Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Problem z AdoDB i qstr()
Forum PHP.pl > Forum > Gotowe rozwiązania
marcz
Witam!

Przesiadłem się ostanio na AdoDB i niestety napotkałem mocno denerwujący problem.

Mój problem wygląda w ten sposób:
Korzystam z ActiveRecord w AdoDB, gdy przesyłam z formularza POSTem zmienną zawierającą znak ', po przesłaniu dostaję już \' (POST chyba to robi automatycznie, prawda?), zapisuję to do bazy, potem odczytuję to za pomocą powiedzmy Find(), przekazuję bezpośrednio do Smarty i na ekranie mam \' zamiast '.

Jak najlepiej sobie z tym poradzić żeby nie mieć niepotrzebnych slashy?

Druga sprawa to czy dodatkowo powinienem używać qstr() w przypadku ActiveRecord w AdoDB i jaka jest funkcja odwrotna do qstr() w AdoDB (inaczej - qstr() to odpowiednik addslashes(), a jaki jest odpowiednik stripslashes()?)?
bigZbig
Na pierwsze pytanie sam sobie odpowiedziales zadajac drugie pytanie.
marcz
Niestety nie, przykład poniżek:

1) sposób:
  1. <?php
  2. rec = new ADOdb_Active_Record("TLanguages");
  3. $rec->Load("id_tlanguages=".$_POST['id_TLanguages']);
  4. $rec->name = $_POST['name'];
  5. $rec->replace();
  6. ?>


2) sposób
  1. <?php
  2. $db->Execute("UPDATE TLanguages SET name='".$_POST['name']."' WHERE id_TLanguages=".$_POST['id_TLanguages']);
  3. ?>


Nie zwracajmy narazie uwagi na poprawność takiego kodu pod względem bezpieczeństwa.
Chodzi o to, że jeżeli w polu o nazwie name w formularzu wpisaliśmy powiedzmy abc', to gdy zastosujemy 1 sposób mamy w bazie zapisane abc\', a jeżeli drugi sposób to mamy abc'.

Drugi sposób nie wstawia niepotrzebnego backslasha, ale mimo wszystko chcę stosować Active Record, bo to naprawdę fajna sprawa (w AdoDB niestety wiele mu do doskonałości jeszcze brakuje).

Moje drugie pytanie to jaką funkcję zastosować przy odczytywaniu danych z bazy, jeżeli zapisujemy stosując qstr().
bigZbig
Bo ActiveRecord automatycznie eskejpuje niebezpieczne znaki. Po odczytaniu takich danych musialbys przepuscic je przez funkcje stripslashes().
marcz
Szkoda, że pomyślano o tym, aby automatyzować proces w obie strony. Jeżeli przy Save() i replace() automatycznie dodajemy jakieś znaki, to przy Load() i Find() powinniśmy automatycznie je usuwać.

Tak samo jeżeli istnieje funkcja qstr() to powinna istnieć i funkcja odwrotna.

Chciałem tablicę otrzymaną z bazy poprzez Find() bezpośrednio przekazać do Smarty, ale widzę, że będę musiał pisać funkcję rekurencyjną, która przejdzie przez wszystkie elementy tablicy (też te zagnieżdżone) i zrobi na nich stripslashes()... - bardzo nieeleganckie rozwiązanie do którego zmuszają nas autorzy AdoDB.

A może jest na to inna metoda?

Co więcej - gdy wprowadzamy ciąg //\\'' poprzez Execute() normalnie - wszystko działa jak należy, jeżeli zaś użyjemy qstr() wyskakuje wyjątek... poprostu cudownie.
intol
Jeżeli dobrze rozumiem AdoDB dodaje \ do ' tylko przy zapisywaniu i nie możesz tego rozpatrywać jako rzeczywiste dodanie ' do stringu: on dodaje to tylko po to, żeby kwarenda się zgadzała, tzn.
  1. INSERT INTO cos(id,mojstring) VALUES(2,'moj string 'nazwa'')


Przy odczytywaniu powinno to już wyglądać normalnie.
pabito
odświeżam temat, bo mam pytanie odnośnie funkcji qstr(), jeżeli użyjemy funkcji qstr() w poniższy sposób:
  1. $q = "SELECT * FROM nasza_tabelka WHERE name =" . $db->qstr($name) . " AND active=1 ORDER BY ordering";
  2. $rs = $db->Execute($q);


to czy jesteśmy całkowicie zabezpieczeni przed sql injection? Czy tylko bindowanie danych zapewnia nam ochrone przed sql injection ?
nospor
qstr to na dobrą sprawę nic innego jak mysql_real_escape_string()... Ludzie od wiekow tego uzywają i jakoś zyją wink.gif
pabito
czyli użycie jej w moim przykładzie, zabezpiecza przed sql injection
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-2024 Invision Power Services, Inc.