SELECT QUOTENAME(@form_input, '''');
Natijalar ip atrofidagi apostroflarni ko'rsatadi. Bunga qo'shimcha ravishda, kirish satridagi apostrof, uni ishlatadigan satrlar buzilmasligini ta'minlaydigan ikki tomon lama apostroflar bilan almashtirildi:
Results.
QUOTENAME-dan foydalanishda yomon alternativalar ko'p, ulardan eng yomoni belgi kombinatsiyalarini qo'lda sozlash uchun REPLACE ko'p funktsiyalarini qo'lla shdir. Natija ko'pincha quyidagicha ko'rinadi:
DECLARE @form_input VARCHAR(250) = '''SELECT * FROM dbo.all_of_ my_passwords';
SELECT REPLACE(@form_input, '''', '''''');
Bu kirishlarni tozalashning qiyin usuli, chunki xaker tomonidan qilinadigan har qan day yomon harakatni oldindan bilish va bu erda hisobga olish kerak. Agar biz bosh qa ajratilgan satr ichida dinamik SQL-ni bajarayotgan kambag'al dastaklar bo'lsak, unda apostroflar hajmi tartibsizlikka va xatolarga olib keladigan kodni keltirib chiq aradigan aylanish miqdoriga yaqinlashishini kuting. Ilova va veb-kod ham tozalovc hi kirishlarga ega ekanligiga ishonch hosil qiling. Bu bizni yomon kod, inson xatosi yoki xavfsizlikning zaifligini salbiy ta'siridan himoya qiladigan qo'shimcha himoya qatlamlarini ta'minlaydi.
LIKE operatorlaridan ehtiyotkorlik bilan foydalaning.
Agar foydalanuvchi ma'lumotlari LIKE operatoridan foydalanadigan so'rovga yubo rilsa, natijada olingan so'rov faqat to'g'ri ma'lumotlarni so'rashiga amin bo'lishimiz kerak. Masalan, "Edvard" deb nomlangan odamlarni oddiy qidirishimiz mumkin:
DECLARE @Search_Criteria NVARCHAR(MAX) = 'Edward';
SELECT
*
FROM Person.Person
WHERE Person.FirstName LIKE @Search_Criteria;
Natijalar Yusuf ismli 72 kishidan iborat:
Agar foydalanuvchi qidiruviga foiz belgisini qo'shsa nima bo'lishini koramiz:
DECLARE @Search_Criteria NVARCHAR(MAX) = '%%' -- User searches f or "Thom", and gets no results returned.
SELECT
*
FROM Person.Person
Bo'sh qidiruv bo'lmasa ham, yuqoridagi so'rov person.Person tarkibini qaytaradi:
Ushbu stsenariyda natijalar to'plami 19,972 qatorni tashkil qiladi. Foiz belgilarining harflar harflari sifatida ko'rib chiqilishini yoki ularni umuman rad etishini ta'minlas h uchun biz ma'lumotlarni tozalashimiz kerak. Agar kerak bo'lsa, TSQL-dan satrlar ni boshqarish va foiz belgilarini harflar soniga aylantirish uchun foydalanish mumkin:
DECLARE @Search_Criteria NVARCHAR(MAX) = '%%' -- User searches f or "Thom", and gets no results returned.
SELECT @Search_Criteria = REPLACE(@Search_Criteria, '%', '[%]');
SELECT * FROM Person.Person
WHERE Person.FirstName LIKE @Search_Criteria;
Bu ideal echim emas, chunki u faqat bitta belgiga murojaat qiladi, ammo agar bu faqat belgi masalasi bo'lsa, u maqbul bo'ladi. Ushbu xatti-harakatlarning asosiy echimi - LIKE taqqoslash bilan ehtiyotkorlik bilan ishlash va kirish satri foydalanuvchiga ular uchun mo'ljallanmagan natijalarni qaytarishga imkon berishi mumkin bo'lgan o'zgartirilmagan belgilar yoki regex modifikatorlaridan o'tmasligini ta'minlash. Shunga o'xshab, agar jadval juda katta bo'lsa, biz foydalanuvchi ushbu katta jadvalga nisbatan indeks skanerini chiqara olishini istamaymiz, chunki milliardlab qatorlarni ko'rib chiqishda xavfsizlik muammosi ustida ishlash muammosi paydo bo'ladi.
Do'stlaringiz bilan baham: |