--- title: SQL Injection localeTitle: SQL注入 --- ## SQL注入 应用程序中的一个漏洞,程序员在将输入包含到数据库的查询中之前不会对其进行清理。这导致攻击者具有完全读取并且通常不会对数据库进行写访问。通过这种类型的访问,攻击者可以做很糟糕的事情。 ### 示例SQL注入攻击 下面的PHP脚本运行SQL语句以按ID获取用户的电子邮件。但是输入没有被清理,因此容易受到SQL注入攻击 ```PHP connect_error) { die("Connection failed: " . $conn->connect_error); } $sql = "SELECT email FROM users WHERE id =" . $input; $result = $conn->query($sql); if ($result->num_rows > 0) { while($row = $result->fetch_assoc()) { echo $row["email"]; } } else { echo "no results"; } $conn->close(); ``` ```SQL SELECT email FROM users WHERE id = `$input`; ``` 因此,使用上面的输入不是类型转换(即使用(int)转换输入,因此只允许一个数字)也不转义允许某人执行SQL注入攻击 - 例如URL `getemailbyuserid.php?id=1'; My Query Here-- -`允许您`getemailbyuserid.php?id=1'; My Query Here-- -`运行任意SQL查询。 ### 在PHP中保护您的网站免受SQL注入攻击 有一些方法可以保护您的网站免受SQL注入攻击。这些方法是白名单,类型转换和字符转义 **白名单:** 白名单方法用于预期只有少量输入的情况。您可以在PHP Switch中列出每个预期输入,然后为无效输入设置默认值。您不必担心类型转换问题或字符转义旁路,但允许的输入极度有限。它仍然是一个选项,请参见下面的示例。 ```PHP