Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [PHP][MYSQL] Problem z dynamicznym generowaniem zapytania
Simek
post
Post #1





Grupa: Zarejestrowani
Postów: 2
Pomógł: 0
Dołączył: 6.02.2010

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


Dopóki wszystko robiłem w miarę statycznie strona działała bez najmniejszego zarzutu, ale jako, że lubię wyzwania postanowiłem stworzyć funkcję, która wszystko generuje dynamicznie (a do wygenerowania jest kilka takich formularzy).

Także przejdźmy do sedna:
  1. function forma( $tabela, $teksty ) {
  2.  
  3. // tutaj znajduje się raczej nie istotna część kodu
  4.  
  5. if ( isset( $_POST[ $pole ] ) ) {
  6. $zapytanie = '"SELECT cena FROM ' . $tabela . ' WHERE';
  7.  
  8. foreach ( $_POST as $name => $value )
  9. $$name = trim( htmlspecialchars( $value ) );
  10.  
  11. foreach( $head as $name => $value ) {
  12. $pole = $tabela . "_" . $name;
  13. if ( $name != "cena" ) {
  14. $zapytanie .= " " . $name . " = '$" . $pole . "' AND";
  15. } else if ( $name == "cena" ) {
  16. $zapytanie = substr( $zapytanie, 0, -4 );
  17. $zapytanie .= '"';
  18. }
  19. }
  20.  
  21. echo $zapytanie;
  22.  
  23. $query = mysql_query( $zapytanie );
  24.  
  25. printf( "<h2 class=\"cena\">Cena: <span class=\"kolor\">%s zł</span></h2>", mysql_result( $query, 0 ) );
  26. }
  27. }

Wszystko jest wporządku oprócz tego, wsytepuję nastepujący błąd związany z zapytaniem MYSQL:
  1. Warning: mysql_result(): supplied argument is not a valid MySQL result resource

Zapytanie które wyrzucam sobie w ramach debugu do HTML wygląda nastepująco:
  1. "SELECT cena FROM ulotki WHERE rozmiar = '$ulotki_rozmiar' AND papier = '$ulotki_papier' AND skladane = '$ulotki_skladane' AND ilosc = '$ulotki_ilosc'"

Sprawdzałem już czy wszystkie zmienne generowane z $_POST nie są puste i zawierają odpowiednie wartości - odpowiedź brzmi tak.

Najważniejsze jest to, że jeśli skopiuję wygenerowane przez skrypt zapytanie i wkleję je na sztywno do kodu wybrana dana wyświetla sie bez najmniejszego problemu.

Liczę na jakakolwiek pomoc i sugestię, jako że jestem samoukiem ; )

Ten post edytował Simek 6.02.2010, 20:32:48
Go to the top of the page
+Quote Post
legorek
post
Post #2





Grupa: Zarejestrowani
Postów: 411
Pomógł: 35
Dołączył: 27.06.2004
Skąd: Kraków

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


Hej!

  1. $zapytanie .= " " . $name . " = '$" . $pole . "' AND";


zamień na:

  1. $zapytanie .= " " . $name . " = '" . $$pole . "' AND";


Poczytaj o zmiennych zmiennych.

A tak na marginesie, Twoje rozwiązanie jest wyjątkowo dziurawe i pozwala atakującemu na wykonanie praktycznie dowolnego zapytania SQL. Jak już musisz coś takiego robić to filtruj zawartość zmiennej $pole,


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





Grupa: Zarejestrowani
Postów: 2
Pomógł: 0
Dołączył: 6.02.2010

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


Oczywiście że mogę tam zastosować dynamiczne zmienne, nie tak "plain text" jak zrobiłem, ale to nie rozwiązuje problemu.

Co do zabezpieczeń, spokojnie, wiem że nie ma jakiegokolwiek filtrowania danych, ale po pierwsze póki co chciałem się skupić na działaniu kodu, zabezpieczenia dojdą za czasem, jak wszystko zacznie już działać w pełni poprawnie, po drugie formularz składa się z samych ?SELECTów?, więc aby wstrzyknąć kod wymagana już jest ingerencja za pomocą FireBuga lub podobnego narzędzia, więc połowa scripts-kiddes odpada w przedbiegach.

EDIT: Uporałem się z problemem, temat do zamknięcia.

Ten post edytował Simek 6.02.2010, 23:40:32
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: 21.08.2025 - 02:38