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

4 php mysql pdo code-injection

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

'; INSERT INTO登录(用户名,密码)VALUES('Gjertsmells','密码'); SELECT'密码'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)
Run Code Online (Sandbox Code Playgroud)

MrC*_*ode 7

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

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

  • 它只保护您应用它的查询,您需要对所有带参数的查询执行此操作.它只能阻止SQL注入,还有一系列其他常见漏洞(XSS,Open Redirect等),每个漏洞都需要一个单独的防御机制. (2认同)

Mis*_*Bla 6

准备你的声明如下:

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

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

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

$query->execute();
Run Code Online (Sandbox Code Playgroud)

这样您就不必清理查询.