代码之家  ›  专栏  ›  技术社区  ›  Jj.

使用window.location查询页面的GET参数安全吗?

  •  3
  • Jj.  · 技术社区  · 16 年前

    我正在进行同行评审,我发现有人使用window.location.search来检查向给定(搜索)页面发送了哪些参数。

    这样做安全吗?我在想,我们可能可以在脚本块内打印HTML输出中的参数,并验证打印的变量,而不是查询window.location。

    4 回复  |  直到 16 年前
        1
  •  13
  •   Christoph    16 年前

    如果启用了javascript, window.location.search 使用安全。

    正如一些无用的进一步信息:据我所知,该属性是在Netscape Navigator 2/MS Internet Explorer 3中引入的,所以我认为它的使用非常安全,即使它还不是任何标准的一部分(目前)。

        2
  •  1
  •   Andrew Hare    16 年前

    关于这种方法,有一点需要注意。 window.location 在页面加载时静态设置,在此之后不会检测到用户对地址栏所做的更改。这不应该是一个问题,但重要的是要知道。

    将以下代码另存为html文件并在浏览器中启动:

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" 
        "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
        <head>
            <title>test</title>
        </head>
        <body>
            <a href="javascript:void(0);" 
                    onclick="alert(window.location);">click me</a>
        </body>
    </html>
    

    “点击我”锚点将显示当前窗口位置 onclick 。但是,如果您在地址栏中添加任何内容并再次单击链接,它将报告与第一次相同的操作。

    希望这不是一个问题,我无法想象它会以任何方式影响你,但很高兴知道这一点。

        3
  •  1
  •   Sesh    16 年前

    安全是“安全”还是“这会一直有效”?

    尽管window.location被广泛使用,但它仍然不是W3C标准的一部分。然而,它在2006年被添加到工作草案规范中:基本上意味着浏览器可能支持也可能不支持它。所以,从“这会一直工作吗”的角度来看,我想你会冒一个小风险。

        4
  •  0
  •   bobince    16 年前

    这样做安全吗?

    对。获取参数作为名称的示例代码->值映射,假设每个参数不需要多个值:

    function getParameters() {
        var parameters= new Object();
        var parts= window.location.search.substring(1).split('\x26');
        for (var parti= parts.length; parti-->0;) {
            var subparts= parts[parti].split(';'); // support semicolon separators as well as ampersand (see HTML 4.01 section B.2.2)
            for (var subparti= subparts.length; subparti-->0;) {
                var parparts= subparts[subparti].split('=', 2);
                if (parparts.length==2)
                    parameters[decodeURIComponent(parparts[0])]= decodeURIComponent(parparts[1]);
            }
       }
       return parameters;
    }