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

时间:2010-06-02 11:44:54

标签: php mysql html validation forms

我正在为我的老板建立一个PHP内部网。一个简单的客户,订单,报价系统。它将被拒绝从互联网访问,仅供3人使用。我不太关心安全性,因为我在验证时。 Javascript在所有计算机上都被禁用。

我遇到的问题是:

  1. 员工将有效数据输入包含以下:;[]"'等任何内容的表单。
  2. 将此数据表单$ _POSTS到validationAndProcessing.php页面,并确定员工是否输入数据到字段中。如果没有,他们会被重定向回数据输入页面,他们错过的字段会以红色突出显示。
  3. htmlspecialchars()适用于从之前输入的内容重新填充到表单的所有数据。
  4. 然后将表单重新提交到validationAndProcessing.php页面,如果成功的数据输入数据库并且员工被带到显示数据页面。
  5. 我的问题是:

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

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

    等。

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

    谢谢, 亚当

3 个答案:

答案 0 :(得分:5)

检查manual page on htmlspecialchars

  

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

$double_encode选项应该是您要找的。

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

答案 1 :(得分:4)

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

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

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

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

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

在PHP方面,你可能想要做的唯一事情就是删除斜线,如果有魔术引号:

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

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

答案 2 :(得分:-3)

So that:- &
becomes:- &amp;
becomes:- &amp;amp;
becomes:- &amp;amp;amp;

你完全错了。 试试吧,看看

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