我应该如何阻止HTML将用户输入的文本解释为实体?

时间:2017-09-12 16:41:37

标签: javascript php html

我有一个用户并输入文字的网站。用户输入了一些东西&#34;我使用#3&amp;#4阀门&#34;进入<input>。该文本存储在数据库中,并显示在其他地方的屏幕上。我的问题是&#34;&amp;#4&#34;被解释为HTML实体或特殊字符,我希望它按字面解释。

我是否需要使用Javascript从&转义<input>?我希望<pre>可以工作,但它也将文本解释为代码。同样,这是用户输入的文本。

例如,当我运行下面的代码时,<input>会显示与<p>不同的文字。我希望<p>能够准确显示<input>显示的内容。

<html>
<body>
<input id="box">
<p id="para"></p>
</body>
<script>
    document.getElementById("box").value = "something #3&#4";
    document.getElementById("para").innerHTML = "something #3&#4";
</script>
</html>

Fiddle

修改

我意识到我需要客户端解决方案和服务器端解决方案。在一个显示用户输入文本的地方,我使用的是Javascript&#39; .innerHTML,而在另一个网页上,我用PHP echo来使用它。

5 个答案:

答案 0 :(得分:1)

<强> Working fiddle

尝试使用以下方法之一( innerText textContent )将内容附加为文本而不是HTML,例如:< / p>

document.getElementById("para").innerText = "something #3&#4";
document.getElementById("para").textContent = "something #3&#4";

注意:如果是服务器端显示,您可以使用htmlentities($content)

希望这有帮助。

document.getElementById("para").textContent = "something #3&#4";
<p id="para"></p>

答案 1 :(得分:1)

我认为你真正的问题是缺乏服务器端过滤。鉴于您遇到了这个问题,我似乎很可能根本不进行任何服务器端输入过滤/清理,这意味着您也容易受到XSS <的攻击/ p>

在服务器端,您应该清理返回给客户端的所有内容,其中包括剥离HTML标记(如果人们尝试发送HTML标记,还会在保存时返回错误)以及替换html特殊字符(见htmlspecialchars)。后者会将您的&转换为&amp;,这将产生您想要的最终结果:您的HTML不会被解释为HTML特殊字符。

使用javascript客户端修复此问题的一个问题是,您不仅需要在任何地方进行此操作,而且如果有相同输出显示在其中的情况下,您还必须记住以不同的方式执行此操作。 HTML文档本身,即不通过javascript显示。

简而言之,在用户数据返回浏览器之前建立一个连贯(彻底)的方法来清理用户数据将解决您的问题并提供第一层保护,防止大量恶意攻击。

答案 2 :(得分:0)

您需要停止将其作为HTML进行操作,因为如果您明确地执行此操作,文本将成为代码。在您的示例的略微修改版本中,请比较:

&#13;
&#13;
Array
(
    [0] => 1x
    [1] => 1x
    [2] => 2x
)
&#13;
var txt = "one <strong>two</strong>";
document.getElementById("box").value = txt;
document.getElementById("para1").innerHTML = txt;
document.getElementById("para2").innerText = txt;
&#13;
&#13;
&#13;

(在<input id="box"> <p id="para1"></p> <p id="para2"></p>的情况下,只有一个选项,因为该元素首先不能包含HTML。)

答案 3 :(得分:0)

使用Copy (Select * From form_submissions) To 'path/to/whatever' With CSV DELIMITER ','; 代替innerText

https://jsfiddle.net/9746ah8s/2/

答案 4 :(得分:-2)

要显示&amp;,您可以替换所有&amp;使用&amp; amp,这样你就会看到#3&amp;#4和'&amp;#4'不会被解释。