htmlspecialchars() - 如何以及何时使用和避免多次使用

Posted

技术标签:

【中文标题】htmlspecialchars() - 如何以及何时使用和避免多次使用【英文标题】:htmlspecialchars() - How and when to use and avoid multiple use 【发布时间】:2011-02-26 18:59:20 【问题描述】:

我正在为我的老板建立一个 php 内部网。一个简单的客户、订单、报价系统。它将被拒绝从 Internet 访问,并且只能由 3 人使用。我对安全性的关注不如对验证的关注。 javascript 在所有机器上都被禁用。

我的问题是这样的:

    员工将有效数据输入到包含以下任何:;[]"' 等的表单中。 Form $_POSTS 将此数据发送到validationAndProcessing.php 页面,并确定员工是否在字段中输入数据。如果他们不这样做,他们会被重定向回数据输入页面,他们错过的字段会以红色突出显示。 htmlspecialchars() 应用于从之前输入的内容重新填充到表单的所有数据。 然后表格重新提交到validationAndProcessing.php页面,如果成功的数据输入数据库并带员工显示数据页面。

我的问题是这样的:

如果员工在第 1 步中反复输入任何数据,则每次将 htmlspecialchars() 应用于数据时,他们都会在第 1 步和第 4 步之间不断移动。

So that:- &
becomes:- &
becomes:- &
becomes:- &

等等。

如何阻止 htmlspecialchars() 多次应用于已清理的数据?

谢谢, 亚当

【问题讨论】:

【参考方案1】:

查看manual page on htmlspecialchars:

string htmlspecialchars (string $string [, int $quote_style = ENT_COMPAT [, string $charset [, bool $double_encode = true ]]])

$double_encode 选项应该是您正在寻找的。​​p>

但是,在正确设置的数据流中,这不应该根本不可能,除非有来自用户或第三方服务的数据可能已经或不可能包含 HTML 编码的字符。 (并不是说我在我的职业生涯中没有建立过一些设置不当的数据流。但这就是为什么我知道为什么它们是干净且定义明确的如此重要。:-)

【讨论】:

$double_encode 是一个黑客;它会阻止任何人使用文字字符串& 或类似的意思来表达这个意思。更好地修复数据流。只在最后的 HTML 模板阶段使用htmlspecialchars(),不要过度输入或数据库内容,你应该没问题。问题中的第 3 步似乎非常可疑。 @bobince 第 3 步,这是符合标准的唯一可能方式 :) 当然你需要htmlspecialchars将文本输出到HTML。然而,第 3 步听起来像是被一揽子应用于 HTML 输出步骤之外的所有内容,这肯定可以解释双重转义。 @bobince 他没有将文本输出到 HTML 中。他填写表单的输入值。至少他应该:) @naescent 我不确定我是否关注你:htmlspecialchars() ed 文本不会被解释为普通字符(即& 将被转换为可见的&)插入表单信息时的浏览器?我看不出您描述的流程将如何以双重编码的字符数据结束。【参考方案2】:

您应该只在 HTML 输出中使用 htmlspecialchars,不要在其他任何地方使用。

<input name="var" value="<?php echo htmlspecialchars($var)?>">

如果$var 包含一个&符号,那么在 HTML 中它将输出编码值:

<input name="var" value="this&amp;that">

但是,用户只会在他们的输入字段中看到this&amp;that,并且在提交时,$_GET['var'] 将是this&amp;that,而不是编码版本。

在 PHP 方面,您可能想做的唯一一件事就是在魔术引号打开时删除斜杠:

if (get_magic_quotes_gpc())
    $var = stripslashes($_POST['var']);
else
    $var = $_POST['var'];

您应该从那里将原始数据存储在数据库中,而不是 HTML 编码的版本。为避免 SQL 注入,如果您使用的是普通的 mysql 函数,请使用mysql_real_escape_string,或者改用PDO。

【讨论】:

在存储用户 cmets 之类的东西之前使用 htmlspecialchars 有什么负面影响?意味着你永远不会忘记输出? @Silver89 最好将真实的规范数据存储在数据库中。它有助于将数据用于其他事情,例如也许您想稍后处理数据。另外,您的想法并不能真正解决任何问题,因为现在您可能会忘记对输入进行编码,然后在数据库中进行各种编码。 @DisgruntledGoat 这只有在您使用 UTF-8 存储数据时才有可能。如果您坚持使用 ISO-8859-1,那么您需要在 htmlentities 或 htmlspecialchars 上使用 double_encode 参数,这样它就不会转换像 ě 这样的字符。到 &#283; @Paul 这就是答案的重点:您应该全面使用 UTF-8,这样就不会发生这种情况。没有它,你永远不应该被“卡住”。如果您的数据库不是 UTF-8,只要您的页面具有与 DB 相同的编码,也有可能。【参考方案3】:
So that:- &
becomes:- &amp;
becomes:- &amp;amp;
becomes:- &amp;amp;amp;

你完全错了。 试试看吧

<form>
<input name="a" value="<?=htmlspecialchars($_GET["a"])?>">
<input type=submit>
</form>

【讨论】:

以上是关于htmlspecialchars() - 如何以及何时使用和避免多次使用的主要内容,如果未能解决你的问题,请参考以下文章

addslashes,htmlspecialchars,htmlentities转换或者转义php特殊字符防止xss攻击以及sql注入

呈现集合抛出“htmlspecialchars() 期望”我如何像 Eloquent 集合一样重新编辑它 [关闭]

如何修复 htmlspecialchars() 期望参数 1 是字符串,给定数组

PHP如何防止XSS攻击

htmlspecialchars 编码行的 LIKE 函数

在插入 MySQL 之前使用 htmlspecialchars() 好吗?