Autor Zpráva
Peter45
Profil
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
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
Peter45:
Ziadny rozdiel v tom nieje. ako si prisiel na to ze ti intval nefunguje?
Ugo
Profil
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
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
Ale to uz nie:

$srchQ = "SELECT * FROM table WHERE id=".intval($_GET[$id])." ";

Nevadi teda budem pouzivat ten kratsi...
Ugo
Profil
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
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
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 */
kdybych dal do hesla - ' OR 1=1, tak by mě to nejspíš přihlásilo, tady stačí heslo zahashovat (což je asi všude takže ok), když dám md5($_POST['pass']) tak s ezbavim pokračování dotazu a vše je v pořádku
"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 */
tak mi to zmaže všechny obrázky z tabulky, když to ošetřím tak aby to byl integer tak my vypadne to za číslem čili
DELETE FROM images WHERE id=(int)$_GET['id'];
/* DELETE FROM images WHERE id=5 */
Peter45
Profil
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
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.

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: