Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/394.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 XSS预防_Javascript_Security_Node.js_Xss_Sanitization - Fatal编程技术网

Javascript XSS预防

Javascript XSS预防,javascript,security,node.js,xss,sanitization,Javascript,Security,Node.js,Xss,Sanitization,有一个Node.js项目可以清理数据,还有一个用于JavaScript的OWASP库可以处理清理以防止XSS 我一直在对这些库进行基准测试,它们非常密集,可能有些过分,我的应用程序不需要任何动态HTML(由用户提交、bbtags或其他任何东西,根本不需要),所以为什么不这样做: 禁用“”字符,不要替换它们或任何东西,只需禁用它们,如果用户提交这些字符,则向它们发出警告,说明这些字符已被禁用(客户端和服务器端验证) &=>& “=>” ”=>&x27 /=>/ 对提交的URL进行编码(获取参

有一个Node.js项目可以清理数据,还有一个用于JavaScript的OWASP库可以处理清理以防止XSS

我一直在对这些库进行基准测试,它们非常密集,可能有些过分,我的应用程序不需要任何动态HTML(由用户提交、bbtags或其他任何东西,根本不需要),所以为什么不这样做:

  • 禁用“
    ”字符,不要替换它们或任何东西,只需禁用它们,如果用户提交这些字符,则向它们发出警告,说明这些字符已被禁用(客户端和服务器端验证)
  • &
    =>
    &
  • =>
  • =>
    &x27
  • /
    =>
    /
  • 对提交的URL进行编码(获取参数等)
  • 本文介绍了基于DOM的XSS,因为我的应用程序使用HTML5 PushState,并且后端与前端完全分离
  • 这是否足以保护我自己,正如我所说,我的应用程序不需要用户提交任何HTML,因此我根本不需要
    标记

    感谢所有反馈,这是我现在使用的:

    var pattern = /<(.*)>/;
    
    function hasHtmlTags(string) {
        return pattern.test(string);
    };
    
    if (hasHtmlTags(userData)) {
        // Do something?
    } else {
        // Create entity.
    }
    
    var模式=/;
    函数hasHtmlTags(字符串){
    返回模式.test(字符串);
    };
    if(hasHtmlTags(userData)){
    //做点什么?
    }否则{
    //创建实体。
    }
    

    因此用户仍然可以使用他们的表情:<等等,并且只有在找到<和>的组合时才会触发该功能。所以没有昂贵的正则表达式之类的,只要组合禁用,我们就可以了。

    这里是一个通用的编码过程:

    var lt = /</g, 
        gt = />/g, 
        ap = /'/g, 
        ic = /"/g;
    value = value.toString().replace(lt, "&lt;").replace(gt, "&gt;").replace(ap, "&#39;").replace(ic, "&#34;");
    
    var lt=/g,
    ap=/'/g,
    ic=/“/g;
    value=value.toString().replace(lt,“”).replace(gt,”).replace(ap,“';”).replace(ic,“";”);
    

    如果您的用户没有向服务器提交任何内容,则您甚至不需要上述内容。如果用户提交了内容,而您正在使用用户输入,则上述内容应该是安全的。只要对“”进行了全局清理,并且括号也被清除,您就可以继续使用。

    为什么不在将数据发送到客户端之前使用
    encodeURIComponent

    var string="<script>...</script>";
    string=encodeURIComponent(string); // %3Cscript%3E...%3C/script%3
    
    var string=“…”;
    string=encodeURIComponent(string);/%3Cscript%3E…%3C/脚本%3
    
    考虑

    以下是他们建议的实施情况:

    function escapeOutput(toOutput){
        return toOutput.replace(/\&/g, '&amp;')
            .replace(/\</g, '&lt;')
            .replace(/\>/g, '&gt;')
            .replace(/\"/g, '&quot;')
            .replace(/\'/g, '&#x27')
            .replace(/\//g, '&#x2F');
    }
    
    函数转义输出(toOutput){
    返回到输出。替换(/\&g,&;'))
    .替换(/\/g'')
    .替换(/\“/g,”))
    .替换(/\'/g''')
    .替换(//\//g,/');
    }
    
    还要确保只有在必要时才使用此功能,否则可能会损坏某些东西

    但我建议您看看已经制作的用于sanatizing输出的库:


    您可以使用以下函数

     function htmlEncode(str){
      return String(str).replace(/[^\w. ]/gi, function(c){
         return '&#'+c.charCodeAt(0)+';';
      });
    }
    
    然后,您将按如下方式使用此函数:

    <script>document.body.innerHTML = htmlEncode(untrustedValue)</script>
    
    <script>document.write('<script>x="'+jsEscape(untrustedValue)+'";<\/script>')</script> 
    
    然后,您将按如下方式使用此函数:

    <script>document.body.innerHTML = htmlEncode(untrustedValue)</script>
    
    <script>document.write('<script>x="'+jsEscape(untrustedValue)+'";<\/script>')</script> 
    
    document.write('x=“”+jsEscape(不可信值)+'”;'))
    

    更多信息:

    我明白了,但用户通常不会使用它,如果他们这样做,它们就不是必需的。所以我想,为什么不省去多余的功能并禁用它们。这应该足够了,.too
    +1
    来澄清问题。如果答案没有错,就没有理由否决。如果有更好的答案,他们将被否决。答案是这是错误的。如果有人输入
    ,他们不希望它被呈现为
    %3Cscript%3E…%3C/script%3
    。它会将特殊字符转换为行噪波。您可以通过完全丢弃所有输入来防止XSS,但这并不能解决问题。谢谢@RASG!@Quentin;是的,如果您有一个内联编辑器,这将有助于解决问题是这样的。但这不仅仅是Ineracon的问题。这是关于XSS的。因此,他想阻止userA编写在userB上执行的脚本。如果他在向userB发送HTML时使用encodeURI,那将是“丑陋”的。是的,但userB会看到它……就像你会按照公认的答案用HTML实体替换它们一样。关于“丢弃所有输入“。他还可以关闭网站以防止XSS;”@rahil471这不是重点,因为即使数据本身看起来很奇怪,用户也会将其视为
    星期一10
    。用户确实会向服务器提交内容,只是没有“”字符。如果对它们进行消毒是解决办法,为什么会有一整张OWASP备忘单@OnlineRacon-请参阅备忘单的内容owasp备忘单涵盖XSS的所有可能方案。如果您没有在标记的定义(而不是内容)或脚本标记中输出数据,那么您可以省略大量数据。@KonstantinD Infrastics我更新了我的答案,请检查它。@OnlineRacon您应该对您所拥有的一切都满意。