小白也能征服CSRF

Axios实战:前端HTTP请求与性能优化指南 HTTP客户端是前端开发中处理网络请求的核心工具,基于Promise的封装使其支持异步编程范式。Axios作为主流解决方案,通过拦截器机制实现请求/响应的统一处理,相比原生fetch API提供了自动JSON转换、CSRF防护等开箱即用的功能。在工程实践中,合理使用并发请求和实例配置可以显著提升页面加载性能,特别是在电商、金融等需要聚合多源数据的场景下。结合防抖技术和取消请求机制,能有效优化搜索建议等高频交互功能。安全方面,通过HTTPS强制、敏感数据过滤等配置,满足企业级应用的安全合规要求。 阅读详情
  • 英文:Cross Site Request Forgy
  • 中文:跨站请求伪造
  • 攻击者在其他的网站对目标网站产生了影响
CSRF攻击危害


  • 利用用户登录态
  • 用户不知情
  • 完成业务请求
  • 盗取用户资金(转账,消费)

就算警察寻找是谁,也只能找到用户,找不到攻击者,因为攻击者用的ip和cookie都是用户的。

CSRF攻击防御

csrf防御核心思想就是利用攻击者不会访问目标网站的前端,只会去访问目标网站的后端,所以如果在目标网站的前端增加验证信息,那就会有效防御csrf攻击,因为csrf无法获取这个验证信息,也就无法得到后端的正确响应。

第一种方法

禁止第三方网站携带cookie

在cookie中加一个same-site属性 但是兼容性很差,只有很少的浏览器兼容。

第二种方法

在前端页面加入验证信息,比如:
1. 验证码
2. 加入token

验证码

这需要前后端协同
1:前端加入验证码输入框。
2:后端为前端提供这个验证码,并且在提交的时候进行验证,还有后端还要记住这个验证码是什么,也就是保存下来,以便有第三方进行csrf攻击时进行判断。
node.js开发后端的话,有ccap这个插件可以用,它可以生成图形验证码。

这个可以有效防御csrf,但是每次都要让用户输入验证码进行验证,降低了用户体验。而且前端提交后,后端还要再校验一下验证码对不对。


token

token就是一个随机字符串,放在前端的请求内容中,也可以放在cookie中。

token生成机制:

// 后端要做的事情
// 随机生成token
var csrfToken = parseInt(Math.random() * 9999999, 10);

// 后端生成token并且保存在cookie中
ctx.cookies.set('csrfToken', csrfToken);


// 前端要做的事情
// 放置一个表单,不会显示出来,设置隐藏
<input name="csrfToken" value=csrfToken><input>
然后在相应的动作里进行判断:
function action(req, res){
    var data;
    if(req.method.toLowerCase() === 'post'){
      data = req.body;
    }else{
        data = req.query;
    }
    if(!data.crsfToken){
        throw new('csrf token is null');
    }else if(data.csrfToken !== req.cookies.get('csrfToken')){
        throw new('csrfToken 错误');
    }
}

使用token需要注意的地方

  • 如果是通过表单提交,则可以直接将token值放在表单里面提交。
  • 如果是ajax请求,则一般是通过将token放在页面的另外一个地方,比如放在meta中。
meta{name="csrf_token", content=csrfToken}

刷新后,在页面的head中多了一个meta,在ajax请求之前,就可以通过js把这个meta中的toke值取出来,一并发到后台去。

注意:

如果用户打开了很多页面或者很多提交表单,每个页面和表单都是对应不同的token,因为cookies里面只能放置一个token,用户提交只能是提交最后一个页面的token或者是最后一个表单的token,所以这个问题也比较特殊,如何处理。需要思考。


CSRF中的referer

referer是http协议中的一个请求头,来自攻击网站。所以还有一个防御方式:验证referer,禁止来自第三方网站的请求。

// 在相应的动作里
function action(req, res){
    var data;
    if(req.method.toLowerCase() === 'post'){
      data = req.body;
    }else{
        data = req.query;
    }
    var referer = res.headers.referer;
    // 通过使用indexOf判断
    if(referer indexOf('localhost') === '-1'){
        throw new('请求非法');
    }

    // 更好的做法是下面这个,因为referer是http://整个url地址,如果url其他部分有localhost,上面的表达式也可以被匹配到
    if(!/^http:\/\/localhost/.test(referer)){
        throw new('请求非法');
    }
}

这里面有几个注意的点:

  • 从本地磁盘访问,没有refere,因为是同域,可以将ftp改成http形式,比如http://127.0.0.1/
  • 通过http访问,有referer。

以上就是我个人对CSRF的理解,前端领域的Web安全所涉及到的内容是很多的,要多去学习和实践,才能更好的写出安全又没有漏洞的代码。

Pikachu靶场实战指南:从零到一,手把手教你玩转十大Web漏洞 本文提供了一份详尽的Pikachu靶场通关教程,手把手指导Web安全初学者从零搭建环境,并系统性地实战演练十大核心漏洞。内容涵盖SQL注入、XSS、文件上传、CSRF、越权等关键漏洞的原理、利用手法及防御策略,通过Burp Suite等工具演示,帮助读者构建从理论到实践的完整攻防知识体系。 阅读详情

相关推荐

从Zemax到Speos:HUD设计数据无缝迁移避坑指南(含STEP文件精度验证)

本文详细介绍了从Zemax到Speos的HUD设计数据无缝迁移方法,重点解决Zernike曲面参数保真、虚拟厚度设置和坐标系对齐等核心问题。通过STEP文件精度验证和工程化解决方案,帮助工程师避免数据迁移中的常见陷阱,提升HUD系统设计效率。适用于Ansys Zemax和Ansys Speos用户,优化光学性能验证流程。

h6i7j8的博客 1063

CSRF攻击

CSRF攻击产生的原因 (Cross Site Request Forgery, 跨站域请求伪造)是一种网络的攻击方式,它在 2007 年曾被列为互联网 20 大安全隐患之一,也被称为“One Click Attack”或者Session Riding,通常缩写为CSRF或者XSRF,是一种对网站的恶意利用也就是人们所知道的钓鱼网站。尽管听起来像跨站脚本(XSS),但它与XSS非常不同,并且攻击方...

xiaoming 326

PX4自定义uORB消息与MAVLink消息映射实战:从飞控到QGC地面站完整流程解析

本文详细解析PX4飞控中自定义uORB消息与MAVLink消息映射的完整流程,涵盖从飞控内部消息定义、MAVLink消息创建到QGC地面站接收显示的全链路实践。重点介绍如何使用mavlink inspector工具进行调试,解决版本兼容性和多实例消息处理等常见问题,为无人机开发者提供可靠的实时数据监控方案。

ll5678的博客 1067

CSRF漏洞(初步理解)

概念 Cross-site request forgery简称“CSRF”(跨站请求伪造)也被称为one-click attack 或者 session riding。 攻击思路 以淘宝为例,目的修改密码。 打开自己的淘宝,进入修改密码的页面,填写完信息后发送请求,然后把这个URL用抓包的方式获取下来,然后发送给对方。 成功的条件: 1.对方已经打开淘宝。 2.对方点击你的连接。 只要点击了这个...

qq_43814486的博客 779

【手把手教学】YOLOv13的Dilated Reparam Block (DRB) 实现细节与优化技巧

DRB(Dilated Reparam Block)是一种创新的卷积神经网络模块,通过多分支膨胀卷积和结构重参数化技术显著提升模型性能。训练阶段使用不同膨胀率和卷积核大小的并行分支增强特征提取能力,推理阶段则将这些分支融合为单一高效的大核卷积。该方法成功解决了大核卷积的计算复杂度和训练困难等问题,在保持推理效率的同时,使模型准确率提升8.56%,mAP暴涨12.33%。DRB的核心在于训练时复杂、推理时简单的设计哲学,以及膨胀卷积的多尺度特征提取能力,为CNN性能优化提供了新的思路。

FJN110的博客 556

TC3XX - MCAL知识点(九):PWM EB-tresos配置说明及代码浅析

脉冲宽度调制(PWM)驱动器负责提供与AUTOSAR指定的PWM信号生成相关的标准服务。PWM通道的底层定时器驱动是GTM (TOM或ATOM片)或CCU6 (T12或T13片)定时器通道。软硬件匹配关系如下:PWM直接引用的是GTM与CCU6模块,然后GTM与CCU6再关联到Port的,根据软硬件匹配关系,也能调用中断来使用,本例子没使用中断。CCU6是一个高分辨率的16位捕获和比较单元,具有特定的应用模式,主要用于交流驱动控制。特殊的工作模式支持控制无刷直流电机使用霍尔传感器或反电动势检测。

梦想技术家 2886

Python模拟登陆 —— 征服验证码 4 果壳

果壳的特殊之处是有隐藏的随机token令牌, 登录界面 查看源代码: 隐藏的令牌 import sys import os.path import http.cookiejar import requests from bs4 import BeautifulSoup login_...

weixin_33875564的博客 189

【WebRTC】【Unity】Unity Web RTC1-Unity中简单实现远程画面

平台:基本常用平台包括安卓,苹果(max和IOS),Windows64,Linux都行。10. 注意,如果从移动设备浏览器连接服务,信令服务器的SSL证书一定要先设好。想要在Unity中实现实时远程桌面,找到了Render Streaming这个手段,本篇介绍相应的使用方法和实例。8. 打开电脑浏览器,地址栏输入http://127.0.0.1,点击Receiver Sample。新建Unity项目,模板选Third Person,Project Name随意。启动App,控制台出现如下信息表示成功。

每日出拳老爷子的博客 2518

征服Spring Boot 阿里程序员推荐的这份全家桶系列笔记,透彻,必须死磕!

针对最近很多人都在面试,我这边也整理了相当多的面试专题资料,也有其他大厂的面经。希望可以帮助到大家。最新整理面试题上述的面试题答案都整理成文档笔记。也还整理了一些面试资料&最新2021收集的一些大厂的面试真题最新整理电子书最新整理大厂面试文档以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取![外链图片转存中…(img-W22mAyQU-1713680691428)]

afsdfrsg的博客 850

C和C++Everything教程的简介

C和C++Everything教程的简介 C和C++Everything教程,该专栏目前已有8000博文,订阅该专栏相当于同时订阅以下所有收费专栏

希望我的博客,能帮上你解决学习中工作中所遇到的问题 4389

多模态论文笔记——CogVLM和CogVLM2

本文详细介绍LoRA版本的多模态模型——CogVLM和CogVLM2。在SD3中使用其作为captioner基准模型的原因和优势。

haopinglianlian的博客 2203

防止伪造跨站请求

关联: 征服 Ajax 应用程序的安全威胁 AJAX 跨域请求 - JSONP获取JSON数据   跨站脚本 在媒体的帮助下,跨站脚本(XSS)成为了大家关注的焦点,当然它是绝对应当关注的。XSS 是 web 应用中最常见的安全隐患,许多流行的开放源代码的 PHP 应用程序受到 XSS 隐患的困扰。 XSS 攻击发生在下面的情况下: 对于...

Just Code 226

SaaS/PaaS/laaS,私有化/云部署,低代码

本人背景,211计科专业22年毕业,毕业后通过校招进入一家游戏公司工作到去年(23)九月,部门效益不佳被裁员了,回来考研,考完就知道考不上了,年底准备准备面试材。福建双非,计算机科学与技术,排名几乎垫底,项目垃圾,没有奖项(专业相关),有一段半年的互联网中厂(朴朴)实习(测试,四个月转正,签完offer两个月被裁)。双非本科24届,有两段前端实习,两段都参杂着一些产品的工作,比如第一段前端用过墨刀设计产品原型,第二段写过各种开发文档,需求文档之类的。

每天多一点干货 1143

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

《零基础学 PHP:从入门到实战》·模块十三:征服数据库:PHP 高级开发、性能优化与架构初探-深度防御 SQL 注入与其他 Web 安全威胁

本章深入探讨了Web应用安全防护,重点剖析SQL注入、XSS和CSRF三大威胁。首先系统讲解了SQL注入的高级攻击手法,包括错误注入、布尔盲注、时间盲注和堆叠查询等技术原理。随后提出以预处理语句为核心的纵深防御体系,强调输入验证、最小权限原则和错误信息屏蔽的多层防护策略。针对XSS攻击,详细分析反射型、存储型和DOM型三类XSS,并介绍输出转义和CSP等防御手段。对于CSRF攻击,则重点讲解Token验证机制的核心防护原理。通过代码示例展示易受攻击的登录页面实现方式,为后续安全防护实践奠定基础。

zwh821的博客 1010

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

2024年最全今天面了个阿里大老,基础扎实,当场给40K的offer,征服Java面试官

在面试前我整理归纳了一些面试学习资料,文中结合我的朋友同学面试美团滴滴这类大厂的资料及案例由于篇幅限制,文档的详解资料太全面,细节内容太多,所以只把部分知识点截图出来粗略的介绍,每个小节点里面都有更细化的内容!大家看完有什么不懂的可以在下方留言讨论也可以关注。本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录需要这份系统化的资料的朋友,可以点击这里获取12.普通类和抽象类有哪些区别?13.抽象类能使用 final 修饰吗?

2401_84584831的博客 492

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

SpringSecurity(一)前言以及框架介绍

本节将讨论Spring Security和Spring家族的联系,通过官网可以得知,Spring Security被描述为一种用于身份验证和访问控制的强大且高度可定制的框架,简言之,它就是一个极大简化了的让Spring程序具备安全性保障的框架。你可以在获得其源码。如果要使用Spring Security,至少需要Java 8.

学习不止境的博客 2356

2022手把手教你Java面试通关BAT

金三银四俗称跳槽黄金季,很多同学都想趁着这段时间拿高薪,去更牛逼的公司工作,认识更多大牛,提升自己的职场竞争力。 那怎样才能通过BAT面试官的考核?怎样成为一名Offer收割机? 之前讲过收割Offer有一个最直接的公示:Offer=硬实力*软实力*好的心态,三者缺一不可。 1.技术硬实力 这里说的硬实力,也就是技术上的真实积累。 怎么来体现你的技术实力?我总的分为:技术深度和技术广度这两方面。 技术广度通俗的讲,就是你熟悉该技术点的使用以及基本原理。一般面试官在面试首轮会问很多技术点,来考核你

uuqaz的博客 284

Spring Security保姆级通关教程!零基础也能玩转系统安全,从此告别裸奔接口!

摘要:Spring Security 保姆级实战教程 Spring Security 是 Spring 生态中强大的安全框架,提供认证、授权及多种安全防护功能。本文通过生动比喻(如城堡守卫)解析其核心机制,并给出5分钟快速集成指南:仅需添加依赖即可开启默认安全防护(随机密码输出在控制台)。实战部分详细演示如何自定义安全规则,包括密码加密、基于角色的访问控制及登录/登出配置。教程强调生产环境注意事项(如避免使用默认账户),适合各层次开发者快速提升应用安全性,告别数据泄露与未授权访问风险。

weixin_58375621的博客 916

2024年2024前端 面试题集(3),2024年最新爱奇艺面试技巧

TCP协议开源分享:【大厂前端面试题解析+核心总结学习笔记+真实项目实战+最新讲解视频】20道JS原理题助你面试一臂之力几道高级前端面试题解析地表最强面试图谱前端面试中的常见的算法问题一篇文章搞定前端面试【面试篇】寒冬求职季之你必须要懂的原生JS(上)【面试篇】寒冬求职季之你必须要懂的原生JS(中)面试题面试官系列(1): 如何实现深克隆面试官系列(2): Event Bus的实现面试官系列(3): 前端路由的实现面试官系列(4): 基于Proxy 数据劫持的双向绑定优势所在面试官系列(5): 你为什么使用

2401_84419009的博客 765

一张神图秒懂前端必备技能-我会5%

相关资料:思维导图:python字符串思维导图:4张Python爬虫下载思维导图:通关python列表思维导图:git思维导图:通关python字典python标准库6张思维导图学明白...

bigzql的博客 2014

Flask如何处理表单提交的数据

使用WTForms库定义表单类,WTForms是一个用于处理Web表单的库,它提供了丰富的表单字段和验证器。你可以通过继承FlaskForm(对于Flask 1.x及更高版本)或Form(对于较旧版本)来创建表单类,并在其中定义表单字段和验证规则。

Flask Web 943
上一篇: 知乎各位前端工程师的感悟【个人总结精华版】
下一篇: 使用fiddler进行调试线上代码
杨不败
博客等级 码龄10年 46粉丝 87原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值