Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [mysql] myslq_query - pusty wynik
Forum PHP.pl > Forum > Przedszkole
Hectic
Witam,
wykonuje w phpmyadmin takie zapytanie

  1. SELECT id FROM uzytkownicy WHERE email = 'mail@wp.pl' AND login = 'nick' AND 1=2 UNION SELECT id FROM uzytkownicy WHERE id=1 #' LIMIT 1


Zwraca wynik 1.

Za to kod w php zwraca pustą tablicę

  1. <?php
  2. $q = "SELECT id FROM uzytkownicy WHERE email = 'mail@wp.pl' AND login = 'nick' and 1=2 UNION SELECT id FROM uzytkownicy WHERE id=1 #' LIMIT 1";
  3.  
  4. $query = mysql_query($q);
  5. $array = mysql_fetch_array($query);
  6.  
  7. echo 'id:'.$array[id];
  8. ?>


Tablica $array jest pusta, dlaczego?
netmare
Ja osobiście się nie orientuje, ale sprawdź może jaki będzie rezultat dla

  1. SELECT id FROM uzytkownicy WHERE id=1


Poza tym co to jest [id] w linii 7 questionmark.gif
Myślę że jeśli już to ['id'] winksmiley.jpg
Hectic
Dla tego zapytani zwraca id = 1 winksmiley.jpg Co do tego drugiego to w chwili obecnej nie ma to różnicy tongue.gif Udało mi się zrobić drugie zapytanie, ale jest to samo w phpmyadminie ok, a w php już dupa sad.gif

  1. SELECT id FROM uzytkownicy WHERE email = 'mail@wp.pl' AND login = 'login' OR 1=1 LIMIT 1 #' LIMIT 1


w phpmyadminie dostaje 1.
netmare
mało się znam na mysql ale co daje '# limit 1 na końcu linii, bo to mi wygląda jakoś podejrzanie, poza tym jak masz pusty wynik to znaczy chyba że wsytąpił błąd zapytania, więc może warto poznać komunikat błędu?
nospor
wywal te #' LIMIT 1
to jest komentarz ktorego php nie lyka i leci ci blad
Hectic
Problem w tym, że błąd nie wystąpił, a znak # powoduje, że zapytania za znakiem nie będą brane pod uwagę. Doszedłem już w czym jest problem. Zapytanie jest generowane z formularza. Wygląda to tak

  1. <?php
  2. $q = "SELECT id FROM $users_table WHERE email = '$email' AND login = '$login' LIMIT 1";
  3. ?>


Za pomocą POST do zmiennej login wstawiam

  1. test& # 3 9 ; and 1=3 UNION SELECT id FROM uzytkownicy WHERE id=1 #


Czyli zapytanie po wyświetleniu echo wygląda tak

  1. SELECT id FROM uzytkownicy WHERE email = 'email' AND login = 'jakis login' AND 1=3 UNION SELECT id FROM uzytkownicy WHERE id=6 #' LIMIT 1


ale tak naprawdę do serwera mysql jest wysyłane w postaci

  1. SELECT id FROM users WHERE email = 'email' AND login = 'jakis login& # 3 9 ; and 1=3 UNION SELECT id FROM uzytkownicy WHERE id=6


Dlatego zapytanie jest komentowane za pomocą # i nie zwraca błędu. Dla wyjaśnienia użyłem & # 3 9 ; bo jest to odpowiednik ' w unicode, a normalny ' w post jest zamieniany na \'
Czy da się temu jakoś zaradzić czy skrypt jest bezpieczny?
netmare
a komu chcesz taką świnię podłożyć i po co??
Hectic
Nikomu nie mam zamiaru nic podkładać... jeśli mam dostęp do kodu to znaczy, że skrypt jest mojego autorstwa? Dwa lata temu napisałem system cms, teraz po zebraniu większego doświadczenia szukam w nim błędów. Znalazłem już jeden tylko przeszkodą jest właśnie to. Wystarczy, że uda mi się wybrać id admina, a hasło zostanie zmienione na nowe i wysłane na podany adres e-mail.
netmare
'=>\' oznacza że na sewrerze jest włączone magic_quotes_gpc, więc raczej nie musisz się obawiać.
Na wszelki wypadek możesz powiedzmy sprawdzać czy jest włączone magic quotes, jeśli nie to zrobić addslashes(), albo jest jeszcze jakaś funkcja do filtrowania SQL-a a najprościej chyba możesz się zabezpieczyć poprzez sprawdzenie czy w mailu wpisanym w formularzu występują spacje, jeśli występują to nie puszczasz dalej skryptu.
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.