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

本文共 1997 字,大约阅读时间需要 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)); // true
var_dump(array_search('freephp', $arr)); // 0
var_dump(in_array('2freephp', $arr)); // true
var_dump(array_search('3freephp', $arr)); // 2

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


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

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

你可能感兴趣的文章
Objective-C实现Interpolation search插值查找算法(附完整源码)
查看>>
Objective-C实现intersection交集算法(附完整源码)
查看>>
Objective-C实现intro sort内省排序算法(附完整源码)
查看>>
Objective-C实现inversions倒置算法(附完整源码)
查看>>
Objective-C实现isalpha函数功能(附完整源码)
查看>>
Objective-C实现islower函数功能(附完整源码)
查看>>
Objective-C实现isPowerOfTwo算法(附完整源码)
查看>>
Objective-C实现isupper函数功能(附完整源码)
查看>>
Objective-C实现ItemCF算法(附完整源码)
查看>>
Objective-C实现ItemCF算法(附完整源码)
查看>>
Objective-C实现iterating through submasks遍历子掩码算法(附完整源码)
查看>>
Objective-C实现jaccard similarity相似度无平方因子数算法(附完整源码)
查看>>
Objective-C实现Julia集算法(附完整源码)
查看>>
Objective-C实现k nearest neighbours k最近邻分类算法(附完整源码)
查看>>
Objective-C实现k-Means算法(附完整源码)
查看>>
Objective-C实现k-nearest算法(附完整源码)
查看>>
Objective-C实现KadaneAlgo计算给定数组的最大连续子数组和算法(附完整源码)
查看>>
Objective-C实现Knapsack problem背包问题算法(附完整源码)
查看>>
Objective-C实现knapsack背包问题算法(附完整源码)
查看>>
Objective-C实现knapsack背包问题算法(附完整源码)
查看>>