Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [PHP][MYSQL] pobranie danych z bazy za pomoca id, w linku
lnn
post 15.04.2009, 13:27:23
Post #1





Grupa: Zarejestrowani
Postów: 361
Pomógł: 11
Dołączył: 17.12.2008
Skąd: LU

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


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

Ten post edytował lnn 15.04.2009, 13:35:17
Go to the top of the page
+Quote Post
1010
post 15.04.2009, 13:45:23
Post #2





Grupa: Zarejestrowani
Postów: 749
Pomógł: 37
Dołączył: 3.10.2006

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


  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.


--------------------
Go to the top of the page
+Quote Post
slawny
post 15.04.2009, 13:49:09
Post #3





Grupa: Zarejestrowani
Postów: 214
Pomógł: 26
Dołączył: 7.11.2007
Skąd: Warszawa

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


  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
Go to the top of the page
+Quote Post
lnn
post 15.04.2009, 13:58:32
Post #4





Grupa: Zarejestrowani
Postów: 361
Pomógł: 11
Dołączył: 17.12.2008
Skąd: LU

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


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
Go to the top of the page
+Quote Post
1010
post 15.04.2009, 14:05:58
Post #5





Grupa: Zarejestrowani
Postów: 749
Pomógł: 37
Dołączył: 3.10.2006

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


  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


--------------------
Go to the top of the page
+Quote Post
slawny
post 15.04.2009, 14:13:20
Post #6





Grupa: Zarejestrowani
Postów: 214
Pomógł: 26
Dołączył: 7.11.2007
Skąd: Warszawa

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


No to @1010 ci wszystko napisał
Go to the top of the page
+Quote Post
lnn
post 15.04.2009, 15:37:47
Post #7





Grupa: Zarejestrowani
Postów: 361
Pomógł: 11
Dołączył: 17.12.2008
Skąd: LU

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


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. ?>
Go to the top of the page
+Quote Post
1010
post 15.04.2009, 17:54:21
Post #8





Grupa: Zarejestrowani
Postów: 749
Pomógł: 37
Dołączył: 3.10.2006

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


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


--------------------
Go to the top of the page
+Quote Post
lnn
post 16.04.2009, 21:00:27
Post #9





Grupa: Zarejestrowani
Postów: 361
Pomógł: 11
Dołączył: 17.12.2008
Skąd: LU

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


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

Ten post edytował lnn 16.04.2009, 21:00:59
Go to the top of the page
+Quote Post
1010
post 16.04.2009, 21:09:48
Post #10





Grupa: Zarejestrowani
Postów: 749
Pomógł: 37
Dołączył: 3.10.2006

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


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.


--------------------
Go to the top of the page
+Quote Post
lnn
post 16.04.2009, 21:18:28
Post #11





Grupa: Zarejestrowani
Postów: 361
Pomógł: 11
Dołączył: 17.12.2008
Skąd: LU

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


dzieki, poczytam! smile.gif
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 Wersja Lo-Fi Aktualny czas: 26.06.2025 - 01:44