1

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

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

4

5 回答 5

2

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

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

编辑

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

例如,您可以直接查询数据WHERE SOME_TEXT LIKE '%<script>%'而不是WHERE SOME_TEXT LIKE '%&lt;script&gt;',因此数据访问更简单。您可以在报告或桌面应用程序等内容上无害地显示数据。而且,如果您在显示端对数据进行编码是一致的,那么您永远不必考虑是否已经在输入端对其进行了编码(这会导致双重编码,非常丑陋),因此您始终可以安全地编码您的输出,无论您是否认为这是一个不安全的数据入口点。

于 2013-03-31T15:28:36.663 回答
2

这正是目的htmlspecialchars()htmlentities()目的。

是的,您绝对应该在将用户提供的数据插入数据库之前对其进行转义。mysql_real_escape_string()将实现这一点,但根据文档上的大红框,以及所有其他mysql_*功能,它已被弃用。您应该考虑改用PDOMySQLi

于 2013-03-31T15:29:31.247 回答
2

虽然现有答案已经提到htmlspecialcharsand htmlentities,但我建议您在存储文本时应用它们,而不是在显示文本时应用它们。这样做的理由是双重的:

  • 如果您(或其他人)稍后在同一数据上添加另一个视图,如果忘记了这一点,您将不会被咬(原则最小惊喜)
  • 您将更频繁地显示数据而不是存储数据,因此您遭受计算损失的次数要少得多。
于 2013-03-31T15:32:55.193 回答
1

使用htmlspecialchars. 这是事实上的“将 html 显示为文本”功能。

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

于 2013-03-31T15:27:31.163 回答
1

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

您可以通过使用 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 实体。

于 2013-03-31T15:29:23.723 回答