我读过很多建议在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--


上面的查询主体将获取“ Admin”行!这是mysql_query的功能吗,它忽略'1' / Special chars之后的注释。在这种情况下,运行MYSQL 5.5和PHP 5.3时如何进行SQL注入

最佳答案

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

10-07 16:26
查看更多