即使我没有POST或GET任何名为url的参数,它仍会插入到Request变量中,导致始终设置Request["url"]
。默认值是请求的aspx文件。如果我在请求中包含url作为POST或GET参数,则会覆盖默认值。你能解释为什么在.net中实现这种行为吗?
答案 0 :(得分:5)
这在HttpRequest类信息中有记录。查看Items集合,它特别指出它将查看来自QueryString,Form,Cookies或ServerVariables的对象。这确实可以追溯到经典的ASP和其他语言已经实现类似,例如PHP虽然PHP认为它不安全,我相信它在v 5.5中被关闭了。微软还建议不要这样做,因为它可以被利用。在Request [“url”]的情况下,它将返回一个服务器变量。如果查询字符串中包含变量url,则Request [“url”]将返回querystring变量,因为它首先在列表中进行扫描。它被用于向后兼容经典ASP,因为它在经典ASP中被广泛使用。
答案 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属性。