转义和清理$ _GET参数

时间:2019-02-08 00:06:35

标签: php mysql pdo get htmlspecialchars

因此,我知道应该在输出或显示数据时对数据进行清理,而不是在接收或存储数据时进行清理。这就是我现在正在做的:

echo htmlspecialchars($name, ENT_QUOTES);

我的问题是,如果我要获取$ _GET参数并检查数据库中的参数,是否仍要清理并逃脱?例如:

$name = htmlspecialchars($_GET['name'], ENT_QUOTES);
$stmt = $db->prepare("SELECT * FROM users WHERE name = :name");
$stmt->bindParam(':name', $name);
$stmt->execute();

那么htmlspecialchars是必需的还是我应该$name = $_GET['name']做?

谢谢。

4 个答案:

答案 0 :(得分:2)

PDO使它比您做起来更加容易:

$stmt = $db->prepare("SELECT * FROM users WHERE name = :name");
$stmt->execute([ 'name' => $_GET['name'] ]);

就是这样。完成。

使用占位符值时,尤其是进行匹配时,请不要转义。 htmlspecialchars在HTML上下文中仅 相关,否则会造成损害。如果要以JSON,电子邮件或其他任何方式显示数据,请针对该上下文和该上下文进行转义,仅

如果某人的名字类似于“ A&W”,那么当您进行搜索时,您将修改输入内容并实际搜索“ A& W”,而这并不是他们的名字。他们将得到零匹配,然后他们会询问您您的网站出了什么问题。

您仅需对输入数据进行 操作,以删去可能干扰搜索匹配的所有字符,例如有人偶然引入了 的前导和尾随空格。

答案 1 :(得分:1)

请勿使用htmlspecialchars()bind()完成所有所需的转义和引用操作。

PHP包含一系列令人困惑的转义符-

  • urlencode-为URL建立值时。
  • html实体,html特殊字符-用于<input><textarea><a>-仅转义"&<>
  • nl2br(或<pre>)-用于处理行尾
  • mysql_real_escape_string-不要使用mysql*例程。
  • mysqli_real_escape_string-在mysqli*例程中转义时-至少'"\
  • 加斜杠-几乎和上面一样
  • hex,base64_encode-处理非文本的可能错误

在将文本存储到MySQL表中时,通常的最佳选择是使字符串仅转义到足以通过解析器的地方。随着处理的进行,这种逃逸消失了。保留重音符号等。

  • 撇号和双引号-这些指示字符串的结尾,因此您需要以某种方式对其进行转义。
  • 反斜杠-传统的逃脱者。但是,如果您要反斜杠怎么办?

PHP的PDO和mysqli具有“绑定”方式,可以为您完成所有工作。相反,如果您使用PHP的“插值”,例如

$sql = "SELECT * FROM t WHERE x = {$_GET['x']}";

您没有逃脱,也没有SQL注入保护。 除非您已经以某种方式检查了参数,否则不要以这种方式编写代码。

对于HTML,您需要一组不同的转义符。考虑一下<。这引入了标签。那么,如何显示“小于”?好吧,您需要它的“ html实体”:&lt;。这导致&出现问题;因此&amp;

答案 2 :(得分:1)

  

所以需要htmlspecialchars还是我应该只做$ name =   $ _GET ['name']?

不,不需要。

按原样保留输入数据 ,与输出介质无关。为安全地嵌入HTML,不应准备

如果明天您需要一些API,PDF或桌面应用程序的JSON格式的数据怎么办?

答案 3 :(得分:0)

出于数据完整性的目的,您仍应该验证输入,例如:确保输入或多或少是出于应用程序稳定性的期望。但是,由于您使用的是预备语句,因此无需急需“清理”(也称为“损坏”)数据,因为数据库驱动程序对数据进行了更严格的封装。

htmlspecialchars()使数据可以安全地包含在HTML文档中,并且仅应在将数据输出到HTML文档中时使用。在插入数据库之前执行此操作或多或少会污染您的数据,以用于除HTML文档以外的任何其他。