CSRF(Cross-Site Request Forgery,跨站请求伪造)是一种常见的网络安全威胁,攻击者通过诱使用户在已认证的网站上执行非预期的操作。为了防止这种攻击,通常会使用CSRF Token。
CSRF Token是一个随机生成的唯一标识符,服务器在用户登录后生成并存储在用户的Session中。每次用户提交表单时,都需要同时提交这个Token,服务器会验证Token的有效性,从而确保请求是合法的。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>CSRF Token Example</title>
</head>
<body>
<form id="csrfForm" action="/submit" method="POST">
<input type="hidden" id="csrfToken" name="csrfToken" value="">
<input type="text" name="data" placeholder="Enter data">
<button type="submit">Submit</button>
</form>
<script>
// 获取CSRF Token
fetch('/get-csrf-token')
.then(response => response.json())
.then(data => {
document.getElementById('csrfToken').value = data.csrfToken;
});
</script>
</body>
</html>
const express = require('express');
const session = require('express-session');
const crypto = require('crypto');
const app = express();
app.use(session({
secret: 'your-secret-key',
resave: false,
saveUninitialized: true
}));
// 生成CSRF Token
app.get('/get-csrf-token', (req, res) => {
if (!req.session.csrfToken) {
req.session.csrfToken = crypto.randomBytes(16).toString('hex');
}
res.json({ csrfToken: req.session.csrfToken });
});
// 验证CSRF Token
app.post('/submit', (req, res) => {
if (req.body.csrfToken !== req.session.csrfToken) {
return res.status(403).send('Invalid CSRF Token');
}
// 处理表单数据
res.send('Form submitted successfully');
});
app.listen(3000, () => {
console.log('Server is running on port 3000');
});
通过以上措施,可以有效防止CSRF攻击,提高Web应用的安全性。