Php 除特定标签外的条形标签<;span>-s

Php 除特定标签外的条形标签<;span>-s,php,jquery,handlebars.js,Php,Jquery,Handlebars.js,我有点困在这里了。我不知道哪种方法是最好和最安全的。我正在使用RESTAPI和handlebar.js 上下文:我有用户生成的内容,看起来可能如下所示: <span class="user-link" data-id="12345" user-id="67890"> Name </span> Blablabla my comment <script> alert("malicious"); </script> blabl

我有点困在这里了。我不知道哪种方法是最好和最安全的。我正在使用RESTAPI和handlebar.js

上下文:我有用户生成的内容,看起来可能如下所示:

<span class="user-link" data-id="12345" user-id="67890">
    Name    
</span>
Blablabla my comment 
<script>
    alert("malicious");
</script> 
blabla 
<b>bold</b>
<span onclick='window.location("http://maliciouswebsite");'>
    bla
</span>

名称
废话我的评论
警惕(“恶意”);
布拉布拉
大胆的
布拉
目标:在向API发布帖子时,我希望能够剥离(或编码?)所有HTML标记,除了
[…]
标记,因为我希望在注释列表中将其呈现为纯HTML。其他任何内容都应采用HTML编码并显示为文本。在任何恶意插入的情况下,我还希望删除任何类型的事件(如span标记上的“onclick”),只保留我的“data id”和“user id”属性

问题:我的方法应该是什么?我完全知道HTML上的正则表达式非常不受欢迎。我应该使用
[…]
BBCode吗?或者我应该贴一些简单的正则表达式?我应该使用JS还是PHP?如何安全地呈现文本

非常感谢你抽出时间!任何提示/链接都会非常有用。

我的建议如下

  • 您可以限制客户端上允许的输入

    • 与其允许发送HTML,不如限制输入并减少:bbcode或markdown
    • handlebar.SafeString()
      -ref
  • 在服务器端应用输入验证

  • 在服务器端应用输入验证和筛选
    • 请参见下面的条带标记,按白名单、黑名单过滤
  • 永远不要忘记,只有Chuck Norris可以用正则表达式解析HTML

主要主题是输入用户输入的“输入过滤和验证”

您询问了“最佳实践”或“如何处理此问题”

其描述如下:

对于许多web应用程序来说,仅仅转义HTML是不够的。你可能 要完全删除任何HTML,或允许HTML的一小部分吗 通过为此,请使用HTML净化器

但对于复杂的HTML来说,速度非常慢。考虑设置一个缓存解决方案来存储经过消毒的结果以供以后使用。 在最后一个链接之后,您可以找到一个使用HTML净化器的代码示例。净化器使用HTML标记白名单/黑名单方法。它的速度很慢,因为过滤是一项复杂的任务

还有其他工具:


当您将允许的输入限制为标记时,您可以使用标记解析器来准备输出。这仍然会解析整个输入,但比应用白名单/黑名单净化更快。

与其围绕这个问题进行讨论,为什么不将编辑器更改为不允许HTML?您可以使用markdown使用一组受限的UI选项(类似于SO的工作方式)格式化站点,然后在服务器端将其转换为有效的HTML。嘿,谢谢您的输入。我对你的建议考虑了很久,我想我可以解决这个问题,但我仍然面临一个问题;我需要“数据id”和“用户id”属性。实际上,我正在使用一个类似于SO的系统,在这里我键入“@”字符,它给我名称的建议,我选择一个,然后将它附加到我的contentEditable DIV。据我所知,将“@”的值(用户名)与其用户id相关联是我只能从生成的HTML(HTML)中获取的东西在contentEditable分区中。我真的不知道SO/FB是如何做到的。。。