5

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

';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)
4

3 回答 3

8

准备好的语句的想法是您不连接变量,而是绑定参数。不同之处在于变量永远不会被插入到 SQL 中,而是 MySQL 引擎单独处理变量,这不存在 SQL 注入的可能性。这还有一个额外的好处,即不需要对变量进行转义或预处理。

$query = $db->prepare("SELECT password FROM login WHERE username = :username");
$query->execute(array(':username' => $username));
于 2013-06-14T07:34:17.553 回答
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();

这样您就不必清理您的查询。

于 2013-06-14T07:34:59.173 回答
3

不要清理输入。只需确保您确实将所提供的数据写入数据库(即防止 SQL 注入),然后转义您的输出。

要防止 SQL 注入,请使用绑定参数。要转义您的输出,请在网页上使用htmlspecialchars和任何其他适合您输出的媒体的编码。

请记住,您必须同时执行上述两项操作。如果您只防御 SQL 注入攻击,您的网站仍然会受到 XSS 攻击。

于 2013-06-14T07:35:03.893 回答