POST Bağlantıları Nasıl Doğru Kullanılır?

Web uygulamalarında, özellikle de yönetim arayüzlerinde, sunucunun durumunu değiştiren eylemlerin HTTP GET yöntemi ile gerçekleştirilmemesi temel bir kural olmalıdır. Metot adından da anlaşılacağı üzere GET sadece veri almak için kullanılmalıdır, değiştirmek için değil. Kayıt silme gibi eylemler için POST yönteminin kullanılması daha uygundur. İdeal olan DELETE yöntemini kullanmak olsa da, bu JavaScript olmadan çağrılamaz, bu nedenle POST tarihsel olarak kullanılır.

Pratikte nasıl yapılır? Bu basit numarayı kullanın. Şablonunuzun başında, daha sonra silme düğmeleri için kullanacağınız postForm tanımlayıcısına sahip bir yardımcı form oluşturun:

<form method="post" id="postForm"></form>

Bu form ile, bir <button> klasik yerine <a> bağlantısı, görsel olarak normal bir bağlantı gibi görünecek şekilde değiştirilebilir. Örneğin, Bootstrap CSS çerçevesi, düğmenin görsel olarak diğer bağlantılardan ayırt edilememesini sağlayan btn btn-link sınıflarını sunar. form="postForm" niteliğini kullanarak, önceden hazırlanmış forma bağlarız:

<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>

Bağlantıya tıklandığında, delete eylemi artık çağrılır. İsteklerin yalnızca POST yöntemiyle ve aynı etki alanından (CSRF saldırılarına karşı etkili bir savunmadır) kabul edilmesini sağlamak için #[Requires] nitelik:

use Nette\Application\Attributes\Requires;

class AdminPresenter extends Nette\Application\UI\Presenter
{
	#[Requires(methods: 'POST', sameOrigin: true)]
	public function actionDelete(int $id): void
	{
		$this->facade->deletePost($id); // hypothetical code for deleting a record
		$this->redirect('default');
	}
}

Bu öznitelik Nette Application 3.2'den beri mevcuttur ve #Requires özniteliği nasıl kullanılır sayfasında özellikleri hakkında daha fazla bilgi edinebilirsiniz.

actionDelete() eylemi yerine handleDelete() sinyalini kullanıyor olsaydınız, sameOrigin: true belirtmeniz gerekmezdi, çünkü sinyaller bu korumaya dolaylı olarak sahiptir:

#[Requires(methods: 'POST')]
public function handleDelete(int $id): void
{
	$this->facade->deletePost($id);
	$this->redirect('this');
}

Bu yaklaşım yalnızca uygulamanızın güvenliğini artırmakla kalmaz, aynı zamanda uygun web standartlarına ve uygulamalarına bağlı kalmanıza da katkıda bulunur. Durum değiştiren eylemler için POST yöntemlerini kullanarak daha sağlam ve güvenli bir uygulama elde edersiniz.