【发布时间】:2014-01-28 06:55:42
【问题描述】:
我正在使用准备好的语句来防止 sql 注入。我想知道我是否在正确的轨道上,以防止使用准备好的语句进行 sql 注入。下面是一个示例 html 表单。
<form action="" method="post" name="ff" id="ff">
<input type="text" name="input1">
<input type="text" name="input2">
<input type="submit" value="submit" name="submit">
</form>
现在在提交上述表格时,我正在使用以下带有准备好的语句的 php 代码。
if(isset($_POST["submit"]))
{
$query = "insert INTO table (input1,input2) VALUES (?,?)";
$stmt = mysqli_prepare($link, $query);
mysqli_stmt_bind_param($stmt, "ss", $_REQUEST["input1"], $_REQUEST["input2"]);
$result = mysqli_stmt_execute($stmt);
if ( false===$result ) {
die('Statement failed: '.$stmt->error);
}
}
请告诉我上面的带有准备好的语句的php代码是否可以防止sql注入的事情。 另外请确认我使用用户输入作为准备好的语句的参数,而不是通过将字符串连接在一起来构建 SQL 命令。
【问题讨论】:
-
看起来不错,而且准备好的语句应该如何使用。
-
“另外请确认我使用用户输入作为准备好的语句的参数,而不是通过将字符串连接在一起来构建 SQL 命令。” - 确认。
-
虽然可以避免 SQL 注入,但这并不意味着您仍然不应该审查您的输入变量(例如数字应该是数字),尤其是当您使用 $_REQUEST 来自 POST 表单的值时(如果表单是 POST 的,那么您应该确切知道 $_POST 和 $_GET 中的内容以及 $_COOKIE 中的内容等
-
我在 PHP 网站上找不到任何说明 mysqli_stmt_bind_param 实际上正在像 mysqli_real_escape 一样清理参数的内容。你们确定它正在清理输入吗?
-
它正在处理字符串值的转义,并用引号括起来......它不会清理,因为您可以在字符串值中嵌入标记等。 ...您仍然需要自己防止:数据库不知道您是否要将
&lt;更改为&lt;等,但mysqli_escape_string()也不清理,它只是用转义引号替换字符串中的引号, 并且将变量绑定到准备好的语句会为您做到这一点
标签: php mysql sql mysqli prepared-statement