Autor Zpráva
Bambéro
Profil *
Dobrý den,
vytvořil jsem si malou administraci pro svůj web, kde mohu hlavně přidávat, editovat a mazat novinky. Nyní jsem chtěl samotný proces trochu zabezpečit a zamezit možnému ne/úmyslnému smazání, či editaci novinky.
Odkaz na mazání novinky má cca akovou podobu:
foo.com/?p=smaz_novinku&id=2

Přemýšlel jsem, jak zapezpečit, aby uživatel nemohl ručně změnit hodnotu id. Tak jsem si ID ve scriptu pěkně zahashoval (sha1) takže teď to vypadá krásně:
foo.com/?p=smaz_novinku&id=fe5dbbcea5ce7e2988b8c69bcfdfde8904aabc1f
, ale teď netuším, jak to vytáhnout ve scriptu na stránce "smaz_novinku". Předpokládám spávně, že jediná možnost je při vkládání novinky do databáze mít ještě jeden sloupec (např. sha_id) a do něj ukládat hash aktuálního id?
Nebo existuje nějaký inteligentnější řešení?
Taps
Profil
Bambéro:
vypadá krásně
ani moc ne

Pokud mazání novinek, probíhá přes administrační systém tak udělaj takové opatření že novinky může mazat jen přihlášený uživatel (případně uživatel, který danou novinku napsal)

samotné ošetření sql dotazu pak může vypadat např. následovně
mysql_query("delete FROM tabulka where id= " . intval($_GET["id"]));
Bambéro
Profil *
Taps:
„vypadá krásně“
ani moc ne

... to bylo myšleno i trochu ironicky :-)

Pokud mazání novinek, probíhá přes administrační systém tak udělaj takové opatření že novinky může mazat jen přihlášený uživatel (případně uživatel, který danou novinku napsal)
Ano, to tak mám, mazat mohou jen administrátoři (nyní je já sám :-)), ale stejně bych to chtěl nějak zabezpečit. Udělám-li adminem troubu, nebo záškodníka, je to sice moje chyba, nicméně proti mojí neprozřetelnosti chci mít obranu. ;-)
BuGeR
Profil
Mám podobný problém jako ty, vyřešil jsem to takto:
V tabulce nemám žádný sloupec (sha_id), ale pokud zavolam ten skript na smazání novinky, tak si necham vypsat pomocí cyklu všechny id s db, a každé jednotlivé id obalím tou hashovaci funkci a porovnám pomocí podmínek, pokud se hashe shoduji, cyklus ukončím a pokud je ID platné, tak ho smažu.. Např. takto:
while($data = mysql_fetch_array($novinky_db)) {
   if(sha1($data["novinka_id"]) == $_GET["id"]) {
      $smaz_id = $data["novinka_id"];
      break;
   }
}
if(isset($smaz_id))
   $result = mysql_query("DELETE FROM novinky WHERE novinka_id = '".$smaz_id."'");

(je to jen ukázka toho, jak by to mohlo fungovat)
Bambéro
Profil *
BuGeR:
Děkuji za postrčení, to je funkční řešení :-)
Tori
Profil
Bambéro:
Jen ze zvědavosti: předpokládám správně, že někde v administraci máte i přehled novinek s odkazy na jejich editaci / smazání? Co zabrání adminovi záškodníkovi, aby se místo editace url pokaždé vrátil na přehled a tam kliknul na smazání další novinky?
Neúmyslnému smazání typu: "nechce se mi vracet na přehled, napíšu do URL smazat ID 3, .... aha, tak to nebyla ona" tím sice zabráníte efektivně, ale úmyslné to jen maličko zdrží.
Joker
Profil
Bambéro:
Přemýšlel jsem, jak zapezpečit, aby uživatel nemohl ručně změnit hodnotu id.
K čemu to je dobré? Nějak v tom nevidím zvýšení bezpečnosti.
Respektive utajení skutečné mazací adresy není dobré zabezpečení. Uživatel klidně může tu mazací adresu zadat, ale pokud nemá na mazání právo, skript by mu to neměl dovolit.
Podle mě to bezpečnost naopak zhoršuje, zdůvodnění viz níže.

Udělám-li adminem troubu, nebo záškodníka, je to sice moje chyba, nicméně proti mojí neprozřetelnosti chci mít obranu. ;-)
Ale copak tohle je nějaké zabezpečení?! Když admin má právo mazat novinky, prostě na ní klikne, dá smazat a hotovo.

BuGeR:
pokud zavolam ten skript na smazání novinky, tak si necham vypsat pomocí cyklu všechny id s db, a každé jednotlivé id obalím tou hashovaci funkci a porovnám
No to je „bezva“, hlavně když těch novinek bude hodně. Druhá zajímavá věc na tom dotazu, proč je proboha číslo, navíc primární klíč, v databázi jako řetězec?
Když už, tak teda:
DELETE FROM novinky WHERE SHA1(novinka_id) = $smaz_id
Ale podle mého názoru i tohle jen aplikaci zbytečně zpomaluje (oproti jednoduchému WHERE novinka_id = $smaz_id) a bezpečnost to spíš zhoršuje.

Bezpečnost to zhoršuje proto, že to dává pocit falešného bezpečí (resp. dojem, že je to zabezpečené, protože se něco udělalo s úmyslem to zabezpečit), zatímco skutečné zvýšení bezpečnosti je malé.

Já bych doporučil zabezpečit:
1. Oprávnění, tj. aby mazat mohli jen ti kdo na to mají právo (a je blbost uživateli dát právo mazat a pak se mu v tom mazání snažit zabránit)
2. CSRF
3. Ani smazání koneckonců nemusí vadit, obvykle se to dělá tak, že smazání nesmaže příspěvek z databáze, ale jen nastaví jeho stav na smazaný, takže se případně dá obnovit.
Taps
Profil
Tori:
to by mělo být ošetřeno tím že kontroluje vlastník novinky s aktuálně přihlášeným uživatelem
Joker
máš pravdu někteří mají tendence si jednoduché věci zbytečně komplikovat
Bambéro:
No ještě mě napadlo, že by každá novinka mohla mív databázi sloupeček zobrazit a pokud by uživatel "Zvolil smazat záznam" tak by se do sloupečku zobrazit nastavila hodnota 0 a poté by se novinky nikde nezobrazovala. Definitivní smazání z databáze by pak mohl udělat uživatel s právem např. SuperAdmin, který by měl přehled o tom, u kterých záznamů byl požadavek na smazání.
Bambéro
Profil *
Joker:
3. Ani smazání koneckonců nemusí vadit, obvykle se to dělá tak, že smazání nesmaže příspěvek z databáze, ale jen nastaví jeho stav na smazaný, takže se případně dá obnovit.

Taps:
No ještě mě napadlo, že by každá novinka mohla mív databázi sloupeček zobrazit a pokud by uživatel "Zvolil smazat záznam" tak by se do sloupečku zobrazit nastavila hodnota 0 a poté by se novinky nikde nezobrazovala. Definitivní smazání z databáze by pak mohl udělat uživatel s právem např. SuperAdmin, který by měl přehled o tom, u kterých záznamů byl požadavek na smazání.

Ano, máte pravdu, a proto na fórum chodím, abych nedělal nějaký zbytečnosti. Pravdou je (což jsem si uvědomil až po vašich argumentech), že pokud mu dám práva na mazání, je zbytečné nějak adresu maskovat.

Díky za váš čas (vás všch, pochopitelně :-))
BuGeR
Profil
Joker:
No to je „bezva“, hlavně když těch novinek bude hodně. Druhá zajímavá věc na tom dotazu, proč je proboha číslo, navíc primární klíč, v databázi jako řetězec?
Tak za to se teda omlouvám, snažil jsem se pomoct, nemusíš být tak zlý :)
Lamicz
Profil
Zabezpečit se musí vždy vlastní akce, ne nějaký formuláře nebo URL.

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: