Autor | Zpráva | ||
---|---|---|---|
Peter45 Profil |
#1 · Zasláno: 12. 2. 2012, 22:26:01 · Upravil/a: Moderátor (editace znemožněna) 12. 2. 2012, 23:47:29
Citam tu toho vela chcel by som sa ubezpecit ci tomu spravne rozumiem:
Takto som mal kod doteras: $srchQ = "SELECT * FROM table WHERE id = $id"; A po precitani par clankov som dospel k tomuto len neviem ci je to bezpecne alebo co ako? $srchQ = "SELECT * FROM table WHERE id= ". (int) $id; Dalsi priklad: $q = mysql_query("SELECT parent FROM kat WHERE id='$curr' AND kategoria<>'' ORDER BY poradie, kategoria ") or die (mysql_error()); A takto som to osetril, je to bezpecne alebo stale niecomu nechapem? $q = mysql_query("SELECT parent FROM kat WHERE id=".intval($_GET[$curr])." AND kategoria<>'' ORDER BY poradie, kategoria ") or die (mysql_error()); K tomuto poslednemu som skusil este toto: $q = mysql_query("SELECT parent FROM kat WHERE id='".mysql_real_escape_string($_GET[$curr])."' AND kategoria<>'' ORDER BY poradie, kategoria ") or die (mysql_error()); Prosim nejake vysvetlenie |
||
Taps Profil |
Peter45:
mysql_real_escape_string - používej pro ošetření textových řetězců intval - používej v případě, že chceš ošetřit číselné hodnoty |
||
Peter45 Profil |
#3 · Zasláno: 12. 2. 2012, 22:41:05 · Upravil/a: Peter45
OK, tomu rozumiem, cize su teda tieto osetrene kody bezpecne proti sqli injection?
V nazve clanku som sa sekol hehe. Este sa spytam, je tuto nejaky rozdiel? lebo ten intval mi nefunguje... $srchQ = "SELECT * FROM table WHERE id= ". (int) $id; $q = mysql_query("SELECT parent FROM kat WHERE id=".intval($_GET[$id])." |
||
pcmanik Profil |
#4 · Zasláno: 12. 2. 2012, 23:38:56
Peter45:
Ziadny rozdiel v tom nieje. ako si prisiel na to ze ti intval nefunguje? |
||
Ugo Profil |
#5 · Zasláno: 13. 2. 2012, 07:33:38
Peter45:
funkce je stejná (int) je kratší, podle mě přehlednější a téměř 2x rychlejsí nemáš chybu ve zdroji proměnné? - $_GET[$id] jestli nemáš náhodou na mysli $_GET['id'] |
||
Peter45 Profil |
#6 · Zasláno: 13. 2. 2012, 07:52:06
Tak tomuto teras nerozumiem, toto mi funguje:
$srchQ = "SELECT * FROM table WHERE id = $id"; //toto je povodne ok $srchQ = "SELECT * FROM table WHERE id= ". (int) $id; //osetrene ok $srchQ = "SELECT * FROM table WHERE id=".intval($_GET[$id])." "; Nevadi teda budem pouzivat ten kratsi... |
||
Ugo Profil |
#7 · Zasláno: 13. 2. 2012, 07:57:37
Peter45:
protože $_GET[$id] není $id, nech si je vypsat přes echo, zapni si zobrazování všech chyb ($_GET[$id] by ti mělo vyhodit Notice: undefined index asi) při URL www.example.com?id=5
<?php /* 5 */ echo $_GET['id']; $var="id"; echo $_GET[$var] |
||
Peter45 Profil |
#8 · Zasláno: 13. 2. 2012, 08:29:45
Zaujma ma ako si to viem vlastne vyskusat ci mam zabazpeceny web respektivne ten dany vypis tabulky...? Co mam kde zadat
|
||
Ugo Profil |
stačí když si dáš v tvém případě echo $srchQ a už uvidíš jestli při blbostech co sou nečíselný bude hodnota id číselná, já nevím jak přesně se nechá využít sqli, ale v tomhle případě bys to moh zkusit nejspíš tak, že do $id dáš "1 or 1=1", " 1' or 1=1" atp. možná třeba "; drop database ifnormation_schema" - což by snad nemělo fungovat ani v nezabezpečenym dotazu :-) v tomhle případě to ale ani zkoušet nemusíš, protože integer ti neplechu neudělá. Ještě je možnost že máš nastaven server tak že automaticky ošetřuje vstupní parametry takže pak by ses taky k žádnýmu špatnýmu chování neměl dostat ani bez ošetření
btw. sqli až tolik neorzumim, podle mě je to hodně nafouknutá bublina a ten problém není nijak velkej, takže by bylo fajn kdyby se ozval někdo povolanější :) |
||
Peter45 Profil |
#10 · Zasláno: 13. 2. 2012, 09:10:42
Neviem stale tomu nejak nechapem jak zistim ci ma vypis bazpecny...pri pouziti echo $srchQ
mi vsade vypisalo toto SELECT * FROM table WHERE id= 340 SELECT * FROM table WHERE id= 338 SELECT * FROM table WHERE id= 336 toto som nasiel na najekej stranke ze to staci pridat trebars do index? foreach ($_GET as $key => $value) { $_GET["$key"]=str_replace(" ","",$_GET["$key"]); } extract($_GET); |
||
Ugo Profil |
přečti si něco o sqli ne o zabezpečení ale o použití, základem je dát za proměnnou kterou používáš pokračování příkazu, třeba u přihlášení
"SELECT * FROM users WHERE nick='".$_POST['nick']."' AND pass='".$_POST['pass']."'" /* SELECT * FROM users WHERE nick='test' AND pass='lol' OR 1=1 */ "SELECT * FROM users WHERE nick='".$_POST['nick']."' AND pass='".md5($_POST['pass'])."'" /* SELECT * FROM users WHERE nick='test' AND pass='md5string' */ když budu mít mazání z parametru v URL podle číselného ID - smaz.php?id=5 OR 1=1 DELETE FROM images WHERE id=$_GET['id']; /* DELETE FROM images WHERE id=5 OR 1=1 */ DELETE FROM images WHERE id=(int)$_GET['id']; /* DELETE FROM images WHERE id=5 */ |
||
Peter45 Profil |
#12 · Zasláno: 13. 2. 2012, 10:31:28
Skusim prestudovat vsetko co o tom najdem, nasiel som nieco podobne tomuto, myslite ze je to k niecomu dobre?
$table = mysql_real_escape_string("download"); $srchQ = "SELECT * FROM $table "; $srch = MySQL_Query($srchQ); $zaznam = MySQL_Fetch_Array($srch); |
||
Ugo Profil |
#13 · Zasláno: 13. 2. 2012, 10:42:18
Peter45:
ne toto konkrétně nemá žádný význam, význam by to mělo kdyby se tabulka brala z proměnné kterou zadává uživatel. Takhle mi tam víc chybí uzavření názvu tabulky do ` (`download`) to jediné by mělo význam. |
||
Časová prodleva: 12 let
|
0