ďťż

[PHP] skrypt tekstów piosenek nie działa :(

       

Podstrony


telcocafe

Witam,
poprzerabiałem parę skryptów i powstało coś takiego:

<?php $connection = mysql_connect('serwer.com', 'user', 'haslo'); mysql_select_db('baza'); $strona = $_GET['id']; if( empty( $strona )) { // Wyświetlanie listy artykułów $query = "SELECT COUNT(*) FROM `natalia-lesz-teksty-piosenek`"; $result = mysql_query($query, $connection); if ($result>0) { $query = "SELECT `id`, `tytul` FROM `natalia-lesz-teksty-piosenek`"; $result = mysql_query($query, $connection); while($row = mysql_fetch_array($result)) { $id = $row['id']; $tytul = $row['tytul']; echo '<center><a title="tekst piosenki '.$tytul.'" href="teksty-piosenek.php?id='.$id.'">'.$id.'. '.$tytul.'</a></center>'; } mysql_close($connection); } else { echo 'Brak tekstów w bazie'; } } else { // Odczytywanie zawartości artykułu $query = "SELECT `id` FROM `natalia-lesz-teksty-piosenek` WHERE `id = $strona`"; $result = mysql_query($query, $connection); $row = mysql_affected_rows(); if ($row>0) { $query = "SELECT `id`, `tytul`, `tresc` FROM `natalia-lesz-teksty-piosenek` WHERE `id = $strona`"; $result = mysql_query($query, $connection); while($row = mysql_fetch_array($result)) { $tytul = $row['tytul']; $tekst = $row['tekst']; echo '<center> <b>'.$tytul.'</b><br><br> '.$tekst.'</center>'; } mysql_close($connection); } else { echo 'Taki tekst nie istnieje'; } } ?>

Pierwsza część skryptu (wyświetlanie listy tekstów) działa.
Niestety po kliknięciu np na teksty-piosenek.php?id=4
wyskakuje:

Taki tekst nie istnieje

Sam nie potrafię znaleźć gdzie tkwi błąd, liczę na czyjąś pomoc i z góry dziękuje :)



<?php $connection = mysql_connect('serwer.com', 'user', 'haslo'); mysql_select_db('baza'); $strona = isset($_GET['id']) ? (int)$_GET['id'] : 0; if( empty( $strona )) { // Wyświetlanie listy artykułów $query = "SELECT `id`, `tytul` FROM `natalia-lesz-teksty-piosenek`"; if (mysql_num_rows($result = mysql_query($query, $connection))) { while($row = mysql_fetch_array($result)) { $id = $row['id']; $tytul = $row['tytul']; echo '<center><a title="tekst piosenki '.$tytul.'" href="teksty-piosenek.php?id='.$id.'">'.$id.'. '.$tytul.'</a></center>'; } } else echo 'Brak tekstów w bazie'; } else { // Odczytywanie zawartości artykułu $query = "SELECT `id`, `tytul`, `tresc` FROM `natalia-lesz-teksty-piosenek` WHERE `id `= $strona"; $result = mysql_query($query, $connection); if($row = mysql_fetch_array($result)) { $tytul = $row['tytul']; $tekst = $row['tekst']; echo '<center> <b>'.$tytul.'</b><br><br> '.$tekst.'</center>'; } else echo 'Taki tekst nie istnieje'; } mysql_close($connection); ?> Poprawiłem jedynie błąd, ponieważ nie korzystam teraz z komputera, ale kod jest nieoptymalny i narażony na ataki SQL injection.
BTW Istnieje taka funkcja jak mysql_error() - w sam raz dla Ciebie.
// Edytowano
@niżej:
Che-che-che :) Rzeczywiście, nie zauważyłem tego. Ale temu kodowi potrzeba wiele...
W miarę poprawiony, zoptymalizowany i zabezpieczony. (Mam nadzieję, że żadnej klamerki nie minąłem).
Użytkownik andrzej_aa edytował ten post 10 wrzesień 2008, 15:15
$query = "SELECT `id` FROM `natalia-lesz-teksty-piosenek` WHERE `id = $strona`"; ... $row = mysql_affected_rows();
A teraz cytat z manuala...
Pobiera liczbę wierszy przetworzonych w ostatnim zapytaniu INSERT, UPDATE, REPLACE lub DELETE skojarzonym z identyfikator_połączenia. A jakiej funkcji używasz w zapytaniu :> ?

Więc może bądź łaskaw zastąpić omówioną linijkę na np. $row = mysql_num_rows($result);
Poza tym mam dwa spostrzeżenia:
1. Nie filtrujesz zmiennej - umożliwiasz SQL Injection. Zrób np. tak:$strona = htmlspecialchars($_GET['id'],ENT_QUOTES); ... $query = 'SELECT id, tytul, tresc FROM natalia-lesz-teksty-piosenek WHERE id="'.mysql_escape_string($strona).'"';
2. Po co dwa zapytania do pobrania rekordów? Wystarczy np. tak:$query = 'SELECT id, tytul, tresc FROM natalia-lesz-teksty-piosenek WHERE id="'.mysql_escape_string($strona).'"'; $result = mysql_query($query, $connection); $row = mysql_num_rows($result); if ($row>0) { //petle wyswietlajace wyniki } else { //info o ich braku }
Pzdr :)

edit: andrzej_aa szybszy, ale coś mi się widzi, że niekoniecznie poprawniejszy (nadal widzę $row = mysql_affected_rows();) :P
Użytkownik DJ_ProG edytował ten post 09 wrzesień 2008, 16:54

1. Nie filtrujesz zmiennej - umożliwiasz [i]SQL Injection[/i]. Zrób np. tak:[code]$strona = htmlspecialchars($_GET['id'],ENT_QUOTES);
Patrze na to i zastanawiam się jakbym się mógł tu włamać. Nie widzę możliwości. ja też nigdy id nie zabezpieczam, za id można podstawić tylko jakąś wartość liczbową to nic nie da włamywaczowi. Nie umieści w bazie kodu php



Najprostszy przykład SQL Injection. Jeśli masz takie zapytanie:

"SELECT `id` FROM `natalia-lesz-teksty-piosenek` WHERE `id = $strona`"
a adres strony taki:

www.strona.pl/index.php?strona=tutaj_numer_strony
to do "strona" zamiast "10" możesz wstawić "10 or 1 = 1". Teraz zapytanie będzie wyglądało tak:

"SELECT 'id' FROM 'natalia-lesz-teksty-piosenek' WHERE id = 10 OR 1 = 1"
co spowoduje zwrócenie wszystkich rekordów.
Użytkownik Kozack edytował ten post 10 wrzesień 2008, 14:24

Najprostszy przykład SQL Injection. Jeśli masz takie zapytanie:

"SELECT `id` FROM `natalia-lesz-teksty-piosenek` WHERE `id = $strona`"
a adres strony taki:

www.strona.pl/index.php?strona=tutaj_numer_strony
to do "strona" zamiast "10" możesz wstawić "10 or 1 = 1". Teraz zapytanie będzie wyglądało tak:

"SELECT 'id' FROM 'natalia-lesz-teksty-piosenek' WHERE id = 10 OR 1 = 1"
co spowoduje zwrócenie wszystkich rekordów.

Fakt można podejrzeć wszystkie rekordy, ale to jeszcze nie włamanie. Gdyby dzięki temu można było modyfikować rekordy, podejrzeć adres, login i hasło serwera, cy usuwać rekordy to miałoby to istotne znaczenie, a tak to tylko sianie paniki

Zobacz coś takiego:SELECT id, tytul, tresc FROM natalia-lesz-teksty-piosenek WHERE id=1 and 0=2 UNIQUE SELECT id, login as tytul, pass as tresc FROM usersI co? To nie ma istotnego znaczenia? ;>
EOT
// Edytowano
Bardzo dobry skrypt kolorowania składni :-)
// Edytowano
@niżej:
A Ty trzymasz takie tabele w różnych bazach danych? ;] Zakodowanie hasła niewiele pomoże - tęczowe tablice. Chyba że dorzucić jeszcze do tego jakiś hash strony, wtedy już trudniej. Natomiast aby wpaść na to, czy na stronie jest błąd wystarczy użyć Blind SQL Injection. A później już zabawa ze zgadnięciem algorytmu i nazw tabel ;-)
Użytkownik andrzej_aa edytował ten post 11 wrzesień 2008, 09:09

Zobacz coś takiego:SELECT id, tytul, tresc FROM natalia<span style='color:orange'>-lesz-teksty-piosenek WHERE id=1 and 0=2 UNIQUE SELECT id, login as tytul, pass as tresc FROM usersI co? To nie ma istotnego znaczenia? ;>
EOT
// Edytowano
Bardzo dobry skrypt kolorowania składni :-)

Teoretycznie masz racje, ale tylko teoretycznie bo z tego do wyciągnięcia tych danych jest długa droga skąd możesz znać tytuł i pola tabeli z danymi userów? One mogą być w zupełnie innej bazie i powinny być. Poza tym hasła powinno się zakodować. Ale przy sprzyjających wiatrach i odrobinie szczęścia przyznaje, że można wyciągnąć te dane. Zastanawiam się jakie jest prawdopodobieństwo trafienia, chyba nie duże. W najlepszym przypadku musisz znać przynajmniej nazwę tabeli, nazwę pola z loginem i hasłem

  • zanotowane.pl
  • doc.pisz.pl
  • pdf.pisz.pl
  • nvm.keep.pl

  • Sitedesign by AltusUmbrae.