我已经阅读了各种建议在SQL查询中使用Prepared statements
的文章,但是如果我需要在页面执行中只触发一次查询而mysql_ lib does not allow executing 2 queries in one statement
值得使用它在某些情况下,mysql_query似乎也忽略了无效的帖子数据(如'ADMIN' OR 1--
)
$username = $_POST['username'];
$password = $_POST['password'];
mysql_query("SELECT * FROM users WHERE username=$username AND password=$password");
//processing
现在,如果有人将“用户名”作为
传递'ADMIN' OR 1--
以上查询dosent获取“Admin”行!这是mysql_query的一个功能,忽略了'1' / Special chars
之后的注释。在这种情况下,如何运行SQL注入,运行MYSQL 5.5和PHP 5.3
答案 0 :(得分:2)
也许'ADMIN' OR 1--
不起作用,但'ADMIN' OR 'x' = 'y'
肯定会,因为它会导致这个SQL查询:
SELECT *
FROM users
WHERE username = 'ADMIN' -- true
OR 'x' = 'y' AND password = 'whatever' -- false, but who cares?
;
总体教训:编写安全性很难,因为我们不习惯用积极寻求破坏我们代码的恶意代理来思考。 SQL注入是一个已解决的问题,解决方案是参数化查询,因此您应该使用它而不是尝试推出自己的尝试解决方案。