为什么默认设置Request [" url"]?

时间:2014-09-27 18:06:47

标签: c# asp.net

即使我没有POST或GET任何名为url的参数,它仍会插入到Request变量中,导致始终设置Request["url"]。默认值是请求的aspx文件。如果我在请求中包含url作为POST或GET参数,则会覆盖默认值。你能解释为什么在.net中实现这种行为吗?

3 个答案:

答案 0 :(得分:5)

这在HttpRequest类信息中有记录。查看Items集合,它特别指出它将查看来自QueryString,Form,Cookies或ServerVariables的对象。这确实可以追溯到经典的ASP和其他语言已经实现类似,例如PHP虽然PHP认为它不安全,我相信它在v 5.5中被关闭了。微软还建议不要这样做,因为它可以被利用。在Request [“url”]的情况下,它将返回一个服务器变量。如果查询字符串中包含变量url,则Request [“url”]将返回querystring变量,因为它首先在列表中进行扫描。它被用于向后兼容经典ASP,因为它在经典ASP中被广泛使用。

HttpRequest Class MSDN Documentation

答案 1 :(得分:1)

为什么不呢?这是Eric Lippart对几乎所有“为什么C#实现X”的答案的必然结果(见this article

原因是“因为有人写了”。没有框架设计师在这里写它来说明原因,我们可能永远不会知道。但是,答案很可能是因为“这是一个有用的捷径”,并且可能追溯到旧的pre -.net asp经典日。

答案 2 :(得分:1)

当您使用带有请求[" url"] 等语法的HttpRequest对象时,您实际上是按密钥搜索多个内部集合。 HttpRequest上的索引器声明为:

public string this[string key]{ get; }

索引器是能够以任何形式访问/搜索任何对象的语法糖,实际上它们通常用于某种集合的类中。

HttpRequest类不是数组或集合,而是一个更复杂的类型,包含许多不同的成员,包括几个集合(Cookies,ServerVariables,QueryString,Form等)。索引器只是一个抽象,使Request对象可以像单个集合一样访问。

为了演示它是如何工作的,这里是一个非常接近实际的.NET 4.5实现的索引器的定义:

public string this[string key]
{
    get
    {
        string val = this.QueryString[key];

        if (val != null)
            return val;

        val = this.Form[key];

        if (val != null)
            return str;

        var cookie = this.Cookies[key];

        if (cookie != null)
            return cookie.Value;

        val = this.ServerVariables[key];

        if (val != null)
            return val;

        return null;
    }
}

现在我终于可以回答你的真实问题了

  

如果我在请求中包含url作为POST或GET参数,则会覆盖默认值。你能解释为什么在.net中实现这种行为吗?

当您发送" url"通过POST或GET参数,你只需要为索引器访问的Forms或QueryString集合添加一个值,而且我没有看到任何错误。无论如何,所有内部HttpRequest集合(Cookies,QueryStrings等)都可以在代码的任何部分进行修改。

  

默认请求[" url"]值来自哪里?

ServerVariables集合。

  

POST或获取url参数是否危险?

如果你在C#中使用请求[" url"] 并且不知道它是如何工作的,那就是。绝对不应该用它来访问当前路径。您应该使用Request.Path属性。