如何在显示之前正确“清理”mysql字符串?

时间:2017-08-03 15:34:38

标签: php mysql pdo

我的网站上有一个带注释字段的表单。如果有人进入,例如:

"What" is 'up'?> 

进入注释字段,它使用PDO预处理语句插入到mysql中,随后出现在数据库中,如下所示:

\"what\" is \'up\'?>

然后,当我从数据库中取出数据时,我使用:

$comment=htmlspecialchars($row['comment']);

但是当我使用“echo $ comment”将其输出到页面时,它会输出到页面:

\"what\" is \'up\'?>

htmlspecialchars不应该删除那些斜杠吗?

FWIW,在转换为PDO之前,我曾经在插入之前使用mysqli_real_escape_string(),然后在显示之前使用htmlspecialchars()

插入代码:

$comment=$_POST['comment'];

$stmt = $pdo->prepare("INSERT into details (firstname, lastname, comment) values (:firstname, :lastname, :comment)");

$stmt->execute([':firstname' => $firstname, ':lastname' => $lastname, ':comment' => $comment]);

1 个答案:

答案 0 :(得分:0)

您的数据库应包含正确的数据:

"what" is 'up'?>

如果它包含垃圾:

\"what\" is \'up\'?>

然后很多事情都会破裂,比如全文搜索,排序,基本上任何操纵文本的东西。你甚至不能使用LENGTH()或SUBSTRING()!所以这必须尽快修复。

插入/更新值的代码部分出了问题。

  • magic_quotes可以被激活(一种破坏数据的好方法)
  • 在您的代码中隐藏addslashes()
  • 使用mysql_real_escape_string()或类似的
  • 进行双重转义
  • 逃避+准备好的stmt

好狩猎。这很难解决。

此外,当你在它时,检查你的编码。谁知道,当有人输入“é”时,可能会插入“é”! (这也打破了SQL UPPER(),LOWER(),SQL排序,LIKE搜索,基本上没什么用。)

我的地址包含'和'é。有时当我收到在线订单时...是的,我收到的信封上印有“\”和“é”。这就是你知道网店使用php的方式!

现在,一旦您的数据库包含正确的数据,您的用户就无法阻止他们在论坛帖子中输入此内容:

<script type="text/javascript"> StealAllYourCookies(); </script>

因此,这就是为什么在将内容输出到html时使用htmlspecialchars()的原因。