我是一名新的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;
}
}
}
我收到以下错误:
')'附近的语法不正确。
如何解决此问题?
答案 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;