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

Ada*_*dam 5 html php mysql forms validation

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

我遇到的问题是:

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

我的问题是:

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

So that:- &
becomes:- &
becomes:- &
becomes:- &
Run Code Online (Sandbox Code Playgroud)

等等..

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

谢谢,亚当

Pek*_*ica 5

查看htmlspecialchars上手册页:

串用htmlspecialchars(字符串$串[摘要$ quote_style = ENT_COMPAT [,字符串$字符集[, 布尔$ double_encode =真 ]]])

$double_encode选项应该是您正在寻找的.

在正确设置的数据流,但是,这不应该是一种可能性可言,除非有数据从用户或可以或不可以已经包含HTML编码字符第三方服务的传入.(不,我还没有建在我的职业生涯的几个不正确设置的数据流.但是,这就是为什么我知道为什么它如此重要他们是干净和明确的.:-)


Dis*_*oat 5

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

<input name="var" value="<?php echo htmlspecialchars($var)?>">
Run Code Online (Sandbox Code Playgroud)

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

<input name="var" value="this&amp;that">
Run Code Online (Sandbox Code Playgroud)

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

在 PHP 方面,如果启用了魔术引号,您唯一可能想做的就是删除斜杠:

if (get_magic_quotes_gpc())
    $var = stripslashes($_POST['var']);
else
    $var = $_POST['var'];
Run Code Online (Sandbox Code Playgroud)

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

  • @Silver89 最好将真实的、规范的数据存储在数据库中。它有助于将数据用于其他用途,例如您可能想稍后处理数据。另外,您的想法并没有真正解决任何问题,因为现在您可能会忘记对输入进行编码,然后在数据库中进行不同的编码。 (4认同)

You*_*nse -4

So that:- &
becomes:- &amp;
becomes:- &amp;amp;
becomes:- &amp;amp;amp;
Run Code Online (Sandbox Code Playgroud)

你完全错了。尝试一下看看

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