Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [MySQL][PHP]Problem z addslashes
cezarek
post
Post #1





Grupa: Zarejestrowani
Postów: 5
Pomógł: 0
Dołączył: 14.11.2010

Ostrzeżenie: (0%)
-----


Witam,
mam taki kod:
  1. $id= addslashes(trim($_POST["id"]));
  2. $zmienna = addslashes(trim($_POST["zmienna"]));
  3.  
  4. $zapytanie = "update tabela
  5. set zmienna = '$zmienna'
  6. where id= '$id'";
  7. $wynik = mysql_query($zapytanie) or die ("Błąd nr ".mysql_errno().": ".mysql_error()."!");
  8. echo "Zmienna ".stripslashes($zmienna)." została zmieniona.";

gdzie $zmienna to ścieżka dostępu do pliku (np. "C:\Documents and Settings\User\Moje dokumenty\Moja muzyka\fotki\"). I problem polega na tym, że do bazy zapisuje się wartość bez dodanych backslash'y i po wyciągnięciu tego z bazy za pomocą stripslashes otrzymuję ścieżkę w postaci "C:Documents and SettingsUserMoje dokumentyMoja muzykafotki". Natomiast ostatnia linia powyższego kodu wyświetla zmienną w postaci prawidłowej, czyli "C:\Documents and Settings\User\Moje dokumenty\Moja muzyka\fotki". Czyli funkcja addslashes działa dopóki nie dodaję danych do bazy.
W czym tkwi problem? Co robię źle?

Pozdrawiam
cezarek
Go to the top of the page
+Quote Post
wookieb
post
Post #2





Grupa: Moderatorzy
Postów: 8 989
Pomógł: 1550
Dołączył: 8.08.2008
Skąd: Słupsk/Gdańsk




1) Nie addslashes bo do tego nie służy
2) mysql_real_escape_string
3) Nie stripslashes.


--------------------
Go to the top of the page
+Quote Post
cezarek
post
Post #3





Grupa: Zarejestrowani
Postów: 5
Pomógł: 0
Dołączył: 14.11.2010

Ostrzeżenie: (0%)
-----


Czyli zamiast addslashes powinienem użyć mysql_real_escape_string, a stripslashes wyrzucić, bo jest niepotrzebne? W ten sposób gdy w zmiennej pojawi się np. cudzysłów znów robi się zamieszanie.
Go to the top of the page
+Quote Post
wookieb
post
Post #4





Grupa: Moderatorzy
Postów: 8 989
Pomógł: 1550
Dołączył: 8.08.2008
Skąd: Słupsk/Gdańsk




Cytat(cezarek @ 14.11.2010, 22:08:38 ) *
Czyli zamiast addslashes powinienem użyć mysql_real_escape_string, a stripslashes wyrzucić, bo jest niepotrzebne?

Tak
Cytat(cezarek @ 14.11.2010, 22:08:38 ) *
W ten sposób gdy w zmiennej pojawi się np. cudzysłów znów robi się zamieszanie.

Nie


--------------------
Go to the top of the page
+Quote Post
cezarek
post
Post #5





Grupa: Zarejestrowani
Postów: 5
Pomógł: 0
Dołączył: 14.11.2010

Ostrzeżenie: (0%)
-----


Być może znów popełniam jakiś błąd, ale gdy wyciągam tą zmienną z cudzysłowem z bazy i umieszczam w polu input
  1. <input name="zmienna" value="<?= $zmienna; ?>">

aby ją wyedytować, to nic mi się nie pojawia. Gdy tą zmienną umieszczam gdzieś np. między znacznikami <p></p> wszystko jest, jak być powinno.

Poza tym dlaczego piszesz, że addslashes nie do tego służy? Między innymi tutaj utaj http://forum.php.pl/index.php?showtopic=158959, http://forum.php.pl/index.php?showtopic=157979 polecana jest właśnie ta funkcja wraz z stripslashes. Sam z książek stosowałem właśnie te funkcje. Jeśli dobrze rozumiem manual, to addslashes właśnie do tego celu powinna być używana.

Najdziwniejsze jest to, że kod, który podałem na początku działa na serwerze webd.pl, a na dreamhost.com nie.

Ten post edytował cezarek 14.11.2010, 23:16:15
Go to the top of the page
+Quote Post
Fifi209
post
Post #6





Grupa: Zarejestrowani
Postów: 4 655
Pomógł: 556
Dołączył: 17.03.2009
Skąd: Katowice

Ostrzeżenie: (0%)
-----


Do zabezpieczenia przez SQL Injection służy wspomniany wyżej mysql_real_escape_string. To, że ktoś używa addslashes w tym celu, oznacza tylko, że przeczytał zły kurs/książkę lub źle zinterpretował manual.


--------------------
Zainteresowania: C#, PHP, JS, SQL, AJAX, XML, C dla AVR
Chętnie pomogę, lecz zanim napiszesz: Wujek Google , Manual PHP
Go to the top of the page
+Quote Post
wookieb
post
Post #7





Grupa: Moderatorzy
Postów: 8 989
Pomógł: 1550
Dołączył: 8.08.2008
Skąd: Słupsk/Gdańsk




Wszystko jest ok, ale jeżeli chcesz dodać takie pole do atrybutu VALUE w inputcie użyj http://pl2.php.net/html_entities
Warto pamiętać o podaniu kodowania jako 3 argument.


--------------------
Go to the top of the page
+Quote Post
thek
post
Post #8





Grupa: Moderatorzy
Postów: 4 362
Pomógł: 714
Dołączył: 12.02.2009
Skąd: Jak się położę tak leżę :D




To, że używasz starych kursów widać poprzez <?= bo choć jest to poprawne, oznacza, że używasz dyrektywy, która powoduje problemy z XML.

Addslashes jest podawane w kursach, bo wspomniana przez chłopaków funkcja nie jest staruszkiem aż takim ( wyszła w gałęzi 4.3, czyli ostatniej z serii PHP4 ) i wcześniej tak się robiło. Ale trzeba było uważać na magic_quotes_gpc (które robi właśnie addslashes, przez co możesz je podwójnie wykonać, nie wiedząc o tym) i inne syfy, więc nie jest to lubiane i akceptowane rozwiązanie w chwili obecnej, gdy nigdy nie wiesz czym Cię uraczy hosting w php.ini przy zakupie serwera i czy da się prosto pewne rzeczy włączyć/wyłączyć czy też nie. W efekcie musisz sprawdzać czy owa, nienawidzona prze wielu, dyrektywa jest włączona i wedle niej aplikować bądź nie addslashes, a sam widzisz, że to mało eleganckie, a przede wszystkim upierdliwe.

Jeśli walisz cokolwiek do value formularzy to zawsze może zajść konflikt apostrofów (pojedynczych i podwójnych) i dlatego wrzucanie tam treści zakończy się problemami. Tekst zobaczysz w Źródle strony, ale nie na samej stronie, bo przeglądarka tego nie zinterpretuje dobrze. Tutaj trzeba użyć wspomnianej html_entities z właściwą dla Ciebie w skrypcie flagą quotów (nie zawsze jest to wartość domyślna).


--------------------
Najpierw był manual... Jeśli tam nie zawarto słów mądrości to zapytaj wszechwiedzącego Google zadając mu własciwe pytania. A jeśli i on milczy to Twój problem nie istnieje :D
Go to the top of the page
+Quote Post
cezarek
post
Post #9





Grupa: Zarejestrowani
Postów: 5
Pomógł: 0
Dołączył: 14.11.2010

Ostrzeżenie: (0%)
-----


Super, wszystko hula jak należy. Wielkie dzięki, chłopaki za pomoc i wyjaśnienie. Po odpowiedzi wookieb miałem właśnie pytać o to dlaczego nie addslashes, ale w pracy nie miałem czasu się zalogować - dzięki thek.
Fakt podstawy PHP poznawałem kilka lat temu i przez dłuższy czas nie dłubałem nic. Trochę się pozmieniało.
A jeśli chodzi o "<?=", to lepiej używać zwykłego "<? echo"?
Go to the top of the page
+Quote Post
Mephistofeles
post
Post #10





Grupa: Zarejestrowani
Postów: 1 182
Pomógł: 115
Dołączył: 4.03.2009
Skąd: Myszków

Ostrzeżenie: (0%)
-----


Tak, ponieważ short tages są czasami wyłączone, a poza tym powodują błędy przy zagnieżdżaniu XMLa.
Go to the top of the page
+Quote Post
Fifi209
post
Post #11





Grupa: Zarejestrowani
Postów: 4 655
Pomógł: 556
Dołączył: 17.03.2009
Skąd: Katowice

Ostrzeżenie: (0%)
-----


Osobiście używam "pełnej" wersji czyli: <?php
Powód edycji: [thek]: I to jest rozwiązanie najlepsze. Nigdy nie sprawi problemów.


--------------------
Zainteresowania: C#, PHP, JS, SQL, AJAX, XML, C dla AVR
Chętnie pomogę, lecz zanim napiszesz: Wujek Google , Manual PHP
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 22.08.2025 - 04:46