/// <summary>
/// Request获取传参
/// </summary>
/// <param name="strName">参数</param>
/// <param name="values">错误时返回此数据</param>
/// <returns></returns>
public static string Request(string strName,string values)
{
if (HttpContext.Current.Request.QueryString[strName] == null || HttpContext.Current.Request.QueryString[strName] == "")
{
return values;
}
else
{
//参数直接过滤,如有特殊符号,HTML,JS,SQL 过滤
return HTML(HttpContext.Current.Request.QueryString[strName].ToString().Trim());
}
}因为我每次用Request.QueryString["id"]获取参数的时候,每次都要过滤,还要判断!我嫌太麻烦,就直接在类库里这样写了一个这样的方法!每次只需调用一下即可!
可是今天我有个公司的朋友来告诉我说,这样写不好!我google了一下!也没找到有什么不对的地方!有什么不好的地方!
请教高手们一下。那地方不对,哪里不好,会出现什么BUG问题????
我很纳闷!
我就是想不明白!
baidu,google 了那么长时间!也没找到合理解释!
是不是他TMD故意玩我啊!
public NameValueCollection QueryString
{
get
{
if (this._queryString == null)
{
this._queryString = new HttpValueCollection();
if (this._wr != null)
{
this.FillInQueryStringCollection();
}
this._queryString.MakeReadOnly();
}
if (this._flags[1])
{
this._flags.Clear(1);
ValidateNameValueCollection(this._queryString, "Request.QueryString");
}
return this._queryString;
}
}当页面上的FORM以GET方式向页面发送请求数据(如数据含有不安全字符,则浏览器先将其转换成16进制的字符再传送,如空格被转成%20)时,WEB SERVER 将请求数据放入一名为QUERY_STRING的环境变量中,QueryString 方法是从这一环境变量中取出相应的值,并将被转成16进制的字符还原(如 %20 被还原成空格)。
肯定不能用Session对吧!
不过我还是想知道,他到底有什么 BUG存在里面。。
public static string Request(string strName, string values)
{
string query = (HttpContext.Current.Request.QueryString[strName] ?? string.Empty).Trim();
return query.Length == 0 ? values : HTML(query);
}
PS:[string].ToString()只是return this并不存在复制了一个string.
刚好有一个参数,比如数据库中某公司的名字吧,ABC'XX'(这是完全有可能的)
然后被你那么一过滤,变成ABCXX。甚至到最后还会被你的页面抛出个错误:查无此司
如果是URL传递怎么办?肯定得过滤吧!
我认为你是怕用户输入的东西,
比如 where 1=1,delete,',
这些数据库关键字。
因为很可能你后台的sql是拼接的,
只要一出现这些东西你程序立马挂了。
当然也不是完全不“过滤”,准确地应该说是验证参数的合法性,比如你数据库里的字段长度是50,那么你可以判断一下这个参数是否Length<50 或者其他网站明文规定不准使用的用户名==
if(string.IsNullOrEmpty(value)) return values;
return HTML(value.Trim());
如果你用if的话。
要做2次HttpContext.Current.Request.QueryString[strName] 要2次hash。
要么就是多申请一个临时变量存放起来。
另外string.Empty的Trim非常快 在第一步判断长度时就跳出来了。PS:三目性能比if高原因不说,自己看IL。
另外 #34
下面是string.IsNullOrEmpty的源码,里面没判断有空格的情况。public static bool IsNullOrEmpty(string value)
{
if (value != null)
{
return (value.Length == 0);
}
return true;
}