-
-
Notifications
You must be signed in to change notification settings - Fork 284
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
Showing
4 changed files
with
57 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,52 @@ | ||
Jak správně používat POST odkazy | ||
******************************** | ||
|
||
Ve webových aplikacích, zejména v administrativních rozhraních, by mělo být základním pravidlem, že akce měnící stav serveru by neměly být prováděny prostřednictvím HTTP metody GET. Jak název metody napovídá, GET by měl sloužit pouze k získání dat, nikoli k jejich změně. | ||
Pro akce jako třeba mazání záznamů je vhodnější použít metodu POST. I když ideální by byla metoda DELETE, ale tu nelze bez JavaScriptu vyvolat, proto se historicky používá POST. | ||
|
||
Jak na to v praxi? Využijte tento jednoduchý trik. Na začátku šablony si vytvoříte pomocný formulář s identifikátorem `postForm`, který následně použijete pro mazací tlačítka: | ||
|
||
```latte .{file:@layout.latte} | ||
<form method="post" id="postForm"></form> | ||
``` | ||
|
||
Díky tomuto formuláři můžete místo klasického odkazu `<a>` použít tlačítko `<button>`, které lze vizuálně upravit tak, aby vypadalo jako běžný odkaz. Například CSS framework Bootstrap nabízí třídy `btn btn-link` se kterými dosáhnete toho, že tlačítko nebude vizuálně odlišné od ostatních odkazů: | ||
|
||
```latte .{file:admin.latte} | ||
<table> | ||
<tr n:foreach="$posts as $post"> | ||
<td>{$post->title}</td> | ||
<td> | ||
<button class="btn btn-link" form="postForm" formaction="{link delete $post->id}">delete</button> | ||
<!-- instead of <a n:href="delete $post->id">delete</a> --> | ||
</td> | ||
</tr> | ||
</table> | ||
``` | ||
|
||
Pro zajištění, že mazací požadavky budou přijímány pouze prostřednictvím metody POST a z téže domény (což je účinná obrana proti CSRF útokům), použijte na akci `delete` atribut `#[Requires]`: (vyžaduje Nette Application 3.2) | ||
|
||
```php .{file:AdminPresenter.php} | ||
#[Requires(methods: 'POST', sameOrigin: true)] | ||
public function actionDelete(int $id): void | ||
{ | ||
$this->facade->deletePost($id); | ||
$this->redirect('default'); | ||
} | ||
``` | ||
|
||
Pokud byste místo akce `actionDelete()` používali signál `handleDelete()`, není nutné uvádět `sameOrigin: true`, protože signály mají tuto ochranu nastavenou implicitně: | ||
|
||
```php | ||
#[Requires(methods: 'POST')] | ||
public function handleDelete(int $id): void | ||
{ | ||
$this->facade->deletePost($id); | ||
$this->redirect('this'); | ||
} | ||
``` | ||
|
||
Tento přístup nejenže zlepšuje bezpečnost vaší aplikace, ale také přispívá k dodržování správných webových standardů a praxe. Využitím metod POST pro akce měnící stav a výraznější separací datových a akčních požadavků dosáhnete robustnější a bezpečnější aplikace. | ||
|
||
|
||
{{sitename: Best Practices}} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters