Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: SQL Injection/Insertion
Forum PHP.pl > Forum > PHP
Stron: 1, 2, 3, 4, 5, 6, 7, 8, 9
Soulast
a ja się już nie co zagubiłem w tym wszystkim lecz czy przy przykładzie:

  1. $sql=mysql_query("SELECT * FROM costam WHERE cos=$wartosc[id] ORDER BY id DESC");


jest dobrze zabezpieczyć id poprzez dodanie przed wartością (int)
  1. $sql=mysql_query("SELECT * FROM costam WHERE cos=(int)$wartosc[id] ORDER BY id DESC");


Czy takie coś przed czymś zabezpiecza?zrozumiałem że dzięki (int) żadne ekstra znaki czy litery nie będą brane pod uwagę
Agape
Powiedzcie mi, jak powinienem filtrować całą tablicę która wygląda tak:

  1. (
  2. [55] => Array
  3. (
  4. [uid] => 55
  5. [nazwa] => CCBC 1325-LP
  6. [opis] => Kamera Kolorowa, przetwornik CCD 1/3" Sony SuperHAD czu?o?? 0.6Lux rozdzielczo?? 480 linii Funkcja AES AGC BLC Uzas:12VDC/24VAC/2.8W wymiar 122x72x63mm
  7.  
  8. [ilosc] => 1
  9. [cena] => 111
  10. )
  11.  
  12. [53] => Array
  13. (
  14. [uid] => 53
  15. [nazwa] => CCBC 1325-LP
  16. [opis] => Kamera Kolorowa, przetwornik CCD 1/3" Sony SuperHAD czu?o?? 0.6Lux rozdzielczo?? 480 linii Funkcja AES AGC BLC Uzas:12VDC/24VAC/2.8W wymiar 122x72x63mm
  17.  
  18. [ilosc] => 1
  19. [cena] => 99
  20. )
  21.  
  22. )


Da się jakoś całą zfiltrować np, przy
  1. foreach($_SESSION['koszyk'] as $produkt){

czy muszę po kolei każde pole które wywojuje np. tak:
  1. $_SESSION['koszyk'] [$id] ['ilosc']


Podajcie jakiś przykład najlepiej. Mam funkcje filtruj ale nie wiem jak ją użyć do powyższego ...
erix
O mamo, a przeczytałeś chociaż pierwszą stronę tego wątku, czy czekasz, aż ktoś Ci podrzuci gotowca?
Agape
Cytat(Agape @ 22.06.2010, 10:42:42 ) *
Mam funkcje filtruj ale nie wiem jak ją użyć do powyższego ...



jak to szybko zrobic na tablicy wielowymiarowej nie powtarzajac za kazdym razem
  1. filtruj($_SESSION['koszyk'] [$id] ['ilosc'])
  2. filtruj($_SESSION['koszyk'] [$id] ['cena'])
  3. filtruj($_SESSION['koszyk'] [$id] ['opis'])
erix
array_map
dsfds2432432dsf
Zasada jest prosta - Don't trust user input

A tak na poważnie to:

- używaj abstrakcji PDO lub ORM-a
- procedury składowane
- pomyśl 2x pisząc RAW SQLa

Proste zasady, których trzeba przestrzegać.
Hoku
tak się zastanawiam czy przepuszczenie przez preg_replace z regułą [^a-zA-Z_] i usunięcie całej reszty + mysql_real_escape_string i dla liczb stosowanie (int) jest wystarczająco bezpieczne?
Crozin
A po co Ci to wyrażenie?
bełdzio
Cytat(Hoku @ 6.07.2010, 23:58:52 ) *
tak się zastanawiam czy przepuszczenie przez preg_replace z regułą [^a-zA-Z_] i usunięcie całej reszty + mysql_real_escape_string i dla liczb stosowanie (int) jest wystarczająco bezpieczne?

nie, po 1. samym a-z da się namieszać 2. filtracje / walidacje stosuje się odpowiednio do filtrowanych / walidowanych danych
Hoku
Wyrażenie samo w sobie ma oczyszczać np. dodawaną lub pobieraną kategorię zostawiając jedynie a-Z i znak"_" usuwając spacje, pokemoniaste znaczki i cyfry nie chce mieć czegoś takiego.

bełdzio jak można namieszać, skoro spacja,znaki spec. nie przechodzą?a zmienna tak czy siak przechodzi przez mysql_real_escape_string() chyba, że się mylę i coś zostaje, tylko co wtedy może zostać złego?. Zawsze wolę znać uzasadnienie.
bełdzio
wszystko zależy od tego, gdzie następnie wyświetlasz te dane, jeśli wyświetlisz jako "zwykły" text na stronie będzie zapewne ok, jak wrzucisz jako zawartość skryptu JS to już niekoniecznie smile.gif
SHiP
Ja wspomne, że mysql_real_escape_string oraz addslashes są dziurawe jeżeli mamy doczynienia z chińskim(i kilkoma innymi) kodowaniem. Należy stosować mysqli->real_escape_string()
H4eX
A co powiecie na takie zabezpieczenie przed SQL Injection?

  1. $cracktrack = $_SERVER['QUERY_STRING'];
  2. $wormprotector = array('chr(', 'chr=', 'chr%20', '%20chr', 'wget%20', '%20wget', 'wget(',
  3. 'cmd=', '%20cmd', 'cmd%20', 'rush=', '%20rush', 'rush%20',
  4. 'union%20', '%20union', 'union(', 'union=', 'echr(', '%20echr', 'echr%20', 'echr=',
  5. 'esystem(', 'esystem%20', 'cp%20', '%20cp', 'cp(', 'mdir%20', '%20mdir', 'mdir(',
  6. 'mcd%20', 'mrd%20', 'rm%20', '%20mcd', '%20mrd', '%20rm',
  7. 'mcd(', 'mrd(', 'rm(', 'mcd=', 'mrd=', 'mv%20', 'rmdir%20', 'mv(', 'rmdir(',
  8. 'chmod(', 'chmod%20', '%20chmod', 'chmod(', 'chmod=', 'chown%20', 'chgrp%20', 'chown(', 'chgrp(',
  9. 'locate%20', 'grep%20', 'locate(', 'grep(', 'diff%20', 'kill%20', 'kill(', 'killall',
  10. 'passwd%20', '%20passwd', 'passwd(', 'telnet%20', 'vi(', 'vi%20',
  11. 'insert%20into', 'select%20', 'nigga(', '%20nigga', 'nigga%20', 'fopen', 'fwrite', '%20like', 'like%20',
  12. '$_request', '$_get', '$request', '$get', '.system', 'HTTP_PHP', '&aim', '%20getenv', 'getenv%20',
  13. 'new_password', '&icq','/etc/password','/etc/shadow', '/etc/groups', '/etc/gshadow',
  14. 'HTTP_USER_AGENT', 'HTTP_HOST', '/bin/ps', 'wget%20', 'uname\x20-a', '/usr/bin/id',
  15. '/bin/echo', '/bin/kill', '/bin/', '/chgrp', '/chown', '/usr/bin', 'g\+\+', 'bin/python',
  16. 'bin/tclsh', 'bin/nasm', 'perl%20', 'traceroute%20', 'ping%20', '/usr/X11R6/bin/xterm', 'lsof%20',
  17. '/bin/mail', '.conf', 'motd%20', 'HTTP/1.', '.inc.php', 'config.php', 'cgi-', '.eml',
  18. 'file\://', 'window.open', '<script>', 'javascript\://','img src', 'img%20src','.jsp','ftp.exe',
  19. 'xp_enumdsn', 'xp_availablemedia', 'xp_filelist', 'xp_cmdshell', 'nc.exe', '.htpasswd',
  20. 'servlet', '/etc/passwd', 'wwwacl', '~root', '~ftp', '.js', '.jsp', 'admin_', '.history',
  21. 'bash_history', '.bash_history', '~nobody', 'server-info', 'server-status', 'reboot%20', 'halt%20',
  22. 'powerdown%20', '/home/ftp', '/home/www', 'secure_site, ok', 'chunked', 'org.apache', '/servlet/con',
  23. '<script', '/robot.txt' ,'/perl' ,'mod_gzip_status', 'db_mysql.inc', '.inc', 'select%20from',
  24. 'select from', 'drop%20', '.system', 'getenv', 'http_', '_php', 'php_', 'phpinfo()', '<?php', '?>', 'sql=');
  25.  
  26. $checkworm = str_replace($wormprotector, '*', $cracktrack);
  27.  
  28. if ($cracktrack != $checkworm)
  29. {
  30. echo "GDZIE?!";
  31. }
Spawnm
A co jak ja cię poproszę/zlecę napisanie mi bloga na którym chcę pisać o programowaniu ? Leżysz smile.gif
pyro
Poza tym to zabezpieczenie totalnie nic nie daje, to co podaje jako parametr mogę zakodować szesnastkowo
H4eX
Czy oprócz kodowania szesnastkowego, da się jeszcze jakimś innym zakodować parametr?
Spawnm
Cytat(SHiP @ 7.07.2010, 14:20:48 ) *
Ja wspomne, że mysql_real_escape_string oraz addslashes są dziurawe jeżeli mamy doczynienia z chińskim(i kilkoma innymi) kodowaniem. Należy stosować mysqli->real_escape_string()

Czy czasem iconv nie rozwiązuje tego typu problemów ?
  1. $str=@iconv("utf-8", "utf-8//IGNORE", $str)


Cytat
Należy stosować mysqli->real_escape_string()

A jak z PDO? Też powinno sobie radzić .
erix
Weźcie mi wyjaśnijcie jedno - jest już kilka skutecznych metod, ludzie dopisują cały czas jakieś swoje-nowe, które się wydają im działać, a tak naprawdę są strzałami w stopy.

Po co?
Spawnm
Erix - bo w sieci na stronach o sql injection zamiast podawać info o funkcjach filtrujących dają gadki typu
'najlepiej stworzyć funkcję która będzie filtrować treść z niebezpiecznych znaków' , swego czasu gdy sam dopiero podchodziłem do tej tematyki spotykałem chyba tylko takie wymysły... dopiero w jakiejś książce znalazłem sensowne wyjaśnienie i funkcję ;p
SHiP
@Spawnm: musiałbym to iconv przetestować ale moim zdaniem nie ma sensu sobie komplikować życia. PDO również jest bezpieczne więc wystarczy wybrac mysqli lub pdo. Dziurawy jest jedynie stary strukturalny moduł obsługi mysql ale to i tak tylko przy kilku azjatyckich kodowaniach.

Wszelkie te zabezpieczenia operujące na słownikach są kretyńskie zawsze można większość z nich ominąć za pomocą komentarzy. Nawet jeśli filtrujesz np. UNION mogę napisać U/**/N/**/I/**/O/**/N albo w hex albo wykorzystując funkcję char()
erix
Huh, z tego co pamiętam, to dało się też niektóre znaki zapisać korzystając z "wysokich kodów Unicode", a to już jest ciężko odfiltrować. winksmiley.jpg
pyro
Cytat(SHiP @ 16.07.2010, 23:29:04 ) *
Wszelkie te zabezpieczenia operujące na słownikach są kretyńskie zawsze można większość z nich ominąć za pomocą komentarzy. Nawet jeśli filtrujesz np. UNION mogę napisać U/**/N/**/I/**/O/**/N albo w hex albo wykorzystując funkcję char()



@SHiP, zdaje się, że masz pisać książkę o bezpieczeństwie www, więc powiedz mi... gdzie te Twoje "U/**/N/**/I/**/O/**/N" zadziała?
SHiP
@pyro: ok trochę się zapędziłem. Sprawdziłem i w nowszych wersjach MySQL to nie działa.

W oracle można użyć czegoś takiego jak execute immediate i tam umieścić zapytanie zapisane w taki sposób jak podałem wyżej i ono zadziała.
W MS SQL można użyć exec()

A jako że piszemy o mysql(chyba?) to za pomocą /**/ można w nim ładnie pousuwać białe znaki np. takie zapytanie nie ma ani jednej spacji a działa:
  1. SELECT/**/*/**/FROM/**/news;


EDIT:
albo coś jeszcze bardziej fajnego

  1. /*!SELECT*//*!**//*!FROM*//*!news*/


To działa(sic!)
H4eX
Cytat(SHiP @ 16.07.2010, 23:29:04 ) *
Wszelkie te zabezpieczenia operujące na słownikach są kretyńskie zawsze można większość z nich ominąć za pomocą komentarzy. Nawet jeśli filtrujesz np. UNION mogę napisać U/**/N/**/I/**/O/**/N albo w hex albo wykorzystując funkcję char()

Jak niby wykorzystać funkcję char() ?
*, char można usuwać, a przed hex da się też zabezpieczyć.
Przyznaję, pomysł trochę nie za dobry ale można zrobić z tego log winksmiley.jpg
SHiP
  1. SELECT char(80,72,80);


==

  1. SELECT PHP

darko
Cytat(SHiP @ 17.07.2010, 00:11:18 ) *
EDIT:
albo coś jeszcze bardziej fajnego

  1. /*!SELECT*//*!**//*!FROM*//*!news*/


To działa(sic!)

To zapytanie akurat nie działa winksmiley.jpg cool.gif
SHiP
@darko: jaką masz wersję mysql? I czy masz w wybranej bazie tabelę news ;]

U siebie mam mysql Ver 14.14 Distrib 5.1.36, for suse-linux-gnu (x86_64) using readline 6.0 i dziala...
darko
5.0.51a-24+lenny2+spu1 (Linux debian 2.6.30-bpo.1-686 #1 SMP Mon Aug 17 14:57:26 UTC 2009 i686 GNU/Linux) i nie hula. Oczywiście podałem nazwę istniejącej tabeli w bazie smile.gif I zwraca całe nic (nie ma błędów po prostu nie zwraca żądnego wyniku, a dane w tabeli są na 100%).
SHiP
Hmm no to dziwne. Wygląda na to, że starsza werjsa inaczej to interpretuje lub masz pustą tabelę. A coś takiego
Cytat
mysql> /*!SELECT*//*!'PHP'*/;
+-----+
| PHP |
+-----+
| PHP |
+-----+
1 row in set (0.00 sec)


questionmark.gif
darko
Wydzielcie ten nasz OT, jak możecie
/*!SELECT*//*!'advisors'*/;
to samo w mysql-query-browser v. 1.2.12:
Query executed in 0:00.0250. Query finished

To samo w phpmyadmin (phpMyAdmin - 2.11.8.1deb5+lenny3):
/*!SELECT*//*!'advisors'*/
Pokaż rekordy 0 - 0 (1 wszystkich, Wykonanie zapytania trwało 0.0003 sekund(y))

Dane są w tabeli advisors na milion %
set4812
Temat ma duzo strony czy ktoś mógłby wymienic wszystkie funkcje które chronia przed sql Injection
Noidea
W sumie to faktycznie lekki śmietnik tu się zrobił.

Ogólnie to nie ma czegoś takiego jak "funkcja chroniąca przed SQL Injection". Temat jest bardziej złożony.
Najprościej jest przerzucić się w końcu na PDO i używać prepared statements


- Inne funkcje "chroniące przed SQL Injection" to mysql_real_escape_string, pg_escape_string, itp.

Stosuje się je do danych tekstowych i tylko dla odpowiedniego systemu bazodanowego.
Jeśli użyjemy funkcji wstawiającej ukośniki przed apostrofami ('O\'Reilly'), a w naszym systemie DB znakiem ucieczki jest drugi apostrof ('O''Reilly'), to nie dość że nie zabezpieczyliśmy się przed niczym, to jeszcze wstawiamy śmieci do bazy danych.

- W przypadku danych liczbowych używamy intval, floatval

- W przypadku nazw kolumn (np. do sortowania), to stosujemy:
  1. <?php
  2.  
  3. $columns = array( 'date', 'points', 'level' );
  4.  
  5. // identyfikatory tekstowe lub liczbowe
  6. if( $_GET['orderType'] < 0 || $_GET['orderType'] >= count( $columns ) )
  7. {
  8. // ktoś próbuje mieszać, throw new Exception
  9. }
  10.  
  11. $orderColumn = $columns[$_GET['orderType']];
  12. $query = "SELECT (...) ORDER BY $orderColumn";
  13. // zapytanie
  14.  
  15.  
  16. // lub nazwy kolumn
  17. if( !in_array( $_GET['orderType'], $columns ) )
  18. {
  19. // ktoś próbuje mieszać, throw new Exception
  20. }
  21.  
  22. $query = "SELECT (...) ORDER BY $_GET[orderType]";
  23. // zapytanie
  24.  
  25. ?>



- W przypadku MySQL zamiast popularnego addslashes poleca się używanie mysql_real_escape_string


- stripslashes jest praktycznie niepotrzebny. Przydaje się tylko, żeby oczyścić dane wejściowe ze śmieci jeśli mamy włączone magic_quotes_gpc
lukasamd
Cytat(Noidea @ 29.09.2010, 12:38:25 ) *
- W przypadku danych liczbowych używamy intval, floatval



Rzutowanie będzie szybszym rozwiązaniem.
gargamel
A co sądzicie o metodzie (na SELECT, UPDATE itp)


  1. SELECT * FROM TABLE WHERE md5(column_name)='".md5($condition)."';


questionmark.gif
Mephistofeles
Po co? Może wystąpić kolizja, choć to mało prawdopodobne, a poza tym po co dodatkowo obciążać PHP i bazę liczeniem hasha? Wystarczą prepared statements i SQL Injection masz z głowy.
michal123
Czy zastosowanie wyrazen regularnych z funkcja preg_match() do danych pochodzacych z formularza uchroni mnie od SQL Injection? Czy jest to niewystarczające zabezpieczenie?
pyro
Cytat(michal123 @ 4.12.2010, 19:18:04 ) *
Czy zastosowanie wyrazen regularnych z funkcja preg_match() do danych pochodzacych z formularza uchroni mnie od SQL Injection? Czy jest to niewystarczające zabezpieczenie?


Nie. A teraz przeczytaj temat.
Rid
Ja na każdym inpucie wprowadziłem preg_match jako głowną formę zabezpieczenia,żeby mi ktoś śmieci nie wpisywał dodatkowo użyłem funkcje, która dodatkowo filtruje, każdą wprowadzoną zmienną poprzez metody stripslashes,htmlentities,strip_tags i pomocniczo trim.Jednakże ,mam wątpliwość co do metody "htmlentities". Użyłem jej w taki sposób
  1. $data= htmlentities ($data,ENT_QUOTES, 'UTF-8');
.Wiem ,że funkcja ma konwertować znaki specjalne do kodowani encji.Polskie znaki w tej metodzie ,są także postrzegane jako znaki specjalne,dlatego w metodzie użyłem zamiany encji na UTF-8 ,ale czy to ma sens???Czy np."\" nie zostanie z powrotem sprowadzony do postaci "\" zamiast do "amp&" która jest encjąquestionmark.gif?
propage
A moje pytanie jest takie:

Czy jest gdzieś zestaw znaktów specialnych, bardzo często używanych w atach przez typu:
../
'--'
'<script>'
'onclick'
'char(
itd...

Myślę, że można zrobić funkcje, która przy każdym odświeżeniu strony będzie sprawdzać $_POST, $_GET, $_SERVER. w momencie, gdy któraś z tablic będzie zawierać słowo, z powyższej listy to damy bana na IP dla klienta. Wiadomo taki ban przed niczym nie zabezpieczy, ale skomplikuje trochę prace hakerowi i wytnie wszystkie boty, które nie zmieniają IP(ów).
Chciałbym tylko dostać jeśli ktoś posiada listę zwrotów, która nada się do zbudowania takiej funkcji, a o pomyśle co sądzicie?
Crozin
@propage: A teraz wyobraź sobie, że tutaj na forum jest coś takiego. Piszesz sobie ładnie posta, dajesz wyślij i jesteś zbanowany. wtf?
propage
to wyjątkowa sytuacja, nie mam zamiaru robić forum dla programistów.

---------

Mam dodakotwe pytanie.
Jesli w skrypcie inkluduje sobie plik na z nazwy GETA.
Aby zabezpieczyć się przed tym, żeby ktos nie piwsał nap ?p=../../config.php

robię taki warunek "if(eregi ('\.', $_GET['p'])) die();

czy są jakieś metody, które obejdą mój warunek?
pyro
Cytat(propage @ 30.01.2011, 14:54:43 ) *
to wyjątkowa sytuacja, nie mam zamiaru robić forum dla programistów.

---------

Mam dodakotwe pytanie.
Jesli w skrypcie inkluduje sobie plik na z nazwy GETA.
Aby zabezpieczyć się przed tym, żeby ktos nie piwsał nap ?p=../../config.php

robię taki warunek "if(eregi ('\.', $_GET['p'])) die();

czy są jakieś metody, które obejdą mój warunek?


yyy tak. I to co najmniej kilka metod.
Crozin
Cytat
to wyjątkowa sytuacja, nie mam zamiaru robić forum dla programistów.
To nie ma znaczenia.

W ogóle zabierasz się za to od złej strony. Próbujesz nie dopuścić do wprowadzenia "dziwnych" danych (co jest bardzo trudne) zamiast upewnić się, że dane zostaną odpowiednio obsłużone (co jest bardzo proste).
Dane trafiają do XML-a czy formatu pochodnego jak HTML? htmlentities czy któraś z podobnych funkcji - problem z głowy.
Dane trafiają do URL-a? (raw)urlencode - problem z głowy.
Dane trafiają do JSON-a? json_encode - problem z głowy.
itd.

Cytat
Mam dodakotwe pytanie.
Jesli w skrypcie inkluduje sobie plik na z nazwy GETA.
Aby zabezpieczyć się przed tym, żeby ktos nie piwsał nap ?p=../../config.php

robię taki warunek "if(eregi ('\.', $_GET['p'])) die();

czy są jakieś metody, które obejdą mój warunek?
1. Nie używaj ereg.
2. Po prostu określ jakie wartości może przyjąć. Ile masz tych plików? 5, 10, 15?
propage
Cytat(Crozin @ 30.01.2011, 21:56:07 ) *
To nie ma znaczenia.

W ogóle zabierasz się za to od złej strony. Próbujesz nie dopuścić do wprowadzenia "dziwnych" danych (co jest bardzo trudne) zamiast upewnić się, że dane zostaną odpowiednio obsłużone (co jest bardzo proste).
Dane trafiają do XML-a czy formatu pochodnego jak HTML? htmlentities czy któraś z podobnych funkcji - problem z głowy.
Dane trafiają do URL-a? (raw)urlencode - problem z głowy.
Dane trafiają do JSON-a? json_encode - problem z głowy.
itd.

1. Nie używaj ereg.
2. Po prostu określ jakie wartości może przyjąć. Ile masz tych plików? 5, 10, 15?


Mam wiele plików, to musi być bardziej elastyczne. Nie chce wypisywać w skrypcie nazw wszystkich możliwych plików.
Skoro są takie metody to chciałbym je poznać, aby się zabezpieczyć przed nimi.
pyro
W tym przypadku wystarczy (zakładając, że wszystkie pliki do includowania posiadasz w jednym, oddzielnym katalogu [np. `includes/`]):

  1. $inc = basename($_GET['inc']);
  2. if(!include_once('includes/'.$inc))
  3. {
  4. echo 'Podales nieistniejacy plik';
  5. }
propage
pyro, przed czym ma zabezpieczyć ten kod?


jesli inc bedzie mieć zawierać "../../index.php"

to

if(!include_once('includes/'.$inc))

da nam to

if(!include_once('includes/../../index.php'))

plik taki istnieje.

nospor
@propage aleś ty cwany... wyciąłeś kawałek z kodu pyro i masz do niego jakieś żale :/

Z kodu pyro wywaliłeś:
$inc = basename($_GET['inc']);
a ten właśnie kawałek kodu stanowił podstawę zabezpieczenia
propage
nie zauważyłem tej funkcji, to jest wystarczające zabezpieczanie?
nospor
Cytat
nie zauważyłem tej funkcji,
Kod miał 4 linijki :/
japolak
chciałbym sie dowiedzieć jakie jest/są w "miarę" skuteczne zabezpieczenie/a przed tym atakiem

szukalem na tym forum... i co któryś post przekierowujecie do tego.. .

poczytałem kilka stron tego tematu.. i jednym słowem tu jest wielka sieczka:

kazdy sie "przekrzykuje" tak jak tirowcy stojący w korku przekrzykują osobówki mijające ich bokiem..


skoro temat jest tematem tak ważnym może "moderacja" by podsumowała go i napisała w pierwszym poście na co tak naprawdę trzeba zwrócić uwagę..
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.