لقد كنت أستخدم MyBatis مؤخرًا. لقد استخدمت ibatis من قبل. بشكل عام ، إنه مشابه ، لكنني ما زلت واجهت العديد من المشاكل. سوف أسجلها مرة أخرى.
اسمحوا لي أولاً أن أقدم الفرق بين #{} و $ {} في MyBatis ، على النحو التالي:
1. # تعامل مع جميع البيانات الواردة كسلسلة ، وأضف عروض أسعار مزدوجة إلى البيانات الواردة تلقائيًا. على سبيل المثال: اطلب بواسطة #user_id #، إذا كانت القيمة التي تم تمريرها هي 111 ، فإن القيمة عند التحليل في SQL هي أمر "111". إذا كانت القيمة التي تم تمريرها هي معرف ، فإن التحليل في SQL هو أمر من خلال "ID".
2. $ يعرض البيانات التي تم تمريرها مباشرة وإنشاءها في SQL. على سبيل المثال: اطلب بواسطة $ user_id $ ، إذا كانت القيمة التي تم تمريرها هي 111 ، فإن القيمة عند تحليلها في SQL يتم طلبها بواسطة user_id. إذا كانت القيمة التي تم تمريرها هي معرف ، فإن التحليل في SQL هو أمر حسب المعرف.
3. يمكن أن تمنع طريقة # بشكل كبير حقن SQL.
4. طريقة $ لا يمكن أن تمنع حقن SQL.
5. يتم استخدام طريقة $ بشكل عام لتمرير كائنات قاعدة البيانات ، مثل تمرير أسماء الجدول.
6. عمومًا ، إذا كنت تستطيع استخدام #، فلا تستخدم $.
عند استخدام الطلب حسب المعلمات الديناميكية عند فرز MyBatis ، تحتاج إلى الانتباه إلى استخدام $ بدلاً من #
استبدال السلسلة
بشكل افتراضي ، يؤدي استخدام بناء جملة Format #{} إلى إنشاء خاصية بيان معالجة مسبقًا وتعيين قيمة آمنة معها كخلفية (مثل؟). هذا آمن وسريع ، وأحيانًا تريد فقط إدخال سلسلة لا تتغير مباشرة إلى عبارة SQL. على سبيل المثال ، مثل الترتيب ، يمكنك استخدامه مثل هذا:
اطلب بواسطة $ {columnName}
هنا لن يقوم MyBatis بتعديل أو سلاسل الهروب.
هام: ليس من الآمن قبول إخراج المحتوى من المستخدم وتوفيره لسلسلة غير متغيرة في البيان. يمكن أن يؤدي ذلك إلى هجمات حقن SQL المحتملة ، لذلك يجب ألا تسمح للمستخدمين بدخول هذه الحقول ، أو عادةً ما يهربون ويفحصونها بنفسك.
وصف MyBatis نفسه:
String structionby الافتراضي ، باستخدام بناء الجملة #{} سيؤدي إلى إنشاء MyBatis لإنشاء خصائص الإعداد وتعيين القيم بأمان مقابل معلمات المعدل (على سبيل المثال؟). على الرغم من أن هذا أكثر أمانًا وأسرع ويفضل دائمًا ، إلا أنك في بعض الأحيان تريد فقط ضخ سلسلة غير معدلة في عبارة SQL. على سبيل المثال ، بالنسبة للترتيب ، يمكنك استخدام شيء مثل هذا: order by $ {columnname} هنا لن يعدل MyBatis أو الهروب من السلسلة. من غير الآمن قبول الإدخال من المستخدم وتزويدها ببيان غير معدّل بهذه الطريقة. هذا يؤدي إلى هجمات حقن SQL المحتملة ، وبالتالي يجب عليك إما عدم إدخال مدخلات المستخدم في هذه الحقول ، أو دائمًا تنفيذ هروبك والشيكات. من ما سبق ، يمكننا أن نرى:
1. استخدم بناء جملة التنسيق #{} لاستخدام عبارة التحضير في MyBatis لتعيين القيم بأمان ، وتنفيذ SQL مما يلي:
reparedStatement ps = conn.preparestatement (SQL) ؛ ps.setint (1 ، id) ؛
فائدة هذا هو: أكثر أمانًا وأسرع ، وعادة ما تكون الممارسة المفضلة.
2. ولكن في بعض الأحيان تريد فقط إدراج سلسلة غير متغيرة مباشرة في عبارة SQL. على سبيل المثال ، مثل الترتيب ، يمكنك استخدامه مثل هذا:
اطلب بواسطة $ {columnName} في هذا الوقت ، لن يقوم MyBatis بتعديل أو الهروب من السلسلة.
هذه الطريقة تشبه:
بيان st = conn.createstatement () ؛ resultset rs = st.executequery (sql) ؛
عيوب هذه الطريقة هي:
من غير الآمن قبول إخراج المحتوى من المستخدم وتوفير سلاسل غير متغيرة في البيان بهذه الطريقة ، مما يؤدي إلى هجمات حقن SQL المحتملة ، لذلك لا يُسمح للمستخدم بإدخال هذه الحقول أو الهروب والتحقق من نفسه.