我开发了一个基于Web的Intranet应用程序,它运行良好。该系统仅供我公司的一个部门使用。当他尝试浏览系统时,该部门以外的任何用户都将收到错误页面。系统将通过将其网络ID传递到Active Directory来检查用户信息,并从那里获取其信息。为此,我创建了一个名为Security的类。 然后我将以下内容放在我的母版页中:
if (Security.isMember(netID))
{
................
}
else
Response.Redirect("Error.aspx");
的代码隐藏: 的
public static bool isMember(string userid)
{
if (Org.Code == "Org. Code")
return true;
else
return false;
}
由于用户在首次浏览网站后会被添加到数据库中,我想修改安全类中的上一个方法,以检查用户是否存在于数据库中。如果不是,系统应使用Security类来检查用户是否属于该部门。我不知道在前一个方法中的数据库中是否放置了用于检查用户是否存在的代码。你能帮帮我吗?
检查数据库中用户是否存在的初始代码:
if (!String.IsNullOrEmpty(userid))
{
string username = userid;
string connString = "Data Source=localhost\\sqlexpress;Initial Catalog=Test;Integrated Security=True";
string cmdText2 = "SELECT Count(*) FROM employee WHERE Username = '" + username + "'";
using (SqlConnection conn = new SqlConnection(connString))
{
conn.Open();
// Open DB connection.
using (SqlCommand cmd = new SqlCommand(cmdText2, conn))
{
cmd.ExecuteScalar();
}
}
}
我通过Security类中的方法修改为:
public static bool isMember(string userid)
{
if (!String.IsNullOrEmpty(userid))
{
string username = userid;
string connString = "Data Source=localhost\\sqlexpress;Initial Catalog=Test;Integrated Security=True";
string cmdText2 = "SELECT Count(*) FROM employee WHERE Username = '" + username + "'";
using (SqlConnection conn = new SqlConnection(connString))
{
conn.Open();
// Open DB connection.
using (SqlCommand cmd = new SqlCommand(cmdText2, conn))
{
cmd.ExecuteScalar();
}
}
return true;
}
else if (Org.Code == code)
return true;
else
return false;
}
但通过这样做,系统对所有人开放,即使他们在部门之外。 那么如何解决这个问题?
答案 0 :(得分:1)
您必须检查已执行命令的结果:
var count = (int) cmd.ExecuteScalar();
return count == 1; // return true if there's only one employee with given name
还可以防止SQL注入攻击并修改
string cmdText2 = "SELECT Count(*) FROM employee WHERE Username = '" + username + "'";
到
string cmdText2 = "SELECT Count(*) FROM employee WHERE Username = @UserName";
并在代码
中设置参数值cmd.Parameters.Add("@UserName", SqlDbType.VarChar);
cmd.Parameters["@UserName"].Value = userName;