Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/html/78.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
如何在用户生成的HTML中防止Javascript注入攻击_Javascript_Html_Regex_Parsing_Code Injection - Fatal编程技术网

如何在用户生成的HTML中防止Javascript注入攻击

如何在用户生成的HTML中防止Javascript注入攻击,javascript,html,regex,parsing,code-injection,Javascript,Html,Regex,Parsing,Code Injection,我正在保存用户提交的HTML(在数据库中)。我必须防止JavaScript注入攻击。我见过的最有害的是style=“expression(…)”中的JavaScript 除此之外,相当数量的有效用户内容将包括特殊字符和XML结构,因此如果可能,我希望避免使用白名单方法。(列出每个允许的HTML元素和属性) JavaScript攻击字符串的示例: 一, 有没有一种方法可以阻止这种JavaScript,而让其余的保持不变 到目前为止,我唯一的解决方案是使用正则表达式删除某些模式。它解决了案例1,但

我正在保存用户提交的HTML(在数据库中)。我必须防止JavaScript注入攻击。我见过的最有害的是
style=“expression(…)”
中的JavaScript

除此之外,相当数量的有效用户内容将包括特殊字符和XML结构,因此如果可能,我希望避免使用白名单方法。(列出每个允许的HTML元素和属性)

JavaScript攻击字符串的示例:

一,

  • 有没有一种方法可以阻止这种JavaScript,而让其余的保持不变

    到目前为止,我唯一的解决方案是使用正则表达式删除某些模式。它解决了案例1,但没有解决案例2

    该环境本质上是Microsoft堆栈:

    • SQL Server 2005
    • C#3.5(ASP.NET)
    • JavaScript和jQuery
    我希望阻塞点是ASP.NET层——任何人都可以创建一个糟糕的HTTP请求

    编辑 谢谢大家的链接。假设我可以定义我的列表(内容将包括许多数学和编程结构,因此白名单将非常烦人),我仍然有一个问题:

    什么样的解析器允许我删除“坏”部分?坏的部分可能是一个完整的元素,但是那些驻留在属性中的脚本呢?我不能随意删除

    你认为就这样吗

    不管你采取什么方法,你肯定需要使用一个白名单。这是唯一一种接近安全的方法,你可以在你的网站上允许什么

    编辑


    不幸的是,我不熟悉.NET,但您可以查看stackoverflow自己与XSS()的斗争,以及为解析此网站上发布的HTML而编写的代码:-显然,您可能需要更改这一点,因为您的白名单更大,但这应该让你开始了。

    元素和属性的白名单是我认为唯一可以接受的选择。任何不在白名单上的内容都应该删除或编码(将&“更改为实体)。此外,请确保检查您允许的属性中的值


    如果你不这样做,你就会暴露出问题——已知的漏洞或将来会发现的漏洞。

    你使用的服务器端代码是什么?这取决于有多少种方法可以过滤出恶意脚本,但这是一个危险的领域。即使是经验丰富的专业人员也会被发现:

    基本上,正如Paolo说,你应该关注用户可以做什么,而不是试图过滤掉他们不应该做的事情

    保留一个允许的HTML标记列表(如b、i、u…)并过滤掉所有其他内容。您可能还希望删除允许的HTML标记的所有属性(例如,因为您的第二个示例)


    另一个解决方案是引入所谓的BB代码,这是许多论坛使用的。它的语法与HTML相似,但首先是允许代码的白名单,然后将其转换为HTML。例如,[b]example[/b]将导致示例。请确保在使用BB代码之前仍然过滤掉HTML标记。

    唯一真正安全的方法是使用白名单。对所有内容进行编码,然后将允许的代码转换回来


    我看到过一些相当高级的尝试,只禁止危险代码,但它仍然不能很好地工作。尝试安全地捕获任何人都能想到的东西是相当了不起的,而且它很容易对一些根本不危险的东西进行恼人的替换。

    您可以使用此限制功能

    功能限制(elem){
    var tf=Um(elem);
    var rx=新的RegExp;
    如果(元素==“电子邮件”){
    rx=/['”]/gi;
    }else if(元素==“搜索”| |元素==“注释”){
    rx=/[^a-z 0-9.,?]/gi;
    }否则{
    rx=/[^a-z0-9]/gi;
    }
    tf.value=tf.value.replace(rx,“”);
    }
    
    目前最好的选择是使用如下标题:

    Content-Security-Policy: default-src 'self';
    
    这将阻止加载内联和外部脚本、样式、图像等,因此浏览器将仅加载和执行来自同一来源的资源


    但是,它在旧浏览器上不起作用。

    谢谢,我实际上将该网站用作测试平台。我已经成功地删除了任何看起来像的内容,所以我需要得到那些不。。。也就是说,expression:、javascript:、vbscript:等等。你能推荐一个能做到这一点的解析器吗?如果你的方法是删除危险的东西,那么你的代码将容易被注入。唯一安全的方法是有一个特别允许的元素和属性的白名单。谢谢你的反馈。我担心白名单就是答案杰夫,试试这个字符串:
    。耶,XSS!黑名单不起作用。不管你的白名单长不长,都没有办法将其列入黑名单。如果你想阅读更多关于这方面的文章,OWASP网站会有很大帮助。请在这里解释一下白名单是什么,以及它是如何操作/删除不好的东西的?我担心内容将包括许多数学和编程结构(XML、C#等),所以我很想避免白名单。我找到了困难的方法。我们现在正在使用转义和白名单。没有任何解释的转储代码只会导致混乱,特别是如果它甚至不起作用:这意味着什么-->
    \uuUm(elem)
    ?这会阻止我们使用CDN吗?@DanielWu是的,但您可以将CDN域或文件哈希白名单
    "Hi, this <b
    style="width:expression(alert('bad!'))">dog</b>
    is black."
    
    Content-Security-Policy: default-src 'self';