Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP][MYSQL] pobranie danych z bazy za pomoca id
Forum PHP.pl > Forum > Przedszkole
lnn
mam pytanie jak pobrac dany wiersz z bazy danych za pomoca id w linku tzn po jego kliknieciu?
np klikam sobie w link http://example.pl/link.php?id=1
to dopiero pobiera dane z bazy i jest mozliwosc wyciagniecia kazdej kolumny z bazy w oddzielnej zmiennej?

z gory dzieki za wskazowki/pomoc smile.gif
1010
  1. <?
  2. $zap = mysql_query("select * from tabela where id='".$_GET['id']."' LIMIT 1;");
  3. $rek = mysql_fetch_assoc($zap);
  4.  
  5. //i masz tablice $rek
  6.  
  7. print_r($rek)
  8. ?>


ps. pamiętaj aby filtrować dane wejściowe.
slawny
  1. <?php
  2. $id=$_GET['id'];
  3.  
  4. //przydal by sie jeszcze mysql_escape_string, ale to sobei dopiszesz
  5.  
  6. $query=mysql_query("Select * from tabela where id=$id");
  7.  
  8. $kolumna1= mysql_results($query,0,'nazwa_kolumny');
  9. .......
  10. .......
  11. ?>

pisane bez sprawdzania ale cos w ten sposob, o ile dobrze zrozumialem
lnn
tzn nie wiem czy to dobrze wytlumaczylem (zielony, poczatkujacy) zatem zobrazuje o co mi chodzi:

mam sobie taka tabele:

i chce za pomoca linku np link.php?id=9 pobrac te dane ktore sa w tabeli w wierszu nr 9

i potem kazda z nich chce przekazac do oddzielnej zmiennej zeby stworzyc wiadomosc do maila, ze np:
$name = jakies imie i nazwisko z bazy na pozycji 9
$tel = jakis tel z bazy na pozycji 9

smile.gif
1010
  1. <?
  2.  
  3. $_GET['id'] = mysql_escape_string($_GET['id']);
  4.  
  5. $zap = mysql_query("SELECT * FROM tu_nazwa_tabeli WHERE id='".$_GET['id']."' LIMIT 1;");
  6. $rek = mysql_fetch_assoc($zap);
  7.  
  8. $name = $rek['name'];
  9. $tel = $rek['tel'];
  10. $email = $rek['email'];
  11. $opcja = $rek['opcja'];
  12. $confirm = $rek['confirm'];
  13.  
  14.  
  15. ?>


Podstaw sobie tylko nazwę tabeli
slawny
No to @1010 ci wszystko napisał
lnn
dzieki 1010 za pomoc! smile.gif

tak przy okazji dodam jak zrealizowalem aktualizacje jednego rekordu w bazie o danym id (moze sie komu przyda)
  1. <?php
  2. $confirm = trim($_GET['confirm']);
  3. mysql_query("UPDATE formularz SET confirm='$confirm' WHERE id='".$_GET['id']."' ")
  4. ?>
1010
Przecież to zwykły UPDATE smile.gif

Jednak Twój przykład nie jest bezpieczny. Pamiętaj żeby każde dane od użytkownika (POST, GET) filtrować przed wykorzystaniem ich w zapytaniach.

Może być to tak jak podałem wyżej

  1. <?
  2. $_GET['id'] = mysql_escape_string($_GET['id']);
  3. ?>



Więcej na temat bezpieczeństwa możesz przeczytać tu:
http://wortal.php.pl/wortal/artykuly/bezpi...wa_skryptow_php

Pozdro
lnn
tym mysql_escape_string mozna filtrowac rowniez dane ktore pobierane sa za pomoca POST a zapisywane do bazy??

co własciwie to daje? smile.gif bo w manualu ktos to opisał jakby conajmniej słownik połknął smile.gif

czy to powinno w ten sposob byc uzyte:
  1. <?php
  2. $_GET['cos'] = mysql_escape_string($_GET['cos']);
  3. // i potem gdy uzywam np.
  4. echo .$_GET['cos']. ;
  5. // i to juz jest w miare bezpieczne?
  6. ?>

dzieki za chwile uwagi i odpowiedz ;P
1010
Oczywiście że można. I zapewnia to bezpieczeństwo przed atakami SQL Injection.

Pozwolę sobie zacytować fragment artykułu z wortalu, do którego wyżej linkowałem:

Cytat
SQL injection ("wstrzykiwanie" komend SQL) to rodzaj zagrożenia, które może powstać w sytuacji, gdy za pomocą skryptu PHP pobierane są informacje z bazy danych a szczegółowe informacje dotyczące tego, jakie dokładnie dane skrypt powinien pobrać pochodzą z zewnątrz. Jest to spotykane zarówno w systemach zarządzania treścią jak i w znacznie prostszych skryptach. Dopóki zapytanie SQL budowane jest w oparciu o informacje przekazane do skryptu "z zewnątrz" skrypt może być narażony na atak typu SQL injection.

Załóżmy, że mamy skrypt, którego zadaniem jest wyświetlanie odpowiednich stron zależnie od wyboru użytkownika, który przekazywany jest do skryptu za pomocą zmiennej "page=" umieszczonej w adresie URL.

index.php?page=links

Następnie skrypt, korzysta z informacji przekazanej w zmiennej "page" i umieszcza je w zapytaniu SQL w celu pobrania z bazy i wyświetlenia odpowiedniej treści.
PHP:

<?php
$page= $_GET['page'];
$res= mysql_query("SELECT FROM table_with_pages WHERE page_id='{$page}' LIMIT 1");
?>

Powyższy przykład to bardzo popularny sposób pobierania danych z bazy, jednocześnie bardzo podatny na ataki. Atakujący musi jedynie ominąć pojedyncze znaki cudzysłowu i dodać odpowiednio spreparowany kawałek kodu:

index.php?page=%27%3B%20DROP%20DATABASE%20--

Jest to poprawne zapytanie URL, więc serwer zamieni zakodowane znaki na ciąg: '; DROP DATABASE. Spowoduje to zamknięcie rozpoczętego wcześniej cudzysłowu, wstawienie znaku kończącego zapytanie SQL (winksmiley.jpg, dodanie polecenia SQL powodującego usunięcie całej bazy danych i na koniec wstawienie znaku komentarza SQL (--) w celu usunięcia pozostałego z pierwotnego zapytania fragmentu polecenia SQL. W ten sposób możemy pożegnać się z naszą bazą danych.

Przytoczony przykład doskonale obrazuje zagrożenie. Należy pamiętać, że nie zawsze musi zadziałać dokładnie tak samo, szczególnie w przypadku gdy uprawnienia dostępu do bazy danych zostaną odpowiednio ustawione. Taki skrypt może jednak posłużyć do pozyskania lub umieszczenia przeróżnych informacji w naszej bazie danych - pobrania haseł użytkowników, zmiany hasła dla określonego użytkownika. Można również za jego pomocą zmodyfikować warunki wyszukiwania SQL za pomocą prostej reguły 'OR WHERE 1=1', przykładowo, pomijając w ten sposób sprawdzanie uprawnień dostępu lub jakikolwiek inne reguły wyszukiwania zamieszczone w zapytaniu SQL. Jest to możliwe, ponieważ dane przekazywane przez URL często są przekazywane do zapytania SQL właśnie jako warunki wyszukiwania.

Oczywiście, atakujący najprawdopodobniej nie pozna struktury bazy danych bez zobaczenia naszego kodu. Przy odpowiedniej ilość prób i odrobinie szczęścia może jednak uzyskać pewne informacje na temat budowy bazy danych, szczególnie w sytuacji gdy skrypt wyświetla na ekranie komunikaty o błędach (tym zagrożeniem dla bezpieczeństwa skryptu zajmiemy się później). Ale co z projektami open-source, których kod źródłowy jest dostępny dla wszystkich? Padają one bardzo często celem ataków, bo przy ogromnej ilości kodu nad którą pracuje bardzo dużo osób nie sposób wyłapać wszystkich błędów w skrypcie.

Najprostszym sposobem zabezpieczenia przed atakiem typu SQL injection jest usunięcie specjalnego znaczenia niektórych znaków, takich jak pojedynczy czy podwójny cudzysłów. Najlepiej w tym celu użyć funkcji natywnych dla bazy danych na której pracujemy. W naszym przypadku (baza MySQL) wygląda to następująco:
PHP:

<?php
$page= mysql_real_escape_string ($_GET['page']);
$res= mysql_query("SELECT FROM table_with_pages WHERE page_id='{$page}' LIMIT 1");
?>

Znacznie lepszym rozwiązaniem jest używanie identyfikatorów numerycznych gdziekolwiek to możliwe, zamiast "index.php?page=links" używając "index.php?page=1" i jednocześnie zmieniać typ danych przechowywanych w tej zmiennej na typ liczbowy:
PHP:

<?php
$page= (int) $_GET['page'];
$res= mysql_query("SELECT FROM table_with_pages WHERE page_id={$page} LIMIT 1");
?>

Kolejnym sposobem jest filtrowanie danych przechowywanych w zmiennych. Dla prostych identyfikatorów przeważnie wystarczą znaki alfanumeryczne (a-z0-9), w zupełności wystarczające w naszym przypadku.

Filtrowanie za pomocą wyrażenia regularnego i funkcji preg_match:
PHP:

<?php
$matches= array();
preg_match ('/^([a-z0-9])$/i', $page, $matches);
//Find page identifier in $matches[1]
?>

Oczywiście, jeżeli to tylko możliwe, nie ujawniaj kodu swoich skryptów.

Podsumowując, przydatne sposoby zabezpieczenia przed atakami typu SQL injection to:

* używanie oznaczeń numerycznych jako identyfikatorów kiedy tylko jest to możliwe,
* usuwanie specjalnego znaczenia niektórych znaków,
* filtrowanie danych pod kątem dozwolonych znaków,
* nie ujawnianie własnego kodu.

Na koniec, należy pamiętać, że takie same zagrożenia dotyczą danych przekazywanych do skryptów za pomocą zapytania typu POST. Jako że nagłówki zapytania HTTP to nic innego jak zwykły tekst, atakujący może bardzo łatwo napisać odpowiedni program (przykładowo, w języku C), którego zadaniem będzie połączenie się z naszym skryptem i wysłanie spreparowanego zapytania metodą POST.
lnn
dzieki, poczytam! smile.gif
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.