所以我有一个朋友尝试在我的网站上运行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)
答案 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攻击敞开大门。