MYSQL二阶攻击问题

时间:2011-10-26 19:44:17

标签: php mysqli sql-injection prepared-statement

现在我正在使用预处理语句,选择/插入数据到mysql。 好我的问题我发现了二阶攻击。 因此,用户例如在我的网站上注册。 并使用像这样的电子邮件或用户名

"username '; DELETE Orders;--"

这会将插入到mysql表中

因此,当我通过准备好的声明再次收到数据时,在准备好的声明中再次插入/做一些事情。

因为我使用准备好的陈述,我会安全吗?

样品:

Get Bad Data:

$sql = "SELECT * FROM USERS where USERID = 1";
...
$stmt->bind_result($username);
...

Next Query:
INSERT or do other things:
$SQL = "SELECT * FROM email WHERE USERNAME = ?";
....
$stmt->bind_param('s', $username);
...

在我的想法之后我会安全,如果我这样做的话?或者是否存在泄漏?

但如果我愿意的话,我会受到攻击:

$sql = "SELECT * FROM email WHERE username = $username";
$stmt = $mysqli->prepare($sql);
$stmt->execute();

谢谢: - )

1 个答案:

答案 0 :(得分:1)

只要占位符一直使用(无处不在!)用于所有[变量]数据 ,那么所有SQL注入攻击*都会被阻止,二阶或其他

这并不意味着没有漏洞或其他攻击媒介 - 但它确实意味着拥有“聪明用户名”的人将无法发送意外的“DROP”到数据库。正如所指出的,如果任何地方使用“不安全的SQL语句”,那么 wham!保证就会关闭。

(“不安全的SQL语句”集包括但不限于使用占位符用于所有[变量]数据的任何此类语句。)

快乐的编码。


*这假设占位符支持/数据库驱动程序中没有错误/漏洞,当然。但那是另一个故事......