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


Correct way to sanitize input in MySQL using PDO

所以我有一个朋友试图在我的网站上运行一个sqlinject,他设法使用下面的代码进入它。我该如何预防呢?我读过一些关于消毒变量的东西,但我该怎么做呢?

INSERT INTO login (username, password) VALUES (' gjertsmell ', '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)

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

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

像这样准备语句:

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

或者使用相同的预处理语句绑定参数,如下所示:

$query->bindParam(":username", $username, PDO::PARAM_STR);
$query->execute();

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

为了防止SQL注入,使用绑定参数。要转义您的输出,请在网页上使用htmlspecialchars,并根据您输出到的媒体使用任何其他适当的编码。

只要记住你必须做以上两件事。如果您只防范SQL注入攻击,那么您的站点仍然会受到XSS攻击。