14-10-12, 09:11 PM
- استخدام ال Parameterized Command Objects :
كما لاحظت من الدرس الذي تحدثنا فيه عن ال SQL Injection ، فإن الطريقة التقليدية لجمل الاستعلام تظل خطرة ، لذا نبدا باستخدام Parameters لجمل الاستعلام لدينا ايضاً حتى لو لم نكن نتعامل مع Stored Procedure .
لو أخذنا المثال التالي للتجربة :
C#:
vb.net:
ستجد اننا قادرين بمبادئ ال SQL Injection من اختراق هذا النظام بسهولة ، لذا البديل يكون باستخدام وتعريف SqlParameter:
C#:
vb.net:
هنا كما لاحظت قمنا بتمرير باميترات إلى جملة استعلام قمنا نحن بكتابتها ضمن البرنامج .
- الحالة الثانية التي لدينا وهي الشائعة الاستخدام هي حالة تعريف Stored Procedure ، لو افترضنا مثلاً جملة الاستعلام التي أنشأناها في أول درس لنا بالشكل التالي :
وقمنا بحفظها باسم GetAge ، الآن نريد استدعاءها من البرنامج ، يتم ذلك بالشكل التالي مثلاً :
C#:
vb.net:
كما لاحظت ، قمنا بتعريف نوع ال Command هنا نظراً لإن الافتراضي هو Text ، ومن ثم قمنا بتعريف متغير الدخول ومتغير الخروج أيضاً .
كما لاحظت من الدرس الذي تحدثنا فيه عن ال SQL Injection ، فإن الطريقة التقليدية لجمل الاستعلام تظل خطرة ، لذا نبدا باستخدام Parameters لجمل الاستعلام لدينا ايضاً حتى لو لم نكن نتعامل مع Stored Procedure .
لو أخذنا المثال التالي للتجربة :
C#:
كود :
[SIZE=3]string strSQL = "Select [First Name]+[Last Name] as [Full Name], Age From Employee where ID=" + ID;
SqlCommand myCommand = new SqlCommand(strSQL, cn);[/SIZE]vb.net:
كود :
[SIZE=3]Dim strSQL As String = "Select [First Name]+[Last Name] as [Full Name], Age From Employee where ID=" + ID
Dim myCommand As New SqlCommand(strSQL, cn) [/SIZE]ستجد اننا قادرين بمبادئ ال SQL Injection من اختراق هذا النظام بسهولة ، لذا البديل يكون باستخدام وتعريف SqlParameter:
C#:
كود :
[SIZE=3]string sql = string.Format("Select [First Name]+[Last Name] as [Full Name], Age From Employee where [/SIZE][SIZE=3]ID=@ID[/SIZE][SIZE=3]");
using(SqlCommand cmd = new SqlCommand(sql, this.sqlCn))
{
// Fill params collection.
SqlParameter param = new SqlParameter();
param.ParameterName = "@ID";
param.Value = 10;
param.SqlDbType = SqlDbType.Int;
cmd.Parameters.Add(param);[/SIZE]
[SIZE=3]// تنفيذ جملة الاستعلام بأي شكل هنا
cmd.ExecuteNonQuery();
}[/SIZE]vb.net:
كود :
Dim sql As String = String.Format("Select [First Name]+[Last Name] as [Full Name], Age From Employee whereكود :
[SIZE=3]ID=@ID[/SIZE][SIZE=3]")
Using cmd As New SqlCommand(sql, Me.sqlCn)
' Fill params collection.
Dim param As New SqlParameter()
param.ParameterName = "@ID"
param.Value = 10
param.SqlDbType = SqlDbType.Int
cmd.Parameters.Add(param)
' تنفيذ جملة الاستعلام بأي شكل هنا
cmd.ExecuteNonQuery()
End Using[/SIZE]هنا كما لاحظت قمنا بتمرير باميترات إلى جملة استعلام قمنا نحن بكتابتها ضمن البرنامج .
- الحالة الثانية التي لدينا وهي الشائعة الاستخدام هي حالة تعريف Stored Procedure ، لو افترضنا مثلاً جملة الاستعلام التي أنشأناها في أول درس لنا بالشكل التالي :
كود :
[SIZE=3]ALTER PROCEDURE dbo.GetAge[/SIZE]
[SIZE=3]@condition int,
@firstname char(10) output[/SIZE]
[SIZE=3]AS[/SIZE]
[SIZE=3]SELECT @firstname=[First Name] from Employee_info where age > @condition[/SIZE]وقمنا بحفظها باسم GetAge ، الآن نريد استدعاءها من البرنامج ، يتم ذلك بالشكل التالي مثلاً :
C#:
كود :
[SIZE=3]using (SqlCommand cmd = new SqlCommand("GetAge", cn))
{
cmd.CommandType = CommandType.StoredProcedure;[/SIZE]
[SIZE=3]SqlParameter param = new SqlParameter();
param.ParameterName = "@condition";
param.SqlDbType = SqlDbType.Int;
param.Value = myAge;
param.Direction = ParameterDirection.Input;
cmd.Parameters.Add(param);[/SIZE]
[SIZE=3]param = new SqlParameter();
param.ParameterName = "@firstnameName";
param.SqlDbType = SqlDbType.Char;
param.Size = 10;
param.Direction = ParameterDirection.Output;
cmd.Parameters.Add(param);[/SIZE]
[SIZE=3]cmd.ExecuteNonQuery();
MessageBox.Show(cmd.Parameters["@firstName"].Value.ToString());
}[/SIZE]vb.net:
كود :
Using cmd As New SqlCommand("GetAge", cn)
cmd.CommandType = CommandType.StoredProcedure
Dim param As New SqlParameter()
param.ParameterName = "@condition"
param.SqlDbType = SqlDbType.Int
param.Value = myAge
param.Direction = ParameterDirection.Input
cmd.Parameters.Add(param)
param = New SqlParameter()
param.ParameterName = "@firstnameName"
param.SqlDbType = SqlDbType.[Char]
param.Size = 10
param.Direction = ParameterDirection.Output
cmd.Parameters.Add(param)
cmd.ExecuteNonQuery()
MessageBox.Show(cmd.Parameters("@firstName").Value.ToString())
End Usingكما لاحظت ، قمنا بتعريف نوع ال Command هنا نظراً لإن الافتراضي هو Text ، ومن ثم قمنا بتعريف متغير الدخول ومتغير الخروج أيضاً .
