所以我有一个朋友试图在我的网站上运行一个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攻击。