【问题标题】:Do ASP.Net controls expose SQL Queries via viewstate?ASP.Net 控件是否通过视图状态公开 SQL 查询?
【发布时间】:2012-02-22 18:43:30
【问题描述】:

作为默认 ASP.Net 控件集的一部分的控件是否始终使用 viewstate 或 controlstate?

即如果我将下面的代码放到一个全新的 Web 表单上,我的 SQL 字符串是否处于未加密的控制状态?

<asp:SqlDataSource ID="mobileData" runat="server" 
        DataSourceMode="DataReader" 
        SelectCommand="SELECT * from ma.bob WHERE Vendor IS NOT NULL" 
/>

我知道如何加密 viewstate 和 controlstate,但我觉得这个常见用例可能非常不安全,这让我感到很疯狂。确实可以通过修改 controlstate 来执行 SQL 注入攻击吗?

我认为大多数人都会想到为敏感应用程序加密 controlstate,但实际上,如果我的假设是正确的——那么它应该总是这样做——并且 Visual Studio 应该默认启用它?

我是否正确地考虑了这一点,还是我有错误的一端?

【问题讨论】:

标签: asp.net security sql-injection viewstate


【解决方案1】:

要回答您的问题,
来自MSDN

出于安全目的,SelectCommand 属性不存储为视图状态。因为可以解码视图的内容 客户端上的状态,存储有关数据库的敏感信息 视图状态下的结构可能导致信息泄露 漏洞。

【讨论】:

    【解决方案2】:

    此信息永远不会存储在 ViewState 中。

    并非所有属性都是这样创建的

    public string SomeProperty
            {
                get
                {
                    object obj = ViewState["SomeProperty"];
                    return (obj == null) ? 0 : (string)obj;
                }
                set
                {
                    ViewState["SomeProperty"] = value;
                }
            }
    

    SelectCommand 这里是由 PageParser 在生成的 C#/Vb 类中分配的。该类将包含一些类似

    的行
     mobileData.SelectCommand="SELECT * from ma.bob WHERE Vendor IS NOT NULL"
    

    每次请求页面时都会进行此分配。 ASP .Net 无需将其保留在 ViewState 中。


    但是如果你做类似的事情

      <asp:HiddenField runat="server" Value="SELECT * from ma.bob WHERE Vendor IS NOT NULL" />
    

    这将进入 ViewState(我所说的解析器在这里也是如此,但是 setter 在这里实现了 ViewState 机制)

    【讨论】:

    • 您是否有权威来源说明这一点?
    猜你喜欢
    • 2023-03-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-10
    • 1970-01-01
    相关资源
    最近更新 更多