这XSS OWASP规则(Which XSS OWASP Rule)

2019-09-17 02:05发布

使用OWASP清单,这是正确的方式保护这种情况呢? 这是一个URL参数需要有XSS保护JavaScript字符串的URL里面。

问题:

<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)) %>'  

Answer 1:

方案三,应使用:

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

这是比较容易看到,如果我们重写表达,这是正确的:

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

首先,我们通过附加创建一个安全的URL baddata到字符串常量,使用适当的逃生功能。 然后,我们采取的是安全的URL,并把它放在一个JavaScript字符串,所以我们要调用JavaScript逃生功能。



Answer 2:

我要回答我的问题。 与这种情况下一遍又一遍的工作后,该解决方案是非常明显的,原因是太。

首先:它被插入JavaScript需要是JavaScript的安全任意字符串。 这总是需要做的无论是什么:

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

这里的目标是确保这一说法。 由于这是javascript代码,把它当作JavaScript的 - 这是不是一个URL,这样的URL编码是不正确。

现在,如果x将会在URL中使用,需要将其编码为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服务器端编码将实现相同的结果在客户端编码一旦在服务器上,一次。 因此,解决方案3是正确的,当且仅当var u停留在URL范围。

做2服务器端编码的危险是,你可能只使用该代码段在其第一次编码的上下文。

采取上述的例子,并添加1更多行:

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

现在有问题,因为u是URL编码,而不是HTML编码。 (在这种特定情况下,这个不存在的XSS的变化,因为你不能打破一个URL编码字符串转换成JS范围的 - 仍然有很多的其他情况下的字符串将需要编码的2倍)。

为了提高灵活性,我的选择是在服务器上,并根据需要在客户端,因为一旦编码:

 <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];
            });
    }

我检查基兰Shunmugavel的答案是正确的。



Answer 3:

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

EncodeForURL应该是最后一次。

<插入强制性“的eval是坏的,你在想什么?” >



文章来源: Which XSS OWASP Rule