正确的防止sql注入:(1)找到所有的sql注入漏洞。(2)修补这些漏洞
sql注入的防御不是一件简单的事,技术一般常常会走入一些误区,比如只对用户的输入做一些escape处理,这是非常不够的,在php中,很多是用mysql_real_escape_string。但是这是可能被绕过的,那是不是再增加一些过滤字符就可以了呢,比如处理空格,括号,select,insert等。其实这种基于黑名单的方式,都或多或少存在一些问题。而在sql的保留字中,像having,order by等都可能出现在自然语言中,从而造成误杀。正确的做法是使用预编译语句,在php中可以用:
$stmt = $mysqli->prepare();
$stmt->bind_param();
关于具体语法请查看手册,这里不再详述。
使用预编译的sql语句,sql语句的语义不会发生改变。在sql语句中,变量用?表示,攻击者无法改变sql的结构。
除了使用预编译语句外,还可以使用安全的存储过程对抗sql注入。检查数据类型。
总结:在php中使用预编译sql语句及检查数据类型是最好的方式。
第三方扩展:利用pdo操作数据库是一种好的避免sql注入的方式。