朋友说这样写不好!我想知道这样有什么坏处?真的不好吗?

月之点点 2011-09-08 12:01:02

/// <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问题????
我很纳闷!
...全文
465 38 打赏 收藏 转发到动态 举报
写回复
用AI写文章
38 条回复
切换为时间正序
请发表友善的回复…
发表回复
gzdiablo 2011-09-13
  • 打赏
  • 举报
回复
[Quote=引用 22 楼 dongxinxi 的回复:]

引用 20 楼 gzdiablo 的回复:
给个精简版的。


你用了两个三目,还不如用一个if呢
[/Quote]


大哥这里只用了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;
}


弦弦 2011-09-08
  • 打赏
  • 举报
回复
简而言之,你应该相信微软
月之点点 2011-09-08
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 nevermore_0923 的回复:]

什么话都不说,直接上代码。
C# code

反编译QueryString属性
public NameValueCollection QueryString
{
get
{
if (this._queryString == null)
{
this._queryString = new HttpValueCollecti……
[/Quote]
不好意思,还是没太明白,继续请教!
月之点点 2011-09-08
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 shwicho 的回复:]

为什么不用 Session来传递参数呢
[/Quote]
点击一条新闻调转另一个页面,news.aspx?id=1
肯定不能用Session对吧!
  • 打赏
  • 举报
回复
为什么不用 Session来传递参数呢
弦弦 2011-09-08
  • 打赏
  • 举报
回复
什么话都不说,直接上代码。

反编译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 被还原成空格)。
月之点点 2011-09-08
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 nevermore_0923 的回复:]

你公司同事说为什么不好了没?
[/Quote]
说了。说多人同时访问可能会获取错的参数!
我就是想不明白!
baidu,google 了那么长时间!也没找到合理解释!
是不是他TMD故意玩我啊!
菜神传说 2011-09-08
  • 打赏
  • 举报
回复
不知道
弦弦 2011-09-08
  • 打赏
  • 举报
回复
你公司同事说为什么不好了没?
czzdwjg 2011-09-08
  • 打赏
  • 举报
回复
怕注入直接用参数查询不就好了?为什么要转换?
wj50676812 2011-09-08
  • 打赏
  • 举报
回复
看了 一下 大概明白意思了。lz的想法是 过滤掉各种关键字 。
但是在实际应用中不应该是用过滤来处理 而是应该验证。验证是否是关键字等等···
颤菊大师 2011-09-08
  • 打赏
  • 举报
回复
如果是我。。我会这么写

var value = HttpContext.Current.Request.QueryString[strName];
if(string.IsNullOrEmpty(value)) return values;
return HTML(value.Trim());
huomingpang 2011-09-08
  • 打赏
  • 举报
回复
回去看书
skubihan 2011-09-08
  • 打赏
  • 举报
回复
看都看不懂
Gemini Dean 2011-09-08
  • 打赏
  • 举报
回复
[Quote=引用 28 楼 dongxinxi 的回复:]
引用 26 楼 shijianyu00 的回复:
引用 19 楼 dongxinxi 的回复:

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

同意,应该最大限度地保存用户输入……
[/Quote]
输入不应该过滤,限制输入的合法性是正确的。这个也不存在什么bug
indusl 2011-09-08
  • 打赏
  • 举报
回复
另外都是在瞎扯淡,本来.NET 就有参数化查询的概念,无须过滤。
indusl 2011-09-08
  • 打赏
  • 举报
回复
看不懂你用个values是什么用途,你不就是过滤了一下Request.QueryString[]的数据吗,values是什么东西?
  • 打赏
  • 举报
回复
[Quote=引用 26 楼 shijianyu00 的回复:]
引用 19 楼 dongxinxi 的回复:

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

同意,应该最大限度地保存用户输入的原始数据,只是在页面上显示的时候稍加注意不要被注入……
[/Quote]
传就让他传呗,如果他过来的URL不合法,IIS自然会抛个404或者其他错误。反之,你在页面里取他原始的传入参数,然后用命令传参的方式去查询数据,管他多少单引号关键字什么的。
当然也不是完全不“过滤”,准确地应该说是验证参数的合法性,比如你数据库里的字段长度是50,那么你可以判断一下这个参数是否Length<50 或者其他网站明文规定不准使用的用户名==
弦弦 2011-09-08
  • 打赏
  • 举报
回复
对于参数过滤我一直不赞成,
我认为你是怕用户输入的东西,
比如 where 1=1,delete,',
这些数据库关键字。
因为很可能你后台的sql是拼接的,
只要一出现这些东西你程序立马挂了。
月之点点 2011-09-08
  • 打赏
  • 举报
回复
[Quote=引用 19 楼 dongxinxi 的回复:]

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

同意,应该最大限度地保存用户输入的原始数据,只是在页面上显示的时候稍加注意不要被注入就行了
[/Quote]

如果是URL传递怎么办?肯定得过滤吧!
加载更多回复(17)

62,046

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧