【发布时间】:2021-02-24 09:36:20
【问题描述】:
我有一个用户表单,我让用户可以在文本区域中输入文本并稍后更改文本。
这是我的 HTML 文本区域示例:
<textarea class="form-control" rows="4" name="answer_text" type="text">
<?php echo strip_tags(nl2br(htmlspecialchars($answers['answer_text']))); ?>
</textarea>
- 文本输入:
"This is text"。
- 文本输出(回显):
&quot;This is text&quot;.
- 所需/预期输出:
"This is text"。
为了避免<br> 在我使用的回声中:strip_tags()
要显示换行符,我使用:nl2br()
出于安全原因,我使用htmlspecialchars()
但是,如果用户在他的文本中使用引号(“或”),我会在我的文本回显中得到&quot;。我可以通过删除htmlspecialchars() 来解决这个问题,但我认为在这里使用它很重要。有没有机会得到正确的输出意味着显示的引号而不是&quot;?
编辑:
我使用了两次htmlspecialchars()。一次是在通过$_POST = htmlspecialchars($value) 获取用户输入值以将其发送到表中,第二次是在 HTML 回显期间,如上所示。
正如@Cbroe 所解释的,问题的发生是因为数据被编码了两次。初始它 " 首先变成了 "e;然后,在第二次编码期间,那个 & 变成了 &amp;。
在我的情况下,正确的方法是在 SQL INSERT 或 UPDATE 期间不使用 htmlspecialchars()(我正在使用 PDO 准备好的语句),并且根据情况在 HTML 回显期间仅使用 htmlspecialchars()。
【问题讨论】:
-
为什么你认为你需要 htmlspecialchars ?
-
可能是我误解了该功能,但需要避免用户将一些代码带入我的数据库(SQL 注入)。文本是使用 PHP PDO Query 插入的。
-
您也可以改为通过 PDO 准备数据
-
当然,使用 htmlspecialchars 是有道理的,当您实际创建 HTML 输出时 - 您正在执行的代码中显示的代码。想象一下会发生什么,如果我在这个表单中输入的 text 是
foobar </textarea> baz,那么如果你 not 应用任何表单,那么生成的 HTML 代码会是什么样子逃跑? -
不,这不是“好”,这完全是错误的方式。在数据库插入部分使用它一开始就是错误的。
标签: php html textarea echo htmlspecialchars