使用PDO正确地对MySQL中的输入进行净化的方法

5

我的一个朋友试图对我的网站进行SQL注入,他使用下面的代码成功进入了网站。我该如何防止这种攻击?我已经了解到一些有关净化变量的内容,但是我应该怎样做呢?

';INSERT INTO login (username, password) VALUES ('Gjertsmells', 'password');SELECT 'password' FROM Login WHERE 'x'='x


$db = new PDO('mysql:host=XXXXXXXX;dbname=XXXXXXX', 'XXXXXXXXXX', 'XXXXXXXXX');

        // query MySQL to verify login
        $query = $db->prepare("SELECT password FROM login WHERE username='$username'");
        $query->execute();

        $column = $query->fetchColumn();
        if($column === $password)

这可能会有所帮助,http://stackoverflow.com/questions/3783627/sanitizing-variables-with-pdo - Nikhil Mohan
准备好的语句可能就足够了。 - Arun Killu
3个回答

8

预处理语句的概念是不要将变量串联起来,而是绑定参数。这样做的区别在于变量永远不会被插入到SQL中,相反,MySQL引擎会单独处理变量,这样就没有SQL注入的可能性。这也有一个额外的好处,即不需要对变量进行转义或预处理。

$query = $db->prepare("SELECT password FROM login WHERE username = :username");
$query->execute(array(':username' => $username));

这是否可以防止 SQL 注入,例如之前用在我身上的代码?我还容易受到其他常见攻击吗? - user1817311
2
它只保护你所应用的查询,你需要对所有带参数的查询进行防范。它仅能防止SQL注入,还有一系列其他常见漏洞(XSS、开放重定向等等),每个漏洞都需要一个单独的防御机制。 - MrCode
以下代码需要使用吗?$column = $query->fetchColumn(); - user1817311
我设置的和@RichardA设置的有什么区别? - user1817311
没关系@RichardA,只是好奇它如何改变了我已经存在的声明 :) - user1817311
显示剩余6条评论

6

按照以下方式准备您的陈述:

$query = $db->prepare("SELECT `password` FROM `login` WHERE `username` = :username");
$query->execute(array(":username" => $username));

或者像这样使用同一个准备好的语句绑定参数:
$query->bindParam(":username", $username, PDO::PARAM_STR);

$query->execute();

这样你就不必清理查询内容。


3
不要对输入进行消毒。只需确保将提供的任何数据写入数据库(即防止SQL注入),然后转义输出即可。
为了防止SQL注入,请使用绑定参数。要在Web页面上转义输出,请使用htmlspecialchars以及适当的编码,考虑到您正在输出的介质。
只需记住,您必须执行上述两个操作。如果您仅保护免受SQL注入攻击,您仍会使您的网站完全暴露于XSS攻击。

你会如何定义XSS攻击?这样我就能识别它们是如何工作的。 - user1817311
这里有一篇非常长的文章:https://en.wikipedia.org/wiki/Cross-site_scripting,以及一个示例:http://www.thegeekstuff.com/2012/02/xss-attack-examples/。 - mzedeler

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接