Nie „oczyszczaj” dane wejściowe jako środek zapobiegający wstrzykiwaniu SQL - użyj symboli zastępczych (lub poprawna ucieczka) , zawsze. Bądź konsekwentny. Bądź bezpieczny. Problem został już rozwiązany.
Ta sprawa będzie „bezpieczna” ze względu na ograniczoną domenę base64_encode funkcjonować. Jednak...
To jest złe praktyki i przechowywanie wartości zakodowanych w base64 (takie, że pokazane zapytanie może działać) niesie ze sobą kilka ujemnych implikacje w miarę zmian przechowywane informacje:niszczy uporządkowanie wartości sprawia, że informacje nie można łatwo przeszukiwać , wymaga dodatkowego krok „kodowanie/dekodowanie”, a nawet zużywa więcej miejsca – ała!
Tak więc, chociaż mogą wystąpić szczególne przypadki danych zakodowanych w base64, to podejście nie dobrze nadaje się jako sposób na złagodzenie wstrzykiwania SQL .
Problem polega na dostępie do SQL przez protokół tekstowy gdzie polecenie/kształt zapytania i wartości są wymieszane. Użycie poprawnego techniki ucieczki (np. mysql_real_escape_string ) rozwiązuje ten problem, zapewniając, że informacje są eskortowane, dzięki czemu tekst SQL jest przetwarzany zgodnie z przeznaczeniem — jednak w przeciwieństwie do kroku z kodowaniem base64 nie faktycznie zmienić dostarczone informacje!
To jest dokładnie co zapewniają symbole zastępcze ! Symbole zastępcze to the powszechnie poprawnym podejściem i należy do niego zachęcać. Symbole zastępcze pozwalają na przesłanie zapytania i wartości do bazy danych oddzielnie gdy jest obsługiwane przez bibliotekę/bazę danych; i są emulowane przez ucieczkę w inny sposób. Prawidłowe użycie symbolu zastępczego eliminuje Wstrzyknięcie SQL i potrzeba mieszania wartości w kodzie użytkownika z tekstem poleceń SQL, co może również ułatwić pisanie i obsługę zapytań.
Aby uniemożliwić „indywidualnym programistom” pisanie okropnych zapytań, rozwiązaniem jest zapobieganie Zapytania ad hoc przed rozproszeniem w kodzie:zbierz operacje dostępu do danych w warstwie dostępu do danych ( DAL) (prawdopodobnie w połączeniu z ORM) i ujawniaj tylko odpowiednie akcje, zapewniając prawidłowe użycie SQL w DAL. W prostszych projektach DAL jest również odpowiednią lokalizacją do centralnego zarządzania regułami biznesowymi dotyczącymi warunków sanitarnych i innej logiki walidacji.
Dokładniej:
-
Oczyść wartości dla reguł biznesowych; powinno to zapobiec „złym informacjom”, takim jak nazwa użytkownika, która jest zbyt krótka, zawiera znaki zastrzeżone lub w inny sposób nie spełnia wymagań biznesowych.
-
Użyj symboli zastępczych aby zapobiec wstrzykiwaniu SQL . To jest ściśle związane z przesyłaniem danych do SQL i nie mają wpływu na zawarte w nich informacje.
Podczas gdy MySQL 5.6.1 dodaje FROM_BASE64 , tak że kodowanie może być po prostu użyte w tekście polecenia SQL, to nadal dodaje dodatkowy jawny krok dekodowania i komplikuje zapytanie przy użyciu takiego schematu kodowania. To podejście base64 po prostu nie konieczne, ponieważ istnieją już sprawdzone techniki zapobiegania wstrzykiwaniu SQL i nie zostały zaproponowane w początkowym pytaniu.