关于防止sql注入的几个知识点

发表于:2015-6-30 11:02

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:逗逼来了    来源:51Testing软件测试网采编

  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("/\badd\b/i","/\(/","/\)/","/\balter\b/i","/\bupdate\b/i","/\bdelete\b/i","/\bselect\b/i","/\band\b/i","/\bor\b/i","/\bbetween\b/i","/\bgroup\b/i","/\bdrop\b/i","/\bfrom\b/i","/\bhaving\b/i","/\border\b/i","/\blike\b/i","/\bchange\b/i","/\blimit\b/i","/\bdistinct\b/i","/\'/","/\"/","/%27/i","/0x27/i","/\bmid/i","/\bdatabase\(\)/i","/\bin\b/i","/\bconcat/i","/char\(.*?\)/i","/%/","/\bunion\b/i","/\=/","/\s+/");
$sqlReplacement="";
$resKeyword=preg_replace($sqlKeywords,$sqlReplacement,$temKeywords);
return$resKeyword;
}
  做了这些处理就能抵御大部分的sql注入了。
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号