由预准备语句输入数据库的字面引号包含前面的反斜杠

时间:2012-02-01 09:56:52

标签: php mysql prepared-statement

我正在尝试为我的数据库创建一个简单的Web界面,我正在使用预准备语句,因为它们应该可以防止SQL注入攻击。无论如何,我的问题是,如果我在表单中输入单引号或双引号并提交它,那么它们将被输入数据库,前面加一个反斜杠,当从数据库中选择项目时,也会打印出来。

那么,如果没有因为prepare语句而要求前面的反斜杠,如何在数据库中输入文字引用?欢呼声。

<?php

$heading = $_POST['heading'];
$story = $_POST['story'];

$mysqli = new mysqli('localhost',$username,$password,'mydb');
if ($mysqli->connect_errno)
  echo "Failed to connect: Error (".$mysqli->connect_errno.") ".$mysqli->connect_error;

if (  !$stmt = $mysqli->prepare('INSERT INTO news (heading,story) VALUES (?,?)')  )
  echo "Prepare failed: Error (".$mysqli->errno.") ".$mysqli->error;

if (  !$stmt->bind_param('ss',$heading,$story)  )
  echo "Binding paramaters failed: (".$stmt->errno.") ".$stmt->error;

if (!$stmt->execute())
  echo "Execute failed: (".$stmt->errno.") ".$stmt->error;

$stmt->close();

?>

3 个答案:

答案 0 :(得分:1)

使用htmlspecialchars()将特殊字符转换为HTML实体或mysql_escape_string()以转义所有“奇怪”符号

答案 1 :(得分:1)

确保在php.ini中关闭magic_quotes。

答案 2 :(得分:0)

您是否考虑使用任何本机PHP函数,如mysql_real_escape_string()或addslashes()?

这些功能本身可以避免插入潜在危险的字符串。