Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

22 Stron V  « < 7 8 9 10 11 > »   
Reply to this topicStart new topic
> SQL Injection/Insertion, Jak zapobiec włamaniu na stronę.
templar
post 30.09.2007, 21:42:27
Post #161





Grupa: Zarejestrowani
Postów: 26
Pomógł: 0
Dołączył: 13.09.2006
Skąd: Poland

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


Cytat(Najki @ 25.11.2004, 00:13:57 ) *
SQL Injection (zwane też "SQL Insertion") to (rzekomo) najprostszy sposób włamu na stronę. Spowodowany jest on niepełnym sformułowaniem zapytań do MySQL.

Przykład. Dajemy na stronie możliwość edycji profilu. Zapytanie do SQL wygląda następująco:
  1. <?php
  2. $query = "update uzytkownicy set pole='$dane' where id='$id'";
  3. ?>

Osoba włamująca się na stronę umieszcza całkiem prosty, odpowiedni ciąg znaków/poleceń w dowolnym polu edycji tego profilu, który wygląda np. tak (dla zmiany hasła użytkownika o dowolnie wybranym, przez atakującego numerze ID):
  1. <?php
  2. ', haslo='nowe_haslo' WHERE id = '1
  3. ?>


W taki oto prosty sposób, osoba atakująca zmieniła hasło użytkownikowi o ID=1 (zazwyczaj administrator). W podobny sposób można również wyciągnąć dowolne dane z tabeli SQL.

W każdym razie. Poszperałem, pomyślałem i zebrałem wszystko do kupy. Zamieszczam to tutaj razem, oraz proszę o rozbudowanie tego topica, gdyż nie znalazłem na tym forum więcej informacji o "SQL Injection".

Oto co możemy dokonać:
1. Możemy sformułować nasze zapytanie do SQL tak:
  1. <?php
  2. $query = 'update `uzytkownicy` set `pole`="'.$dane.'" where `id`="'.$id.'";';
  3. ?>

2. Numer ID warto ustawiać w sposób $_GET['id'], lub $_POST['id'], można też ustawić go w nast. sposób:
  1. <?php
  2. $id = (int)$_GET['id'];
  3. ?>


Może nie ma tego dużo, ale jest to już jakaś podstawa do zabezpieczenia strony/skryptu przed prostym i niezwykle niebezpiecznym, SQL Injection. Proszę osoby obeznane w tym temacie, aby dopisały tu własne propozycje metod zabezpieczenia się przed tym atakiem.


Ależ problem ;->.

  1. <?php
  2. function SecureQuery($q, $type)
  3. {
  4. switch($type)
  5. {
  6. case 'string':
  7. if(!preg_match('[a-z0-9]', $q)) $ret = false;
  8. else $ret = true;
  9. break;
  10.  
  11. case 'int':
  12. if(!is_numeric($q)) $ret = false;
  13. else $ret = true;
  14. break;
  15. }
  16. return $ret;
  17. }
  18. ?>


I potem w kodzie, przed zapytaniami:

Dla URL'i z tekstem i cyframi:

  1. <?php
  2. $nazwa_uzytkownika = $_GET['username'];
  3.  
  4. if(SecureQuery($nazwa_uzytkownika, 'string'))
  5. mysql_query('SELECT * FROM `db_name` WHERE `user_name` = "'.$nazwa_uzytkownika.'"');
  6. else die('error');
  7. ?>


A dla URLi z cyframi zastosujemy

  1. <?php
  2. $ilosc = $_GET['ilosc'];
  3.  
  4. if(SecureQuery($ilosc, 'int'))
  5. mysql_query('SELECT * FROM `db_name` WHERE `ilosc` = "'.$ilosc.'"');
  6. else die('error');
  7. ?>


Zawsze trzeba kodowac w mysl zasady KISS - (keep it stupid simple).

Pozdrawiam.

Ten post edytował templar 30.09.2007, 21:45:08
Go to the top of the page
+Quote Post
bełdzio
post 30.09.2007, 22:34:53
Post #162





Grupa: Zarejestrowani
Postów: 690
Pomógł: 81
Dołączył: 6.04.2005
Skąd: Szczecin

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


@templar a po co te regExpy? nie lepiej skorzystać z ctype?


--------------------
Go to the top of the page
+Quote Post
Regyam
post 4.11.2007, 14:46:49
Post #163





Grupa: Zarejestrowani
Postów: 79
Pomógł: 0
Dołączył: 8.04.2007

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


a co z sql injection jezeli mam linki w mod_rewrite i nie da sie wpisac slowa bo mam zdefiniowana wartosc ([0-9]*). Chyba nie da sie tego w jakikolwiek sposob ominac bo wywala error 404, co o tym myslicie?
Go to the top of the page
+Quote Post
bełdzio
post 4.11.2007, 15:40:32
Post #164





Grupa: Zarejestrowani
Postów: 690
Pomógł: 81
Dołączył: 6.04.2005
Skąd: Szczecin

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


zawsze istnieje możliwość odwołania się bezpośrednio do plików, ale to też można wyeliminować smile.gif zerknij tu -> http://www.beldzio.com/modrewrite-jako-pie...knieciami.freez


--------------------
Go to the top of the page
+Quote Post
rzymek01
post 14.11.2007, 20:55:27
Post #165





Grupa: Zarejestrowani
Postów: 592
Pomógł: 62
Dołączył: 3.08.2006

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


Cytat(bełdzio @ 30.09.2007, 22:34:53 ) *
nie lepiej skorzystać z ctype?

Moim zdaniem lepiej skorzystać jest z is_numeric.
Kiedyś testowałem te funkcje i ctype okazało się wolniejsze w działaniu smile.gif


--------------------
:]
Go to the top of the page
+Quote Post
bełdzio
post 15.11.2007, 00:25:56
Post #166





Grupa: Zarejestrowani
Postów: 690
Pomógł: 81
Dołączył: 6.04.2005
Skąd: Szczecin

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


wg. manuala ctype jest szybsze, a raczej ich testy były dokładniejsze :-)


--------------------
Go to the top of the page
+Quote Post
Garrappachc
post 15.11.2007, 22:23:22
Post #167





Grupa: Zarejestrowani
Postów: 76
Pomógł: 2
Dołączył: 15.11.2007
Skąd: Kraków

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


Co do samego początku tematu:

czy nie można przefiltrować apostrofów:

Kod
$login = str_replace("`", "", $login);
$login = str_replace("'", "", $login);

(ewentualnie wywalić błędu)?
A tak poza tym to przecież MySQL odpowiednio koduje hasła:
  1. UPDATE `users` SET `haslo`=(PASSWORD('$pass')) WHERE `id`='$id'


więć teoretycznie w czym problem?...


--------------------


CPU | GPU | RAM | HDD | OS
Go to the top of the page
+Quote Post
Kicok
post 15.11.2007, 23:08:17
Post #168





Grupa: Zarejestrowani
Postów: 1 033
Pomógł: 125
Dołączył: 17.09.2005
Skąd: Żywiec

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


Cytat
A tak poza tym to przecież MySQL odpowiednio koduje hasła:
  1. UPDATE `users` SET `haslo`=(PASSWORD('$pass')) WHERE `id`='$id'



więć teoretycznie w czym problem?...


Problem jest w tym, że wysyłając formularzem odpowiedni ciąg znaków mogę to zapytanie przerobić na:
  1. UPDATE `users` SET `haslo`=(PASSWORD('jakies_haslo')), `is_admin`=1 WHERE `id` = 123 -- ')) WHERE `id` = ''


A co do apostrofów, to ich użycie nie oznacza zawsze próby włamania. Zamiast usuwania ich albo wyrzucania błędu wystarczy umieścić przed nimi znaki ucieczki.


--------------------
"Sumienie mam czyste, bo nieużywane."
Go to the top of the page
+Quote Post
marcio
post 23.12.2007, 23:40:39
Post #169





Grupa: Zarejestrowani
Postów: 2 291
Pomógł: 156
Dołączył: 23.09.2007
Skąd: ITALY-MILAN

Ostrzeżenie: (10%)
X----


A wiec po Przeczytaniu chyba juz 10 raz tego tematu sam juz nie wiem co uzywac dla zmienne $_GET['id'] mam dawac
*(int)
*intval()
*Is_numeric()
*is_integer
??Sam juz nie wiem co jest najlepsze do rzutowania typu cyfrowego


--------------------
Zainteresowania: XML | PHP | MY(SQL)| C# for .NET | PYTHON
http://code.google.com/p/form-builider/
Moj blog
Go to the top of the page
+Quote Post
Kicok
post 2.01.2008, 11:10:54
Post #170





Grupa: Zarejestrowani
Postów: 1 033
Pomógł: 125
Dołączył: 17.09.2005
Skąd: Żywiec

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


is_integer" title="Zobacz w manualu PHP" target="_manual nigdy nie zadziała dla $_GET, $_POST czy $_COOKIE. Dane w tych tablicach są zawsze typu string lub array


Stosuj rzutowanie: intval" title="Zobacz w manualu PHP" target="_manual lub (int) i sprawdzaj czy zapytanie zwróciło jakieś dane. Jeśli nie, to wyświetlasz informację "nie ma strony o podanym ID", "nie ma takiego newsa", "komentarz nie istnieje lub został usunięty" czy jaką tam chcesz.


--------------------
"Sumienie mam czyste, bo nieużywane."
Go to the top of the page
+Quote Post
pytajnik2
post 2.01.2008, 18:06:56
Post #171





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

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


Witajcie,
a co myślicie o tym?
http://axelpl.wordpress.com/2008/01/01/uni...n-i-xss/#more-3
Go to the top of the page
+Quote Post
bełdzio
post 2.01.2008, 20:29:42
Post #172





Grupa: Zarejestrowani
Postów: 690
Pomógł: 81
Dołączył: 6.04.2005
Skąd: Szczecin

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


patrzac na szybko to nic ciekawego smile.gif z tego co widze to nawet nie broni przez standardowym 1 =1 smile.gif


--------------------
Go to the top of the page
+Quote Post
pytajnik2
post 2.01.2008, 20:35:44
Post #173





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

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


no ale jak się ma w wszystkie pisywane przecież zmienne w apostrofach np tak
select * from ... where cos = '$_GET['cos']'
to obroni co nie?
no i nie da sie uzyc select, union oraz exec. a to dopisanie 1 = 1 to chyba zadziala jesli zmienna nie jest w apostrofkach?
Go to the top of the page
+Quote Post
bełdzio
post 3.01.2008, 00:03:29
Post #174





Grupa: Zarejestrowani
Postów: 690
Pomógł: 81
Dołączył: 6.04.2005
Skąd: Szczecin

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


wszystko zalezy od konkretnego kodu, najlepsze zabezpieczenie to pisanie porzadnego kodu, a nie bawienie sie w polsrodki


--------------------
Go to the top of the page
+Quote Post
kilas88
post 9.02.2008, 03:27:22
Post #175





Grupa: Zarejestrowani
Postów: 305
Pomógł: 25
Dołączył: 27.01.2007

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


Cytat(Najki @ 6.12.2004, 09:29:56 ) *
Owszem dodaje, ale chyba tylko, gdy na serwerze jest włączone <span style="font-weight: bold;">magic_quotes_gpc</span> ?
A jeśli nie to jakim prawem kolega mi się włamał? snitch.gif


Znalazłem taką funkcję odnośnie tego problemu.
  1. <?php
  2. function stripMagicQuotes($var){
  3. return stripslashes($var);
  4. }else{
  5. return $var;
  6. }
  7. }
  8. ?>

Przydatne porady smile.gif
Go to the top of the page
+Quote Post
specialplan
post 10.03.2008, 12:27:05
Post #176





Grupa: Zarejestrowani
Postów: 206
Pomógł: 21
Dołączył: 1.09.2006
Skąd: Edinburgh

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


Cytat(kilas88 @ 9.02.2008, 04:27:22 ) *
Znalazłem taką funkcję odnośnie tego problemu.
  1. <?php
  2. function stripMagicQuotes($var){
  3. return stripslashes($var);
  4. }else{
  5. return $var;
  6. }
  7. }
  8. ?>

Przydatne porady smile.gif


To ze zrodel PHP-Fusion?
Go to the top of the page
+Quote Post
lucca
post 10.03.2008, 18:51:04
Post #177





Grupa: Zarejestrowani
Postów: 29
Pomógł: 2
Dołączył: 7.03.2008

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


Witka!

Mam pytanie odnośnie SQL Injection.

Wszystkie dane przepuszczam przez filtry, nie dopuszczam, żednych danych do bazy bez obróbki.

Case study:
Mam formularz rejestracji, próbowałem w nim wpisać

  1. "; DELETE * FROM users;


Zwrócił:
There was an error: Invalid User Name Specified and try again.

Czy to znaczy, że skrypt jest jako tako bezpieczny? Macie może jakieś metody, żeby sprawdzić dany skrypt?
Go to the top of the page
+Quote Post
kilas88
post 10.03.2008, 22:35:51
Post #178





Grupa: Zarejestrowani
Postów: 305
Pomógł: 25
Dołączył: 27.01.2007

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


Cytat(specialplan @ 10.03.2008, 12:27:05 ) *
To ze zrodel PHP-Fusion?

Źródło: php.net/mysql_escape_string. W komentarzach ktoś zapodał, więc skopiowałem - być może komuś się przyda. Pozdrawiam.
Go to the top of the page
+Quote Post
.radex
post 11.03.2008, 19:02:00
Post #179





Grupa: Zarejestrowani
Postów: 1 657
Pomógł: 125
Dołączył: 29.04.2006

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


Mam takie pytanie: "Od zawsze" bronię się przeciwko atakom SQL Injection, w ten sposób:

- mysql_real_escape_string
- apostrof na wyrażenie( bo np. gdyby po czyimś wstrzyknięciu było "WHERE news_title = costam AND (...) --" to samo mysql_escape_string by nic nie dało.)

Ostatnio czytałem bardzo wiele artykułów na temat bezpieczeństwa skryptów etc. i co raz bardziej mam wrażenie, że to co robię to za mało.

Wiem, że pytanie jest głupkowate i "mogłem uważniej czytać", ale kiedyś czyjś artykuł wciska mi kit, że trza zrobić cośtam (a to sprawy bezpieczeństwa), a ja tego nie robię to strasznie mnie to stresuje, bo zaczynam wierzyć, że to prawda tongue.gif


--------------------
blog | Tadam — minutnik do Pomodoro na Maka :)
Go to the top of the page
+Quote Post
bim2
post 11.03.2008, 19:09:01
Post #180





Grupa: Zarejestrowani
Postów: 1 873
Pomógł: 152
Dołączył: 9.04.2006
Skąd: Berlin

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


Czego jeszcze Ci brakuje tongue.gif Wystarczy ze w zmiennych który wstrzykujesz w zapytanie "SELECT * FROM lol WHERE if='$id'" dajesz ' lub jeśli to ma być int dajesz (int)$_GET['ehh']; Tyle starcza... :] No i usuwanie wszelkich scripts embed ;P


--------------------
Go to the top of the page
+Quote Post

22 Stron V  « < 7 8 9 10 11 > » 
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.04.2024 - 05:45