我无法在我的javascript中使用替代品

时间:2017-09-26 11:54:54

标签: javascript regex

我试图在我的网址中获取哈希值,以便我可以使用该信息在我的网页上的不同元素上设置类。要做到这一点非常简单,但我担心我可能会因此而容易受到XSS的攻击,并且我希望在使用之前清理set变量。问题是我无法让它发挥作用。

例如,我想设置一个名为" hash"的变量。到"画廊"来自网址:www.my-domain.com/#gallery。

但我想确保像www.my-domain.com/#Hello<script>malicious payload</script>这样的事情无法发挥作用。

问题是控制台报告以下内容: 的你好%3Cscript%3Enasty%20payload%3C /脚本%3E

我希望得到 Hello 。所以,显然我做错了什么,但我无法弄清楚。

这是我的代码:

<script type="text/javascript">
        jQuery(document).ready(function(){
            var hash = document.URL.substr(document.URL.indexOf('#')+1);

            hash = hash.replace(/<script[^>]*?>.*?<\/script>/gi, '').
                     replace(/<[\/\!]*?[^<>]*?>/gi, '').
                     replace(/<style[^>]*?>.*?<\/style>/gi, '').
                     replace(/<![\s\S]*?--[ \t\n\r]*>/gi, '');
            console.log(hash); //Check the result in the console
                if (hash === 'gallery' || hash === 'galleria' || hash === 'galleri') {
                    jQuery('#prod_description').removeClass('uk-active');
                    jQuery('#prod_gallery').addClass('uk-active');
                } else 
                    if (hash === 'relations') {
                    jQuery('#prod_description').removeClass('uk-active');
                    jQuery('#prod_relation').addClass('uk-active');
                } else 
                    if (hash === 'other') {
                    jQuery('#prod_description').removeClass('uk-active');
                    jQuery('#prod_other').addClass('uk-active');
                } else 
                    if (hash === 'promotion') {
                    jQuery('#prod_description').removeClass('uk-active');
                    jQuery('#prod_promotion').addClass('uk-active');                        
                }
            }
        );
    </script>

我尝试过这样的事情:.replace(&#39; l&#39;,&#39;&#39;)并按预期工作,第一个实例是&#39; l&#39;在哈希中从结果中删除。这让我觉得我的正则表达式是错误的所以我尝试了一个更简单的方法:.replace(/ [^ 0-9a-z] / gi,&#39;&#39;)但这并不是工作要么。

关于我做错了什么的想法?

3 个答案:

答案 0 :(得分:2)

  

但我担心我可能会因此而容易受到XSS的攻击

你不是 - 因为你不是在任何地方输出 HTML背景中的哈希值。

你在这里所做的一切,都是将它与几种不同的文字文字进行比较。即使您的hash变量包含foo<script>malicious()</script>之类的内容 - 将foo<script>malicious()</script>gallery进行比较绝对无害,它只是比较,这只是在这种情况下导致错误。仅仅比较字符串不会执行任何代码。

只要您没有在某处将值插入页面,此处就没有XSS风险。您可以完全删除尝试替换内容的行。

答案 1 :(得分:1)

它是编码所以你需要解码它

var hash = decodeURIComponent(window.location.hash.substr(1));

除非您将该哈希直接放在页面上,否则哈希中的脚本标记不会执行任何操作,在字符串比较中唯一会发生的事情就是不匹配。

答案 2 :(得分:0)

你可以做一个简单的indexOf,但请确保不要eval数据;如果它被发送到服务器端,请确保这些人正确处理它。

你不应该像这样做任何替换因为有无限的可能性。

例如:

var h = decodeURIComponent(window.location.hash.substr(1));
if (h.indexOf('promotion') > -1) {
    // do some logic
}