如何从此查询中删除sql注入并使其运行良好?

时间:2012-12-12 07:36:44

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

我是一名新的ASP.NET开发人员,我正在开发一个基于Web的应用程序,其中有一个菜单栏,有很多选项。其中一些选项仅显示给管理员。系统背后有一个逻辑来检查用户是否是管理员。如果是,将显示选项。我写了这个方法,但我有一个sql injectiom,我想删除它。

为了您的信息,我有以下数据库设计:

  • 用户表:NetID, Name, Title
  • 管理员表:ID, NetID

这是C#方法:

private bool isAdmin(string username)
{
        string connString = "Data Source=appSever\\sqlexpress;Initial Catalog=TestDB;Integrated Security=True";
        string cmdText = "SELECT ID, NetID FROM dbo.Admins WHERE NetID = '" + NetID + "')";
        using (SqlConnection conn = new SqlConnection(connString))
        {
            conn.Open();
            // Open DB connection.
            using (SqlCommand cmd = new SqlCommand(cmdText, conn))
            {
                SqlDataReader reader = cmd.ExecuteReader();
                if (reader != null)
                    if (reader.Read())
                        if (reader["ID"].Equals(1))
                            return true;
                return false;
            }
        }
    }

我尝试通过将第三行更改为:

来更改它
string cmdText = "SELECT ID, NetID FROM dbo.Admins WHERE NetID = @NetID)";

但我收到以下错误,我不知道原因:

  

必须声明标量变量“@NetID”。

能帮助我解决这个问题吗?

*的 *更新:

After updating the code to the following:
    private bool isAdmin(string username)
    {
        string NetID = username;
        string connString = "Data Source=appServer\\sqlexpress;Initial Catalog=TestDB;Integrated Security=True";
        string cmdText = "SELECT ID, NetID FROM dbo.Admins WHERE NetID = @NetID";
        using (SqlConnection conn = new SqlConnection(connString))
        {
            conn.Open();
            // Open DB connection.
            using (SqlCommand cmd = new SqlCommand(cmdText, conn))
            {
                cmd.Parameters.AddWithValue("@NetID", NetID);
                SqlDataReader reader = cmd.ExecuteReader();
                if (reader != null)
                    if (reader.Read())
                        if (reader["NetID"] == username)
                            return true;
                return false;
            }
        }
    }

我收到以下错误:

')'附近的语法不正确。

如何解决此问题?

4 个答案:

答案 0 :(得分:8)

您需要传递@NetID参数的值:

cmd.Parameters.AddWithValue("@NetID", NetID);

答案 1 :(得分:1)

试试这个

 private bool isAdmin(string username)
 {
    string connString = "Data Source=appSever\\sqlexpress;Initial Catalog=TestDB;Integrated Security=True";
    string cmdText = "SELECT ID, NetID FROM dbo.Admins WHERE NetID = @NetID)";
    using (SqlConnection conn = new SqlConnection(connString))
    {
        conn.Open();
        // Open DB connection.
        using (SqlCommand cmd = new SqlCommand(cmdText, conn))
        {
            cmd.Parameters.AddWithValue("@NetID", NetID);
            SqlDataReader reader = cmd.ExecuteReader();
            if (reader != null)
                if (reader.Read())
                    if (reader["ID"].Equals(1))
                        return true;
            return false;
        }
    }
 }

答案 2 :(得分:0)

如果您在IsAdmin方法中使用NetId作为参数而不是

 private bool isAdmin(string NetID)
{
string connString = "Data Source=appSever\\sqlexpress;Initial Catalog=TestDB;Integrated Security=True";
 string cmdText = "SELECT ID, NetID FROM dbo.Admins WHERE NetID = @NetID)";
using (SqlConnection conn = new SqlConnection(connString))
{
    conn.Open();
    // Open DB connection.
    using (SqlCommand cmd = new SqlCommand(cmdText, conn))
    {
        cmd.Parameters.AddWithValue("@NetID", NetID);
        string value = cmd.ExecuteScalar().tostring();
        if (value != null)
           return true;
       else
           return false;
    }
}

}

答案 3 :(得分:0)

最好使用

cmd.Parameters.Add("@netid",SqlBdType.Int).Value=NetID;