本文标签:, ,

各种网页后端语言基本都会和数据库链接,而传入参数也是非常正常的事情,但是通常往往因为过滤不严导致SQL注入漏洞,时代在发展,解决办法也出来了,那就是绑定数据,把数据库要用到的数据绑定参数(MYSQL5.1开始支持),然后通过MYSQL预处理SQL模板,服务器会根据传送的SQL模板和参数进行处理,不作转义,数据就永远是数据,SQL语句就是SQL语句,不会发生SQL注入漏洞了。

这里说的是PHP中的PDO,因为PHP中只有PDO和mysqli支持数据绑定,一开始大家都用得好好的,但是PHP还是出现了漏洞(意外中的意外,不过因为版本是5.3.6及以下,用的人少所以受影响的不多),因为不是什么高手,就不做详细解释了,下面我会留下之前参考的网址,想研究的可以详细看看。

先举例有问题的使用方式(PHP5.3.6以下版本不安全):
$pdo = new PDO("mysql:host=127.0.0.1;dbname=test;charset=gbk","root");
$pdo->query('SET NAMES GBK');
$var = urldecode('%bf%27%20OR%20username%3Dusername%20%23');
$query = "SELECT * FROM info WHERE username = ?";
$stmt = $pdo->prepare($query);
$stmt->execute(array($var));
$r = $stmt->fetch();
print_r($r);

正确的使用方式(安全):
$pdo = new PDO("mysql:host=127.0.0.1;dbname=test;charset=gbk","root");
$pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, false); //防止本地转义SQL语句,全都发送给服务器去处理
$pdo->query('SET NAMES GBK');
$var = urldecode('%bf%27%20OR%20username%3Dusername%20%23');
$query = "SELECT * FROM info WHERE username = ?";
$stmt = $pdo->prepare($query);
$stmt->execute(array($var));
$r = $stmt->fetch();
print_r($r);

参考:
http://zhangxugg-163-com.iteye.com/blog/1835721
https://my.oschina.net/zxu/blog/163135

 » 订阅本站:http://feed.x2009.net