Mysql
 sql >> база данни >  >> RDS >> Mysql

Base64 като метод за дезинфекция на въведеното от потребителя за Mysql

Не „дезинфекцирайте“ въвеждане като средство за предотвратяване на SQL инжектиране - използвайте заместители (или правилното бягство) , винаги. Да бъда постоянен. Пази се. Проблемът вече е решен.

Този случай ще бъде „безопасен“ поради ограничения домейн на base64_encode функция. Въпреки това...

Това е лоша практика и съхраняването на стойности, кодирани в base64 (така че показаната заявка може да работи) носи няколко отрицателни последици, тъй като промени съхраняваната информация:тя унищожава подреждането на стойностите прави информацията нетривиална за търсене , изисква допълнителен стъпка „кодиране/декодиране“ и дори консумира повече място - ооо!

По този начин, въпреки че може да има специфични случаи за base64-кодиране на данни, този подход не подходящ като средство за смекчаване на SQL инжекция .

Проблемът се дължи на достъпа до SQL чрез текстов протокол където командата/формата на заявката и стойности се смесват. Използването на правилно техники за избягване (напр. mysql_real_escape_string ) коригира това, като гарантира, че информацията е екранирана, така че SQL текстът да се разбира синтактично както е предвидено - обаче, за разлика от стъпка за кодиране на base64, не всъщност променете предоставената информация!

Това е точно какво предоставят заместителите ! Заместителите са the универсално правилен подход и трябва да бъде насърчаван. Заместители позволяват изпращането на заявката и стойностите към базата данни отделно когато се поддържа от библиотеката/базата данни; и се емулират чрез избягване по друг начин. Правилното използване на заместителя елиминира SQL инжекция и необходимостта от потребителски код за смесване на стойности в SQL команден текст, което също може да направи заявките по-лесни за писане и поддръжка.

За да предотвратите "индивидуалните програмисти" да пишат ужасни заявки, решението е предотвратяване ad hoc заявки да не бъдат разпръснати наоколо в кода:събирайте операциите за достъп до данни в слой за достъп до данни ( DAL) (евентуално във връзка с ORM) и излагайте само съответните действия, като гарантирате правилното използване на SQL в рамките на DAL. При по-прости проекти DAL също е подходящо място за централно управление на бизнес правилата за санитария и друга логика за валидиране.

По-точно:

  • Санитизирайте ценности за бизнес правила; това трябва да предотврати „лоша информация“, като например потребителско име, което е твърде кратко, съдържа ограничени знаци или по друг начин не отговаря на бизнес изискванията.

  • Използвайте заместители за предотвратяване на SQL инжекция . Това е строго свързано с прехвърлянето на данните към SQL и няма отношение към информацията в тях.

Докато MySQL 5.6.1 добавя FROM_BASE64 , така че кодирането може просто да се използва в текста на SQL командата, това все пак добавя допълнителна изрична стъпка на декодиране и усложнява заявката при използване на такава схема за кодиране. Този подход base64 просто не е необходимо, тъй като вече има доказани техники за предотвратяване на SQL инжектиране и не беше предложено в първоначалния въпрос.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Извличане на йерархия от таблица като тази

  2. mysql - преместване на редове от една таблица в друга

  3. Пример за връзка с JavaFX MySQL, моля

  4. Изберете последните N реда от MySQL

  5. Секции на конфигурационния файл на Mysql