使用PDO在MySQL中清理输入的正确方法

时间:2013-06-14 07:30:48

标签: php mysql pdo code-injection

所以我有一个朋友尝试在我的网站上运行SQLinjection,他设法使用下面的代码进入它。我怎么能阻止这个?我已经阅读了一些关于清理变量的内容,但我该怎么做?

'; INSERT INTO登录(用户名,密码)VALUES('Gjertsmells','password');选择'密码'FROM登录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)

3 个答案:

答案 0 :(得分:7)

预处理语句的想法是你不连接变量,而是绑定参数。区别在于变量永远不会插入到SQL中,而是MySQL引擎单独处理变量,这样就不会出现SQL注入。这也有额外的好处,即不需要对变量进行转义或预处理。

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

答案 1 :(得分: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();

这样您就不必清理查询。

答案 2 :(得分:3)

不要清理输入。只要确保你真正写入了数据库提供的数据(即防止SQL注入),然后转义输出。

要防止SQL注入,请使用bound parameters。要转义输出,请在网页上使用htmlspecialchars以及根据您输出的介质选择适当的任何其他编码。

请记住,您必须同时执行上述两项操作。如果您只是防止SQL注入攻击,您仍然会使您的站点对XSS攻击敞开大门。