يشير هجوم حقن SQL إلى استغلال نقاط الضعف في التصميم ، وتشغيل أوامر SQL على الخوادم المستهدفة ، والهجمات الأخرى.
السبب الرئيسي وراء نجاح هجوم حقن SQL عند توليد أوامر SQL ديناميكيًا.
على سبيل المثال:
إذا تم تحديد بيان الاستعلام الخاص بك * من المسؤول حيث اسم المستخدم = "" والمستخدم و "و" و "" "& pwd &" '' "
ثم ، إذا كان اسم المستخدم الخاص بي هو: 1 'أو' 1 '=' 1
ثم ، سيصبح بيان الاستعلام الخاص بك:
حدد * من المسؤول حيث اسم المستخدم = '1 أو' 1 '=' 1 'و password =' "& pwd &" '' "
وبهذه الطريقة ، سيتم تمرير بيان الاستعلام الخاص بك ، ويمكنك إدخال واجهة الإدارة الخاصة بك.
لذلك ، عند الوقاية ، تحتاج إلى التحقق من مدخلات المستخدم. يتم تحويل الشخصيات الخاصة الخاصة ، مثل عروض الأسعار الفردية ، والاقتباسات المزدوجة ، والفواصل ، والفواصل ، والكولون ، والاتصالات ، وما إلى ذلك ، أو ترشيحها.
الشخصيات والسلاسل الخاصة التي يجب ترشيحها هي:
مستخدم صافي
xp_cmdshell
/يضيف
exec master.dbo.xp_cmdshell
صافي المسؤولين المحليين
يختار
عدد
ASC
شار
منتصف
'
:
"
أدخل
حذف من
جدول إسقاط
تحديث
اقتطاع
من
٪
فيما يلي رمز الوقاية الذي كتبته حول حل هجمات الحقن لمرجع التعلم الخاص بك!
إصدار JS من رمز هجوم حقن SQL ~:
[رمز تبدأ]
<script language = "javaScript">
<!-
var url = location.search ؛
var re =/^/؟ (.*) (Select ٪ 20 | insert ٪ 20 | delete ٪ 20from ٪ 20 | count/(| drop ٪ 20table | update ٪ 20treal ٪ 20 | asc/(| mid/(| char/ (|
var e = re.test (url) ؛
إذا (ه) {
تنبيه ("العنوان يحتوي على أحرف غير قانونية ~") ؛
location.href = "error.asp" ؛
}
//->
<script>
[نهاية الكود]
إصدار ASP من الكود لمنع هجمات حقن SQL ~:
[رمز تبدأ]
<٪
عند استئناف الخطأ التالي
قاتمة strtemp
إذا كان lace (request.servervariables ("https")) = "OFF" ثم
strtemp = "http: //"
آخر
strtemp = "https: //"
إنهاء إذا
strtemp = strtemp & request.servervariables ("server_name")
إذا كان request.servervariables ("server_port") <> 80 ثم strtemp = strtemp & ":" & request.servervariables ("server_port")
strtemp = strtemp & request.servervariables ("url")
إذا كانت القطع (request.querystring) <> "" ثم strtemp = strtemp & "؟
strtemp = lace (strtemp)
إذا كانت Instr (strtemp أو "Select ٪ 20") أو Instr (StrTemp أو "Insert ٪ 20") أو Instr (Strtemp أو "DELETE ٪ 20FROM") أو Instr (Strtemp أو "count (") أو Instr ٪ 20table ") أو instr (strtemp ،" update ٪ 20 ") أو instr (strtemp ،" truncate ٪ 20 ") أو instr (strtemp ،" ASC (") أو instr ، "char (") أو Instr (strtemp ، "xp_cmdshell") أو Instr (strtemp ، "exec ٪ 20master") أو instr (strtemp ، "net ٪ 20localgroup ٪ 20administrators") أو instr (strtemp ، ":") instr (strtemp ، ") أو Instr (strtemp ،" ٪ 20or ٪ 20 ") ثم
استجابة. write "<script language = 'javaScript'>"
استجابة. الكتابة "تنبيه (" عنوان غير قانوني !! ") ؛"
استجابة. write "location.href = 'error.asp' ؛"
استجابة. "<script>"
إنهاء إذا
٪>
[نهاية الكود]
C# تحقق من السلاسل لمنع هجمات حقن SQL
في هذا المثال ، يتم تحديده مبدئيًا باسم = و "الأرقام
Bool CheckParams (Params Object [] args)
{
String [] lawlesses = {"=" ، "'"} ؛
if (lawlesses == null || lawlesses.length <= 0) return true ؛
.
// بالإضافة إلى ذلك ، نظرًا لأنني أرغب في القيام بالوظائف العامة وسهلة التعديل ، فإن لدي خطوة أخرى من صفيف الأحرف إلى التعبيرات العادية.
String str_regex = ".*[" ؛
لـ (int i = 0 ؛ i <lawlesses.length-1 ؛ i ++)
str_regex+= lawlesses [i]+"|" ؛
str_regex+= lawlesses [lawlesses.length-1]+"].*" ؛
//
foreach (كائن arg في args)
{
إذا كانت (Arg re re string) // إذا كانت سلسلة ، فتحقق مباشرة
{
if (regex.matches (arg.toString () ، str_regex) .count> 0)
العودة كاذبة
}
إذا كان (Arg is Icollection) // إذا كانت مجموعة ، فتحقق مما إذا كان العنصر في المجموعة عبارة عن سلسلة.
{
foreach (كائن OBJ في (icollection) arg)
{
إذا (OBJ هي سلسلة)
{
if (regex.matches (obj.toString () ، str_regex) .count> 0)
العودة كاذبة
}
}
}
}
العودة صحيح.