安全的代码之PHP大法
0x00 摘要
作为一个安全从业者,对于代码的安全较为敏感,网站的的漏洞源于代码的漏洞 。
白盒狗专注代码漏洞挖掘30年
学好代码审计的关键也是写好代码的关键:
- 了解恶意用户要从哪些入口攻击整个框架
- 一切输入都是有害的
- 不要信任任何一个用户
- 代码的逻辑
0x01 过滤输入
a.验证提交值是否为期望值或者允许值
<html>
<form action="" method="post">
<input type="radio" name="gender" value="Male">Male<br/>
<input type="radio" name="gender" value="Female">Female<br/>
<input type="submit" name="submit" value="submit"><br/>
</form>
</html>
(a):
<?php
if(!empty($_POST))
{
echo "The user's gender is ".$_POST['gender'].".<br/>";
}
?>
(b):
<?php
if(!empty($_POST))
{
switch ($_POST['gender'])
{
case 'Male':
case 'Female':
echo "The user's gender is ".$_POST['gender'].".<br/>";
break;
default:
echo "Invalid input value for gender specified.<br/>";
break;
}
}
?>
比较一下(a)(b)两种后台验证 (b)显然确保了正确值 对于处理数据方面显然很重要
b.确认提交类型是否为允许类型
$number_of_nights = (int)$_POST[’num_nights’];
if($num_of_nights == 0)
{
echo “Error: Invalied number of nights for the room”;
exit;
}
这种不仅能确认正确的输入 也可以改进系统的安全
c.输入数据库的数据
- 输入必须使用
addslashes()
函数 stripslashes()
用来返回数据的原始形式php.ini
文件中开启magic_quotes_gpc
(格式化GET POST和cookie变量)和—–magic_quotes_runtime
(格式化进入数据库的数据) 自动添加和过滤斜杠
d.其他恶意输入
当用户传递数据给system()和exec()时 必须使用escapeshellcmd()避免任何恶意用户运行系统命令”; system(“echo $b”);//结果(2)?>结果(1): sixwhale;ls结果(2): sixwhale 1.php(遍历当前目录下所有文件)
在shell里是分割命令的作用 所以可想而知 只要改变;后的值就可以导致很多命令注入
strip_tags()去掉HTML和PHP标记 避免恶意脚本植入
0x02 转义输出
最常见的就是插入恶意的HTML代码 使用 htmlspecialchars()或者 htmlentities()函数
0x03 (//∀//)
关于代码审计,之前接触的不多,将自己学到的一些东西,整理思路,记录于博客中,一方面是为了加强记忆,另一方面也是为了之后用到查找的方便(இдஇ; )