如何安全地允许嵌入内容?

时间:2009-02-10 20:43:58

标签: php javascript html web

我自己编写了一个网站(有点像社交网络)。我允许成员互相发送评论。在评论中;我接受评论,然后在将其保存在db ..

之前调用此行
$com = htmlentities($com);

当我想要显示它时;我把这段代码叫做..

$com = html_entity_decode($com);

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

我遇到的问题是,有些人基本上都会在那里放入javascript代码,这往往会产生令人讨厌的东西,例如打开警报框,更改网页的位置以及类似的东西..我正在努力找到一个好的一劳永逸地解决这个问题的解决方案..其他网站如何允许这种功能?

感谢您的反馈

5 个答案:

答案 0 :(得分:8)

首先:htmlentitieshtmlspecialchars应该用于转义嵌入HTML的字符串。将它们插入SQL查询时,不应该使用它来转义字符串 - 使用mysql_real_escape_string(For MySql)或更好 - 使用prepared statements,它们具有绑定参数。当您手动转义字符串时,请确保关闭或禁用magic_quotes

第二:当你再把它拉出来时,你不会忘记它们。例如。没有mysql_real_unescape_string。你不应该使用stripslashes - 如果你发现你需要,那么你可能已经打开了magic_quotes - 转而关闭它们,并在继续之前修复数据库中的数据。

第三:您使用html_entity_decode执行的操作会完全取消htmlentities的预期用途。现在,您绝对无法防止恶意用户将代码注入您的网站(您很容易受到跨网站脚本攻击,即XSS)。您嵌入到HTML上下文中的字符串应使用htmlspecialchars(或htmlentities)进行转义。如果您绝对 将HTML嵌入到页面中,则必须首先通过清理解决方案运行它。 strip_tags这样做 - 理论上 - 但实际上它是非常不合适的。我目前所知道的最佳解决方案是HtmlPurifier。但是,无论您做什么,让随机用户将代码嵌入您的网站始终存在风险。如果可能的话,尝试设计您的应用程序,使其不需要。

答案 1 :(得分:3)

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

答案 2 :(得分:1)

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

但如果您真的想要允许HTML,则需要清除所有“脚本”标记。我相信有可用的库可以做到这一点。但这足以阻止用户输入代码中的JS执行。

答案 3 :(得分:0)

This is how我认为Stackoverflow会在RefacterMyCode完成它。

答案 4 :(得分:0)

您可能需要考虑Zend Filter,它提供的不仅仅是strip_tags,您不必包含整个Zend Framework来使用它。