Autor Zpráva
Anonymní
Profil *
lidi četl jsem něco o bezpečnosti a zjistil jsem že se dá někdy něco smazat pomocí url z mysql tb pokud to neuděláš šikovně. učím se ted SEO narazil jsem na mod_rewrite (htaccess) pokud udělám piomocí toho přehledaná url př.: xxx.cz/pivovary/pilsner/
tak zabráním možnému zneužité té url ke smazaní něčeho z db?

diky doufám že jste mě pochopili
quinux
Profil
Možnému smazání zabráníš, když budeš formuláře odesílat metodou POST nikoli GET
Peca
Profil
quinux Obávám se, že odeslat cokoliv metodou post není zas takový problém.
Hlavní je nedávat obsah formuláře jenom tak bezhlavě do dotazu na databázi. Dát si pozor na nebezpečné znaky -ukončení dotazu a napsání úplně jiného apod. Totéž platí např. pro zobrazování stránek ve stylu /zobraz.php?url=najaka_stranka.php
djlj
Profil
Anonymní
Snad ti pomůže i tento článek...
Anonymní
Profil *
ale pokud použiju přehledná url a né zobraz.php?url=najaka_stranka.php tak pžez url mi to nesmaže?

a čím mám formulář ošetřit? myslím že jsem používal jendu funkci ted si nepamatuju přesně jakou ale je to nějak htmlchar . .. . () nevim přesně :-D
Anonymní
Profil *
díky za link jak tam udává tak takový zápis bude bezpečný? když to protlačim přez ty funkce? (na číslo/intval/ a text/addslashed/ ?)

<?php
// ošetření vstupních dat
mysql_query("SELECT * FROM tabulka WHERE nazev = '" . addslashes($_GET["nazev"]) . "' OR id = " . intval($_GET["id"]));

// spolehnutí se na magic_quotes_gpc
mysql_query("SELECT * FROM tabulka WHERE nazev = '$_GET[nazev]' OR id = '$_GET[id]'");
?>


nebo se mýlím?


co znamená OFFSET v tomdle příkladu? ? //OFFSET " . intval($_GET["offset"])

<?php
// nefunguje
mysql_query("SELECT * FROM tabulka LIMIT 10 OFFSET '$_GET[offset]'");

// funguje
mysql_query("SELECT * FROM tabulka LIMIT 10 OFFSET " . intval($_GET["offset"]));
?>

diky
quinux
Profil
Peca

No já to myslel v souvislosti s tou url. Když na nějakém webu něco smažu a dostanu např. takovou url: formular.php?id=523&akce=smazat tak je jasné, že potom stačí jen měnit id a promažu databázi - to dokáže každý druhý uživatel.
Když však v url bude jen formular.php a data půjdou postem tak to už je pro většinu uživatelů mnohem těžší. :o)
Hugo
Profil
quinux

Težší jo, ale rozhodně ne neproveditelné. Poslat data metodou post je velmi jednoduché.
Anonymní
Profil *
jo ty to myslíš takhle jenže já myslím třeba pokud buud mít todle

PHP: "SELECT * FROM table WHERE id=$id";

a zadá něco takového

?id=0%20or%201=1 znaky %20 jsou uvedeny jako korektní náhrada mezery do URL)
?id=57;%20DELETE%20FROM%20table

tak se mi něco smaže pokud to budu mít neošetřené

a pokud budu mít přeheldné url (SOE)xxx.cz/pivovary/pilsner/ přez mod_rewrite

jestli bude furt možníé mi něco přez tu url něco smazat nějak ?
Hugo
Profil
Anonymní

To zalezi na tom jak budes mit nastaveny mod_rewrite.

xxx.cz/pivovary/57;%20DELETE%20FROM%20table/

prepises na toto

57;%20DELETE%20FROM%20table

Tak ti to moc nepomůže. IMHO je nejdůležitější provést korektní kontrolu a ošetření dat před zápisem do db.
Kajman_
Profil *
tak takový zápis bude bezpečný? když to protlačim přez ty funkce? (na číslo/intval/ a text/addslashed/ ?

V kombinaci s uvozovkami kolem obého ano.

OFFSET je počet řádků, které se přeskočí. Má tam být číslo, proto to nefuguje s řetězcem '1'.

?id=57;%20DELETE%20FROM%20table

V mysql_query nelze zadávat více dotazů oddělených středníky. Neplecha se dělá tím první způsobem - tedy pomocí or.

Udělejte to tak, že to nedokážete zneužít i když víte, jaké jsou zdrojáky.
Anonymní
Profil *
naco dalšího z bezpečnosti se mám zaměřit?


session je dostatečně bezpečné? abych vněm mohl mít duležité informace?
-error414
Profil *
Pripada me to jako by si bzyl vte bezpecnosti upne zmateny.

mod_rewrite dela jen hezka url - nezabrani sql utoku

pred kazdym dotazem je treba osetrit vstupni data ktera jsou v dotazu pouzita pokud neni zapnuta directiva magic_quotes_gpc.

nebo pouzivani vazani promenych, mysql to sice neumi ale da se to m´pomoci db layeru emulovat.
a
Profil *
Co tahle přidat na začátek php pracující s databází tohle:

foreach($_GET as $key=>$value)
{$_GET[$key]=mysql_escape_string($value);
}
foreach($_POST as $key=>$value)
{$_POST[$key]=mysql_escape_string($value);}

A už si nemusím dělat starosti a nebo je zde ještě nějaké nebezpečí?
a
Profil *
ošetří mi todle dostatečně čislo?

if (intVal(strVal($id) != $id))
{echo "není číslo";}
else{sql = ...;}
Anonymní
Profil *
? :-/
arix
Profil *
lidi :-) zdá se to že to bude stačit jak na to koukám co nato říkáte? pude to? já myslím že jo, že to dostatečně ošetří všecky get a post na stránce? mylímse že to bude stačit?

foreach($_GET as $key=>$value)
{$_GET[$key]=mysql_escape_string($value);
}
foreach($_POST as $key=>$value)
{$_POST[$key]=mysql_escape_string($value);}
Toto téma je uzamčeno. Odpověď nelze zaslat.