【问题标题】:How to prevent SQL Injection in a search form in asp如何在asp中的搜索表单中防止SQL注入
【发布时间】:2013-07-01 08:35:14
【问题描述】:

我正在开发一个基于新闻的网站。而且该网站有一个新闻标题的搜索栏,我不想让 SQL 注入发生在上面。

我正在做的是从 文本框 中获取文本,然后使用查询来获取匹配结果。当用户点击搜索按钮时会发生这种情况:

protected void button_Click(object sender, EventArgs e)
{
        string connectionString = ConfigurationManager.ConnectionStrings["connection"].ConnectionString;
        SqlConnection conn = new SqlConnection(connectionString);

        try
        {
            SqlCommand comm = new SqlCommand("SELECT * FROM news
                Where newstilte LIKE '%" + searchbox.text + "%'", conn);
            conn.Open();

            SqlDataReader reader = comm.ExecuteReader();

            myRepeater.DataSource = reader;
            myRepeater.DataBind();

            reader.Close();
        }
        catch (Exception exception)
        {
            Response.Write(exception.ToString());
        }
        finally
        {
            conn.Close();
        }
    }

如您所见,然后我使用中继器来显示结果。我想知道如何防止人们在 文本框 中写入的部分进行 SQL 注入。

【问题讨论】:

  • 如果您了解 sql 注入,您是否尝试将其输入到google
  • @SonerGönül +1 提到了那篇出色的文章(不亚于 SO 创始人)。
  • 在这个网站上进行 5 秒搜索怎么样? stackoverflow.com/questions/4018174/…
  • @user2978785:参数化查询将阻止将参数文本解释为 SQL。它将仅被解释为字符串,从而防止 SQL 注入。只需尝试一下,亲自看看 - 并阅读那篇文章!

标签: c# asp.net sql sql-server


【解决方案1】:

使用以下参数化查询:

protected void button_Click(object sender, EventArgs e)
    {
        string connectionString = ConfigurationManager.ConnectionStrings["connection"].ConnectionString;
        SqlConnection conn = new SqlConnection(connectionString);
        try
        {
            SqlCommand comm = new SqlCommand("SELECT * FROM news
                Where newstilte LIKE '%' + @newstilte + '%'", conn);

            cmm.Parameters.AddWithValue("@search",searchbox.text)  ;

            conn.Open();
            SqlDataAdapter reader = comm.ExecuteReader();
            myRepeater.DataSource = reader;
            myRepeater.DataBind();
            reader.Close();
        }
        catch (Exception exception)
        {
            Response.Write(exception.ToString());
        }
        finally
        {
            conn.Close();
        }
    }

编辑:

如果您对搜索有数据类型限制,也可以使用以下。

cmm.Parameters.Add(new SqlParameter("@search", SqlDbType.VarChar));
cmm.Parameters["@search"].Value = searchbox.text;

查看THIS 文档。

【讨论】:

  • 如果他创建以下函数或存储过程以验证输入类型(int、float、nvarchar 等)会更好
  • 你的意思是LIKE @searchLIKE '%' + @search + '%'
  • @drakoumelitos - 无需验证输入类型。这将是一个字符串。来自searchbox.text
  • 我看不出参数化查询有什么帮助。倾斜是一个字符串。我应该在查询中添加一个参数,例如 nvchar(50) 类型。黑客仍然可以插入里面有一些不好的代码,它仍然是一个 nvarchar(50)!它有什么帮助?
  • @user2078785 因为参数不被视为查询的一部分;它们是数据。黑客可以在此处注入代码,因为 mwah'-- evil code here 被简单地视为数据,而不是命令。
【解决方案2】:

试试

 SqlCommand comm = new SqlCommand("SELECT * FROM news
            Where newstilte LIKE '%' + @newstilte + '%'", conn);

 comm.Parameters.AddWithValue("@newstilte",searchbox.text)

【讨论】:

  • 你的意思是LIKE @newstilte,或者可能是LIKE '%' + @newstilte + '%'
【解决方案3】:

使用带参数的存储过程。

.net SQL 库正确

SqlCommand comm = new SqlCommand("StoredProcedureName")
comm.CommandType = CommandType.StoredProcedure
cmd.Parameters.AddWithValue("@Parameter", Value)

.net 库应该可以处理大多数注入。

【讨论】:

  • 无需跳转到存储过程;与正确参数化的查询相比,它们无论如何几乎没有任何好处,还有许多优点
  • 它们包括参数类型验证
  • 更不用说它们提高了查询速度,因为 mssql 背后的逻辑
  • 大多数可以在常规 SQL 中工作的强制转换操作也适用于参数类型,坦率地说 - 它仍然不是一个很大的优势
  • 如果您的用户甚至拥有对数据库的 sproc 访问权限,那么您已经输掉了这场战斗。 “事先在数据库中编译”和“查询计划被缓存,因此不必再次创建它”——重复一遍:它们使用 完全相同的机制;它们之间没有区别 - 在两种情况下它的行为都非常相似。而且,提示:我确实在商业 webapps 上工作;p 在某些场景中它们具有实用性,但是:它们是例外,而不是规范
猜你喜欢
  • 1970-01-01
  • 2020-04-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-21
  • 2011-09-10
相关资源
最近更新 更多