Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/419.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何从内容提交中去除恶意HTML(XXS等)?_Javascript_Html_Webforms_Web - Fatal编程技术网

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安全地实施输入卫生注定会失败

  • 输出用户生成的数据时,对组成html的字符进行编码
  • 当用户生成的数据输出到您的网页上时,请更改一些字符以使其安全。即字符
    &
    应更改为
    &分别为

    如果允许用户编辑文本,这是最好的方法,因为您实际上并不更改存储中的文本,您可以让用户通过
    textarea

  • 存储用户生成的数据时,对组成html的字符进行编码
  • 执行与上面相同的操作,但在将数据存储到数据库之前执行此操作

    这对性能有好处,因为您不需要在每次输出时对其进行编码,但它不会让用户编辑未修改的文本,这可能是一个严重的缺点,具体取决于您正在构建的内容

  • 在输出或存储之前去除字符

  • 在输出或存储之前去除
    字符-我认为这不是一个很好的解决方案,因为这是对用户输入的不必要的更改,但有些人更喜欢它。

    首先在输入上运行
    htmlspecialchars
    ,然后为允许的标记撤消它(例如,将
    b
    替换为
    )。

    是正确的…您需要显式地允许某些标记。但问题是,输入可能到处都是,因此您需要使用类似于库的方法将其放入一个位置,然后您可以在该位置删除已清理的文档

    您应该使用
    HTML-Tidy
    清理您的输入并使其进入投诉状态,这样您就可以显式地允许某些标记。在永久存储已清理内容之前,应删除其中的所有内容。(注意:出于性能原因,请勿将blob存储在数据库中,请将它们存储在文件系统中,并使用安全位置(不在web根目录中的位置)中的文件路径链接到它们)


    祝你好运。

    假设你实际使用了正确的数据库访问(使用占位符!!!,并且实现没有中断)和正确的呈现(例如,为输出上下文转义),那么…什么都没有!但是对于大多数[PHP]开发来说,这些都是一个很大的假设:-/而我不是说“不要清理输入”(根据业务规则,应该将其过滤到可接受的数据范围),我要指出的是,如果您依靠净化技术“确保代码安全”,那么需要首先(或同时)解决其他设计问题。请使用经验证的库。至于“存储HTML并在以后将其推入页面”:请小心--如果您确实明确接受标记而不是限制标记,并使用库来执行此操作。我将存储/使用一种保证安全的标记格式,并且不允许所有直接HTML构造(并使用库来执行此操作)。例如,StackOverflow似乎正在使用某种形式的扩展。库还应注意生成有效的HTML标记。不平衡的标记确实会破坏页面呈现。如果您从未为此使用过正则表达式,您将起诉xml解析器,否则您将面临严重的失败。