为什么使用Prepared Statements / mysql_real_escape_string进行SQL查询

时间:2012-09-27 16:55:27

标签: php mysql

我已经阅读了各种建议在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

1 个答案:

答案 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注入是一个已解决的问题,解决方案是参数化查询,因此您应该使用它而不是尝试推出自己的尝试解决方案。