Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> Problem z AdoDB i qstr()
marcz
post
Post #1





Grupa: Zarejestrowani
Postów: 26
Pomógł: 0
Dołączył: 12.07.2003
Skąd: Białystok

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


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()?)?

Ten post edytował marcz 19.07.2006, 12:23:35
Go to the top of the page
+Quote Post
bigZbig
post
Post #2





Grupa: Zarejestrowani
Postów: 740
Pomógł: 15
Dołączył: 23.08.2004
Skąd: Poznań

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


Na pierwsze pytanie sam sobie odpowiedziales zadajac drugie pytanie.
Go to the top of the page
+Quote Post
marcz
post
Post #3





Grupa: Zarejestrowani
Postów: 26
Pomógł: 0
Dołączył: 12.07.2003
Skąd: Białystok

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


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().
Go to the top of the page
+Quote Post
bigZbig
post
Post #4





Grupa: Zarejestrowani
Postów: 740
Pomógł: 15
Dołączył: 23.08.2004
Skąd: Poznań

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


Bo ActiveRecord automatycznie eskejpuje niebezpieczne znaki. Po odczytaniu takich danych musialbys przepuscic je przez funkcje stripslashes().
Go to the top of the page
+Quote Post
marcz
post
Post #5





Grupa: Zarejestrowani
Postów: 26
Pomógł: 0
Dołączył: 12.07.2003
Skąd: Białystok

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


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.
Go to the top of the page
+Quote Post
intol
post
Post #6





Grupa: Zarejestrowani
Postów: 110
Pomógł: 1
Dołączył: 29.07.2003

Ostrzeżenie: (10%)
X----


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.
Go to the top of the page
+Quote Post
pabito
post
Post #7





Grupa: Zarejestrowani
Postów: 77
Pomógł: 4
Dołączył: 14.05.2013

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


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 ?

Ten post edytował pabito 27.08.2014, 12:53:52
Go to the top of the page
+Quote Post
nospor
post
Post #8





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




qstr to na dobrą sprawę nic innego jak mysql_real_escape_string()... Ludzie od wiekow tego uzywają i jakoś zyją (IMG:style_emoticons/default/wink.gif)
Go to the top of the page
+Quote Post
pabito
post
Post #9





Grupa: Zarejestrowani
Postów: 77
Pomógł: 4
Dołączył: 14.05.2013

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


czyli użycie jej w moim przykładzie, zabezpiecza przed sql injection
Go to the top of the page
+Quote Post

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

 



RSS Aktualny czas: 22.08.2025 - 17:54