0

我已经阅读了各种建议Prepared statements在 SQL 查询中使用的文章,但是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. 在这种情况下,SQL 注入将如何发生,运行 MYSQL 5.5 和 PHP 5.3

4

1 回答 1

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

于 2012-09-27T16:58:00.550 回答