关于防止sql注入的几个知识点
作者:网络转载 发布时间:[ 2015/6/30 15:28:55 ] 推荐标签:数据库
1.PDO预处理是。
你可以把他看成是要运行的sql的已经编译过的模板,它可以用变量参数进行定制
它有两个显著优点:
1.1:查询仅需解析一次,但可以用相同或者不同参数执行多次。换句话说如果要以不同的参数执行同样的语句执行多次,利用PDO可以大大降低应用程序的速度。
1.2:提供给预处理的语句不需要携带引号,所以可以有效防止sql的注入。但是如果查询的其他部分是由未转义的输入来构建的,则仍存在sql注入的风险。
1.3:另外pdo预处理无效的地方:
1.3.1:limit语句
1.3.2:like%?%.不能这么使用,占位符必须代表整个字符。所以可以这样like?,然后传入参数为这样的格式:%iloveyou%;
2.在处理参数之前先decode两次。防止url编码注入。
为什么这么做呢?我暂时也不太理解,这个博客上有相关说明。特此向博主致敬!牛人,总结的真好。
http://drops.wooyun.org/tips/968
3.然后过滤引号,括号,和一些sql关键词(好是urldecode两次后),比如union,select,concat等,好能匹配单词边界,有些sql注入可能使用替换关键词的办法如:seSelectlect,这样即使select被过滤了,然后又来个select。
下面是我自己写的一个sql过滤正则替换函数,在多次漏洞盒子报告错误后,我利用它做了成功的sql注入防御:
publicfunctionremoveSql($keyword){
$temKeywords=urldecode(urldecode(trim($keyword)));
$sqlKeywords=array("/add/i","/(/","/)/","/alter/i","/update/i","/delete/i","/select/i","/and/i","/or/i","/between/i","/group/i","/drop/i","/from/i","/having/i","/order/i","/like/i","/change/i","/limit/i","/distinct/i","/'/","/"/","/%27/i","/0x27/i","/mid/i","/database()/i","/in/i","/concat/i","/char(.*?)/i","/%/","/union/i","/=/","/s+/");
$sqlReplacement="";
$resKeyword=preg_replace($sqlKeywords,$sqlReplacement,$temKeywords);
return$resKeyword;
}
做了这些处理能抵御大部分的sql注入了。
相关推荐
更新发布
功能测试和接口测试的区别
2023/3/23 14:23:39如何写好测试用例文档
2023/3/22 16:17:39常用的选择回归测试的方式有哪些?
2022/6/14 16:14:27测试流程中需要重点把关几个过程?
2021/10/18 15:37:44性能测试的七种方法
2021/9/17 15:19:29全链路压测优化思路
2021/9/14 15:42:25性能测试流程浅谈
2021/5/28 17:25:47常见的APP性能测试指标
2021/5/8 17:01:11