1

我是 PHP 新手,我有一个表单,人们可以在其中向数据库提交值。稍后这些值要么使用 JS 注入,要么直接放在 HTML 文档中。

我正在使用以下内容来清理我的输入:

function sanitise($str){
  $string = htmlspecialchars($str);
  $string = mysql_real_escape_string($str);
  return $string;
}

问题在于,在我的数据库中,带引号的输入如下所示:input's. 这意味着如果我在 JS 中插入该值,引号会搞砸一切。

我试着这样做是为了避免引用:

function sanitise($str){
  $string = htmlspecialchars($str);
  $string = mysql_real_escape_string($str);
  return addslashes($string);
}

这会将我的数据库条目转换为如下所示的内容:input\'s. 这在 JS 中有效,但如果我直接在内部注入该值,<div></div>那么反斜杠仍然存在......我对我做错了什么感到困惑 - 我如何清理我的输入并同时普遍逃避HTML和JS的特殊字符?

4

1 回答 1

1

数据清理在工作流程的不同步骤中意味着不同的事情。您也不想重复执行此操作,否则您将传播转义字符。

现代方法是尝试以正确的表示形式处理数据。这意味着如果您有名称O'Niell,那么这就是字符串的实际内容。通常这意味着来自网络浏览器的数据可以按原样使用。(只要确保魔术引号被禁用。)

当您将数据传递到其他层时,它就会被清理。最简单的情况是在将其用作数字之前检查它是否为数字,例如查找数据库行。下一个最简单的方法是在组装 SQL 时使用函数,mysqli_real_escape_string而不是更早。(顺便说一句,使用准备好的语句将为您执行此操作。)将数据放入 URL 或 Javascript 中也是如此:您在发出数据时对数据进行转义。

尽可能晚地这样做可以解决两个问题。首先是您不存在处理转义数据的问题。第二个是你不会双重转义数据。

于 2013-09-18T02:24:11.483 回答