繁体   English   中英

哪个XSS OWASP规则

[英]Which XSS OWASP Rule

使用OWASP核对表,这是正确的方法来保护这种情况吗? 这是一个javascript字符串中的url,其中url参数需要具有xss保护。

问题:

<script>
    var u = 'xyz.html?x=<% url.baddata %>'  
    dosomeAjax(u);
</script>

可能解决方案1:

var u = 'xyz.html?x=<% encodeForURL(url.baddata) %>'

可能解决方案2:

var u = 'xyz.html?x=<% encodeForJavaScript(url.baddata) %>'  

可能解决方案3:

var u = 'xyz.html?x=<% encodeForJavaScript(encodeForURL(url.baddata)) %>'  

应使用解决方案3:

//solution 3:
var u = 'xyz.html?x=<% encodeForJavaScript(encodeForURL(url.baddata)) %>';

如果我们将表达式重写为:更容易看出这是正确的:

var u = '<% encodeForJavaScript("xyz.html?x=" + encodeForURL(url.baddata)) %>';

首先,我们通过使用适当的转义函数将baddata附加到字符串常量来创建一个安全的URL。 然后我们将这个安全的URL放在JavaScript字符串中,因此我们必须调用JavaScript转义函数。

我将回答我自己的问题。 在一遍又一遍地使用这种情况后,解决方案非常明显,原因也是如此。

首先:任何插入javascript的字符串都必须是javascript安全的。 无论如何,这总是需要发生:

<script>
  var x = "<% encodeForJavaScript(someCrazyString) %>";
</script>

这个目标是安全的。 由于这是javascript代码,请将其视为javascript - 这不是网址,因此网址编码不正确。

现在,如果要在URL中使用x ,则需要将其编码为url。

唯一的事情是x现在是一个javascript字符串。 因此,服务器端编码是不可能的,因为字符串已被推出中间层,现在正在浏览器中生存和呼吸。

解决方案是使用javascript的url编码函数: encodeURIComponentz()

<script>
  var x = "<% encodeForJavaScript(someCrazyString) %>";
  x = x + '234'
  var url = 'http://localhost/abc.cfm?x=' + encodeURIComponent(x)
</script>

没有理由使用2个服务器端XXS编码功能。 始终使用单个服务器端编码函数,并为上下文使用正确的服务器端函数:

网址:

<a href="xyz.jsp?x=<% encodeForURL(someString) %>" target="_blank" >click here</a>

JS:

 <script>
   var x = "<% encodeForJavaScript(someCrazyString) %>";
 </script>

JSON:

 <script>
   var x = {"x"  : "<% encodeForJSONinJS(someCrazyString) %>"};
 </script>

更新(几年后)

执行2个服务器端编码将获得与在服务器上编码一次和在客户端中编码一次相同的结果。 因此,当且仅当var u保留在url范围内时,解决方案3才是正确的。

进行2次服务器端编码的危险在于,您只能在首次编码的上下文中使用该代码段。

以上面的示例为例,再添加1行:

 <script>
     var u = 'xyz.html?x=<% encodeForJavaScript(encodeForURL(url.baddata)) %>
     dosomeAjax(u);
     document.getElementById('someDivTag').innerHTML= u;
 </script>

现在有问题,因为你是url编码而不是html编码。 (在这种特殊情况下,这不会呈现xss可变性,因为您不能将url编码的字符串分解为js作用域 - 尽管如此,还有许多其他情况需要将字符串编码为2x)。

为了灵活性,我的首选是在服务器上编码一次,并根据需要在客户端编码:

 <script>
     var x = "<% encodeForJavaScript(someCrazyString) %>";
     var u = 'http://localhost/abc.cfm?x=' + encodeURIComponent(x)
     dosomeAjax(u);
     document.getElementById('someDivTag').innerHTML= u.toHtml();
 </script>

toHtml()是:

    var __entityMap = {
            "&": "&amp;",
            "<": "&lt;",
            ">": "&gt;",
            '"': '&quot;',
            "'": '&#39;',
            "/": '&#x2F;'
    };

    String.prototype.toHtml = function() {
            return String(this).replace(/[&<>"'\/]/g, function (s) {  
                    return __entityMap[s];
            });
    }

我正在检查Cheran Shunmugavel的答案是否正确。

var u = 'xyz.html?x=<% encodeForURL(encodeForJavaScript(url.baddata)) %>' 

EncodeForURL应该是最后一个。

<插入强制性”的评价很糟糕,你在想什么? >

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM