Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

22 Stron V  « < 11 12 13 14 15 > »   
Reply to this topicStart new topic
> SQL Injection/Insertion, Jak zapobiec włamaniu na stronę.
erix
post 30.05.2009, 13:10:33
Post #241





Grupa: Moderatorzy
Postów: 15 467
Pomógł: 1451
Dołączył: 25.04.2005
Skąd: Szczebrzeszyn/Rzeszów




Cytat
Czy to było niebezpieczne?

Jeśli nie filtrujesz danych wejściowych, to jest niebezpieczne.

Jeśli filtrujesz, nie przejmuj się; chyba każdą stronę skanują boty poszukujące dziur. ;]


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

ZCE :: Pisząc PW załączaj LINK DO TEMATU i TYLKO w sprawach moderacji :: jakiś błąd - a TREŚĆ BŁĘDU? :: nie ponaglaj z odpowiedzią via PW!
Go to the top of the page
+Quote Post
mrSlowFlow
post 30.05.2009, 17:06:09
Post #242





Grupa: Zarejestrowani
Postów: 19
Pomógł: 0
Dołączył: 19.03.2009
Skąd: Warszawa

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


Co sądzicie o tym: http://hacking.pl/5845
Czy coś takiego wystarczy?
Go to the top of the page
+Quote Post
erix
post 30.05.2009, 20:46:50
Post #243





Grupa: Moderatorzy
Postów: 15 467
Pomógł: 1451
Dołączył: 25.04.2005
Skąd: Szczebrzeszyn/Rzeszów




A chociaż przeczytałeś ten wątek od początku...?


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

ZCE :: Pisząc PW załączaj LINK DO TEMATU i TYLKO w sprawach moderacji :: jakiś błąd - a TREŚĆ BŁĘDU? :: nie ponaglaj z odpowiedzią via PW!
Go to the top of the page
+Quote Post
Fantome
post 14.06.2009, 15:08:58
Post #244





Grupa: Zarejestrowani
Postów: 8
Pomógł: 0
Dołączył: 27.12.2006

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


ostatnich kilka dni przesiedziałem na szukaniu dobrego i skutecznego sposobu zabezpieczenia się przed SQL injection, jednak nic na prawdę konkretnego nie znalazłem;/
pewnie ameryki nie odkryłem, do optymalnych sposobów to nie należy, ale po połączeniu pomysłów z kilku stron oraz fragmentów kodów z tego forum powstało coś takiego:
  1. <?php
  2. function filtr_sprawdzenie($text)
  3. {
  4.    $filtr_sprawdzenie= filtr($text);
  5.    return substr_count($filtr_sprawdzenie, '1');
  6. }
  7. function filtr($text)
  8. {
  9.    $text=strtolower($text);
  10.    
  11.    
  12.    $ciag_sprawdzenie = substr_count($text, 'unique').
  13.    substr_count($text, '*/').
  14.    substr_count($text, '/*').
  15.    substr_count($text, '//').
  16.    substr_count($text, '#').
  17.    substr_count($text, '<!--').
  18.    substr_count($text, 'char').
  19.    substr_count($text, 'BETWEEN');
  20.  
  21.    return $ciag_sprawdzenie;
  22.    
  23. }
  24.  
  25.  
  26.  
  27. function strip_tags_content($text, $tags = '', $invert = FALSE) {
  28. preg_match_all('/<(.+?)[s]*/?[s]*>/si', trim($tags), $tags);
  29.  $tags = array_unique($tags[1]);
  30.  if(is_array($tags) AND count($tags)> 0) {
  31.    if($invert == FALSE) {
  32.      return preg_replace('@<(?!(?:'. implode('|', $tags) .')b)(w+)b.*?>.*?</1>@si', '', $text);
  33.    }
  34.    else {
  35.      return preg_replace('@<('. implode('|', $tags) .')b.*?>.*?</1>@si', '', $text);
  36.    }
  37.  }
  38.  elseif($invert == FALSE) {
  39.    return preg_replace('@<(w+)b.*?>.*?</1>@si', '', $text);
  40.  }
  41.  return $text;
  42. }
  43.  
  44. function dlugosc_ciagu($text, $max)
  45. {
  46.    if(strlen($text)<$max)
  47.    {
  48.        return $text;
  49.    }
  50.    else
  51.    return'error';
  52. }
  53.  
  54. $text=$_POST['jakis_tekst'];
  55. $user_id=1;
  56. $max=50;
  57. if(dlugosc_ciagu($text, $max)!='error')
  58. {
  59.    $ile_podejrzanych_znakow = filtr_sprawdzenie($text);//sprawdza czy nie zostało użyte słowo unique itp. jeśli bedzie 1 albo wiecej to ktos chce sie wlamac, jesli 0 to nie:)
  60.    if($ile_podejrzanych_znakow>0)
  61.    {
  62.        echo 'Próba włamania, Twoje IP zostało zbanowane, a admin poinformowany drogą mailową';//dalej kod wysyłający maila/smsa do admina, banujący dane IP w systemie
  63.    }
  64.    else
  65.    {
  66.        $text = strip_tags_content(htmlspecialchars(strip_tags(html_entity_decode(substr($text,0,550)))));
  67.        $zapytanie = "INSERT INTO notatki (`id`, `user_id`, `tresc`) VALUES ('', '$user_id', '$text')";
  68.        $dodaj_komentarz = mysql_query($zapytanie);
  69.    }
  70. }
  71. else
  72. print 'Wpis jest za długi';
  73. ?>



osobiście widzę w tym jeden plus, bo po pierwszej próbie włamania dany użytkownik/bot jest banowany, komunikat o tym jest wysyłany do mnie, a w razie gdyby zaszła pomyłka mogę zdjąć bana z danego użytkownika. Cała strona którą teraz piszę jest dostępna dopiero po zalogowaniu więc goście nie będą mogli nic nabroić(teoretycznie).

geniuszem nie jestem jeśli chodzi o php, dopiero zaczynam w tym zabawę, ale pytanie:
czy ten kod jest dość bezpieczny? ciężko będzie to obejść?
Pozdrawiam Fantome:)
Go to the top of the page
+Quote Post
erix
post 15.06.2009, 10:02:52
Post #245





Grupa: Moderatorzy
Postów: 15 467
Pomógł: 1451
Dołączył: 25.04.2005
Skąd: Szczebrzeszyn/Rzeszów




Cytat
ostatnich kilka dni przesiedziałem na szukaniu dobrego i skutecznego sposobu zabezpieczenia się przed SQL injection, jednak nic na prawdę konkretnego nie znalazłem;/

A chociaż przeczytałeś cały ten wątek...? tiredsmiley.gif


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

ZCE :: Pisząc PW załączaj LINK DO TEMATU i TYLKO w sprawach moderacji :: jakiś błąd - a TREŚĆ BŁĘDU? :: nie ponaglaj z odpowiedzią via PW!
Go to the top of the page
+Quote Post
Fantome
post 15.06.2009, 11:01:05
Post #246





Grupa: Zarejestrowani
Postów: 8
Pomógł: 0
Dołączył: 27.12.2006

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


żeby tylko ten... ze 2 dni temu to czytałem i postanowiłem szukać dalej... jest sporo pomysłów i rozwiązań w tym temacie, ale nikt nie potwierdził, że któreś z podanych zabezpiecza stronę w 100%... sad.gif
Go to the top of the page
+Quote Post
erix
post 15.06.2009, 11:11:28
Post #247





Grupa: Moderatorzy
Postów: 15 467
Pomógł: 1451
Dołączył: 25.04.2005
Skąd: Szczebrzeszyn/Rzeszów




A wiesz o tym, że na nic nie ma 100% zabezpieczenia?


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

ZCE :: Pisząc PW załączaj LINK DO TEMATU i TYLKO w sprawach moderacji :: jakiś błąd - a TREŚĆ BŁĘDU? :: nie ponaglaj z odpowiedzią via PW!
Go to the top of the page
+Quote Post
Fantome
post 15.06.2009, 11:20:18
Post #248





Grupa: Zarejestrowani
Postów: 8
Pomógł: 0
Dołączył: 27.12.2006

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


zdaję sobie z tego sprawę smile.gif jednak staram się wyeliminować jak najwięcej dziur w tym co piszę smile.gif
pozdrawiam Fantome smile.gif
Go to the top of the page
+Quote Post
erix
post 15.06.2009, 11:28:11
Post #249





Grupa: Moderatorzy
Postów: 15 467
Pomógł: 1451
Dołączył: 25.04.2005
Skąd: Szczebrzeszyn/Rzeszów




Jeśli wprowadzisz to, o czym mowa w tym wątku, nie powinno być problemu.

Zresztą, od tego są beta-testy, aby wyeliminować błędy. [;


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

ZCE :: Pisząc PW załączaj LINK DO TEMATU i TYLKO w sprawach moderacji :: jakiś błąd - a TREŚĆ BŁĘDU? :: nie ponaglaj z odpowiedzią via PW!
Go to the top of the page
+Quote Post
nieraczek
post 20.06.2009, 09:05:08
Post #250





Grupa: Zarejestrowani
Postów: 405
Pomógł: 6
Dołączył: 12.01.2007

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


Fantome nie banuj po IP - w ten sposób podczas szukania czegoś w google odkryłem już dwa fora internetowe, na których jestem zbanowany po IP a w życiu się tam nie rejestrowałem :/
Go to the top of the page
+Quote Post
erix
post 20.06.2009, 11:17:48
Post #251





Grupa: Moderatorzy
Postów: 15 467
Pomógł: 1451
Dołączył: 25.04.2005
Skąd: Szczebrzeszyn/Rzeszów




To raczej nie wina forum, a tego, że IP trafiło prawdopodobnie do kogoś, kto ma PC-zombie.

A z tego, co pamiętam, to TP wykupiła kiedyś pulę IP dla neozdrady, która była wcześniej intensywnie wykorzystywana do włamów. [;


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

ZCE :: Pisząc PW załączaj LINK DO TEMATU i TYLKO w sprawach moderacji :: jakiś błąd - a TREŚĆ BŁĘDU? :: nie ponaglaj z odpowiedzią via PW!
Go to the top of the page
+Quote Post
Spawnm
post 27.06.2009, 20:22:27
Post #252





Grupa: Moderatorzy
Postów: 4 069
Pomógł: 497
Dołączył: 11.05.2007
Skąd: Warszawa




Tak się zastanawiam...
jeśli strona ma geta np id=1, jeśli dopiszemy mu 1' sql /* to nie zareaguje,
ale jeśli mu dam id=aaa to wypluje warning ... czy taka strona jest podatna na sql injection ?
Pytam bo widzę taką stronkę i zastanawiam się czy zawracać gitarę adminowi , dodatkowo ciekawość smile.gif
Go to the top of the page
+Quote Post
#luq
post 27.06.2009, 21:39:56
Post #253





Grupa: Zarejestrowani
Postów: 589
Pomógł: 91
Dołączył: 22.05.2008
Skąd: Gliwice

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


Cytat(Spawnm @ 27.06.2009, 21:22:27 ) *
ale jeśli mu dam id=aaa to wypluje warning ... czy taka strona jest podatna na sql injection ?

Tak. Jeśli dla stringa wypluwa warninga to wielce prawdopodobne jest, że zapytanie jest zbudowane tak:
  1. SELECT a FROM b WHERE id = $zmienna

Integery nie muszą być w cudzysłowiach, natomiast stringi tak. A np. zapytanie
  1. SELECT a FROM b WHERE id = 1' sql /*

nie wywołuję błędu bo po stronie php są wykrywane pewne niebezpieczne ciągi np. sekwencja "/*" i zmienna jest ignorowana etc.

Jednoznacznie nie da się określić czy taka strona jest podatna na jakiś atak z grupy SQLI. Ja sprawdziłbym ataki typu DoS z grupy SQLI. Sprawdzałbym inne wejścia bo raczej podane przez Ciebie jest popularne.

Taka wskazówka, każdy atak SQLI zaczyna się od wydedukowania zapytania.


--------------------
Moja gra - scraby.io
Go to the top of the page
+Quote Post
-lukasamd-
post 28.06.2009, 13:59:21
Post #254





Goście







Mam pewne pytanie, odnośnie wypowiedzi erixa dotyczącej mysql_escape_string:

Cytat
Ta funkcja może Ci rozwalić znaki przy korzystaniu z wielobajtowych kodowań


Kiedy może się coś takiego stać? Powiedzmy że przez $_POST idzie ciąg, po którym szukam czegoś w bazie w polu typu varchar.
Ciąg z założenia powinien być obrobiony tzn. bez znaków diaktrycznych itp. więc nie muszę się martwić o problemy z nimi.

Chodzi o to, że mysql_real_escape_string działa znacznie wolniej niż wersja bez sprawdzania charsetu.
Go to the top of the page
+Quote Post
erix
post 28.06.2009, 21:26:21
Post #255





Grupa: Moderatorzy
Postów: 15 467
Pomógł: 1451
Dołączył: 25.04.2005
Skąd: Szczebrzeszyn/Rzeszów




Np. przy korzystaniu z UTF-8.

Wszystko jest przecież napisane:
Cytat
does not take a connection argument and does not respect the current charset setting.


A tak poza tym, dla mysql_escape_string" title="Zobacz w manualu PHP" target="_manual:
Cytat
This function is deprecated.


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

ZCE :: Pisząc PW załączaj LINK DO TEMATU i TYLKO w sprawach moderacji :: jakiś błąd - a TREŚĆ BŁĘDU? :: nie ponaglaj z odpowiedzią via PW!
Go to the top of the page
+Quote Post
$olo
post 14.07.2009, 16:05:12
Post #256





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

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


Cytat(erix @ 15.06.2009, 11:11:28 ) *
A wiesz o tym, że na nic nie ma 100% zabezpieczenia?

Hej,

Już raz wspominałem o zastosowaniu zmiennych związanych, ale jakoś widzę wątek dalej rozwija się
w stronę doktoryzacji nad zupełnie prostym problemem. W telegraficznym skrócie:
Zmienne związane mają 2 główne zastosowania:
1) optymalizacja działania aplikacji poprzez jednokrotną interpretację zapytania, a w każdym
następnym jego uruchomieniu tylko podmienianie samych danych. MySQL optymalizuje sobie
niestety takie zapytanie tylko w obrębie sesji. Inne bazy takie jak ORACLE przechowują plan wykonania
zapytania.
2) Oddzielenie treści zapytania od parametrów załatwia przy okazji właśnie problem MySQL Injection.
W zasadzie w 100% ponieważ dane nie wpływają na treść zapytania, która już wcześniej została sparsowana.

Przykład SQLa:

  1. SELECT * FROM tabela WHERE pole = :parametr


takie zapytanie parsuje sobie baza, a dopiero potem przekazujemy (bindujemy) wartość
zmiennej "parametr".

Jeszcze raz link do manuala PHP:
PDO::prepare
oraz jak kto woli:
mysqli_prepare

Oczywiście warunkiem jest PHP5 oraz MySQL 4.1, ale to chyba już w tej chwili standard.
Go to the top of the page
+Quote Post
xajart
post 25.11.2009, 13:07:53
Post #257





Grupa: Zarejestrowani
Postów: 141
Pomógł: 1
Dołączył: 2.12.2008

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


Z tego co zauważyłem to ile osób tyle rozwiązań przed tego typu atakami. A jeżeli ktoś opracuje jakiś uniwersalny kod - to posypie się sporo wypowiedzi negatywnych. Wiec z tego nasuwa się jeden wniosek, jakie zabezpieczenie by nie było i tak nie jest dobre.

Z tego co czytałem ten wątek i jemu podobne w sieci. To nasuneły mi sę takie spostrzeżenia:
Przed atakami XSS najlepiej się bronić stosując htmlspecialchars lub htmlentities - dla danych wyświetlanych (np z BD).


Natomiast przed SQL Injecton, to albo zapoznać się z jakimś interfejsem np PDO i konstruować zapytania w stylu prepare, execute. 
Ale jeżeli ktoś chce zostać przy standardowym konstruowaniu zapytań do BD (np nie chce mu się przebudowywać istniejącego serwisu pod PDO), to czy nie wystarczy dane (zewnętrzne) czy to z POST czy GET poddawać najpierw np htmlentities potem zastosować sprawdzanie wyrażeniami regularnymi (lub stosować funkcje ctype, is_numeric itp.), a na końcu w zapytaniu do BD zastosować mysql_real_escape_string

Jest wiele opini na temat czy to htmlentities, addslashes, strip_tags. Ale które nalepsze? 

strip_tags - wycina(eliminuje) znaczniki HTML,
- nie warty zachodu, jeżeli dane które mają być przetworzone, zapisane w BD a potem wyświetlane w serwisie (stracą formatowanie). 
- jednak są sytuacje w których może się przydać.


addslashes - Dodaje znak ucieczki przed znakami niebezpiecznymi jak: apostrof, cudzysłów, backslash i NUL

htmlentities - konwertuje wszystkie znaki HTML na encje, gdzie htmlspecialchars tylko znaki specjalne. 

Wiec jeżęli ciag zostanie przeformatowany przez htmlentities - to spokonie można sprawdzić np wyrażeniami regularnymi czy zawiera to co powinnien i odpowiednią długość znaków, a następnie przekazać do bazy danych. Ale czy warto wtedy stosować mysql_real_escape_string? - moim zdaniem warto na wypadek gdy wyrażenia regularne nie będą zbyt ścliśle określone i przepuszczą coś w stylu  UNION, SELECT ... Wówczas jeżeli dobrze rozumie powyższa komenda to wyeliminuje.

Ale nie jestem specem w tej dziedzinie i miło mi będzie jeżeli ktoś to sprostuje.


Go to the top of the page
+Quote Post
ucho
post 25.11.2009, 13:42:16
Post #258





Grupa: Zarejestrowani
Postów: 300
Pomógł: 32
Dołączył: 31.07.2006

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


Wszystkie pytania o SQL Injection powinny się kończyć jednym zdaniem: "Używaj prepared statements, lub jeśli uważasz, że nigdy nie zapomnisz tego zrobić, dodawaj znaki ucieczki odpowiednie dla twojej bazy". Koniec, kropka. Podobnie XSS - "usuwasz cały html albo escape podczas wyświetlania".
Tymczasem w tym wątku co chwila pojawiają się jakieś dziwne pomysły, które co najwyżej wprowadzają zamieszanie i w sumie nie wiem czemu ten wątek ma służyć. Może lepiej przyciąć to do jednego postu z informacją co i jak i tylko go zostawić przypiętym?
Go to the top of the page
+Quote Post
Mephistofeles
post 30.12.2009, 21:58:11
Post #259





Grupa: Zarejestrowani
Postów: 1 182
Pomógł: 115
Dołączył: 4.03.2009
Skąd: Myszków

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


Zgadzam się. Jak czytam niektóre z tych wymysłów to aż głowa boli. Potem się przyszła ekipa źle nauczy.
Go to the top of the page
+Quote Post
bełdzio
post 30.12.2009, 22:32:03
Post #260





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

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


Cytat(ucho @ 25.11.2009, 11:42:16 ) *
Wszystkie pytania o SQL Injection powinny się kończyć jednym zdaniem: "Używaj prepared statements"


ja bym dodał świadomie smile.gif bo korzystając z PS też można dać ciała smile.gif


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

22 Stron V  « < 11 12 13 14 15 > » 
Reply to this topicStart new topic
14 Użytkowników czyta ten temat (14 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 25.04.2024 - 17:29