这个JavaScript代码安全吗?

Is this JavaScript code safe?

本文关键字:安全 代码 JavaScript 这个      更新时间:2023-09-26

我在网上找到了以下JS。

获取url参数值的函数。

function get_url_param(param) {
  param = param.replace(/['[]/,"'''[").replace(/[']]/,"''']");
  var regexS = "[''?&]"+param+"=([^&#]*)";
  var regex = new RegExp( regexS );
  var results = regex.exec(window.location.href);
  if( results == null )
    return '';
  else
    return results[1];
}

然而,当我看到exec()函数时,我总是想:哇!

所以我的问题是:它安全吗?

附注:如果你认为这个函数很糟糕,有更好的选择,不要犹豫分享:)

上面的函数使用了真实的url,但是我只需要解析一个包含url的字符串

您在函数中看到的.exec()不是窗口的,而是RegExp对象的。

所以用。

我不会将Regexp execeval混淆。有点笨拙,但应该可以工作。

Regexp#exec是安全的,尽管不是一个很好的接口。

附注:如果你认为这个函数很糟糕,有更好的选择,不要犹豫分享:)

yeeep: -)

param = param.replace(/['[]/,"'''[").replace(/[']]/,"''']");

这没有使用g全局regexp,所以你只替换每个括号的一个实例;field[][]行不通。你也不需要角色组…param.replace(/'[/g, '''[')就可以了。或者,非regexp替换成语param.split('[').join('''[') .

:

var regexS = "[''?&]"+param+"=([^&#]*)";

您没有转义足够多的字符,无法将它们放入regexp中并使它们表示其字面意思。

无论如何,这种regex黑客仍然不是解析url/查询字符串的好方法。这不能正确处理;%编码,或+的空间,它可能会在URL的其他地方的参数相似。

相反,让我们首先单独获取查询字符串。如果您有一个链接或位置对象,您可以从.search属性中获得它。如果你只有一个字符串URL,你可以把它变成一个链接对象,以获得可靠的:

function getQueryString(url) {
    var a= document.createElement('a');
    a.href= url;
    return a.search;
}

现在你可以通过删除前面的?,拆分&;,然后将url解码的结果放入JS对象来解析它:

function parseQuery(query) {
    var lookup= {};
    var params= query.slice(1).split(/[&;]/);
    for (var i= 0; i<params.length; i++) {
        var ix= params[i].indexOf('=');
        if (ix!==-1) {
            var name= decodeURIComponent(params[i].slice(0, ix));
            var value= decodeURIComponent(params[i].slice(ix+1));
            if (!(name in lookup))
                lookup[name]= [];
            lookup[name].push(value);
        }
    }
    return lookup;
}

这使得查找参数变得容易:

var url= 'http://www.example.com/?a=b&c=d&c=%65;f[]=g#h=i';
var pars= parseQuery(getQueryString(url));
alert(pars.a);      // ['b']
alert(pars.c);      // ['d', 'e']
alert(pars['f[]']); // ['g']
alert('h' in pars); // false

如果您不需要为一个参数读取多个值,您可以只执行lookup[name]= value而不是if...[]...push舞蹈,在查找中返回单个字符串值而不是列表。