普通sql注入防范
1.gpc/rutime魔术引号
magic_quotes_gpc
magic_quotes_runtime
magic_quotes_sybase
2.使用过滤函数
addslashes()
mysql_real_escape_string()
mysql_escape_string()
宽字节注入防范
1.在设置SET NSMES 'gbk‘,character_set_client=binary设置character_set_client为binary
2.使用mysql_set_charset(‘gbk’)设置编码,然后使用mysql_real_escape_string()函数被参数过滤
3.使用pdo方式,在PHP5.3.6及以下版本需要设置setAttribute(PDO::ATTR_EMULATE_PREPARES,false);来禁用prepared statements的 仿真效果
二次urldecode注入防范
代码审计时重点检查urldecode和rawurldecode函数
XSS漏洞防范
1.html实体转码
2.过滤特殊字符
单引号(’)
双引号(")
尖括号(<>)
反斜杠(\)
冒号(:)
与符(&)
井号(#)
3.创建黑名单与白名单
CSRF防范
1.增加token/referer验证避免img标签请求的水坑攻击
在页面或cookie里面加一个不可预测的字符串,服务器在接收操作请求的时候只要验证这个字符串是否是上次访问留下的即可判断是不是可信请求
2.增加验证码
文件上传漏洞防范
1.白名单方式过滤文件扩展名,使用in_array或者(===)来对比扩展名
2.保存上传的文件时重命名文件,文件命名规则采用时间戳的拼接随机数的MD5值方式"md5(time()+rand(1,10000))"
代码执行漏洞防范
结合正则表达式进行白名单限制
命令执行漏洞防范
1.命令防注入函数
escapeshellcmd()
escapeshellarg()
2.创建参数白名单
变量覆盖函数漏洞防范
1.使用原始变量
不进行变量注册,直接用原生的 G E T 、 _GET、 GET、_POST等数组变量进行操作,如果考虑程序可读性等原因,需要注册个别变量,可以直接在代码中定义变量,然后再把请求中的值赋值给它。
2.验证变量存在
在注册变量前先判断变量是否存在
参考文献《代码审计》尹毅 著
https://www.w3school.com.cn