Javascript 如何从内容提交中去除恶意HTML(XXS等)?
我有一个内容提交表单,其中包含多个输入字段,所有字段在提交时都直接输入数据库。当请求此内容时,将打印它 我意识到这是一个安全问题Javascript 如何从内容提交中去除恶意HTML(XXS等)?,javascript,html,webforms,web,Javascript,Html,Webforms,Web,我有一个内容提交表单,其中包含多个输入字段,所有字段在提交时都直接输入数据库。当请求此内容时,将打印它 我意识到这是一个安全问题 如何在仍然允许格式化标记(b,I等)的情况下,仅剥离恶意HTML(XSS)?使用mysql\u stripslashes()、htmlspecialchars()和urldecode(),对于整数值,您可能只需int-typecast即可。严格定义哪个“无辜”您将允许的html标记-如或。然后运行一个正则表达式,只接受你想要的,而拒绝所有其他的。我认为对输入进行编码会
如何在仍然允许格式化标记(
b
,I
等)的情况下,仅剥离恶意HTML(XSS)?使用mysql\u stripslashes()、htmlspecialchars()和urldecode(),对于整数值,您可能只需int-typecast即可。严格定义哪个“无辜”您将允许的html标记-如
或
。然后运行一个正则表达式,只接受你想要的,而拒绝所有其他的。我认为对输入进行编码会有帮助
对于PHP,我认为它是:
htmlspecialchars
有几种方法可以解决这个问题 首先,让我们明确一点:要以安全的方式实现这一点,不能用javascript实现,只能在服务器端实现-使用javascript安全地实施输入卫生注定会失败
和&
应更改为
,
和&代码>分别为
如果允许用户编辑文本,这是最好的方法,因为您实际上并不更改存储中的文本,您可以让用户通过textarea
存储用户生成的数据时,对组成html的字符进行编码
执行与上面相同的操作,但在将数据存储到数据库之前执行此操作
这对性能有好处,因为您不需要在每次输出时对其进行编码,但它不会让用户编辑未修改的文本,这可能是一个严重的缺点,具体取决于您正在构建的内容
在输出或存储之前去除字符
在输出或存储之前去除
字符-我认为这不是一个很好的解决方案,因为这是对用户输入的不必要的更改,但有些人更喜欢它。首先在输入上运行htmlspecialchars
,然后为允许的标记撤消它(例如,将b
替换为
)。是正确的…您需要显式地允许某些标记。但问题是,输入可能到处都是,因此您需要使用类似于库的方法将其放入一个位置,然后您可以在该位置删除已清理的文档
您应该使用HTML-Tidy
清理您的输入并使其进入投诉状态,这样您就可以显式地允许某些标记。在永久存储已清理内容之前,应删除其中的所有内容。(注意:出于性能原因,请勿将blob存储在数据库中,请将它们存储在文件系统中,并使用安全位置(不在web根目录中的位置)中的文件路径链接到它们)
祝你好运。假设你实际使用了正确的数据库访问(使用占位符!!!,并且实现没有中断)和正确的呈现(例如,为输出上下文转义),那么…什么都没有!但是对于大多数[PHP]开发来说,这些都是一个很大的假设:-/而我不是说“不要清理输入”(根据业务规则,应该将其过滤到可接受的数据范围),我要指出的是,如果您依靠净化技术“确保代码安全”,那么需要首先(或同时)解决其他设计问题。请使用经验证的库。至于“存储HTML并在以后将其推入页面”:请小心--如果您确实明确接受标记而不是限制标记,并使用库来执行此操作。我将存储/使用一种保证安全的标记格式,并且不允许所有直接HTML构造(并使用库来执行此操作)。例如,StackOverflow似乎正在使用某种形式的扩展。库还应注意生成有效的HTML标记。不平衡的标记确实会破坏页面呈现。如果您从未为此使用过正则表达式,您将起诉xml解析器,否则您将面临严重的失败。