informasi kontak saya
Surat[email protected]
2024-07-12
한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina
Untuk mencegah serangan Pemalsuan Permintaan Lintas Situs (CSRF), langkah-langkah keamanan umum berikut dapat diambil dalam pengembangan front-end:
Ini adalah salah satu mekanisme pertahanan yang paling umum digunakan.
Hasilkan Token: Setelah pengguna masuk, server menghasilkan Token CSRF yang acak dan tidak dapat diprediksi dan menyimpannya di sisi server. Pada saat yang sama, token tersebut dikirim ke klien melalui header Set-Cookie dan disimpan di Cookie pengguna.
Bentuk Token yang tertanam: Di setiap formulir HTML yang memerlukan perlindungan, tambahkan bidang tersembunyi (<input type="hidden">
), nilainya diatur ke Token CSRF yang dibaca dari cookie.
VerifikasiToken : Saat formulir dikirimkan, backend akan menerima data formulir dan Token dalam cookie (karena kebijakan asal yang sama, browser akan secara otomatis mengirimkan cookie). Sisi server memverifikasi apakah Token dalam bentuk konsisten dengan Token yang disimpan di sisi server atau di Sesi. Jika tidak konsisten, permintaan ditolak.
Meskipun tidak sepenuhnya dapat diandalkan karena Referer dan Asal mungkin dirusak atau hilang, ini masih dapat digunakan sebagai alat bantu dalam beberapa skenario.
Periksa Referensi : Verifikasi bidang Referer di header permintaan HTTP untuk memastikan bahwa permintaan dimulai dari nama domain yang diharapkan. Namun perlu diperhatikan bahwa cara ini memiliki keterbatasan. Misalnya pada permintaan downgrade dari HTTPS ke HTTP, Referer tidak akan dikirimkan.
Periksa Header Asal: Mirip dengan Referer, header Asal memberikan informasi tentang sumber permintaan, tetapi hanya dikirim saat menggunakan XMLHttpRequest atau Fetch API.
Untuk cookie yang tidak memerlukan akses lintas situs, atribut SameSite dapat diatur untuk meningkatkan keamanan.
Tambahkan header HTTP khusus ke permintaan AJAX (sepertiX-Requested-With: XMLHttpRequest
), lalu verifikasi keberadaan dan nilai header ini di sisi server. Karena JavaScript dapat dengan bebas mengatur header XMLHttpRequest, tetapi pengiriman formulir biasa tidak bisa, hal ini dapat membedakan permintaan yang dimulai oleh skrip.
Sisi server (kodesemu):
// 生成并设置Token
function generateCsrfToken() {
return crypto.randomBytes(32).toString('hex');
}
app.post('/login', (req, res) => {
const token = generateCsrfToken();
res.cookie('csrfToken', token, { httpOnly: true, secure: true, sameSite: 'strict' });
// 存储token到session或其他存储机制
});
app.post('/submitForm', (req, res) => {
if (req.body.csrfToken === req.cookies.csrfToken) {
// 请求合法,处理逻辑...
} else {
// CSRF攻击检测,拒绝请求
res.status(403).send('Forbidden');
}
});
HTML ujung depan:
<form action="/submitForm" method="POST">
<!-- 其他表单字段... -->
<input type="hidden" name="csrfToken" value="{{csrfToken}}">
<button type="submit">Submit</button>
</form>
Harap diperhatikan bahwa kode di atas hanyalah contoh, dan aplikasi sebenarnya perlu disesuaikan dengan kerangka backend dan bahasa yang digunakan.