博客
关于我
PHP安全之道学习笔记2:编码安全指南
阅读量:419 次
发布时间:2019-03-06

本文共 1962 字,大约阅读时间需要 6 分钟。

编码安全指南

编程是一门艺术,而安全编程更是一门在刀尖上起舞的艺术。我们需要既要小心网络黑客的攻击,又要避免自己在编程中的一些常见陷阱。以下是几个值得注意的问题和解决方案。

1. hash比较的缺陷

在PHP中,hash值如果以"0e"开头并由数字组成,可能会被误认为0,这种情况在旧版本的PHP中较为常见。例如:

var_dump('0e1327544' == 0); // bool(true)

这种情况可能导致密码验证逻辑被绕过。例如:

$Password_from_db = "0e23434";$Password = "2323";if ($Password_from_db == md5($Password)) {    echo "login success!";} else {    echo "login fails";}

为了安全比较,建议使用内置函数 hash_equals()(PHP 5.6 及以上版本),这样可以确保比较过程的安全性。

2. bool比较的缺陷

json_decodeunserialize 函数可能会将部分数据解析为 bool,从而导致比较上的安全问题。例如:

$str = '{"user":true, "pass":true}';$data = json_decode($str, true);if ($data['user'] == 'root' && $data['pass'] == 'pass') {    echo "login success\r\n";} else {    echo "login fails\r\n";}

执行结果会显示 "login success",因为 true 被误认为是字符串 "root" 或 "pass"。为了避免这种问题,始终使用严格的 === 进行比较。

3. 数值比较的风险

PHP是弱类型语言,但数据类型也有数值范围限制。攻击者可能利用这一点绕过验证逻辑。例如:

$a = 9223372036854775807;$b = 9223372036854775827;var_dump($a === $b); // bool(true)var_dump($a % 100); // int(0)

在PHP 7.1.x及以上版本中,这种问题已被修复,但在5.x版本中仍然存在。因此,在实际业务逻辑中,需要特别注意数值类型的范围,避免使用全等号(===)进行比较。

此外,浮点数计算也可能导致精度问题。例如:

$uid = 0.999999999999999999;if ($uid == "1") {    echo "search uid is 1 for data\r\n";}

为了防止这种问题,可以使用 is_int() 函数进行类型判断。

4. switch缺陷

switch 语句中,参数会被自动转换为整数类型进行比较,这可能导致意外的结果。例如:

$num = "1FreePHP";switch ($num) {    case 0:        echo "nothing";        break;    case 1:        echo "1 hacker here!";        break;    case 2:        echo "2 hackers here";        break;    default:        echo "confused";}

输出结果为 "1 hacker here!"。为了避免这种问题,应该在 switch 语句中使用 is_numeric() 函数进行数据类型检查。

5. 数组缺陷

in_array()array_search() 函数使用松散比较,可能导致误匹配。例如:

$arr = [0, 2, 3, "4"];var_dump(in_array('freephp', $arr)); // truevar_dump(array_search('freephp', $arr)); // 0var_dump(in_array('2freephp', $arr)); // truevar_dump(array_search('3freephp', $arr)); // 2

为了确保比较的准确性,应该使用严格模式(true 作为第三个参数)。


编码安全是一个复杂的任务,需要开发者在日常编程中时刻保持警惕。虽然PHP是一个强大的语言,但也存在许多潜在的安全隐患。通过熟悉这些常见问题并采取相应的防护措施,可以显著提升代码的安全性。建议在实际业务逻辑中尽量使用现代化的框架和工具,并定期进行安全审计。

转载地址:http://eksuz.baihongyu.com/

你可能感兴趣的文章
Objective-C实现ripple adder涟波加法器算法(附完整源码)
查看>>
Objective-C实现RodCutting棒材切割最大利润算法(附完整源码)
查看>>
Objective-C实现Romberg算法(附完整源码)
查看>>
Objective-C实现round robin循环赛算法(附完整源码)
查看>>
Objective-C实现RRT路径搜索(附完整源码)
查看>>
Objective-C实现rsa 密钥生成器算法(附完整源码)
查看>>
Objective-C实现RSA密码算法(附完整源码)
查看>>
Objective-C实现runge kutta龙格-库塔法算法(附完整源码)
查看>>
Objective-C实现segment tree段树算法(附完整源码)
查看>>
Objective-C实现selection sort选择排序算法(附完整源码)
查看>>
Objective-C实现sha256算法(附完整源码)
查看>>
Objective-C实现shell sort希尔排序算法(附完整源码)
查看>>
Objective-C实现SinglyLinkedList单链表算法(附完整源码)
查看>>
Objective-C实现skew heap倾斜堆算法(附完整源码)
查看>>
Objective-C实现Skip List跳表算法(附完整源码)
查看>>
Objective-C实现slack message松弛消息算法(附完整源码)
查看>>
Objective-C实现slow sort慢排序算法(附完整源码)
查看>>
Objective-C实现tanh函数功能(附完整源码)
查看>>
Objective-C实现z-algorithm算法(附完整源码)
查看>>
Objective-C实现zellers congruence泽勒一致算法(附完整源码)
查看>>