[ Príspevkov: 14 ] 
AutorSpráva
Offline

Užívateľ
Užívateľ
zhodnotenie mysql_injection zabezpecenia

Registrovaný: 16.01.08
Prihlásený: 27.03.13
Príspevky: 646
Témy: 144 | 144
Bydlisko: Žilina

Caute,
vytvoril som si jednoduchu funkciu proti MySQL Injection a XSS. Rad by som vedel, ci je moje Query "nepriestrelne", pripadne ako to vylepsit...

Funkcia:
Kód:
function protect($input, $cislo = false, $is_sql = false)
{
   $input = htmlentities($input, ENT_QUOTES);   
   if(get_magic_quotes_gpc ())
   {
      $input = stripslashes ($input);
   }   
   else
   {
      $input=addslashes($input);
   }
   if ($is_sql)
   {
      $input = mysql_real_escape_string ($input);
   }
   if ($cislo==true)
   {
      if (is_numeric($input))
      {
         return $input;
      }
      else
      {
         $zero=0;
         return $zero;
      }
   }
   else
   {
      $input = strip_tags($input);
      $input = str_replace("
      ", "\n", $input);   
      $input=str_ireplace(";","",$input);
      $input=str_ireplace("=","",$input);
      $input=str_ireplace("-","",$input);
      $input=str_ireplace(".","",$input);
      $input=str_ireplace("*","",$input);
      $input=str_ireplace("&","",$input);
      $input=str_ireplace("?","",$input);
      $input=str_ireplace("$","",$input);
      $input=str_ireplace("!","",$input);
      $input=str_ireplace(":","",$input);
      $input=str_ireplace("#","",$input);
      return $input;
   }
}


Pouzitie:
Kód:
$t1=protect($t1); // ak je ocakavany string
$t2=protect($t2,true); // ak je ocakavane cislo

$query=sprintf("SELECT * FROM tabulka WHERE id='%s' AND ico='%d'",$t1,$t2);


DIK


_________________
Mac Book Pro 15.4", CPU: Intel Core 2 Duo 2.8 GHz, RAM: 4GB DDR3, HDD: 500 GB, VGA: 512MB GDDR3, OS: Mac OS X Lion; Mobil: HTC ONE S
Offline

Čestný člen
Čestný člen
zhodnotenie mysql_injection zabezpecenia

Registrovaný: 11.08.07
Príspevky: 4110
Témy: 30 | 30
Bydlisko: Brno

Ta podmienka s get_magic_quotes_gpc() je chybna, aj tak ti bude vracat nerovnake vysledky, napriklad pri zadani a\b ti pri zapnutych magic_quotes necha a\b a pri vypnutych a\\b, to zrejme nechces :) Ak pouzijes addslashes a navyse este aj htmlentities, tak pochybujem, ze mysql_real_escape_string tam este treba. Dalej hned hore vytvoris entity a potom ampersandy zmazes pomocou str_ireplace, wtf? Takisto strip_tags nic nespravi, lebo mas to vsade zaentitovane.
Odporucam zamysliet sa nad tym, co je naozaj nebezpecne a treba to osetrit, a co je uz zbytocne a mozno aj hlupe odstranovat. Ako by napriklad prispevky na tomto fore vyzerali, keby sa z nich mazali bezne interpunkcne znaky ako bodky, otazniky, stredniky, atd?
O tom, ze ten kod je zbytocne dlhy (desat str_ireplacov sa dalo zlucit do jedneho regexpu), ani nehovorim.


Offline

Užívateľ
Užívateľ
zhodnotenie mysql_injection zabezpecenia

Registrovaný: 16.01.08
Prihlásený: 27.03.13
Príspevky: 646
Témy: 144 | 144
Bydlisko: Žilina
Napísal autor témyOffline : 16.02.2010 9:59 | zhodnotenie mysql_injection zabezpecenia

Dik za odpoved Ďuri. trochu som to upravil:

Kód:
function protect($input, $cislo = false, $is_sql = false)
{
   $input = htmlentities($input, ENT_QUOTES);   
   if(get_magic_quotes_gpc ())
   {
      $input = stripslashes ($input);
   }
   if ($is_sql)
   {
      $input = mysql_real_escape_string ($input);
   }
   if ($cislo==true)
   {
      if (is_numeric($input))
      {
         return $input;
      }
      else
      {
         $zero=0;
         return $zero;
      }
   }
   else
   {
      $input = strip_tags($input);
      $input = str_replace("
      ", "\n", $input);   
      $input=str_ireplace(";","",$input);
      $input=str_ireplace("=","",$input);
      $input=str_ireplace("-","",$input);
      $input=str_ireplace(".","",$input);
      $input=str_ireplace("*","",$input);
      $input=str_ireplace("&","",$input);
      $input=str_ireplace("?","",$input);
      $input=str_ireplace("$","",$input);
      $input=str_ireplace("!","",$input);
      $input=str_ireplace(":","",$input);
      $input=str_ireplace("#","",$input);
      return $input;
   }
}


mohol by si mi prosim ta zlucit tie str_ireplace do regexpu? ide o to, ze si s regexpami velmi nerozumiem a rad by som to mal spravne :D
co tam treba este vyhodit / prerobit? a to odstranovanie niektorych znakov: ide o to, ze tieto znaky na 100% nebudu mat co robit v kontrolovanych premennych.


_________________
Mac Book Pro 15.4", CPU: Intel Core 2 Duo 2.8 GHz, RAM: 4GB DDR3, HDD: 500 GB, VGA: 512MB GDDR3, OS: Mac OS X Lion; Mobil: HTC ONE S
Offline

Čestný člen
Čestný člen
zhodnotenie mysql_injection zabezpecenia

Registrovaný: 11.08.07
Príspevky: 4110
Témy: 30 | 30
Bydlisko: Brno
NapísalOffline : 16.02.2010 10:28 | zhodnotenie mysql_injection zabezpecenia

Ak mas nejaky vycet znakov, ktore su povolene, sprav to tak, ze vsetky znaky okrem nich odstranis. Pripadne priklad s odstranenim nepovolenych znakov (toto sa mi nepozdava. Pochybujem, ze napises vsetky znaky, ktore si naozaj nezelas mat. Ale budiz, ako ty chces):
Kód:
$input = preg_replace('/[\x00-\x20;=\-.*&?$!:#]/', '', $input); //odstranuje netlacitelne znaky vratane whitespace a tvoje nechcene interpunkcne znamienka

Na tvojom mieste tam ten ampersand nechavam, kedze htmlentities (mimochodom nespravne pouzite, kedze ti chyba 3.parameter - encoding) skonvertuje napriklad aj pismeno á. Tvoja fcia zmeni á na aacute, to vyzera v texte blbo, ze?
Dalej ta premenna $zero je naco? Pouzi return 0.
Fcia is_numeric ti ponecha aj bodku a pismeno e, nevadi?
Celkovo mi to pripada nepremyslene a chaoticke. Mohol by si napisat, co presne chces spravit a najdeme mozno lepsi postup.


Offline

Užívateľ
Užívateľ
zhodnotenie mysql_injection zabezpecenia

Registrovaný: 16.01.08
Prihlásený: 27.03.13
Príspevky: 646
Témy: 144 | 144
Bydlisko: Žilina
Napísal autor témyOffline : 16.02.2010 10:41 | zhodnotenie mysql_injection zabezpecenia

Ďuri, dik za rady.

ide o to, ze si potrebujem spravit funkciu, ktorou budem kontrolovat $_POST a $_GET premenne proti MySQL Injection a XSS. najidealnejsie by bolo, keby som napr. ako v mojom priklade este funkcii vedel nastavit (true/false) ci sa ma jednat o cislo, pripadne o string. kontrolovat sa budu napr. meno, heslo, nejake id, cislo strany, text ktory uzivatel zadal (napr. komentar) atd. proste nieco univerzalne, co by som mohol pouzivat kdekolvek (takze je mozno to odstranovanie nezelanych znakov naozaj blbost).

navyse chcem query prehnat vzdy aj cez sprintf, je to krok k lepsej bezpecnosti?

necham si poradit.

DIK


_________________
Mac Book Pro 15.4", CPU: Intel Core 2 Duo 2.8 GHz, RAM: 4GB DDR3, HDD: 500 GB, VGA: 512MB GDDR3, OS: Mac OS X Lion; Mobil: HTC ONE S
Offline

Čestný člen
Čestný člen
zhodnotenie mysql_injection zabezpecenia

Registrovaný: 11.08.07
Príspevky: 4110
Témy: 30 | 30
Bydlisko: Brno
NapísalOffline : 16.02.2010 11:53 | zhodnotenie mysql_injection zabezpecenia

Ja by som volil nasledovny postup - pomocou htmlspecialchars() s druhym parametrom ENT_QUOTES osetris jednak XSS, jednak apostrofy. Potom napriklad pomocou str_replace escapujes spatne lomitko, aby sa dalo pouzit v SQL:
Kód:
$input = str_replace('\\', '\\\\', $input);
Mozes uplne vyhodit znaky, ktore tam urcite nemaju co robit, \x00-\x09, \x0B-\x1F, mozno aj dalsie. Volitelne si pridaj ako parameter napriklad nejaky regexp, ak budes chciet odstranit dalsie znaky. To uz nechavam na teba, sprav si tie parametre tak, ako ty chces.
Sprintf ti k vacsej bezpecnosti vacsinou nepomoze, mozno len v pripade, ze pouzivas %d a zaistis tak, ze budes pracovat s integerom. To sa ale da docielit aj pretypovanim, $input = (int) $input;
Nezabudni este na zaciatok pridat stripslashes v pripade zapnutych magic_quotes.


Offline

Užívateľ
Užívateľ
zhodnotenie mysql_injection zabezpecenia

Registrovaný: 16.01.08
Prihlásený: 27.03.13
Príspevky: 646
Témy: 144 | 144
Bydlisko: Žilina
Napísal autor témyOffline : 16.02.2010 12:14 | zhodnotenie mysql_injection zabezpecenia

no, takze som to nejak prerobil, je to lepsie? len mi je jasne, ze ten regexp mam zle a fakt si s nim neviem poradit, nemohol by si mi to, prosim ta, upravit? :D

Kód:
function protect($input, $cislo = false)
{   
   if(get_magic_quotes_gpc ())
    {
        $input = stripslashes ($input);
    }
   $input = htmlentities($input, ENT_QUOTES);
   $input = str_replace('\\', '\\\\', $input);
   if ($cislo==true)
   {
      $input=str_ireplace(".","",$input);
      $input=str_ireplace("e","",$input);
      if (is_numeric($input))
      {
         return $input;
      }
      else
      {
         return 0;
      }
   }
   else
   {
      $regexp="/([\x00-\x09])([\x0B-\x1F])/";
      if (!preg_match($regexp, $input))
      {
         return $input;
      }
      else
      {
           return 0;
      }
   }
}


_________________
Mac Book Pro 15.4", CPU: Intel Core 2 Duo 2.8 GHz, RAM: 4GB DDR3, HDD: 500 GB, VGA: 512MB GDDR3, OS: Mac OS X Lion; Mobil: HTC ONE S
Offline

Čestný člen
Čestný člen
zhodnotenie mysql_injection zabezpecenia

Registrovaný: 11.08.07
Príspevky: 4110
Témy: 30 | 30
Bydlisko: Brno
NapísalOffline : 16.02.2010 12:21 | zhodnotenie mysql_injection zabezpecenia

Ten kod som ti okomentoval.
Kód:
function protect($input, $cislo = false)
{   
   if(get_magic_quotes_gpc ())
    {
        $input = stripslashes ($input);
    }
   $input = htmlspecialchars($input, ENT_QUOTES); //pouzil som podla mna vhodnejsiu fciu
   $input = str_replace('\\', '\\\\', $input);
   if ($cislo) //uprava zapisu
   {
      return (ctype_digit($input)) ? $cislo : 0; //fcia ctype_digit testuje len na 0-9; plus vid ternarny operator => zjednoduchsenie zapisu
   }
   else
   {
      return preg_replace('/[\x00-\x09\x0B-\x1F]/', '', $input); //znaky staci odstranit, nie hned mazat cely input
   }
}
Este zvazujem, ci by v if-vetve toho $cislo nestacilo proste
Kód:
return (int) $cislo;

Tie regexpy odporucam, aspon zaklady. www.regularnivyrazy.info


Offline

Užívateľ
Užívateľ
zhodnotenie mysql_injection zabezpecenia

Registrovaný: 16.01.08
Prihlásený: 27.03.13
Príspevky: 646
Témy: 144 | 144
Bydlisko: Žilina
Napísal autor témyOffline : 16.02.2010 12:47 | zhodnotenie mysql_injection zabezpecenia

DIK za kod. som ho skusil a toto je vytup:

Citácia:
SELECT * FROM uzivatel WHERE id='' OR ''='''


a neviem ci je to OK alebo nie.

takto som to pouzil:

Kód:
$t2="' OR ''=''";
$t2=protect($t2);


$test="SELECT * FROM uzivatel WHERE id='".$t2."'";
echo $test;


tie regexpy bude musiet nastudovat ;)


_________________
Mac Book Pro 15.4", CPU: Intel Core 2 Duo 2.8 GHz, RAM: 4GB DDR3, HDD: 500 GB, VGA: 512MB GDDR3, OS: Mac OS X Lion; Mobil: HTC ONE S
Offline

Čestný člen
Čestný člen
zhodnotenie mysql_injection zabezpecenia

Registrovaný: 11.08.07
Príspevky: 4110
Témy: 30 | 30
Bydlisko: Brno
NapísalOffline : 16.02.2010 13:20 | zhodnotenie mysql_injection zabezpecenia

Kludne to moze byt OK, pretoze pozeras do HTML stranky. Keby si si otvoril zdrojovy kod, videl by si, ze apostrofy su nahradene za ', co nemoze uskodit.


Offline

Užívateľ
Užívateľ
zhodnotenie mysql_injection zabezpecenia

Registrovaný: 16.01.08
Prihlásený: 27.03.13
Príspevky: 646
Témy: 144 | 144
Bydlisko: Žilina
Napísal autor témyOffline : 16.02.2010 13:25 | zhodnotenie mysql_injection zabezpecenia

PERFEKTNE! robim uz tolko veci naraz, ze ma taka banalita ako pozriet do kodu ani nenapadla.

este raz DIK za pomoc a idem studovat regexp ;)


_________________
Mac Book Pro 15.4", CPU: Intel Core 2 Duo 2.8 GHz, RAM: 4GB DDR3, HDD: 500 GB, VGA: 512MB GDDR3, OS: Mac OS X Lion; Mobil: HTC ONE S
Offline

Skúsený užívateľ
Skúsený užívateľ
zhodnotenie mysql_injection zabezpecenia

Registrovaný: 29.10.07
Prihlásený: 12.06.17
Príspevky: 1408
Témy: 28 | 28
Bydlisko: Bratislava
Vek: 36

A ja by som namiesto tvorby vlastnych metod vyuzil nejake uz hotove a overene. Ide predsa o bezpecnost. Navyse, naco escapovat, ked mozeme rovno pouzit mysqli namiesto mysql. Vdaka bindovaniu parametrov sa sql injection bat netreba.


_________________
PC: OS: Windows 10 (64bit) CPU: INTEL Core i5-4440 GPU: ASUS ATI R9280X RAM: Kingston 8GB DDR3 1600MHz MB: MSI B85-G43 Gaming HDD: Seagate 1TB HDD Barracuda SSD: SAMSUNG 120GB HDD 840 EVO CASE: COOLERMASTER N400
Mobil: OS: Android 4.4.2 Model: LG G2 D802 16GB
Offline

Užívateľ
Užívateľ
zhodnotenie mysql_injection zabezpecenia

Registrovaný: 16.01.08
Prihlásený: 27.03.13
Príspevky: 646
Témy: 144 | 144
Bydlisko: Žilina
Napísal autor témyOffline : 17.02.2010 7:56 | zhodnotenie mysql_injection zabezpecenia

ja by som tiez rad pouzil uz overenu funkciu proti injection a XSS ale nic take som nikde nenasiel, tak som zacal riesit nieco vlastne...


_________________
Mac Book Pro 15.4", CPU: Intel Core 2 Duo 2.8 GHz, RAM: 4GB DDR3, HDD: 500 GB, VGA: 512MB GDDR3, OS: Mac OS X Lion; Mobil: HTC ONE S
Offline

Skúsený užívateľ
Skúsený užívateľ
zhodnotenie mysql_injection zabezpecenia

Registrovaný: 29.10.07
Prihlásený: 12.06.17
Príspevky: 1408
Témy: 28 | 28
Bydlisko: Bratislava
Vek: 36

Google: php input filter class

ahaho, hned prvy link ;) Sice stara trieda, ale nemyslim ze to je chyba. Skor naopak.


_________________
PC: OS: Windows 10 (64bit) CPU: INTEL Core i5-4440 GPU: ASUS ATI R9280X RAM: Kingston 8GB DDR3 1600MHz MB: MSI B85-G43 Gaming HDD: Seagate 1TB HDD Barracuda SSD: SAMSUNG 120GB HDD 840 EVO CASE: COOLERMASTER N400
Mobil: OS: Android 4.4.2 Model: LG G2 D802 16GB
 [ Príspevkov: 14 ] 


zhodnotenie mysql_injection zabezpecenia



Podobné témy

 Témy  Odpovede  Zobrazenia  Posledný príspevok 
V tomto fóre nie sú ďalšie neprečítané témy.

Centrum Zabezpecenia

v Operačné systémy Microsoft

0

193

27.03.2011 11:56

Marquez

V tomto fóre nie sú ďalšie neprečítané témy.

Upozornenie zabezpecenia

v Operačné systémy Microsoft

6

1038

12.04.2009 2:14

GeeDeeI

V tomto fóre nie sú ďalšie neprečítané témy.

upozornenie zabezpecenia

v Operačné systémy Microsoft

2

1318

07.08.2009 23:04

Logik

V tomto fóre nie sú ďalšie neprečítané témy.

Centrum zabezpečenia

v Operačné systémy Microsoft

11

325

12.09.2006 14:36

markesy

V tomto fóre nie sú ďalšie neprečítané témy.

centrum zabezpečenia systemu

v Operačné systémy Microsoft

3

110

24.11.2014 19:07

milan1966

V tomto fóre nie sú ďalšie neprečítané témy.

vypnute centrum zabezpečenia

v Operačné systémy Microsoft

1

1394

23.08.2009 20:09

Jani

V tomto fóre nie sú ďalšie neprečítané témy.

Navrh kompletneho zabezpecenia pc

[ Choď na stránku:Choď na stránku: 1, 2, 3, 4 ]

v Antivíry a antispywary

94

9643

28.03.2014 12:01

tairikuokami

V tomto fóre nie sú ďalšie neprečítané témy.

I:centrum zabezpečenia systemu

v Operačné systémy Microsoft

2

72

29.12.2012 19:47

Denco1

V tomto fóre nie sú ďalšie neprečítané témy.

upozornenia zabezpecenia systemu Windows

v Operačné systémy Microsoft

2

484

28.07.2006 21:52

johny128

V tomto fóre nie sú ďalšie neprečítané témy.

Testovanie zabezpecenia web stranky

v Ostatné

0

321

16.02.2011 9:37

slash24

V tomto fóre nie sú ďalšie neprečítané témy.

Ako vypnut Win Firewall bez Centra zabezpecenia

v Bezpečnosť a firewally

3

1244

05.03.2008 18:25

tantum

V tomto fóre nie sú ďalšie neprečítané témy.

služba centra zabezpečenia systému windows sa nedá spustiť

v Operačné systémy Microsoft

1

1064

14.08.2012 19:14

mtxd

V tomto fóre nie sú ďalšie neprečítané témy.

W7: služba centra zabezpečenia systému sa nedá pustit

v Operačné systémy Microsoft

6

755

10.09.2009 22:23

Sparco117

V tomto fóre nie sú ďalšie neprečítané témy.

Zhodnotenie

v Webdesign

8

528

08.12.2008 22:10

dedko45

V tomto fóre nie sú ďalšie neprečítané témy.

Zhodnotenie..

v Notebooky a netbooky

3

265

19.12.2009 13:53

ac.milan

V tomto fóre nie sú ďalšie neprečítané témy.

Zhodnotenie

v PC zostavy

10

302

17.11.2011 14:34

killer



© 2005 - 2017 PCforum, edited by JanoF