【问题标题】:asp:QueryStringParameter and empty query string parameterasp:QueryStringParameter 和空查询字符串参数
【发布时间】:2011-02-10 20:05:53
【问题描述】:

我有asp:GridView 使用asp:SqlDataSource 显示客户端请求。我想限制客户端显示的信息:

View.aspx 必须显示所有内容,View.aspx?client=1 必须仅显示来自客户端 ID #1 的请求。

所以我使用<asp:QueryStringParameter Name="client" QueryStringField="client" /> 查询"EXEC getRequests @client"

当指定某些客户端时,一切正常。但不要 - 如果不是。

我使用 SSMS 测试了我的 SP - 它在两种情况下都能正常工作 - 指定参数时和未指定参数时(NULL 显式传递)。

我该怎么办?

【问题讨论】:

  • 看起来您正在使用这种方法向一些非常严重的 SQL 注入攻击向量敞开大门。
  • @womp: 我怎么打开? QueryStringParameter 仅在经过多次检查后才添加到具有适当权限的用户的代码隐藏中。
  • 啊,如果您要对其进行消毒,那很好。从您的问题来看,它就像您直接使用它一样。
  • @womp:我只获取客户端 ID (int) 并将其传递给 SP。我确信这样做是安全的。我不做 "SELECT ... WHERE ID=" + Request["client"] 之类的傻事 :)

标签: asp.net .net sql-server sqldatasource querystringparameter


【解决方案1】:

您需要为这些情况定义参数的默认值,例如:

<asp:QueryStringParameter Name="client" QueryStringField="client" DefaultValue="0"/>

然后在SP中你需要验证客户端是否为0,返回所有客户端,否则返回特定的一个。

【讨论】:

  • 是否可以将默认值设置为NULL (DBNull.Value)?
  • 嗯,我不这么认为。但是是否有理由使用 NULL 而不是 0、-1 或其他值?
  • 对于NULL,很容易使用SQL内置函数ISNULL(,)。 0 或 -1 等值需要在查询中附加 CASE-WHEN-THEN 语句
  • 有了这个 url "View.aspx?client=" 我认为参数会自动转换为 null,因为它是空的。试试这个并提供一些反馈,
  • 感谢您的参与! :) 问题解决了。见下文
【解决方案2】:

如果它的任何参数为空,则不会触发 SqlDataSource,除非您另外指定:

<asp:SqlDataSource CancelSelectOnNullParameter="False" />

可能还需要为您的查询字符串参数添加一个空默认值:

<asp:QueryStringParameter Name="client" QueryStringField="client" DefaultValue="" ConvertEmptyStringToNull="True" />

【讨论】:

  • 非常感谢!第一个选项可以满足我的需要。
  • 这是一个非常尴尬的默认设置(即默认情况下它应该使用 NULL 参数触发)。我很确定表示“一切”的 NULL 参数非常常见。
猜你喜欢
  • 2015-02-02
  • 1970-01-01
  • 1970-01-01
  • 2014-10-01
  • 1970-01-01
  • 2015-06-09
  • 2012-08-30
  • 2021-05-05
  • 2010-12-02
相关资源
最近更新 更多