我的网站遭到SQL注入的攻击。黑客在URL查询字符串中使用了以下内容:
abc-buy.php?sid=144760&op=-3+union+all+select+1,2,3,4,5,6,7,load_file%28%22/etc/passwd%22%29
我怎样才能避免这种攻击?
答案 0 :(得分:2)
如何验证输入取决于输入是什么,但在这种情况下,很明显-3+union+all+select+1,2,3,4,5,6,7,load_file%28%22/etc/passwd%22%29
不是 op 的有效输入(无论操作是什么)。< / p>
所以在这种情况下,它可能就像添加一些代码来检查“op”的值是否与预期值之一匹配一样简单。
if ( op != "or" and op != "and" and op != "monkeys" ) {
raise_exception("Invalid op specified! Go away you trickster!");
}
您应该为从用户收到的每个值执行此操作。虽然对于自由格式字段(如电子邮件地址或注释等)来说比较棘手,但仍然要确保它们是匹配字段的有效数据 - 并在将它们插入数据库之前转义任何自由格式字段。这可能会产生以下差异:
INSERT INTO users (username,fullname) VALUES ("bob","Robert"); DROP TABLE users; SELECT 1 WHERE "x"="");
和
INSERT INTO users(username,fullname) VALUES ("bob",Robert\"\)\; DROP TABLE users\; SELECT 1 WHERE \"x\"=\"");
功能差异在于第一个(未转义)版本,DROP TABLE users;
命令执行,而第二个,您只需插入一个名为{{1}的长傻名称的新用户}。
答案 1 :(得分:2)
切换到PDO并使用带有占位符的预准备语句。
答案 2 :(得分:0)
正如大多数答案所说,您应该将保存到数据库中的所有内容(字段占位符)转义。
但我最近发现你应该逃避查询中的所有占位符,因为没有它:
“FROM子句”的占位符可能允许黑客访问任何表的数据。
“WHERE子句”的占位符可能允许黑客访问当前表中的任何行。这意味着黑客可以在尝试登录时以数据库中的任何用户身份访问您的应用程序。
答案 3 :(得分:-1)
使用zend框架。这将默认阻止它 http://framework.zend.com/
或您放入数据库中的所有内容。
http://php.net/manual/en/function.mysql-real-escape-string.php