1. mysql和mysqli的方式永远有防不胜防的漏洞,你自己去过滤字符串,那些16进制,64进制的怎么搞,过滤这个相当的复杂,并且也低效,以前大家都过滤字符串,那是没有办法,现在有办法了不用什么心态。建议以后都不要用这样的方式。
2. 有效的方式只有占位符,原理就是告诉数据库我这里的一串东西就是字符串,永远不可能是sql,也就是后来php 才支持的pdo。
给两个办法,匈牙利命名法、注入尝试探测。
一、别瞧不起匈牙利命名法,这货的原意可不是你以为的傻瓜一样在变量名后加上类型名。真正的做法是:未做escape过滤的字符串命令按照你自己的习惯命名,escape后的字符串加上类似_f或_ss这样的suffix。习惯后在写代码的时候自然就会要求传入的字符串都是过滤过的。
二、注入尝试探测则比较简单:作为黑客来说如果需要进行攻击,会进行多次注入尝试,期间几乎可以肯定会构造出一个无效的sql语句,执行时就会报错了。自己写个数据库的query函数进行封装,如果发现有执行无效的sql语句则通过邮件或其他形式进行报警。