網站首頁 編程語言 正文
防??站受第三?服務器的惡意攻擊,csrf相當于在表達中增加了?個隱藏的input框,?于向服務器提交?個唯一的隨機字符串?于服務器驗證表單是否是本服務器的表單。
在settings中我們設置過這個中間件,默認是開啟的,我們可以注釋掉并不開啟
MIDDLEWARE = [
'django.middleware.csrf.CsrfViewMiddleware',
]
一、前后端不分離
我們開啟的情況下可以設置一下我們的表單
<form action="" method="post">
{% csrf_token %}
<input type="text" name="username">
<input type="submit">
form>
這樣的話我們的表單會自動提交這個csrf,但是現在已經很少使用submit直接提交了,我們可以使用JS進行提交
<form method="POST" action="/csrf1.html">
{% csrf_token %}
<input id="username" type="text" name="username" />
<input type="submit" value="提交"/>
<a onclick="submitForm();">Ajax提交a>
form>
<script src="/static/jquery-1.12.4.js">script>
<script>
function submitForm(){
var csrf = $('input[name="csrfmiddlewaretoken"]').val();
var user = $('#user').val();
$.ajax({
url: '/csrf1.html',
type: 'POST',
data: { "user":user,'csrfmiddlewaretoken': csrf},
success:function(data){
console.log('OK');
}
})
}
script>
二、跨域問題
?個?站不能使?ajax來訪問另?個?站的數據,這樣的話會被瀏覽器給阻止,這個問題我們通常叫做跨域問題,哪怕是同一域名下的二級域名都不可以
域名的組成 http://www.google.com:80/index.html
http:// 協議
www 子域名
google 主域名
80 端口號
index.html 請求的地址
當協議、?域名、主域名、端?號中任意?個不相同時,都算不同的“域”,不同的域之間相互請求資源,就叫“跨域”。
三、前后端分離
對于前后端分離項目,我們就很難將生成的scrf字符串返回給前端,所以我們需要一個模塊
pip install django-cors-headers
設置
#在INSTALLED_APPS?添加“corsheaders”
INSTALLED_APPS = [
'corsheaders',
]
#在MIDDLEWARE_CLASSES添加,這個中間件的位置不要改,否則會出bug
MIDDLEWARE_CLASSES = [
'corsheaders.middleware.CorsMiddleware',
'django.middleware.common.CommonMiddleware',
]
# 處理跨域
# 添加允許執行跨站點請求的主機
CORS_ALLOW_CREDENTIALS = True
CORS_ORIGIN_ALLOW_ALL = True
# 授權進行跨站點HTTP請求的來源列表
CORS_ORIGIN_WHITELIST = [
'http://127.0.0.1',
'http://localhost',
]
# 允許的方法
CORS_ALLOW_METHODS = [
'DELETE',
'GET',
'OPTIONS',
'PATCH',
'POST',
'PUT',
]
# 發出實際請求時可以使用的非標準HTTP標頭的列表
CORS_ALLOW_HEADERS = (
'XMLHttpRequest',
'X_FILENAME',
'accept-encoding',
'authorization',
'content-type',
'dnt',
'origin',
'user-agent',
'x-csrftoken',
'x-requested-with',
)
原文鏈接:https://blog.csdn.net/weixin_43903639/article/details/122886598
相關推薦
- 2022-09-18 Go語言實現服務端消息接收和發送_Golang
- 2022-12-11 Rust中Cargo的使用詳解_Rust語言
- 2022-05-29 Docker向數據卷Volume寫入數據_docker
- 2023-05-23 numpy中的掩碼數組的使用_python
- 2024-04-06 npm install安裝插件很慢,解決方法
- 2022-12-01 SQL?Server修改數據的幾種語句詳解_MsSql
- 2022-09-29 關于React動態修改元素樣式的三種方式_React
- 2022-11-12 C++設計與實現ORM系統實例詳解_C 語言
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支