Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: mysql_real_escape_string a dane w bazie mysql
Forum PHP.pl > Forum > PHP
rafalp
Wszystko przed wrzuceniem do bazy MySql traktuje mysql_real_escape_string:

i tak:
  1. <?php
  2. $s = "'abc";
  3. echo $s // 'abc
  4. ?>

echo ok, takie jak ma być. Jednak w bazie widze pierwotne $s czyli 'abc nie pojmuje gdzie/co/kiedy usuwa spowrotem slash. Czy robi to się zawsze czy to zależne od konfiguracji już samego MySql-a?

Tzn boje się że na innym serwerze moje dane pobierane z bazy mogą wygladać ze slashem czyli np. \'abc
Zyx
Backslash (slash to / smile.gif) znika podczas parsowania zapytania SQL dokładnie w taki sam sposób, jak to się dzieje w każdym cywilizowanym języku programowania. Popatrz na PHP. Spróbuj wyświetlić:

  1. <?php
  2.  
  3. echo 'Tekst: ' tekst';
  4.  
  5. ?>


Tu też backslash znika, ponieważ on pełni jedynie rolę pomocniczą w składni: pozwala wpisać apostrof tak, żeby nie został on przez parser zinterpretowany jako koniec ciągu tekstowego. Dokładnie to samo masz w zapytaniu:

Kod
$pdo->query('SELECT * FROM foo WHERE title=\'Tekst \\' tekst\'');


Teraz gdy PHP bierze się za przetwarzanie, na własne potrzeby zabiera pierwszy backslash i do bazy idzie:

Kod
SELECT * FROM foo WHERE title='Tekst \' tekst'


Na identycznej zasadzie MySQL zabiera drugi backslash i wie, że ma porównać pole z tekstem

Kod
Tekst ' Tekst


Jeśli chodzi o obawy, to masz się czego bać, ale z trochę innego powodu, niż sądzisz. Otóż kiedyś ktoś "mądry" wymyślił w PHP tzw. "magic quotes". Polega to w mocnym skrócie na tym, że wszystkie dane, które przychodzą do skryptu metodą POST, GET, jako ciastka itd. są domyślnie escape'owane (tzn. dodawany jest przed niebezpiecznymi znakami backslash). Jeśli więc wysłaliśmy tekst Foo ' bar, to skrypt już z definicji będzie operować na ciągu Foo \' bar. Jeśli teraz skrypt też we własnym zakresie escape'uje potrzebne dane, to w bazie powstanie syf, gdyż poleci tam: Foo \\' bar. Z kolei jeśli magiczne cytaty są wyłączone, a skrypt nie escape'uje danych, otrzymujemy dziurę bezpieczeństwa i narażamy wszystkie zapytania na ataki typu SQL Injection.

Osobiście polecam pisać skrypt tak, jakby magiczne cytaty były wyłączone, gdyż takie jest obecnie domyślne ustawienie i będą one wycofywane. Na początku skryptu umieszczamy jedynie prosty filtr, który w przypadku ich włączenia zniweluje ich efekty, tj. skasuje nadmiarowe slashe. Ponadto, zapomnij o funkcjach typu mysql_ i mysqli_. Jest PDO, jest tam wbudowana możliwość podpinania parametrów pod zapytanie i one są wtedy automatycznie escape'owane, gdy zachodzi taka potrzeba, zależnie od ustawień konfiguracji:

  1. <?php
  2. $stmt = $pdo->prepare('SELECT * FROM foo WHERE title = :title');
  3. $stmt->bindValue(':title', 'To jest tytuł', PDO::PARAM_STR);
  4. $stmt->execute();
  5. ?>
Pilsener
Dokładnie - dane, które odbierasz $_POSTEM od usera traktuj np. tym:
  1. <?php
  2.   $tresc=addslashes($tresc);
  3. }
  4. ?>
- i się nie martwisz. Dane w postaci aaa\'bbb\'cccc trzymasz jedynie w plikach tekstowych smile.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.