Latest web development tutorials

حقن سكليتي

إذا كان موقع الويب الخاص بك يسمح للمستخدمين المدخلات، والمدخلات في قاعدة بيانات SQLite، وهذه المرة كنت تواجه مشكلة السلامة كما هو معروف حقن SQL. وهذا الفصل تظهر لك كيفية منع هذا من الحدوث، وضمان البيانات سكليتي النصي الأمن.

يحدث حقن عادة عند طلب إدخال المستخدم، مثل يحتاج المستخدم لإدخال اسم، ولكن كان المستخدم قد دخلت بيان سكليتي، وسيتم تشغيل هذا البيان على قاعدة البيانات دون وعي.

أبدا البيانات التي يتم توفيرها المستخدم الثقة، ومعالجة البيانات وذلك فقط التحقق من صحتها، ويتم الحكم من خلال مطابقة النقش. في المثال التالي، اسم المستخدم اسم المستخدم يقتصر على أحرف أبجدية رقمية أو سفلية، يجب أن يكون طولها ما بين 8-20 حرفا - وفقا للحاجة لتعديل هذه القواعد.

إذا (preg_match ( "/ ^ \ ث {8،20} $ /"، $ _GET [ 'اسم المستخدم']، $ نقاط)) {
   $ ديسيبل = SQLiteDatabase الجديدة ( 'اسم')؛
   $ النتيجة = @ $ DB-> الاستعلام ( "SELECT * FROM المستخدمين حيث اسم المستخدم = $ مباريات [0]")؛
} {شيء آخر
   صدى "اسم المستخدم غير مقبولة".
}

وللتدليل على هذه المشكلة، والنظر في هذه الفرضية مقتطفات: لعرض المشكلة، والنظر في هذا المقتطف:

$ اسم = "القادر '؛ حذف من المستخدمين.".
@ $ DB-> الاستعلام ( "SELECT * FROM المستخدمين حيث اسم المستخدم = '{$ اسم}")؛

وظيفة الدعوة إلى استرداد اسم العمود المحدد من قبل اسم المستخدم مباريات سجل من الجدول المستخدم.في ظل الظروف العادية،$ اسم يحتوي على أحرف والمساحات أبجدية رقمية فقط، مثل إيليا السلسلة. ولكن هنا، على سبيل المثال $ بإضافة استعلام جديد، يدعو إلى قاعدة البيانات سوف يسبب مشاكل كارثية: حقن الاستعلام DELETE لحذف كافة السجلات من المستخدمين.

على الرغم من أن هناك لا يسمح لتنفيذ الاستعلام أو قاعدة بيانات واجهة التراص استعلامات متعددة في استدعاء دالة واحدة، إذا حاولت كومة الاستعلام، ثم فشل المكالمة، ولكن سكليتي وشبكة الإنترنت لا تزال مكدسة في الاستعلام، التي تنص على الإعدام في سلسلة جميع الاستفسارات، التي يمكن أن تسبب مشاكل أمنية خطيرة.

حقن منع SQL

في لغات البرمجة مثل بيرل و PHP، يمكنك التعامل مع بمهارة كل حرف الهروب. يوفر PHP برمجة سلسلة اللغة ظائفsqlite_escape_string () لسكليتي يستخدم للهروب أحرف خاصة الإدخال.

إذا (get_magic_quotes_gpc ()) 
{
  $ اسم = sqlite_escape_string (اسم $)؛
}
$ النتيجة = @ $ DB-> الاستعلام ( "SELECT * FROM المستخدمين حيث اسم المستخدم = '{$ اسم}")؛

على الرغم من أن يتم ترميز البيانات بحيث جعلت إدراج آمن، ولكنها سوف تجعل المقارنة نصية بسيطة، في الاستعلام، العمود يحتوي علىبيانات ثنائية مثلالشرط غير متوفر.

يرجى ملاحظة، لا ينبغي أن يكون مرجعا addslashes () في سلسلة الاستعلام سكليتي، فإنه سيؤدي إلى نتائج غريبة عند استرجاع البيانات.