这是一个不容易发现的问题,因为正常使用是不会出现问题的,只有非正常使用情况下才会发生,比如漏洞扫描、sqlmap等工具扫描时会发生,我们还是拿DTcms官方网站来做测试;输入如下地址
http://demo.dtcms.net/gsearch.html?category_id=40&min_price=0&max_price=100&orderby
结果就会出现如下错误页面,
通过测试,我们发现程序错误是出现
string paramKey=Request.QueryString.GetKey(i).ToString();
这一行,GetKey 获取集合中指定索引处的键,因为地址orderby后面缺少等于号,所以才会报错,那怎么解决呢?
方法很简单,我们只需要判断是否为空,为空就不执行:代码如下
模板文件:gsearch.html
for (int i = 0; i < Request.QueryString.AllKeys.Length; i++) { object obj = Request.QueryString.GetKey(i); if (null != obj) { string paramKey = obj.ToString(); int paramValue = Utils.StrToInt(Request.QueryString[i].ToString(), 0); if (paramKey.StartsWith("s_") && paramValue > 0) { dicSpecIds.Add(paramKey, paramValue.ToString()); } } }
好了,问题已经解决,大家可以好好的测试一下!