我正在创建一个投资组合。我有一个PHP的管理页面设置。我希望用户将内容从管理面板发布到主页面。我可以这样做,但在考虑发布"文本功能的方法时,我有点卡住了。像图像和粗体文字。在HTML中,这很简单。
<img alt="A pretty kitten" src="src/img.png">
但是,在发布内容时让用户使用HTML真的很聪明,如果不是,为什么,还有什么好的选择吗?
答案 0 :(得分:3)
不,让用户在帖子中使用html绝对不是一个好主意。这使您的应用程序容易受到XSS Attacks
的攻击跨站点脚本(XSS)是Web应用程序中常见的一种计算机安全漏洞。 XSS使攻击者能够将客户端脚本注入其他用户查看的网页中。攻击者可能会使用跨站点脚本漏洞绕过访问控制,例如同源策略。
回到你的问题。有几种方法可以解决这个问题,其中一个最简单的解决方案是为HTML使用不同的标记,在用户发布的内容上使用htmlentities()
,然后再将其存储到数据库中。
并且要向用户显示格式化的内容,您可以解析您在HTML变体中制作的标记。
示例用户输入:
<b>This is a normal text</b> [b]and this is a bold text[/b]
通过htmlentities()
函数传递该字符串后,标准HTML <b></b>
标记将被解释为纯文本,并且在显示内容时不会实际加粗文本。
要使句子的第二部分变为粗体,您必须使用将[b][/b]
标记解析为<b></b>
个标记的函数。
以下是如何执行此操作的示例:
function formatString($string) {
$string = preg_replace('/\[b\]/', '<b>', $string);
$string = preg_replace('/\[\/b\]/', '</b>', $string);
return $string;
}
答案 1 :(得分:1)
您可以使用的一个选项是允许用户发布HTML的有限子集。有各种各样的方法,但我最喜欢的是HTML Purifier(没有联盟,只是粉丝),它允许(通过extensive config)只有某些HTML标签,属性等的安全白名单。
即。您可以允许<img src="">
但不允许<img onclick="">
。
答案 2 :(得分:0)
允许任何人向您的网站发布任何HTML,这是一个巨大的风险。他们可以进行跨站点搜索,将用户转发到不适当的页面,包括非法内容等。
正如评论中已经提到的,许多CMS都为此提供了解决方案。如果您不想使用CMS,可能还需要查看BBCode。应该有一些库来解释BBCode和BBCode编辑。此外,不要低估许多用户熟悉这一事实的事实。
BBCode允许用户对其文本进行样式化,发布图像等,但可以防止恶意内容。