在企业中有以下几种方式能够选择;php
没有作任何过滤,直接把参数插入到SQL语句中,就是注入点;前端
PHP Demo:mysql
// 接收来自前端输入参数id $uid = $_GET['id']; // 构造查询SQL语句,注意这里,uid参数没作过滤就放到SQL语句中进行拼接 $sql = "select * from user where user_id = $uid"; // 语句也未使用预编译,就执行查询动做,SQL注入就是这么产生的 query($sql);
注意,上面只是一个演示案例,如今的Web框架基本是MVC模式的,Model层通常不接收前端的参数,接收前端参数通常在Control层完成,也就意味着查询SQL注入的时候你须要跟踪一个前端参数从Control层传递到Model。这期间,一个前端参数可能会通过十几个函数的调用传递都是有可能的。这个时候考验你的就不是技术了,而是耐心。sql
最开始使用的是Seay源代码审计工具,后面使用的是Rips代码审计工具,发现都不能知足本身的需求,由于有个致命缺陷,就是会有遗漏的SQL注入找不全。这样就很是危险了,你说XSS、CSRF这种攻击客户端的洞,漏几个就漏几个了。但SQL注入这种攻击服务端的漏了几个,若是漏的那几个还被外部发现了,那饭碗还要不要了?框架
比较的结果是 Rips 比 Seay 误报率、准确率要高好几个档次。使用Risp能提升审核的效率,可是并不能提升精度,因此正确用法的是,拿到陌生的代码时,可使用Rips先扫一遍,先找出一些容易找到SQL注入点。想要覆盖全,而且有精度的效果,往下看。函数
Taint这种参数污染标记跟踪的工具又会比Rips的准确率高。工具
精度和效率感受是个矛盾;ui
Taint总会有误报和漏的,毕竟taint是基于流量的,若是没有人点击那个url,是不可能检测出来的,能够用一个笨方法来解决,如今的情景下,光靠检测工具是可能的,只能说依靠工具辅助人来提升效率而已。url