【问题标题】:SQL Injection on Views视图上的 SQL 注入
【发布时间】:2015-11-18 18:57:35
【问题描述】:

我们在 ASP.Net 中使用 3 层架构。

共有 3 层

  1. 演示文稿
  2. 商务
  3. 数据访问

数据访问层包含 GetData 和 ExecuteQuery 等功能。 我想知道的是,想要直接从表示层调用视图。在不使用存储过程的情况下从前端调用视图是否存在 SQL 注入的可能性?

表示层 (C#)

protected void btnView_Click(object sender, EventArgs e)
        {
            DL obj = new DL();
            DataTable tb = new DataTable();
            string query = "select * from ViewTeacher where FID = " + txtName.Text;

            tb = obj.GetData(query);

        }

数据库访问

public DataTable GetData(string query)
        {
            DataTable datatable = new DataTable();
            SqlCommand cmd = new SqlCommand();
            cmd.Connection = con;
            cmd.CommandText = query;

            try
            {
                if (cmd.Connection.State != ConnectionState.Open)
                {
                    cmd.Connection.Open();
                }
                using (SqlDataAdapter da = new SqlDataAdapter(cmd))
                {
                    da.Fill(datatable);
                }
            }
            catch (Exception ex)
            {

                throw new ArgumentException(ex.Message);
            }
            return datatable;
        }

【问题讨论】:

  • 你能否提供一些代码,因为你如何调用它(阅读函数)是它可能出错的地方。
  • @Dorvalla.,当然让我编辑
  • 您可以直接从表示层调用视图,根据您调用它的方式,它可能存在 sql 注入问题,因此如果您提供用于调用视图的代码,则按照 Dorvalla 的要求我们可以建议代码导致sql注入问题吗?
  • @Dorvalla 我已经编辑了问题。
  • @RameshBabu.. 编辑请检查

标签: sql sql-injection 3-tier


【解决方案1】:

您如何“调用视图”?如果您正在运行以下临时查询:

SELECT <columns> FROM View WHERE ColumnX = 'Y'

如果该查询是使用(可能)恶意输入构建的,那么是的,当然这可能会受到 SQL 注入的影响 - 注入的全部意义在于攻击者可以改变查询的性质:

SELECT <columns> FROM View WHERE ColumnX = 'Z'
UNION ALL
SELECT name,0,0,0,0 FROM INFORMATION_SCHEMA.TABLES --'

攻击者不仅限于原始查询中存在的对象。


上述两个查询中的不可信输入是:

Y

Z'
UNION ALL
SELECT name,0,0,0,0 FROM INFORMATION_SCHEMA.TABLES --

【讨论】:

    【解决方案2】:

    从前端调用视图时应该没有 SQL 注入的机会,因为视图不带参数。
    参考 : can we pass parameter to a view in sql?

    【讨论】:

    • 如果应用程序中有一个用于访问视图的硬编码查询,那么它不会受到注入 - 但那是因为它是一个硬编码查询,而不是因为它查询视图。我不知道有任何 API 只采用视图的名称并从中返回所有行(也不确定此类 API 的实用程序) - 在我知道的大多数 API 中,您需要提供完成访问(和过滤)视图的 query。如果这不是硬编码的,那么它就像其他任何东西一样受到注入。
    • 我只在编辑之前看到了这个问题。根据我对问题的理解,我提供了解决方案。
    • @Biswabid - 在看到编辑之前我也回答了(因此为什么我的查询与问题中现在显示的不一样) - 我仍然可以看到注入的可能性。正如我所说,我知道没有任何 API 可以让您只指定一个视图 - 您必须提供完整的查询。
    【解决方案3】:

    当您编写如下从文本框中获取值的查询时,100% 存在 sql 注入的可能性。

    string query = "select * from ViewTeacher where FID = " + txtName.Text;
    

    【讨论】:

      猜你喜欢
      • 2017-01-03
      • 2011-10-10
      • 1970-01-01
      • 1970-01-01
      • 2012-04-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多