Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/256.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php MYSQL二阶攻击问题_Php_Mysqli_Sql Injection_Prepared Statement - Fatal编程技术网

Php MYSQL二阶攻击问题

Php MYSQL二阶攻击问题,php,mysqli,sql-injection,prepared-statement,Php,Mysqli,Sql Injection,Prepared Statement,现在我正在使用准备好的语句来选择/插入数据到mysql。 好的,我的问题是我发现了二级攻击。 例如,用户在我的站点上注册。 并使用电子邮件或用户名之类的 "username '; DELETE Orders;--" 这将向mysql表中插入内容 因此,当我通过prepared语句再次接收数据,并在prepared语句中再次插入/处理数据时 我会很安全,因为我使用事先准备好的声明 样本: Get Bad Data: $sql = "SELECT * FROM USERS where USERI

现在我正在使用准备好的语句来选择/插入数据到mysql。 好的,我的问题是我发现了二级攻击。 例如,用户在我的站点上注册。 并使用电子邮件或用户名之类的

"username '; DELETE Orders;--"
这将向mysql表中插入内容

因此,当我通过prepared语句再次接收数据,并在prepared语句中再次插入/处理数据时

我会很安全,因为我使用事先准备好的声明

样本:

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();

谢谢:-)

只要对所有[variable]数据一致地使用占位符(在任何地方!),那么所有SQL注入攻击*都会被挫败,无论是二阶攻击还是其他攻击

这并不意味着不存在漏洞或其他攻击向量——但它确实意味着拥有“聪明用户名”的人将无法向数据库发送意外的“删除”。正如所指出的,如果anywhere使用“不安全的SQL语句”,那么,砰!担保失效

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

快乐编码



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

如果有人支持,为什么不使用事先准备好的声明呢?:)是的,你的权利,我已经做了,但只是好奇…如果我仍然可以攻击,只是学会了编码:P@Marcus:准备好的语句无法处理所有类型的查询。有时你不得不光着身子不使用它们,即使是在可用和需要的时候。@MarcB什么时候你不能使用预先准备好的语句?任何链接或描述都将不胜感激:)@Marc B当然。。。您仍然可以通过生成一个带有占位符和值的查询来实现这一点。没有理由变得草率,开始将数据压入SQL字符串本身:)