2

我经营自己编写的网站(有点像社交网络)。我允许成员互相发送评论。在评论中;我接受评论,然后在将其保存到数据库之前调用此行。

$com = htmlentities($com);

当我想显示它时;我称这段代码..

$com = html_entity_decode($com);

这在大多数情况下都很有效。它允许用户复制/粘贴 youtube/imeem 嵌入代码并互相发送视频和歌曲。它还允许他们将图像上传到 photobucket 并复制/粘贴嵌入代码以发送图片评论。

我遇到的问题是,有些人基本上也在那里放入了 javascript 代码,这些代码往往会做一些讨厌的事情,例如打开警报框、更改网页的位置等等。我正在尝试找到一个好的解决方案来解决这个问题一劳永逸。其他网站如何允许这种功能?

感谢您的反馈意见

4

5 回答 5

8

第一:htmlentities或者只是htmlspecialchars应该用于转义嵌入到 HTML 中的字符串。当您将它们插入 SQL 查询时,您不应该使用它来转义字符串 - 使用mysql_real_escape_string(For MySql) 或更好的是 - 使用具有绑定参数的准备好的语句。当您手动转义字符串时,请确保magic_quotes以其他方式关闭或禁用它。

第二:当你再次拉出它们时,你不会松开它们。例如。没有mysql_real_unescape_string。而且你也不应该使用stripslashes——如果你发现你需要,那么你可能打开了magic_quotes——而是将它们关闭,并在继续之前修复数据库中的数据。

第三:您正在做的事情html_entity_decode完全使htmlentities. 现在,您绝对无法防止恶意用户将代码注入您的站点(您很容易受到跨站点脚本的攻击。XSS)。嵌入到 HTML 上下文中的字符串应使用htmlspecialchars(或htmlentities) 进行转义。如果您绝对必须将 HTML 嵌入到您的页面中,则必须首先通过清理解决方案运行它。strip_tags这样做 - 在理论上 - 但在实践中它是非常不充分的。我目前知道的最好的解决方案是HtmlPurifier。但是,无论您做什么,让随机用户将代码嵌入您的站点总是有风险的。如果可能,请尝试将您的应用程序设计为不需要它。

于 2009-02-10T21:46:54.597 回答
3

我非常希望您在将数据发送到数据库之前对其进行清理。听起来您是SQL 注入攻击的主要目标。我知道这不是你的问题,但这是你需要注意的事情。

于 2009-02-10T20:47:29.950 回答
1

是的,这是一个问题。许多网站只允许在用户字段中使用自己的自定义标记来解决这个问题。

但是如果你真的想允许 HTML,你需要清除所有的“脚本”标签。我相信有可用的图书馆可以做到这一点。但这应该足以防止 JS 在用户输入的代码中执行。

于 2009-02-10T20:47:12.243 回答
0

我认为,这就是Stackoverflow 在RefacterMyCode上的做法。

于 2009-02-10T20:49:31.630 回答
0

您可能需要考虑Zend Filter,它提供的不仅仅是 strip_tags ,而且您不必包含整个 Zend 框架即可使用它。

于 2009-02-10T20:50:59.427 回答