5

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

供您参考,我有以下数据库设计:

  • 用户表: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

4 回答 4

8

您需要为@NetID参数传递一个值:

cmd.Parameters.AddWithValue("@NetID", NetID);
于 2012-12-12T07:39:26.917 回答
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;
        }
    }
 }
于 2012-12-12T07:59:52.903 回答
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;
    }
}

}

于 2012-12-12T09:22:37.340 回答
0

它更好地使用

cmd.Parameters.Add("@netid",SqlBdType.Int).Value=NetID;
于 2012-12-24T09:31:04.617 回答