Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [HTML][MySQL][PHP]używanie real_escape_string dla danych wysyłanych z formularza
Forum PHP.pl > Forum > Przedszkole
radziopoke
Często na stronach mam różne formularze najczęściej dane z nich wysyłane są metodą post.

Słyszałem już nie raz że jeżeli takie dane chcemy przesłać do bazy MySQL należy użyć funkcji real_escape_string by zabezpieczyć się przed włamaniem. No i tu pojawia się problem gdyż wysyłane dane na jednym serwerze potrzebują tej funkcji na innym tylko to przeszkadza.

Przykład
w formularzu wpisałem:
coś tam ' i coś innego

Wiadomo, że znak ' powinien zostać "zabezpieczony" lecz nie wiedzieć czemu na jednym serwerze taki tekst wysłany metodą post(nie wiem jak jest z get) jest przekazany w tablicy post jako: coś tam \' i coś innego (oczywiście wypisanie tego na ekranie nie pokarze nam slesha)
Lecz jeżeli chciałbym wysłać taki tekst do bazy i potraktuję to jeszcze za pomocą real_escape_string to przy wypisaniu danych z bazy widnieje na ekranie tekst z \'

Jednak niektóre serwery (przynajmniej tak chyba kiedyś było) nie miały tak zabezpieczonych danych i bez real_escape_string wyskakiwał błąd zapytania.

Ciekawię się czy teraz wszędzie tak jest, że dane wysłane z formularza są tak zabezpieczanie, a jak nie to jak stworzyć kod by na każdym serwerze działał dobrze?
Michael2318
Zadaniem wszystkich funkcji chroniących przed SQLI jest właśnie zamiana apostrofów ( ' ) na postać ( \' ).
Możesz użyć innych funkcji do zabezpieczeń: http://majkelo.pl/php-mysql-bezpieczenstwo...ection,vp16.htm
radziopoke
Np. na home.pl jeżeli próbuje np wysłać przez formularz coś w stylu:

Kod
jakiś tekst ' coś dalej


a zapytanie wygląda tak:
  1. $dane = $mysqli->real_escape_string($_POST['login']);
  2. $query = "SELECT * FROM `table` WHERE user='".$dane."'"
  3. //wysłanie zapytania itp
  4. //...
  5.  
  6. //po wszystkim
  7. echo $query;


w efekcie otrzymuję błąd, a funkcja echo wyświetla:
Kod
SELECT * FROM `table` WHERE user='jakiś tekst \\' coś dalej'

widać tu dwa slashe.
jednak gdy wyślę(bez zabezpieczeń):
  1. $query = "SELECT * FROM `table` WHERE user='".$_POST['login']."'"

zapytanie wykonuje się poprawnie. wynik:
Kod
SELECT * FROM `table` WHERE user='jakiś tekst \' coś dalej'


To tak jakby wysłane dane przez formularz same się zabezpieczyły. Ale czy tak jest na każdym serwerze? Wątpię. Dlatego chciałbym się dowiedzieć jak sprawdzić czy dane wysłane przez formularz są już zabezpieczone?
Michael2318
http://pl.wikibooks.org/wiki/PHP/Biblioteka_PDO
Cytat
Kiedy PHP był jeszcze niewielkim projektem, ktoś wpadł na pomysł wspomożenia programistów i wymyślił tzw. magic quotes. Opcja ta, jeżeli jest włączona, powoduje, że we wszystkich danych z tablic $_GET, $_POST oraz $_COOKIE apostrofy są automatycznie poprzedzane backslashem, dzięki czemu nie trzeba się tym zajmować samodzielnie.

Podsumowując, masz tam włączone magic_quotes.
A czy tak jest na każdym serwerze - zależy czy jest włączone i tyle.
Ja bym to wyłączył i sam zabezpieczał dane. Jak wyłączyć, tutaj: http://tosiek.pl/wylaczenie-magic_quotes_g...quotes_runtime/
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.