我读过很多建议在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注入是一个已解决的问题,解决方案是参数化查询,因此您应该使用该方法,而不要尝试使用自己尝试的解决方案。