Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: po co addshlashes()
Forum PHP.pl > Forum > Przedszkole
sirostr
Tak jak w temacie.
Co robi ta fuckcja oprócz tego, że dodaje mi niepotrzebne shlashe?
nospor
http://pl2.php.net/manual/pl/function.addslashes.php
Cytat
An example use of addslashes() is when you're entering data into a database. For example, to insert the name O'reilly into a database, you will need to escape it. Most databases do this with a \ which would mean O\'reilly. This would only be to get the data into the database, the extra \ will not be inserted. Having the PHP directive magic_quotes_sybase set to on will mean ' is instead escaped with another '.

Aczkolwiek lepiej uzywac mysql_real_escape_string() albo najlepiej uzywac PDO winksmiley.jpg

Cytat
że dodaje mi niepotrzebne shlashe

Krótko rzecz mowiac: skoro nie potrzebujesz to nie uzywaj winksmiley.jpg

Popraw prosze tytul o znacznik zgodnie z zasadami forum przedszkole
kszychu
Jak Ci nie potrzebne to nie używaj. Jak poczujesz, że są potrzebne, to użyjesz.
uli
No dobra chłopaki - może mu jednak wytłumaczyć bo za 2 miesiące będzie płacz biggrin.gif

Addslashes dodaje (jak to określiłeś) niepotrzebne slashe.

Mam nadzieję, że rozjaśni Ci się po tym przykładzie (na SQL'u):

  1. <?php
  2. $tekst = "tekst z ' apostrofem";
  3. $zapytanie = "UPDATE tabelka_z_sql SET tekst='$tekst' WHERE id=1";
  4. ?>


Pytanie do Ciebie:
Gdzie skończy się pole tekst? I ile błędów wywali interpreter PHP?
  1. <?php
  2. echo ($zapytanie);
  3. ?>


Wynik:

  1. UPDATE tabelka_z_sql SET tekst='tekst z '


I kupa g... po apostrofie.
qrees
Interpreter php nie wywali żadnego błędu składni, bo nie da się zrobić błędu składni w stringu... addslashes służy m.in. do poprawnego formatowania zapytań w SQL. Jak chcemy dodać jakąś wartość z apostrofem, to tekst:
  1. <?php
  2. '$tekst';
  3. ?>

Zamienia się na przykładowo:
  1. <?php
  2. 'Tekst z ' apostrofem;
  3. ?>

A to zdecydowanie nie jest to o co nam chodziło, czyli:
  1. <?php
  2. 'Tekst z ' apostrofem';
  3. ?>

I masz swojego "niepotrzebnego" slasha.
konrados
To ja z podobnym pytaniem - a co z innymi znakami typu
<>?!,. etc? Żeby zabezpieczyś się przed sql injection gdy user w formularzach stringi wysyła, też trzeba z nimi coś zrobić, zanim się to doda do bazy, prawda? Aktualnie używam takiej funkcji:
CODE

//oczyszczanie tekstu wprow. przez usera.
function Utils_Clean($text) {
# Turn tabs and CRs into spaces so they can't
# fake other fields or extra entries
$text = ereg_replace("[[:space:]]", ' ', $text);
# Escape < > and and & so they
# can't mess withour HTML markup
$text = ereg_replace('&', '&', $text);
$text = ereg_replace('<', '<', $text);
$text = ereg_replace('>', '>', $text);
# Don't allow excessively long entries
return $text;
}



A nie ma jakiś prostych funkcji w php które by się zajęły tym wszystim, czyli encode przed wstawieniem do bazy danych i dekodowanie po wydobyciu?
Ogółem chcę pozwolić userowi pisać przeróżne znaki (np. apostrofy) ale niekoniecznie <> by nie wstawił czegoś. ?
kszychu
mysql_escape_string()
konrados
Dzięki kszychu
Napisałem jeszcze w podobnym temacie http://forum.php.pl/index.php?showtopic=86150
Zajrzałbyś ?
potreb
Zresztą jeżeli nie dodasz addslashes do jakiegos tekstu który będzie zawierał ' " to przy np wgrywaniu bazy wywali ci błąd w phpmyadminie, zresztą to już tez zależy w jakiej wersji. Z drugiej strony warto stosować addslashes, bo jest to dobry sposób na sql_injection
konrados
Zrobiłem testy i nic już nie kumam.
Przechodzę na utf-8 przeto plik jest w utf-8.
Teraz biorę dane przesłane przez użytkownika poprzez formularz, metoda POST i wpisuję:

CODE
Żołnierz a teraz html injection: <B> a teraz inne znaczki: ' " <> ?


Gdy kazałem to wydrukować (przed dodaniem do bazy danych) wyszło:

CODE
Żołnierz a teraz html injection: a teraz inne znaczki: \' \" <> ?


Czyli zanim dodałem do bazy danych już slashe są dodane przez POST?

Teraz patrzę na phpmyadmin (nie używałem żadnych addslashes), i oto co wylądowało w bazie wg. myadmin:

CODE
ŝo�nierz a teraz html injection: <B> a teraz inne znaczki: ' " <> ?


Jak więc widać nic się nie stało, nie został string ucięty? No to po co mam używać addslashes?

Staram się napisać bezpieczny (tzn. przed hackerami) skrypt, uwzgl. utf-8 ale na każdym kroku jakieś zaskoczenie smile.gif
qrees
Cytat(konrados @ 29.01.2008, 17:40:48 ) *
Zrobiłem testy i nic już nie kumam.
Przechodzę na utf-8 przeto plik jest w utf-8.
Teraz biorę dane przesłane przez użytkownika poprzez formularz, metoda POST i wpisuję:

CODE
Żołnierz a teraz html injection: <B> a teraz inne znaczki: ' " <> ?


Gdy kazałem to wydrukować (przed dodaniem do bazy danych) wyszło:

CODE
Żołnierz a teraz html injection: a teraz inne znaczki: \' \" <> ?


Czyli zanim dodałem do bazy danych już slashe są dodane przez POST?

Teraz patrzę na phpmyadmin (nie używałem żadnych addslashes), i oto co wylądowało w bazie wg. myadmin:

CODE
ŝo�nierz a teraz html injection: <B> a teraz inne znaczki: ' " <> ?


Jak więc widać nic się nie stało, nie został string ucięty? No to po co mam używać addslashes?

Staram się napisać bezpieczny (tzn. przed hackerami) skrypt, uwzgl. utf-8 ale na każdym kroku jakieś zaskoczenie smile.gif

No do bazy został wpisany string po wykonaniu addslashes. Spróbuj dodać string bez znaków \, ale z slashami to zobaczysz co się stanie. Po dodaniu do bazy nie ma już slashy, bo są niepotrzebne. One są tylko potrzebne aby poprawnie zapisać zapytanie SQL.
konrados
no ale ja nie używałem addslahes !

Właśnie mi się coś przypomniało - czy aby to nie zależy od wersji php i/lub mysql? Nie ma to czegoś wspólnego z magic.. coś tam? ( magic_quotes_gpc )? Tu (http://pl.php.net/addslashes) widzę coś takiego:

The PHP directive magic_quotes_gpc is on by default, and it essentially runs addslashes() on all GET, POST, and COOKIE data. Do not use addslashes() on strings that have already been escaped with magic_quotes_gpc as you'll then do double escaping. The function get_magic_quotes_gpc() may come in handy for checking this.

Więc niby kiedy mam używać addslashes? Używam wersji php chyba >5 więc może po prostu nie muszę tego robić?
qrees
Cytat(konrados @ 29.01.2008, 18:24:49 ) *
no ale ja nie używałem addslahes !

Właśnie mi się coś przypomniało - czy aby to nie zależy od wersji php i/lub mysql? Nie ma to czegoś wspólnego z magic.. coś tam? ( magic_quotes_gpc )? Tu (http://pl.php.net/addslashes) widzę coś takiego:

The PHP directive magic_quotes_gpc is on by default, and it essentially runs addslashes() on all GET, POST, and COOKIE data. Do not use addslashes() on strings that have already been escaped with magic_quotes_gpc as you'll then do double escaping. The function get_magic_quotes_gpc() may come in handy for checking this.

Więc niby kiedy mam używać addslashes? Używam wersji php chyba >5 więc może po prostu nie muszę tego robić?

Dobrze, ale wstawiasz tekst który został wysłany z formularza, i tak masz rację ma to coś wspólnego z magic_quotes_gpc. Gdy to jest włączone, to wartości z formularzy automatycznie przechodzą przez addslashes, dlatego jak ponownie zrobisz addslashes to robi się kiszka. A co do testowania, to przetestuj sobie jakiś tekst prosto ze strkyptu, a nie z formularza i nie użyj na nim addslashes. Wtedy zobaczysz co się stanie.
konrados
No dobra grees a mogę zamiast addslashes używać mysql_escape_string ? Chodzi mi o jakąś taką metodę prostą - kodowanie gdy wrzucamy do bazy, dekodowanie gdy pobieramy? Cały dzień siedzę nad utf-8/bezpieczeństwo skryptów i już mnie głowa boli sad.gif
I co jest odwrotnością mysql_escape_string? Co robi "decode"?

Chodzi tylko i wyłącznie o dane użytkownika wprowadzane w formularzu.
qrees
Cytat(konrados @ 29.01.2008, 18:36:22 ) *
No dobra grees a mogę zamiast addslashes używać mysql_escape_string ? Chodzi mi o jakąś taką metodę prostą - kodowanie gdy wrzucamy do bazy, dekodowanie gdy pobieramy? Cały dzień siedzę nad utf-8/bezpieczeństwo skryptów i już mnie głowa boli sad.gif
I co jest odwrotnością mysql_escape_string? Co robi "decode"?

Chodzi tylko i wyłącznie o dane użytkownika wprowadzane w formularzu.



Tak, oczywiście, nawet lepiej. A co do dekodowania, to nic nie trzeba dekodować, bo wynik jest już w postaci tablicy. Kodować trzeba jedynie w czasie tworzenia zapytania (SELECT, INSERT itp.).
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.