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
NoiseMc
Cytat
$strIn = '-2';

Jezeli ktos poda liczbe ujemna jako id rekordu, ktory ma zostac pobrany, a nie ma rekordu o takim id to nie dostanie z bazy nic ale o zadnym wlamaniu w ten sposob nie ma mowy.
Ja osobiscie stosuje rzutowanie (int) przy liczbach, a przy stringach robie sobie parametryzowane zapytanie PDO i bindParam i to starczy w zupelnosci.
Sedziwoj
@NoiseMc
Wiesz ale nie musi być to ID rekordu i nie zawsze musi działać jak myślisz, najlepiej jest zabezpieczyć tak, aby dostawał tylko to co oczekujesz.
Bo na tym to wszystko polega, że masz dostać tylko to co powinieneś, wtedy nie martwisz się o jakieś inne dziwne przypadki.
NoiseMc
Ale po co kombinowac ...
  1. <?php
  2. // url/?action=show&id=1
  3. $id = (int)$_GET['id']; // $id = 1 - rekord istnieje i go dostaniesz
  4.  
  5. // url/?action=show&id=-1
  6. $id = (int)$_GET['id']; // $id = -1 - rekord moze nie istniec nic nie dostajesz
  7.  
  8. // url/?action=show&id=zlosliwy sql'; --
  9. $id = (int)$_GET['id']; // $id = 0 - rowniez nic nie dostajesz
  10. ?>

Wystarczy w zupelnosci ... jezeli user poda w url-u prawidlowy ID to dostaje prawidlowy rekord ... jezeli nie to dostaje 'nic'. Nie chodzi o to zeby dostawac to co oczekujesz tylko o to zeby radzic robie z tym czego nie oczekujesz smile.gif
Sedziwoj
Ech, ciągle ograniczasz się do ID, do tego ja mam podejście że jak robić to dobrze, a kontrola tego co się dostaje ma być dokładna, nie wiem co potem będę chciał z tym robić, ale najlepiej jak jest tym co chcę, a nie coś "co działa".

Edit: literówka
NoiseMc
Ja pisze o sposobach zabezpieczenia sie przed wstrzyknieciem zlosliwego SQL, a nie o walidacji danych wejsciowych. Jak wyprowadzasz psa na spacer to nie musisz sprawdzac czy nalezy do gatunku gryzacych ... wystarczy ze mu zalozysz kaganiec winksmiley.jpg tak wiec aby skutecznie ochronic sie przed SQL Injection wystarczy w zupelnosci to co napisal LEW21 i ja. Jezeli natomiast chodzi o walidacje danych wejsciowych bo na przyklad cena produktu musi byc liczba a jego adres url nie moze zawierac znakow specjalnych to w pelni sie z Toba zgadzam powinno sie sprawdzac wszystko ... a do tego uzywam Zend_Validate_* - bardzo prosta w uzyciu metoda, ktora w polaczeniu z Zend_Filter jest prosta, wygodna i porzadna.
Endzio
Witam.
Używam kodu
  1. <?php
  2. function filtr($zmienna)
  3. {
  4. $zmienna = htmlspecialchars(trim($zmienna));
  5. $zmienna = str_replace("r\n", "<br />", $zmienna);
  6. $zmienna = str_replace("'", "&#_039;", $zmienna); //Bez znaku "_"
  7. return $zmienna;
  8. }
  9.  
  10. $autor = filtr($_POST['autor']);
  11. $tresc = filtr($_POST['tresc']);
  12. $sql = mysql_query("insert into shoutbox values ('NULL', '$autor', '$tresc')") or die("Błąd: ".mysql_error());
  13. ?>

Oraz standardowe pytanie biggrin.gif
Czy moje rozwiązanie jest bezpieczne, co byście zmienili?
Black-Berry
Dołączam się do pytania... możebyśmy napisali wspólnie 2 ostateczne wersje funkcji czyszczących string oraz liczby typu float smile.gif
@Sedziwoj Pomóż chłopie bo chyba tylko ty wiesz o co naprawdę chodzi smile.gif Podrawiam.

Edit: błędy.
Sedziwoj
Jak sprawdzać dane typu string? To zależy co może w nich być a co nie...
Co do liczb jeśli liczba może być tylko dodatnia całkowita preferuję, a jest z GET (ważne, bo w tej metodzie zmienna musi być tylu string)
  1. <?php
  2. $cos = '4342';
  3. if( !empty($cos) && ctype_digit($cos ) ){
  4.  echo "tak";
  5.  $int = (int)$cos;
  6. }else{
  7.  echo "nie";
  8. }
  9. ?>

To jest dobre do sprawdzania np. ID
Przy liczbach które mogą być ujemne, lub/i zmiennoprzecinkowe możne użyć is_numeric() (ale trzeba pamiętać aby rzutować na typ oczekiwany, czyli nie pomijać (int)) ale znakiem dziesiętnym jest "." nie "," co może być problemem.
Jeśli mamy "," to wtedy trzeba użyć preg_match() i wzorze typu '/[-+]?[1-9][0-9]*([\\.,][0-9]*)?/' lub zamienić "," na "." i robić tą poprzednią metodą.

Wracając do string'ów, to na prawdę zależy co powinno być, a czego nie powinno. I o tym już było pisane, po znaj ' jest dla html właściwie obojętny, ale dla SQL może być zabójczy. Tylko że czasem go można zamienić używając htmlspecialchars() czy też można htmlentities() ale to zależy od specyfikacji, przy bazie mysql_escape_string() czy mysql_real_escape_string(), pg_escape_string() itd. itp.

@Endzio
Dla mysql NULL to jest typ, zaleca się
  1. <?php
  2. $str = 'cos ' . $cos . '...';
  3. ?>

czyli aby zmienne nie były w ciągu znaków, (przy zapytaniu SQL gdzie jest wiele ' można użyć ", ale też zmienne są wyizolowane od ciągu).


EDIT:
P.S. Ja tam nie znam się na tym dobrze... tylko trochę wiem.
piter2k1
Co do pierwszego postu:

Kod
<?php
$query = "update uzytkownicy set pole='$dane' where id='$id'\";
?>


Ja zrobił bym po prostu:
Kod
<?php
$id = settype($_GET['id'], 'integer');
$query = "update uzytkownicy set pole='$dane' where id='$id'\";
?>
Kicok
Cytat
Ja zrobił bym po prostu:


A co zwraca funkcja settype" title="Zobacz w manualu PHP" target="_manual? Chyba pomyliło Ci się z intval" title="Zobacz w manualu PHP" target="_manual ;]
templar
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.
bełdzio
@templar a po co te regExpy? nie lepiej skorzystać z ctype?
Regyam
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?
bełdzio
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
rzymek01
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
bełdzio
wg. manuala ctype jest szybsze, a raczej ich testy były dokładniejsze :-)
Garrappachc
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?...
Kicok
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.
marcio
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
Kicok
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.
pytajnik2
Witajcie,
a co myślicie o tym?
http://axelpl.wordpress.com/2008/01/01/uni...n-i-xss/#more-3
bełdzio
patrzac na szybko to nic ciekawego smile.gif z tego co widze to nawet nie broni przez standardowym 1 =1 smile.gif
pytajnik2
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?
bełdzio
wszystko zalezy od konkretnego kodu, najlepsze zabezpieczenie to pisanie porzadnego kodu, a nie bawienie sie w polsrodki
kilas88
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
specialplan
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?
lucca
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?
kilas88
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.
.radex
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
bim2
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
.radex
Jakich znowuż scripts embed?
empuszek
Cytat(bim2 @ 11.03.2008, 19:09:01 ) *
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



Nareszcie ktoś to jasno napisał.

PS Co to jest Sript Embed?
bełdzio
zapewne chodzi o xss smile.gif
Xniver
Cytat
PS Co to jest Sript Embed?

Chodzi o tagi HTML <script> i <embed>. Wystarczy użycie funkcji strip_tags albo htmlspecialchars
gandziorz
Witam,
Przeczytałem temat przyklejony. I nikt nie sprecyzował jak można się uchronić przed union.
Napisałem taką funkcję:
  1. <?php
  2. function filtr ($zmienna) {
  3. $zmienna = mysql_real_escape_string($zmienna); //zmienia na zmienna z znakami unikowymi
  4. $zmienna = htmlspecialchars($zmienna, ENT_QUOTES); //zmienia znaki html
  5. return $zmienna;
  6. }
  7. ?>

Tylko tak naprawdę nic nie wnosi ciekawego bo owszem zabezpieczy ale jedynie przed prostymi operacjami. Ale co jeśli ktoś użyje union?
Nie poskutkuje bo przecież przy UNION nie trzeba dawać splash'y.

Wiadomo również jak jest przy liczbach można dać INT i dopisać że jeżeli jest odstęp to nie ma tego brać pod uwagę.
np.
  1. <?php
  2. strona.php?id=3 or 1=1
  3. Pobierze wtedy tylko 3.
  4. ?>


Dalej nie wiem co z union?
Sedziwoj
Myślałem że w przyklejonych ma być jakiś porządek, a tu burdel się robi...
Ograniczenie się do mysql, do tego było pisane co z union.

PS
spróbuj ?id=3%20or%20id%3d4 i analogicznie union jak nie sprawdzisz czy id to liczba, a string'a nie dasz w apostrofach.
marcio
Dajesz np na zmienne z get'a prosty str_replace np tak
  1. <?php
  2. $id = $_GET['id'];
  3. $nowy_id = str_replace("union", "", $id);
  4. ?>

Lub dajesz preg_match + system bledow czy cos w tym stylu lub spradzasz czy zmienna id jest liczba
  1. <?php
  2. if(is_integer($_GET['zmienna'])) {
  3. //dzialania jak wszystko ok
  4. }
  5.  
  6. else echo('Blad proba wlamania');
  7. ?>

Co do strongow zastosuj pierwsza metode

Edit sedziwoj szybszy smile.gif
Sedziwoj
@marcio

Do id jako liczby całkowitej dodatniej różnej od zera lepiej użyć kombinacji empty() || ctype_digit() -> niepoprawne id.
Co do string'ów to Twoja metoda jest do niczego, co jakbyś pamiętał już było wspominane w tym temacie, w ciągach zabezpiecza się przed znakami specjalnymi np. używając *_escape_string(), do tego w zapytaniu taki ciąg znaków musi być w znakach oznaczających ciąg znaków, dla MySQL, PostgeSQL itd. jest to najczęściej
  1. 'i to jest ciąg znaków dla bazy'

I jak to użyjesz nie wbiją się za pomocą "SQL Injection", ogólnie dla każdego typu danych sprawdza się czy jest to ten co chcemy, a potem robimy odpowiednie rzeczy z nim (właściwie to chyba tylko ciąg znaków wymaga, ale pewnie coś by się jeszcze znalazło)
MalyKazio
Mam krótkie pytanie. Czy w przypadku używania MySQL lepszym jest używanie mysql_real_escape_string zamiast addslashes? Z tego co się zorientowałem jest to funkcja dedykowana dla tej bazy danych. Czy zatem warto otrzymane zmienne, przy włączonym magic_quotes przefiltrować z powrotem stripslashes i potem przez zapytaniem zastosować mysql_real_escape_string? Czy też jest to zupełnie bez sensu i lepiej zostawić tak jak jest a ewentualne mysql_real.* zostawić na wypadek wyłączonych magic_quotes?
Crozin
Jeśli masz magic_quotes przepuść wszystkie dane (_POST, _GET i _COOKIE) przez stripslashes() a przed dodaniem do bazy użyj mysql_real_escape_string() (ponieważ ona escape'uje: \x00, \n, \r, \, ', " and \x1a )
.radex
Apostrofy na wyrażenie + mysql_real_escape_string wszystko rozwiązuje. Nie potrzebne są dodatkowe zabezpiecznie przeciwko np. UNION
Jarod
Cytat(radex_p @ 9.05.2008, 17:15:23 ) *
Apostrofy na wyrażenie + mysql_real_escape_string wszystko rozwiązuje. Nie potrzebne są dodatkowe zabezpiecznie przeciwko np. UNION


Z czystej ciekawości, czy inne bazy rządzą się tymi samymi prawami?
.radex
to zależy od SQL a nie od typu bazy danych. Przynajmniej tak mi się wydaje.
kilas88
Odnośnie bezpieczeństwa mam takie pytanie.. Gdzieś tam wyczytałem, że baza danych MySQLi jest szybsza, lepsza i bezpieczniejsza od bazy MySQL. Na czym te różnice w bezpieczeństwie polegają?

I ja dodam funkcję, której używam przy zabezpieczaniu się:

  1. <?php
  2. function escape_data ($data) {
  3.  global $dbc; // zmienna z przypisanym połączeniem do bazy mysql
  4.  if (ini_get('magic_quotes_qpc')) {
  5. $data = stripslashes($data);
  6.  }
  7.  return mysql_real_escape_string(trim($data), $dbc);
  8. }
  9. ?>


Oczywiście jeszcze sprawdzam czy pobierana jest liczba, czy string oraz w miarę możliwości - zakres liczb, długość stringów i wszelkie inne opcje.
pyro
Cytat(marcio @ 6.04.2008, 23:34:11 ) *
Dajesz np na zmienne z get'a prosty str_replace np tak
  1. <?php
  2. $id = $_GET['id'];
  3. $nowy_id = str_replace("union", "", $id);
  4. ?>


www.bla.com/index.php?id=-1 UNI/**/ON SELECT 1;
marcio
@Up oczywiscie znaki takie jak -,*,/ tez mozna usunac smile.gif

A co myslicie o takim nadzorowaniu http://www.uw-team.org/forum/viewtopic.php?f=5&t=6986
pyro
Cytat(marcio @ 5.11.2008, 15:50:49 ) *
@Up oczywiscie znaki takie jak -,*,/ tez mozna usunac smile.gif

A co myslicie o takim nadzorowaniu http://www.uw-team.org/forum/viewtopic.php?f=5&t=6986


tak, sprobujesz je usunac wyrazeniami regularnymi to ja ci zaczne te znaki kodować, poza tym moge chciec umiescic takie znaki jak ukosniki i gwiazdki i co wtedy? dupne zabezpieczenie...

A nadzorowanie ktore podales napewno nie zabezpieczy 100%, moze tylko sluzyc jako dodatkowa nakladka bezpieczenstwa
kayy
Pytanie;

jeżeli użyje takiego czegoś, to wszystkie zmienne z $_GET i $_POST będą zabezpieczone?

  1. <?php
  2. function safe() {
  3.  
  4. foreach($_POST as $key => $item) $_POST[$key] = addslashes($item);
  5.  
  6. foreach($_POST as $key => $item) $_POST[$key] = mysql_real_escape_string($item);
  7.  
  8. foreach($_POST as $key => $item) $_POST[$key] = htmlspecialchars($item, ENT_QUOTES);
  9.  
  10. foreach($_POST as $key => $item) $_POST[$key] = strip_tags($item);
  11.  
  12. foreach($_GET as $key => $item) $_GET[$key] = addslashes($item);
  13.  
  14. foreach($_GET as $key => $item) $_GET[$key] = mysql_real_escape_string($item);
  15.  
  16. foreach($_GET as $key => $item) $_GET[$key] = htmlspecialchars($item, ENT_QUOTES);
  17.  
  18. foreach($_GET as $key => $item) $_GET[$key] = strip_tags($item);
  19.  
  20.  
  21.  
  22.  
  23. }
  24. ?>
Black-Berry
Takie coś będzie chyba szybsze i lepsze bo nie sprawdzasz słowa union a za pomocą union ktoś mi się włamał:

  1. <?php
  2. while ($key = key($_GET)) {
  3.        if (strlen($_GET[$key])>20
  4.        or eregi('union', $_GET[$key])
  5.        or eregi(';', $_GET[$key])
  6.        or eregi('=', $_GET[$key])) $_GET[$key] = 0;
  7.        next($_GET);
  8.    }
  9. ?>
ucho
Cytat(radex_p @ 9.05.2008, 18:15:23 ) *
Apostrofy na wyrażenie + mysql_real_escape_string wszystko rozwiązuje. Nie potrzebne są dodatkowe zabezpiecznie przeciwko np. UNION

I to powinien być koniec dyskusji na temat zabezpieczania przed Sql Injection.
Na xss itp. wystarczy samo traktowanie wszystkich danych wejściowych za pomocą htmlspecialchars() - będzie po danych w bazie/na stronie widać czy ktoś próbował coś kombinować (co może być wadą lub zaletą smile.gif ale będzie to niegroźne.

kayy: poza tym żę twój kod nieco dziwnie wygląda to:
-najpierw strip_tags()
-potem htmlspecialchars()
-a tylko na danych które będziesz używał w zapytaniach mysql_real_escape_string()
addslashes jest niepotrzebne, *_real_escape_string wystarcza

A jeszcze w kwestii sql injection to powinno się używać przede wszystkim jakiegoś DBO, preapared statements, lub jakiejkolwiek biblioteki która daje coś w stylu PEARowego DB::quoteSmart ( escape i odpowiednia apostrofy dla stringa automatycznie niezależnie od bazy z której się korzysta)
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.