Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP/MySQL] Slashes, quotes i baza MySQL
Forum PHP.pl > Forum > PHP
Crade
Przede wszystkim, na wstępie: jako nowy użytkownik forum - witam wszystkich smile.gif.

Sporo się mówi ostatnio o atakach SQL Injection (choć nie tylko), ale i także prawidłowym zabezpieczaniem skryptów. Jako, że ja nie miałem do czynienia z wieloma różniącymi się serwerami, nie mogę też mieć pojęcia na temat funkcji dotyczących automatycznego dodawania slashy przed znakami takimi jak ' " `. Chciałbym zadać pytanie, jednocześnie przeprowadzając małą "ankietę" pytając was o to, czy w swoich bazach danych MySQL trzymacie tekst w czystej formie w stylu, czy może skonwertowany za pomocą funkcji addslashes:

Cytat("Czysta forma")
Jestem Ania i chodzę na zakupy do sklepu tzw. "Super'Samu"

Cytat("Skonwertowana przez użycie funkcji addslashes")
Jestem Ania i chodzę na zakupy do sklepu tzw. \"Super\'Samu\"


Którą wersję preferujecie bardziej? Która wersja trzymania tekstu w bazie danych wydaje się Wam bezpieczniejsza? Mimo przyklejonego tematu o SQL Injection itp. byłbym wdzięczny za udzielanie się w temacie i wypisywanie zalet oraz wad wybranych przez Was sposobów.
Kicok
W bazie danych dane trzyma się w "czystej formie", co nie znaczy, że nie używa się funkcji zabezpieczających przed atakami SQL Injection (addslashes, mysql_escape_string, mysql_real_escape_string, itp.)


Prosty test: odpal sobie phpMyAdmina i spróbuj wykonać takie zapytanie:
  1. INSERT INTO tabela (pole_tekstowe) VALUES ('Jestem Ania i chodzę na zakupy do sklepu tzw. "Super'Samu"');
Wyrzuci błąd.

Następnie spróbuj wykonać takie zapytanie:
  1. INSERT INTO tabela (pole_tekstowe) VALUES ('Jestem Ania i chodzę na zakupy do sklepu tzw. \"Super'Samu\"');
i sprawdź jaki tekst znalazł się w bazie danych. Szczególną uwagę zwróć na to, czy zawiera ukośniki.


Ukośnik informuje tylko bazę danych, że następny po nim znak (apostrof, cudzysłów, itp.) ma być traktowany jako zwykły tekst, sam natomiast do bazy danych zapisywany nie jest.
Crade
A tu przysłowiowa (_._), gdyż dane z formularza wprowadzone do skryptu w takiej formie:

  1. $zmienna = addslashes($_POST['zmienna']);
  2. myslq_query(" INSERT INTO tabela SET `jakiespole` = '$zmienna' ");


... w bazie danych występują razem ze slashami.

Czy przyczyną tego jest używanie SET zamiast VALUES? Hmm... nie mam pomysłów sad.gif.
Kicok
  1. <?php
  2. echo($_POST['zmienna']);
  3. // Wyświetliły się slashe pomimo tego, że funkcję addslashes() użyjesz dopiero kilka linijek niżej? W takim razie poczytaj o magic_quotes:
  4. // <a href="http://pl.php.net/manual/pl/security.magicquotes.php" target="_blank">http://pl.php.net/manual/pl/security.magicquotes.php</a>
  5. // <a href="http://pl.php.net/manual/pl/function.get-magic-quotes-gpc.php" target="_blank">http://pl.php.net/manual/pl/function.get-m...-quotes-gpc.php</a>
  6.  
  7. echo('<br>');
  8.  
  9. $_POST['zmienna'] = addslashes($_POST['zmienna']);
  10. echo($_POST['zmienna']);
  11. // Teraz jest cała masa slashy. Te powstałe przez magic_quotes zostały dodatkowo p
    otraktowane funkcją addslashes()
  12.  
  13.  
  14. mysql_query("INSERT INTO tabela SET `jakiespole` = '{$_POST['zmienna']}'");
  15. // W bazie danych są teraz "pojedyncze" slashe, gdyż "połowa z nich" została potraktowana jako znaki ucieczki, a druga połowa jako zwykły tekst
  16. ?>


magic_quotes_qpc" title="Zobacz w manualu PHP" target="_manual - tą funkcją sprawdzasz, czy tablice $_POST, $_GET i $_COOKIE już na starcie zostały potraktowane funkcją addslashes(). Jeśli tak, to:
- jeśli używasz bazy danych MySQL, to dane wejściowe są już w pewnym stopniu zabezpieczone, jeśli używasz np. MSSQL to nie są zabezpieczone, bo MSSQL stosuje inny znak ucieczki.
- będziesz musiał pamiętać o użyciu funkcji stripslashes" title="Zobacz w manualu PHP" target="_manual przed wyświetleniem danych z wyżej wymienionych tablic superglobalnych. No chyba że nie razi cię to, że po wpisaniu w formularzu tekstu: Wydawnictwo O'Reilly na stronie wyświetli się: Wydawnictwo O\'Reilly
Crade
Dzięki, Kicok, za pomoc i obszernego posta. Mimo to samemu udało mi się dojść (po dość długiej motaninie) do tego że magic_quotes_qpc jest włączone i znaki ucieczki dodają się same.

Początkowo zmieszałem się dlatego, że niektóre dane do zapytania pochodziły z formularza, a niektóre były zwykłymi zmiennymi. Te pierwsze były potraktowane slashami automatycznie, drugie zaś - nie. To mnie też właśniei zgubiło smile.gif.

Mimo tego dziękuję bardzo za okazaną pomoc - oby więcej takich ludzi biggrin.gif.
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.