请考虑以下情形: http://www.yourdomain.com/Default.aspx?p=2
现在我们要检查查询字符串参数p是否包含错误。 我现在有这个设置:
1)检查p是否存在
2)从p的值中过滤掉html
3)htmlencode p的值
4)检查p是否为整数
5)检查db
中是否存在p的整数这就是我平常的做法,尽管第5步当然是一次表演。
亲切的问候, 标记
答案 0 :(得分:3)
如果您打算使用该参数从数据库中检索某些内容,为什么要过滤掉html或对其进行编码?这不像你要将它存储在数据库中,或者显示在前端。如果它存在,只需立即将它扔到DAL。您是DAL应该足够聪明,告诉您它是否无法检索具有该ID的记录,或者无法解析ID等等。
答案 1 :(得分:3)
我的观点:通常这种查询字符串参数并非真正由用户“输入”,而是作为链接提交。因此,过度复杂的慢速验证并非真正必要。
所以我只是将它传递给持久性/数据层,并根据我正在使用的系统类型处理作为常规404 Not Found或500 Internal Server Error返回的任何错误。
答案 2 :(得分:1)
如果您要将输入转换为整数,则不需要步骤2和3 - 只需使用int.TryParse
查看您拥有的内容即可。只有当你期望一个你将在动态sql语句中使用的字符串,或者将在你的网站上显示时,我才会对html的输入进行编码和测试
答案 3 :(得分:1)
怎么样:
int p = 0;
if(!Int32.TryParse(Request.QueryString["p"], out p))
throw new ArgumentOutOfRangeException("p");
答案 4 :(得分:0)
非常简单。对于大多数数据类型(整数,小数,双精度,日期和布尔值),格式非常严格。如果该值在严格格式下不解析,那就是错误。
字符串有时具有严格的格式,如电子邮件地址或电话号码。这些可以通过简单的正则表达式进行验证。如果符合,请使用它,否则会出错。
但大多数情况下,字符串只需要持久保存到数据库中,然后再次显示。在这种情况下,除了在插入数据库时转义(在使用参数化查询时不必要)k以及渲染到显示时的HTML编码时,不需要进行处理。
这样就可以验证任何和所有数据,并且不存在任何注射的风险。
字符串松散格式的罕见例外是......很少见。我现在想不出来。为此,您可以进行更广泛的解析和处理。
已添加:哦,是的,检查ID(或其他值)是否对数据库有效。你做对了,但想想你是否总是需要它。通常,您可以将检查放入您必须要执行的其他查询中。就像您根据ID选择数据一样,您无需明确检查它是否存在 - 只需准备好您的查询就不会返回任何数据。
有时您根本不需要使用该值,那么您可以忽略它。
但是,当然,还有其他时候,例如插入/更新数据时,您确实需要明确检查数据是否存在且在当前上下文中是否有效。