/// <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问题????
我很纳闷! 

解决方案 »

  1.   

    说了。说多人同时访问可能会获取错的参数!
    我就是想不明白!
    baidu,google 了那么长时间!也没找到合理解释!
    是不是他TMD故意玩我啊!
      

  2.   

    什么话都不说,直接上代码。反编译QueryString属性
    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   被还原成空格)。
      

  3.   

    为什么不用 Session来传递参数呢
      

  4.   

    点击一条新闻调转另一个页面,news.aspx?id=1
    肯定不能用Session对吧!
      

  5.   

    如果你是为了放SQL注入的话可以全局的判断 任何输入点的 输入字符 而不是每个都去判断一次
      

  6.   

    QueryString[strName] 本来就是String,还要执行一遍 ToString() 运算并且额外复制一个新的字符串干什么?
      

  7.   

    至于有些人说的什么“过滤”,这是很扯的概念,难道用户录入就不允许有 script、delete、逗号、单引号 等等内容吗?这只能说明你不会正常处理字符串到sql或者到html中的转义连接问题,所以才搞什么“过滤”。
      

  8.   

    Request.QueryString[strName] 获取的值是string类型是吧?为什么还要在来一个.toString(),这不是多此一举么。
      

  9.   

    谢谢,大家,
    不过我还是想知道,他到底有什么 BUG存在里面。。
      

  10.   

    bug?有什么bug。庸人自扰而已。
      

  11.   

    给个精简版的。
    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.
      

  12.   

    假如你的代码里过滤了单引号
    刚好有一个参数,比如数据库中某公司的名字吧,ABC'XX'(这是完全有可能的)
    然后被你那么一过滤,变成ABCXX。甚至到最后还会被你的页面抛出个错误:查无此司
      

  13.   


    如果是URL传递怎么办?肯定得过滤吧!
      

  14.   

    对于参数过滤我一直不赞成,
    我认为你是怕用户输入的东西,
    比如 where 1=1,delete,',
    这些数据库关键字。
    因为很可能你后台的sql是拼接的,
    只要一出现这些东西你程序立马挂了。
      

  15.   

    传就让他传呗,如果他过来的URL不合法,IIS自然会抛个404或者其他错误。反之,你在页面里取他原始的传入参数,然后用命令传参的方式去查询数据,管他多少单引号关键字什么的。
    当然也不是完全不“过滤”,准确地应该说是验证参数的合法性,比如你数据库里的字段长度是50,那么你可以判断一下这个参数是否Length<50 或者其他网站明文规定不准使用的用户名==
      

  16.   

    看不懂你用个values是什么用途,你不就是过滤了一下Request.QueryString[]的数据吗,values是什么东西?
      

  17.   

    另外都是在瞎扯淡,本来.NET 就有参数化查询的概念,无须过滤。
      

  18.   

    输入不应该过滤,限制输入的合法性是正确的。这个也不存在什么bug
      

  19.   

    如果是我。。我会这么写var value = HttpContext.Current.Request.QueryString[strName];
    if(string.IsNullOrEmpty(value)) return values;
    return HTML(value.Trim());
      

  20.   

    大哥这里只用了1个三目。上面一个是??。 判断是否为null。
    如果你用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;