如何在页面上将html / javascript代码显示为普通文本

时间:2013-03-31 15:25:59

标签: php xss user-input

在我的应用程序中,用户可以发布他们的状态更新,其中您可能会发布一些代码html / javascript或任何其他脚本,我将其存储在我的数据库中,并在网页上显示,我想在不影响页面的情况下显示此代码,代码应显示为普通文本,在服务器端处理或在客户端加载时不应运行...如何实现此目的?而且我在没有任何处理的情况下存储它,例如mysql_real_escape_string()strip_tags()或任何其他过滤器......是不是对它进行任何处理?有没有与之相关的威胁?如果我应该对它执行任何操作,那么我应该使用哪些函数来更安全,并实现我的目的,即显示用户输入,就像普通/纯文本一样。

更新: 在阅读完所有答案后,我想我应该去阅读有关htmlspecialcharshtmlentities

的更多信息

5 个答案:

答案 0 :(得分:2)

看起来你想要htmlentities。在显示文本时使用它 - 在阅读或存储文本时,您不必做任何特别的事情。

仅供参考:对于您正在显示的用户创建的任何文本,这可能是一个好主意 - 可以防止XSS,CSRF以及所有其他令人讨厌的注入问题。

修改

看起来我在这里投票,但我建议您在存储时不对数据进行编码,而是在显示数据时要小心。它更加一致,同时允许您的数据是纯粹的。

例如,您可以直接查询数据WHERE SOME_TEXT LIKE '%<script>%'而不是WHERE SOME_TEXT LIKE '%&lt;script&gt;',因此数据访问更简单。您可以在报表或桌面应用程序等内容中无害地显示数据。如果你对显示器侧的数据编码保持一致,你就不必考虑是否已经在输入上编码了它(这会导致双重编码,非常难看),所以你可以安全地使用对您的输出进行编码,无论您是否认为这是一个不安全的数据入口点。

答案 1 :(得分:2)

这正是htmlspecialchars()htmlentities()的用途。

是的,你肯定应该在将用户提供的数据插入数据库之前将其转义。 mysql_real_escape_string()将实现此目的,但根据docs上的大红框以及所有其他mysql_*函数,它已被弃用。您应该使用PDOMySQLi代替。

答案 2 :(得分:2)

虽然现有答案已经提及htmlspecialcharshtmlentities,但我建议您在存储文本时应用这些答案,而不是在显示时应用强>文字。这个理由是双重的:

  • 如果您(或其他人)稍后在同一数据上添加另一个视图,如果忘记这一点,您将不会被咬伤(最不可理喻的原则)
  • 您将比存储数据更频繁地显示数据,因此您的计算损失会少得多。

答案 3 :(得分:1)

使用htmlspecialchars。这是事实上的显示html作为文本&#34;功能

mysql_real_escape_string存储起来(实际上你应该使用PDO / mysqli正确的参数化查询)以防止注入,但这不会影响原始数据显示。从数据库中检索时使用htmlspecialchars并准备好显示,而不是在存储时。

答案 4 :(得分:1)

您可以使用<pre><code>标记来显示格式化代码。但是为了防止代码执行而不显示,您需要将文本转换为字符实体。 &GT;变为&gt;,&lt;成为&amp; lt等等。

您可以使用PHP执行此操作,例如:

<?php echo htmlentities('function getSize() {  var myFSO = new
ActiveXObject("Scripting.FileSystemObject");
  var filepath =
document.upload.file.value;   var
thefile = myFSO.getFile(filepath);
  var size = thefile.size;  alert(size
+ " bytes"); }'); ?>

由于您的系统依赖于用户输入,您可能必须依靠AJAX来实际处理用户输入并将其转换为HTML实体。