2

我的网站上有一些 javascript 函数,但我不知道使用它们是否安全。

这是我的代码:

// works like PHP's $_GET
function get(name){
    name=name.replace(/[\[]/,"\\\[").replace(/[\]]/,"\\\]");
    regexS="[\\?&]"+name+"=([^&#]*)";
    regex=new RegExp(regexS);
    results=regex.exec(window.location.href);
    if(results==null)
        return '';
    return results[1];
}

// and here is my anti xss filter
var param = unescape(decodeURI(get("q")));
param = param.replace(/<(.*?)>/gi, "");
someElement.innerHTML = param;

是否可以绕过此过滤器?

4

2 回答 2

3

不要试图在进入您的应用程序的过程中找到 XSS。您的程序可能会在内部转换数据,以使您创建的任何过滤器都可能是可绕过的。

取而代之的是,在应用程序输出的过程中应用适当的 HTML 编码数据。这样你就可以避免漏洞。

于 2013-02-09T05:00:17.833 回答
0

不,但是如果您在倒数第二行中模拟多行模式,如下所示:

param = param.replace(/<([\s\S]*?)>/gi, "");

您的示例代码将是安全的。您的示例代码中最大的缺陷是innerHTML在您根本不想添加 HTML 时使用。因此,innerHTML您应该使用并尝试过滤掉 HTML,而不是使用和尝试过滤掉 HTML ,这样createTextNode您就不必再担心 XSS。因此,如果您喜欢,请保留您的get函数,并使用如下参数值(改编自 MDN):

var param = unescape(decodeURI(get("q")));
var text  = document.createTextNode(param);
document.getElementById(someElement).appendChild(newtext);

如果你使用 jQuery,你可以使用.text()函数,它本身使用createTextNode.

于 2013-02-08T23:00:25.550 回答