您好,欢迎访问一九零五行业门户网

PHP防SQL注入不要再用addslashes和mysql_real_escape_string了

博主热衷各种互联网技术,常啰嗦,时常伴有强迫症,常更新,觉得文章对你有帮助的可以关注我。 转载请注明深蓝的镰刀
看了很多php网站在防sql注入上还在使用addslashes和str_replace,百度一下php防注入也同样在使用他们,实践发现就连mysql_real_escape_string也有黑客可以绕过的办法,如果你的系统仍在用上面三个方法,那么我的这篇博文就有了意义,以提醒所有后来者绕过这个坑。
出于为后人栽树而不是挖坑的考虑,给出php以及mysql的版本信息,以免将来“问题”不再是“问题”了。
用str_replace以及各种php字符替换函数来防注入已经不用我说了,这种“黑名单”式的防御已经被证明是经不起时间考验的。
下面给出绕过addslasher和mysql_real_escape_string的方法(trick)。
注意:虽然在mysql5.5.37-log下该trick已经被修复了,但仍然没有确切地解决注入问题,介于很多公司的系统仍在使用mysql5.0,我建议立马做出改进,这点也是我《也说说几种让程序员快速提高能力的方法 》中提到的一个十分重要的点。
注意:如果你不确定你的系统是否有sql注入的风险,请将下面的下面的demo部署到你的服务器,如果运行结果相同,那么请参考最后的完美的解决方案。
mysql:
mysql> select version();+---------------------+| version() |+---------------------+| 5.0.45-community-ny |+---------------------+1 row in set (0.00 sec)mysql> create database test default charset gbk;query ok, 1 row affected (0.00 sec)mysql> use test;database changedmysql> create table users ( username varchar(32) character set gbk, password varchar(32) character set gbk, primary key (username));query ok, 0 rows affected (0.02 sec)mysql> insert into users set username='ewrfg', password='wer44';query ok, 1 row affected (0.01 sec)mysql> insert into users set username='ewrfg2', password='wer443';query ok, 1 row affected (0.01 sec)mysql> insert into users set username='ewrfg4', password='wer4434';query ok, 1 row affected (0.01 sec)=
php:
setattribute(pdo::attr_emulate_prepares, false);$pdo->setattribute(pdo::attr_errmode, pdo::errmode_exception);$stmt = $pdo->prepare('select * from employees where name = :name');$stmt->execute(array('name' => $name));foreach ($stmt as $row) { // do something with $row}
mysqli:
$stmt = $dbconnection->prepare('select * from employees where name = ?');$stmt->bind_param('s', $name);$stmt->execute();$result = $stmt->get_result();while ($row = $result->fetch_assoc()) { // do something with $row}
以上就介绍了php防sql注入不要再用addslashes和mysql_real_escape_string了,包括了方面的内容,希望对php教程有兴趣的朋友有所帮助。
其它类似信息

推荐信息