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

标签 php javascript html web

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

$com = htmlentities($com);

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

$com = html_entity_decode($com);

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

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

感谢您的反馈

最佳答案

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

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

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

关于php - 如何安全地允许嵌入内容?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/534121/

相关文章:

php - WordPress:用 span 包裹 li 内容

javascript - 如果输入特殊文本,则删除文本区域中的值

javascript - MomentJS 错误输出

html - flex-grow 不适用于图像

javascript - 如何让div停止相互重叠

php - 使用 IOS 解析基本的 JSON

php - 使用脚本将照片上传到 instagram

php - 从其他3个Docker容器访问MySQL

javascript - 将函数引用传递给函数失败

jquery - 如何使 Bootstrap 图像和 div 扩展到浏览器的宽度