1

我开发了一个基于 Intranet Web 的应用程序,它运行良好。该系统仅专用于我公司的一个部门。该部门以外的任何用户在尝试浏览系统时都会收到错误页面。系统将通过将他的网络 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 类中的先前方法以检查用户是否存在于数据库中。如果不是,系统应该使用 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;
    }

但是通过这样做,系统对所有人开放,即使他们在部门之外。那么如何解决这个问题呢?

4

1 回答 1

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;
于 2012-11-19T08:24:14.030 回答