7 回答
TA贡献2036条经验 获得超8个赞
如果您使用的是最新版本的PHP,则mysql_real_escape_string
下面列出的选项将不再可用(尽管mysqli::escape_string
它是现代版本)。这些天,该mysql_real_escape_string
选项只适用于旧版PHP上的遗留代码。
您有两个选项 - 转义您的特殊字符unsafe_variable
,或使用参数化查询。两者都可以保护您免受SQL注入。参数化查询被认为是更好的做法,但在使用它之前需要在PHP中更改为更新的MySQL扩展。
我们将首先覆盖较低影响的字符串。
//Connect$unsafe_variable = $_POST["user-input"];$safe_variable = mysql_real_escape_string($unsafe_variable);mysql_query("INSERT INTO table (column) VALUES ('" . $safe_variable . "')");//Disconnect
另请参见mysql_real_escape_string
功能的详细信息。
要使用参数化查询,您需要使用MySQLi而不是MySQL函数。要重写您的示例,我们需要类似以下内容。
<?php $mysqli = new mysqli("server", "username", "password", "database_name"); // TODO - Check that connection was successful. $unsafe_variable = $_POST["user-input"]; $stmt = $mysqli->prepare("INSERT INTO table (column) VALUES (?)"); // TODO check that $stmt creation succeeded // "s" means the database expects a string $stmt->bind_param("s", $unsafe_variable); $stmt->execute(); $stmt->close(); $mysqli->close();?>
你想要阅读的关键功能就是mysqli::prepare
。
此外,正如其他人所建议的那样,您可能会发现使用PDO之类的步骤来增加抽象层是有用的/更容易的。
请注意,您询问的案例非常简单,更复杂的案例可能需要更复杂的方法。特别是:
如果要根据用户输入更改SQL的结构,参数化查询将无济于事,并且不需要转义所需的转义
mysql_real_escape_string
。在这种情况下,您最好通过白名单传递用户的输入,以确保只允许“安全”值。如果您在条件中使用来自用户输入的整数并采用该
mysql_real_escape_string
方法,您将在下面的注释中遇到Polynomial描述的问题。这种情况比较棘手,因为整数不会被引号括起来,所以你可以通过验证用户输入只包含数字来处理。可能还有其他我不知道的情况。您可能会发现这是一个有用的资源,可以解决您可能遇到的一些更微妙的问题。
TA贡献1982条经验 获得超2个赞
使用PDO和准备的查询。
($conn是一个PDO对象)
$stmt = $conn->prepare("INSERT INTO tbl VALUES(:id, :name)");
$stmt->bindValue(':id', $id);
$stmt->bindValue(':name', $name);
$stmt->execute();
添加回答
举报