Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

22 Stron V  « < 4 5 6 7 8 > »   
Reply to this topicStart new topic
> SQL Injection/Insertion, Jak zapobiec włamaniu na stronę.
Jarod
post 3.08.2006, 09:01:53
Post #101





Grupa: Zarejestrowani
Postów: 1 190
Pomógł: 27
Dołączył: 23.04.2005

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


Cytat(eai @ 2.08.2006, 21:40 ) *
@J4r0d Przecież to jest jeszcze prostsze smile.gif

Przykład:

checksum.php
  1. <?php
  2.  
  3. function checksum ($id) {
  4. return substr(md5('aXq23' . $id), 1, 3); 
  5. }
  6.  
  7. ?>


admin.php
  1. <?php
  2.  
  3. //...
  4.  
  5. include 'checksum.php';
  6. function foo () { //Jakas tam funkcja generujaca linki do panelu admina bla bla bla...
  7. $row = ...; //Tablica np. wynik z mysql
  8. echo 'strona.com?usun=' . $row['id'] . '&checksum=' . checksum($row['id'];
  9.  }
  10.  
  11.  
  12. function delete () {
  13. if(checksum ($_GET['id']) == $_GET['checksum']) {
  14.  
  15. // Usuwasz
  16.  
  17. }
  18. }
  19.  ?>


Prościej się wytłumaczyć nie da smile.gif

Dzięki. Nie zauważyłem, że generujesz go na podstawie Id. Wszystko jasne. Dzięki.


--------------------
”Godzina nauki w życiu nowoczesnego apostoła jest godziną modlitwy.”
(św. Josemaría Escrivá, Droga, 335)
Go to the top of the page
+Quote Post
planet_x
post 3.08.2006, 15:09:20
Post #102





Grupa: Zarejestrowani
Postów: 21
Pomógł: 0
Dołączył: 13.06.2002
Skąd: mmz

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


Co do zabezpieczenia przed SQL Injection znalazłem coś takiego

  1. <?php
  2.  
  3. $arrArguments = array();
  4. $intArgumentIndex = 0;
  5.  
  6. function parseArgument($arrMatches) {
  7. global $arrArguments, $intArgumentIndex;
  8.  
  9. $strMatch = $arrMatches[0];
  10. $strArgument = @$arrArguments[$intArgumentIndex++];
  11. switch ($strMatch) {
  12. case '%d': return (int)$strArgument;
  13. case '%s': return '"'.
  14. mysql_real_escape_string($strArgument).'"';
  15. case '%b': return (int)((bool)$strArgument);
  16. }
  17. }
  18.  
  19. function SQL($strSql) {
  20. global $arrArguments, $intArgumentIndex;
  21.  
  22. $arrArgs = func_get_args();
  23. array_shift($arrArgs);
  24. $arrArguments = $arrArgs;
  25. $intArgumentIndex = 0;
  26. return preg_replace_callback('/(%[dsb])/', 'parseArgument',
  27. $strSql);
  28. }
  29.  
  30. ?>


Zastosowanie:
  1. $sql = SQL('INSERT INTO users (id, uid, name, username, password, newsletter)
  2. VALUES (NULL, %d, %s, %s, %s, %B)', $_POST['uid'], $_POST['name'],
  3. $_POST['username'], md5($_POST['password']), $_POST['newsletter']);
  4.  
  5. INSERT INTO users (id, uid, name, username, password, newsletter)
  6. VALUES (NULL, 1, "Łukasz \"anAKiN\" Lach", "anakin",
  7. "97296eca657a093aa379778c237e292d", 1)


Cały temat pod http://www.hacking.pl
oraz bardzo dobry przykład po angielsku ale kod każdy rozumie
http://www.unixwiz.net/techtips/sql-injection.html
a tu przykład błedów wysyłanych przez formularz
http://webcity.pl/webcity/porady.php/t/113

Dobrym też pomysłem są logi jeżeli było jakieś błędne zapytanie, dzięki temu można wyczaić co dany klient kombinuje, i powiedzmy przyblokować w imie dobra jego IP na jakiś czas ewentualnie login, wtedy niezrobimy krzywdy innym userom na tym samym ip.

Co do tego usówania to ja jeszcze weryfikuje IP, nazwe sesji, sumę kontrolną, i uprawniemia usera, pozatym nie jest dany wpis wywalany z bazy tylko deaktywowany powiedzmy jakieś pole w DB odpowiada za status, pużniej odpalam co jakiś czas skrypt który usówa wpisy starsze niż 30 dni z bazy danych w celu odciążenia serwera. Myślę że to w miarę bezpieczna metoda jeżeli chodzi o usówania damych z bazy. i jeszczcze na dodatek jak jest kilka osób które zarządzają serwisem.

Ten post edytował planet_x 3.08.2006, 15:21:26
Go to the top of the page
+Quote Post
php programmer
post 21.08.2006, 11:10:02
Post #103





Grupa: Zarejestrowani
Postów: 1 045
Pomógł: 5
Dołączył: 8.11.2004
Skąd: trójmiasto

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


Mam zapytanie, które jest brzydkie

  1. <?php
  2. $query = "DELETE FROM newsy WHERE id=".$_GET['id'];
  3. ?>


Czy jak zmienie w taki sposób:

  1. <?php
  2. $query = "DELETE FROM newsy WHERE id='".$_GET['id']."'";
  3. ?>


To będzie już ładne questionmark.gif?
Go to the top of the page
+Quote Post
nospor
post 21.08.2006, 11:25:10
Post #104





Grupa: Moderatorzy
Postów: 36 455
Pomógł: 6292
Dołączył: 27.12.2004




a jak ktos ci w miejsce id zamiast powiedzmy 2, wpisze: 2' or 1=1 to usunie ci wszystko z tabeli.... byla mowa na poczatku tego topicu. jesli id to liczba, to rzutuj ja na liczbe: (int)$_GET['id']. jak nie liczba to slashuj


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

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
php programmer
post 21.08.2006, 13:05:04
Post #105





Grupa: Zarejestrowani
Postów: 1 045
Pomógł: 5
Dołączył: 8.11.2004
Skąd: trójmiasto

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


OK. Ale jak mam już zapytanie typu SELECT, np
  1. <?php
  2. $query = "SELECT * FROM newsy WHERE id=".$_GET['id'];
  3. ?>

To rozumiem, że chyba nic złego się nie może stać ?
Go to the top of the page
+Quote Post
nospor
post 21.08.2006, 13:08:30
Post #106





Grupa: Moderatorzy
Postów: 36 455
Pomógł: 6292
Dołączył: 27.12.2004




W przypadku mysql za bardzo tak ci nic nie skasuja, gdyz mysql_query pozwala na wykonanie tylko jednego zapytania. ale w przypadku innych baz to moglbys sie zzdziwic.
Pozatym w mysql to ci moga wyciagnac inne dane niz w twoim warunku, wystarczy ze za id dadza: 2 or 1=1
i juz poznaja wszystkie rekordy a nie tylko o danym id.

Przyjmij wkoncu do wiadomosc. Dane nalezy filtrowac, niezaleznie od tego czy ktos moze zaszkodzic czy nie. Naucz sie wyrabiac w sobie dobre nawyki.
Cos ma byc intem: zrzutuj na int. Cos ma byc tekstem: przeslashuj to


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

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
sobstel
post 21.08.2006, 13:25:04
Post #107





Grupa: Zarejestrowani
Postów: 853
Pomógł: 25
Dołączył: 27.08.2003
Skąd: Katowice

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


Cytat(php programmer @ 21.08.2006, 14:05 ) *
OK. Ale jak mam już zapytanie typu SELECT, np
  1. <?php
  2. $query = "SELECT * FROM newsy WHERE id=".$_GET['id'];
  3. ?>

To rozumiem, że chyba nic złego się nie może stać ?


żartujesz czy to jakaś prowokacja? w $_GET['id'] wpisuje OR 1=1 i po sprawie. wlasciwie mozna zrobic tu wszystko teraz. taki przyklad pojawia sie w kazdym kursie, artykule, ksiazce jako calkowity brazk zabezpieczenia.


--------------------
"If debugging is the process of removing bugs, then programming must be the process of putting them in..."
sobstel.org
Go to the top of the page
+Quote Post
skowron-line
post 21.08.2006, 13:45:32
Post #108





Grupa: Zarejestrowani
Postów: 4 340
Pomógł: 542
Dołączył: 15.01.2006
Skąd: Olsztyn/Warszawa

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


Cytat(nospor @ 21.08.2006, 12:08 ) *
mysql_query pozwala na wykonanie tylko jednego

a jesli bedzie cos takiego
http://index.php?site=del&id=2
i dopiszesz dalej
';%20$mysql_query%20=%20"%20DELETE%20%20FROM%20USERS";
chodzi o usuwanie to czy cos takiego ma szanse zadzialac

w przypadku jak id nie jest filtrowane


--------------------
I'm so fast that last night I turned off the light switch in my hotel room and was in bed before the room was dark - Muhammad Ali.
Peg jeżeli chcesz uprawiać sex to dzieci muszą wyjść, a jeżeli chcesz żeby był dobry ty też musisz wyjść - Al Bundy.

QueryBuilder, Mootools.net, bbcradio1::MistaJam
http://www.phpbench.com/
Go to the top of the page
+Quote Post
nospor
post 22.08.2006, 08:23:57
Post #109





Grupa: Moderatorzy
Postów: 36 455
Pomógł: 6292
Dołączył: 27.12.2004




Cytat
a jesli bedzie cos takiego
http://index.php?site=del&id=2
i dopiszesz dalej
';%20$mysql_query%20=%20"%20DELETE%20%20FROM%20USERS";
chodzi o usuwanie to czy cos takiego ma szanse zadzialac

w przypadku jak id nie jest filtrowane

Czy Twoim zamierzeniem bylo zakonczenie jednej instrukcji php i wywolanie drugiej, w tym przypadku wywolanie ponownie mysql_query? Powodzenia życze. winksmiley.jpg


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

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
php programmer
post 23.08.2006, 12:39:00
Post #110





Grupa: Zarejestrowani
Postów: 1 045
Pomógł: 5
Dołączył: 8.11.2004
Skąd: trójmiasto

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


Kurcze zrobiłem coś takiego:

  1. <?php
  2. $query = ($_GET['id']=='') ? 'INSERT INTO formularze SET' : 'UPDATE formularze SET ';
  3. $query .= " name = '".mysql_escape_string($_POST['name'])."', date='".$_POST['date']."' ";
  4. if ($_GET['id']!='')
  5. $query .= ' WHERE id ='.(int)$_GET['id'];
  6.  
  7. $result = mysql_query($query) or die(mysql_error());
  8. ?>


Probelm jest chyba z mysql_escape_string
bo teraz po dodaniu tesktu z cudzysłowem i zapisaniu w bazie,
jak robie wyświetlanie wpisanych wartości to mam dodane slashe,
Co się w takim przypadku robi? Jest jakaś funkcja na to?

Ten post edytował php programmer 23.08.2006, 12:40:32
Go to the top of the page
+Quote Post
nospor
post 23.08.2006, 12:41:56
Post #111





Grupa: Moderatorzy
Postów: 36 455
Pomógł: 6292
Dołączył: 27.12.2004




no musisz przed wyswietleniem uzyc stripslashes. jest to pewien feler... smile.gif

Mozesz tez zapisywac do bazy przy pomocy htmlspecialchars z dyrektywa ENT_QUOTES. Zapiszesz wowczas encje i nie bedziesz mial \


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

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
sobstel
post 23.08.2006, 13:20:47
Post #112





Grupa: Zarejestrowani
Postów: 853
Pomógł: 25
Dołączył: 27.08.2003
Skąd: Katowice

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


używaj prepared statements to w wiekszosci przypadkow nie bedziesz musial sie sie przejmowaniem slashowaniem i odslashowaniem. niestety dostepne dopiero od mysqli i pdo


--------------------
"If debugging is the process of removing bugs, then programming must be the process of putting them in..."
sobstel.org
Go to the top of the page
+Quote Post
free
post 29.08.2006, 20:33:05
Post #113





Grupa: Zarejestrowani
Postów: 269
Pomógł: 0
Dołączył: 6.02.2006

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


Cytat(MoD @ 27.02.2005, 16:45:48 ) *
Ja do liczb stosuje najczęściej ereg" title="Zobacz w manualu php" target="_manual (zwłaszcza w UPDATE, w grze MMORPG). Wtedy mam pewność że osoba która wpisze np -1230 nie wyrządzi mi żadnych szkód. A zabezpieczanie skryptów można trenować na wspomnianym przeze mnie wyżej ExoFusion. Jak ktoś go tak zabezpieczy, że nie będzie żadnych (no, może nie żadnych, a prawie żadnych) błędów to będzie się miał czym pochwalić (ja znałem 2 gry na 10 które były w miarę zabezpieczone, ale i tak padły - właśnie przez SQL Injection)

Apropo gier: http://sge.laventhar.pl/ Włamałem sie do niej pół roku temu poprzez błąd serwera, w kodzie php odnalazłem pliki *ini a tam hasło :-) i gra była moja.
Go to the top of the page
+Quote Post
Vexator
post 30.08.2006, 06:36:08
Post #114





Grupa: Zarejestrowani
Postów: 32
Pomógł: 6
Dołączył: 28.08.2006
Skąd: Gdańsk

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


przyznam szczerze, ze calego topica nie przeczytalem i moze sie juz pojawilo

jesli chcemy zrobic
  1. SELECT pole FROM tabela WHERE id=$_GET['id']

to najlepiej jest nie przesylac zmiennej bezposrednio GETem, czy POSTem, lecz zrobic tak:

  1. <?php
  2.  
  3. switch ($_GET['id'])
  4. {
  5. case 'a': $szukana=0;
  6. break;
  7. case 'b': $szukana=1;
  8. break;
  9. default : $szukana=666;
  10. }
  11.  
  12. $sql = "SELECT pole FROM tabela WHERE id =".$szukana.";";
  13. ?>


w ten sposob nikt nie jest w stanie pod nasza zmienna podpiac "zlych" warunkow do sqla, bo jesli wpisze cokolwiek innego niz a lub b, to $szukana bedzie defaultowa


p.s. co zrobic, zeby forum nie wstawialo mi \ przed "?

Ten post edytował Vexator 30.08.2006, 06:46:04


--------------------
Pomogłem? Kliknij "pomógł" ;)
Go to the top of the page
+Quote Post
nospor
post 30.08.2006, 08:13:33
Post #115





Grupa: Moderatorzy
Postów: 36 455
Pomógł: 6292
Dołączył: 27.12.2004




@Vexator z calym szacunkiem, ale przeczytaj jednak ten topic caly, albo przynajmniej strone na ktorej napisales tego posta...
Przeciez ty dales warunek na ID, w bazie mam powiedzmy 1000 rekordow i co, mam walić na kazdego case? Jak ty to sobie wyobrazasz? poroniony pomysl
skoro to ID to wystarczy zrzutowac na int: (int) $_GET['id']
i nikt ci nic nie wrzuci


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

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
free
post 31.08.2006, 11:33:31
Post #116





Grupa: Zarejestrowani
Postów: 269
Pomógł: 0
Dołączył: 6.02.2006

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


Naklepsza ochroną jest stosowanie sesji z prawami dostepu. W swoich skryptach przed wyslaniem zapytanie do SQL spr czy user ma prawa dostepu, jezeli nie skrypt nie puszcza pasozyda.
Go to the top of the page
+Quote Post
nospor
post 31.08.2006, 12:02:58
Post #117





Grupa: Moderatorzy
Postów: 36 455
Pomógł: 6292
Dołączył: 27.12.2004




@free ale jak to sie ma do topicu w ktorym uraczyles nas tym postem?
W jaki sposob sprawdzasz czy koles ma prawa? Na podstawie pewnie czy zalogowany, a zeby sie zalogowac to musi wpisac login i haslo i juz w tym momencie moze zrobic ci atak. No chyba ze sprawdzasz czy ma prawa do zalogowania sie winksmiley.jpg

edit: a nawet jak ma prawa to moze chcacy lub niechcacy zrobic cos "źle"


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

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
Blastereq
post 7.09.2006, 12:27:57
Post #118





Grupa: Zarejestrowani
Postów: 42
Pomógł: 0
Dołączył: 28.11.2005

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


Hmm, mam pytanie, stosuje mod_rewrite w ten sposób :
  1. RewriteEngine on
  2. RewriteRule ^$ /index.php
  3. RewriteRule ^([0-9a-z]+)$ /$1/
  4. RewriteRule ^([0-9a-z]+)/$ /index.php?p_zmienna=$1
  5.  
  6. RewriteRule ^([0-9a-z]+)/([0-9a-z]+)$ /$1/$2/
  7. RewriteRule ^([0-9a-z]+)/([0-9a-z]+)/$ /index.php?p_zmienna=$1&d_zmienna=$2

Adres strony pojawia się w ten sposób : http://strona.net/wartosc1/wartosc2/
Jeśli w żadnym linku nie odwołam się do postaci http://strona.net/index.php?p_zmienna=wart...mienna=wartosc2 . To czy ewentualny atakujący będzię miał możliwość w jakikolwiek sposób zobaczyć nazwę tej zmiennej ? Bo jeśli nie będzie miał możliwości to przy wpisaniu http://strona.net/wartosc1 OR 1=1/ wyskoczy błąd serwera gdyż pusty znak nie jest uwzględniony w [0-9a-z] i SQL Injection się nie powiedzie. Czy się myle ?

Ten post edytował Blastereq 7.09.2006, 12:28:57


--------------------
śmieszne filmiki
Go to the top of the page
+Quote Post
Rzast
post 11.09.2006, 15:36:07
Post #119





Grupa: Zarejestrowani
Postów: 45
Pomógł: 0
Dołączył: 24.11.2005
Skąd: Podczerwone

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


Ja bronię się trochę inaczej:
robię zapytanie typu
  1. <?php
  2. $sql='SELECT id,login FROM baza WHERE haslo="'.md5($_POST['haslo']).'"';
  3. $wynik=mysql_fetch_row($sql);
  4. if ((mysql_num_rows($sql)==1) && ($wynik[1]==$_POST['login'])){
  5. //Zalogowany
  6. $_Session['id']=$wynik[0];
  7. //Dalsze czynności....
  8. }else{
  9. //Jeszcze raz, bo nie udało się. Można ewentualnie wypisać, czy to zły login, czy 
    też hasło....
  10. }
  11. ?>


Funkcja haszująca MD5 gwarantuje, że treść wysłana w zapytaniu do bazy NIE będzie żadnym poleceniem. Jeżeli hasło istnieje (albo ktoś trafił na ciąg po haszowaniu dajacy jakiśtam rezultat, który jest w bazie), to sprawdzamy login z zapodanym wcześniej. Takie podejście od tyłu winksmiley.jpg Najczęściej wykorzystywane jest pole [login] do takich zabaw jak SQL Injection. A w tym przypadku nie ma na to szans.

Proszę o ocenę pod względem bezpieczeństwa...

PS> Hasła w bazie są oczywiście shaszowane aarambo.gif
PS2> w zmiennej $sql nie ma żadnych Backslashy (czyli [\])


--------------------
Podhale naprawa komputerów, strony WWW
Go to the top of the page
+Quote Post
MatheW
post 11.09.2006, 16:49:54
Post #120





Grupa: Zarejestrowani
Postów: 135
Pomógł: 0
Dołączył: 29.05.2006
Skąd: Lublin

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


Super - sprawdzasz tylko po haśle - więc zakladasz ze kazdy user MUSI miec inne haslo - zle - wybierz po loginie (ktory winien byc unikalny) i potem czy hash hasła = shaszowane wczesniej haslo z bazy.


--------------------
[gg:8166107][jid:mmatheww@jabberpl.org][mail:mat.wojcik[at]gmail.com][www: http://mwojcik.pl]
Go to the top of the page
+Quote Post

22 Stron V  « < 4 5 6 7 8 > » 
Reply to this topicStart new topic
3 Użytkowników czyta ten temat (3 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 24.04.2024 - 08:37