بررسی اصول امنیتی پایگاه های داده بخش بیست و یکم
شکل 5-2 : ایجاد کاربر در سطح پایگاهداده
3. کاربر موجود در پایگاهداده master باید اجازۀ اجرای sp_setapprole را داشته باشد و از دسترسی به سایر منابع باید محروم باشد. برای انجام این کار بر روی کاربر Login1 کلیک راست کرده و Properties را انتخاب کنید(شکل 5-3).
شکل 5-3 : اجازه اجرای sp_setapprole به کاربر Login1 اعطا شده است
4. برنامه رویۀ ذخیره شدۀ sp_setapprole را اجرا میکند. این رویه نام و کلمه رمز APR را از فرم ورود دریافت میکند(شکل 5-4).
شکل 5-4 : در یافت نام APR و کلمه رمز
کدهای زیر به زبان برنامه نویسی C# بوده و برای اجرای sp_setapprole است.
public partial class frm_begin : Form
{
public static SqlConnection con;
public SqlCommand cmd_SP;
public frm_begin()
{
String s = "Data Source=y;Initial Catalog=db_systemactivity;Integrated Security=True";
String s1 = "Data Source=y;Initial Catalog=db_systemactivity;User ID=u;Password='1';Network Library=dbmslpcn";
con = new SqlConnection(s1);
InitializeComponent();
}
//**************************************************************
private void btn_ok_Click(object sender, EventArgs e)
{
cmd_SP = con.CreateCommand();
cmd_SP.CommandType = CommandType.StoredProcedure;
cmd_SP.CommandText = "sp_setapprole";
cmd_SP.Parameters.Add("@rolename", SqlDbType.NVarChar).Value = txt_username.Text;
cmd_SP.Parameters.Add("@password", SqlDbType.NVarChar).Value = txt_password.Text;
con.Open();
cmd_SP.ExecuteNonQuery();
s1 = true;
//con.Close();
}
دقت کنید که SqlConnection بصورت static تعریف شده است علت این امر این است که Connection مورد نظر(con) تحت کنترل یکی از APR های معتبر در سطح پایگاه داده در آمده است و حوزۀ عملیاتی این Connection معادل حوزۀ عملیاتی APR است. حال فرض کنید فرمی دارید که مشخصات پرسنل یک شرکت را ثبت میکند. این فرم یا باید یک Connection جدید بسازد و یا باید از Connection این کلاس frm_begin استفاده کند. اگر قرار باشد تا برای این فرم یک Connection جدید ساخته شود دوباره باید از UserName و Password از کاربر درخواست شود(اگر تعداد فرمها زیاد باشد این عمل بسیار وقت گیر است) و یا اینکه UserName و Password از کلاس frm_begin به کلاس جاری منتقل شود. این انتقال میتواند بسیار مهلک باشد و انتقال این اطلاعات در سطح فرمها از لحاظ امنیتی مناسب نیست. بهترین روش استفاده از Connection موجود در کلاس frm_begin است. راههای متفاوتی برای انجام این کار وجود دارد که یکی از آنها تعریف Connection بصورت static است. به این نکته نیز توجه شود که این Connection نباید تا پایان کار کاربر بسته شود و لزومی به اجرای دستور con.Close() نیست.
5. در صورتی که این نام و کلمه رمز معتبر باشد ، APR مورد نظر فعال میشود.
6. در این لحظه ارتباط کاربر عادی قطع شده و برنامه با سطح دسترسی APR به SQLServer وصل میشود. پس از اجرای این رویه ، connection برنامه تحت کنترل نقش مورد نظر قرار میگیرد بدین معنی که اگر بر فرض مثال نقش برنامهای مجاز به دسترسی به جدول tbl1 نباشد ، پس از اجرای sp_setapprole ، این connection نیز حق دسترسی به این جدول را ندارد.