现在我正在使用预处理语句,选择/插入数据到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();
谢谢: - )
答案 0 :(得分:1)
只要占位符一直使用(无处不在!)用于所有[变量]数据 ,那么所有SQL注入攻击*都会被阻止,二阶或其他
这并不意味着没有漏洞或其他攻击媒介 - 但它确实意味着拥有“聪明用户名”的人将无法发送意外的“DROP”到数据库。正如所指出的,如果任何地方使用“不安全的SQL语句”,那么 wham!保证就会关闭。
(“不安全的SQL语句”集包括但不限于不使用占位符用于所有[变量]数据的任何此类语句。)
快乐的编码。
*这假设占位符支持/数据库驱动程序中没有错误/漏洞,当然。但那是另一个故事......