防伪机制(CSRF防护)是Web应用中保护用户免受跨站请求伪造攻击的安全措施。当通过Ajax或AngularJS等前端技术发起请求时,需要特别考虑如何实现有效的防伪保护。
// 服务器端生成令牌并设置到Cookie和meta标签
<meta name="csrf-token" content="{{ csrf_token() }}">
// Ajax请求时从meta标签获取令牌
$.ajaxSetup({
headers: {
'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')
}
});
// 发起Ajax请求
$.ajax({
url: '/api/data',
type: 'POST',
data: { /* 请求数据 */ },
success: function(response) {
// 处理响应
}
});
// 服务器设置CSRF Cookie
// 客户端JavaScript读取Cookie并设置请求头
function getCookie(name) {
let cookieValue = null;
if (document.cookie && document.cookie !== '') {
const cookies = document.cookie.split(';');
for (let i = 0; i < cookies.length; i++) {
const cookie = cookies[i].trim();
if (cookie.substring(0, name.length + 1) === (name + '=')) {
cookieValue = decodeURIComponent(cookie.substring(name.length + 1));
break;
}
}
}
return cookieValue;
}
const csrfToken = getCookie('csrftoken');
fetch('/api/endpoint', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'X-CSRFToken': csrfToken
},
body: JSON.stringify({ /* 数据 */ })
});
angular.module('app', [])
.config(function($httpProvider) {
$httpProvider.defaults.xsrfCookieName = 'csrftoken';
$httpProvider.defaults.xsrfHeaderName = 'X-CSRFToken';
})
.controller('MainCtrl', function($http) {
$http.post('/api/data', { /* 数据 */ })
.then(function(response) {
// 处理响应
});
});
angular.module('app', [])
.factory('csrfInterceptor', function() {
return {
request: function(config) {
const csrfToken = document.cookie.replace(
/(?:(?:^|.*;\s*)csrftoken\s*\=\s*([^;]*).*$)|^.*$/, "$1"
);
if (csrfToken && ['POST', 'PUT', 'DELETE'].includes(config.method)) {
config.headers['X-CSRFToken'] = csrfToken;
}
return config;
}
};
})
.config(function($httpProvider) {
$httpProvider.interceptors.push('csrfInterceptor');
});
原因:客户端发送的令牌与服务器存储的不一致 解决:
原因:CORS策略限制 解决:
原因:SameSite或HttpOnly属性配置不当 解决:
通过合理实现这些防伪机制,可以有效保护Web应用免受CSRF攻击,同时保持Ajax和AngularJS应用的流畅用户体验。
没有搜到相关的沙龙