الجميع على دراية بحقن SQL. إنها طريقة هجوم شائعة. يدخل المهاجمون بعض شظايا SQL الغريبة على معلومات النموذج أو عنوان URL للواجهة ، مثل عبارات "أو" 1 '=' 1 '"، والتي قد تغزو التطبيقات مع التحقق من المعلمة غير الكافية. لذلك نحن بحاجة إلى القيام ببعض الأعمال في تطبيقنا لمنع طرق الهجوم هذه. في بعض التطبيقات ذات الأمان العالي ، مثل البرامج المصرفية ، نستخدم غالبًا طريقة استبدال جميع عبارات SQL بإجراءات مخزنة لمنع حقن SQL. هذه بالطبع طريقة آمنة للغاية ، لكننا قد لا نحتاج إلى هذه الطريقة الصارمة في تطورنا اليومي.
كإطار طبقة ثبات شبه أوتوموما ، يجب أن يكون إطار عمل MyBatis مكتوبًا يدويًا من قبل أنفسنا. في هذا الوقت ، بالطبع ، من الضروري منع حقن SQL. في الواقع ، SQL MyBatis هو بنية مع وظيفة "إدخال + إخراج" ، على غرار وظيفة ، على النحو التالي:
<حدد ID = "getBlogById" resultType = "blog" parametertype = "int"> <br> حدد المعرف ، العنوان ، المؤلف ، المحتوى من المدونة حيث id =#{id} </select> هنا ، تشير المعلمة إلى نوع المعلمة الإدخال ، ويشير ResultType إلى نوع المعلمة الإخراج. استجابة لما سبق ، إذا أردنا منع حقن SQL ، فيجب علينا أن نعمل بجد على معلمات المدخلات. الجزء المميز في الكود أعلاه هو الجزء الذي يتم فيه تقطيع معلمات الإدخال في SQL. بعد المرور في المعلمات ، قم بطباعة بيان SQL الذي تم تنفيذه وسترى أن SQL يبدو هكذا:
حدد المعرف ، العنوان ، المؤلف ، المحتوى من المدونة حيث معرف =؟
بغض النظر عن المعلمات التي يتم إدخالها ، فإن SQL المطبوعة مثل هذا. وذلك لأن MyBatis يتيح وظيفة premompilation. قبل تنفيذ SQL ، سيتم إرسال SQL أعلاه إلى قاعدة البيانات للتجميع. أثناء التنفيذ ، يمكنك استخدام SQL المترجمة مباشرة واستبدال العنصر النائب "؟". نظرًا لأن حقن SQL لا يمكن أن يعمل إلا على عملية التجميع ، يمكن أن تتجنب هذه الطريقة مشكلة حقن SQL.
كيف يحقق MyBatis مسبقًا من SQL؟ في الواقع ، في الجزء السفلي من الإطار ، تعمل فئة الإعداد في JDBC. ReparedStatement هي فئة فرعية من البيان الذي نحن على دراية به. يحتوي كائنه على عبارات SQL المترجمة. هذا النهج "الجاهز" لا يحسن الأمان فحسب ، بل يعمل أيضًا على تحسين الكفاءة عند تنفيذ SQL عدة مرات ، لأنه تم تجميع SQL ولا داعي للتجميع عند التنفيذ مرة أخرى.
بعد قولي هذا ، هل يمكننا منع حقن SQL باستخدام MyBatis؟ بالطبع لا ، يرجى الاطلاع على الرمز التالي:
<حدد ID = "orderblog" resultType = "blog" parametertype = "map"> حدد المعرف ، العنوان ، المؤلف ، المحتوى من طلب المدونة بواسطة $ {orderparam} </select> بعد الملاحظة الدقيقة ، تغير تنسيق المعلمة المضمنة من "#{xxx}" إلى $ {xxx}. إذا قمنا بتعيين المعلمة "OrderParam" إلى "ID" وطباعة SQL ، فيبدو هذا:
حدد المعرف ، العنوان ، المؤلف ، المحتوى من طلب المدونة حسب المعرف
من الواضح أن هذا لا يمكن أن يمنع حقن SQL. في MyBatis ، ستشارك المعلمات في التنسيق "$ {xxx}" مباشرة في تجميع SQL ، وبالتالي منع هجمات الحقن. ومع ذلك ، عندما يتعلق الأمر بأسماء الجدول الديناميكية وأسماء الأعمدة ، يمكننا فقط استخدام تنسيقات المعلمة مثل "$ {xxx}" ، لذلك نحتاج إلى معالجة هذه المعلمات يدويًا في الكود لمنع الحقن.
الخلاصة: عند كتابة عبارات تعيين MyBatis ، حاول استخدام التنسيق "#{xxx}". إذا كان عليك استخدام معلمات مثل "$ {xxx}" ، فيجب عليك القيام بعمل جيد في التصفية يدويًا لمنع هجمات حقن SQL.
ما سبق هو المحتوى الكامل لإطار طبقة الثبات Java يمنع MyBatis MyBatis يمنع حقن SQL الذي يجلبه لك المحرر. آمل أن يدعم الجميع wulin.com أكثر ~