ako na príkaz delete v <a href="">
- Takeshi
- Člen | 596
Ahojte,
mám nasledovné
<a href='{link delete! $articleId}' onClick="confirm('Naozaj chcete tento článok vymazať?')">link</a>
public function handleDelete($id)
{
... delete clanku ...
}
všetko by bolo v pohode, ale ked dam pri kontrolnej otazke, ci chcem naozaj vymazať článok, tak mi tú akciu delete článku urobí či dám OK alebo ZRUŠIŤ
ako sa to správne robí?
- Michal Vyšinský
- Člen | 608
Já často používám něco takového:
<a href="{link delete! $articleId}" data-confirm="Opravdu?">Smazat</a>
$(function(){
$('[data-confirm]').click(function(e){
e.preventDefault();
if(confirm($(this).data('confirm'))) {
location.href = $(this).attr('href');
}
});
});
Jen místo škaredého confirm používám většinou modal okna.
Editoval Michal Vyšinský (23. 9. 2014 11:50)
- japlavaren
- Člen | 404
- ak ti niekto podstrci odkaz a kliknes ho (i ked malo pravdepodobne)
- ak sa ti robot dostane do administracie a navstivi vsetky odkazy, je to v k****e
Editoval japlavaren (23. 9. 2014 20:55)
- David Matějka
- Moderator | 6445
@japlavaren
- https://forum.nette.org/…ete-v-a-href#…
- jestli se ti dostal robot do administrace, tak mas vetsi problem jinde :)
- Casper
- Člen | 253
@Šaman Ono to především není o tom jestli formulář či odkaz, ale o použité HTTP metodě. Tím, že použiješ GET metodu pro nějakou akci, tak porušuješ její základní safe vlastnost (a pravděpodobně i idempotenci). A to se všemi důsledky co z toho plynou. Tedy například otevíráš vrátka pro zmíněný CSRF útok. Dalším problémem může být cachování. Například proxy server, který si cachuje GET požadavky se při snaze obnovit svou cache ti znovu zavolá tvou akci. Zkrátka a jednoduše, dle specifikace HTTP slouží na akce především POST metoda.
Jenže je trochu opruz na každou blbost psát formulář s jedním submit buttonem a k tomu ještě továrničku, takže všichni používají signály, které často porušují specifikaci HTTP :) Osobně bych už bez secured-links doplňku vůbec signály nepoužíval.
- Zax
- Člen | 370
Hackuje metody link()
a signalReceived()
. Pokud
tomu dobře rozumím, tak ke každému vytvořenému odkazu, který směruje na
signál s anotací @secured, se vytvoří náhodný token, který se
uloží do session a hash toho tokenu se připojí do odkazu jako parametr
_sec
. Při přechodu na zabezpečený signál se pak kontroluje,
jestli ten hash sedí s tím, co je v session (= kliklo se na zabezpečený
odkaz), a pokud ne (podstrčený odkaz, parametr _sec chybí nebo nesedí),
vyhodí se výjimka a ke zpracování signálu nedojde.
- kolsi
- Člen | 131
Narazil jsem na toto trochu starší téma, ale řeším podobný problém, tak se zeptám, zda to secured-links by pomohlo ho vyřešit.
V naší aplikace jsme narazili na docela závažný bezpečnostní bug, který spočívá v tom, že signál není vázaný na konkrétní action. Když uživatel chce provést nějakou akci, tak v action ověříme, zda má oprávnění k této akci a podle toho ho pustíme dál, nebo vyhodíme chybu.
Teď situace, když mám seznam (třeba Grido), kde mazání položek probíhá AJAXem (tedy signál). V actionList se ověří oprávnění, handleDelete pak položku smaže. Nad tlačítkem Delete je pak odkaz …/project/list/55?do=delete a všechno ok.
Teď někdo zadá URL …/project/abcdef/55?do=delete a co se stane? Jelikož actionAbcdef neexistuje, tak se ani nikde neověří oprávnění. Následně se zavolá actionDelete a položka se smaže.
Vyřeší to secured-links? Nebo se jedná o špatný návrh? Nebo je prostě potřeba v handleru ověřit oprávnění ještě jednou? Či jak jinak to řešit?
- Etch
- Člen | 403
@kolsi Tak se to v praxi často dělá, že si člověk vytvoří anotaci s whitelistem akcí, na kterých může být daný signál zavolán. Osobně pak existenci této anotace vynucuji, takže nelze provést signál bez této anotace.
Je to tak jak píše @looky. Vždy záleží na tom, jak se na to koukáš. Já většinou ověřuji oprávnění až na úrovni modelu, takže to že jde signál pustit na jiné akci by mě nemuselo příliš zajímat, protože daná operace stejně selže. Přesto whitelist akcí pro signál v anotaci dělám, abych měl dobrý pocit. :)
- kolsi
- Člen | 131
Tak my máme oprávnění na globální úrovni v BasePresenteru, kdy ve startupu se volá funkce checkPermission (každý presenter už implementuje sám), která ověří přístup podle kombinace presenter/action/id a podle toho uživatele na danou stránku (ne)pustí. Ty signály jsme nějak přehlídli, protože to neprošlo přes action, ale už nám nedošlo, že tu action tam můžu podstrčit jakoukoli (čili tu na kterou mám oprávnění) a handler se stejně zavolá.
V Nette ty anotace/whitelisty asi nebudou co? Existuje na to nějaký už hotový doplněk, nebo musíme implementovat sami (což asi nebude problém)?