首页 文章 精选 留言 我的

精选列表

搜索[白金认证],共10003篇文章
优秀的个人博客,低调大师

详解Django的CSRF认证

1.csrf原理 csrf要求发送post,put或delete请求的时候,是先以get方式发送请求,服务端响应时会分配一个随机字符串给客户端,客户端第二次发送post,put或delete请求时携带上次分配的随机字符串到服务端进行校验 2.Django中的CSRF中间件 首先,我们知道Django中间件作用于整个项目。 在一个项目中,如果想对全局所有视图函数或视图类起作用时,就可以在中间件中实现,比如想实现用户登录判断,基于用户的权限管理(RBAC)等都可以在Django中间件中来进行操作 Django内置了很多中间件,其中之一就是CSRF中间件 MIDDLEWARE_CLASSES = [ 'django.middleware.security.SecurityMiddleware', 'django.contrib.sessions.middleware.SessionMiddleware', 'django.middleware.common.CommonMiddleware', 'django.middleware.csrf.CsrfViewMiddleware', 'django.contrib.auth.middleware.AuthenticationMiddleware', 'django.contrib.auth.middleware.SessionAuthenticationMiddleware', 'django.contrib.messages.middleware.MessageMiddleware', 'django.middleware.clickjacking.XFrameOptionsMiddleware', ] 上面第四个就是Django内置的CSRF中间件 3.Django中间件的执行流程 Django中间件中最多可以定义5个方法 process_request process_response process_view process_exception process_template_response Django中间件的执行顺序 1.请求进入到Django后,会按中间件的注册顺序执行每个中间件中的process_request方法 如果所有的中间件的process_request方法都没有定义return语句,则进入路由映射,进行url匹配 否则直接执行return语句,返回响应给客户端 2.依次按顺序执行中间件中的process_view方法 如果某个中间件的process_view方法没有return语句,则根据第1步中匹配到的URL执行对应的视图函数或视图类 如果某个中间件的process_view方法中定义了return语句,则后面的视图函数或视图类不会执行,程序会直接返回 3.视图函数或视图类执行完成之后,会按照中间件的注册顺序逆序执行中间件中的process_response方法 如果中间件中定义了return语句,程序会正常执行,把视图函数或视图类的执行结果返回给客户端 否则程序会抛出异常 4.程序在视图函数或视图类的正常执行过程中 如果出现异常,则会执行按顺序执行中间件中的process_exception方法 否则process_exception方法不会执行 如果某个中间件的process_exception方法中定义了return语句,则后面的中间件中的process_exception方法不会继续执行了 5.如果视图函数或视图类中使用render方法来向客户端返回数据,则会触发中间件中的process_template_response方法 4.Django CSRF中间件的源码解析 Django CSRF中间件的源码 class CsrfViewMiddleware(MiddlewareMixin): def _accept(self, request): request.csrf_processing_done = True return None def _reject(self, request, reason): logger.warning( 'Forbidden (%s): %s', reason, request.path, extra={ 'status_code': 403, 'request': request, } ) return _get_failure_view()(request, reason=reason) def _get_token(self, request): if settings.CSRF_USE_SESSIONS: try: return request.session.get(CSRF_SESSION_KEY) except AttributeError: raise ImproperlyConfigured( 'CSRF_USE_SESSIONS is enabled, but request.session is not ' 'set. SessionMiddleware must appear before CsrfViewMiddleware ' 'in MIDDLEWARE%s.' % ('_CLASSES' if settings.MIDDLEWARE is None else '') ) else: try: cookie_token = request.COOKIES[settings.CSRF_COOKIE_NAME] except KeyError: return None csrf_token = _sanitize_token(cookie_token) if csrf_token != cookie_token: # Cookie token needed to be replaced; # the cookie needs to be reset. request.csrf_cookie_needs_reset = True return csrf_token def _set_token(self, request, response): if settings.CSRF_USE_SESSIONS: request.session[CSRF_SESSION_KEY] = request.META['CSRF_COOKIE'] else: response.set_cookie( settings.CSRF_COOKIE_NAME, request.META['CSRF_COOKIE'], max_age=settings.CSRF_COOKIE_AGE, domain=settings.CSRF_COOKIE_DOMAIN, path=settings.CSRF_COOKIE_PATH, secure=settings.CSRF_COOKIE_SECURE, httponly=settings.CSRF_COOKIE_HTTPONLY, ) patch_vary_headers(response, ('Cookie',)) def process_request(self, request): csrf_token = self._get_token(request) if csrf_token is not None: # Use same token next time. request.META['CSRF_COOKIE'] = csrf_token def process_view(self, request, callback, callback_args, callback_kwargs): if getattr(request, 'csrf_processing_done', False): return None if getattr(callback, 'csrf_exempt', False): return None if request.method not in ('GET', 'HEAD', 'OPTIONS', 'TRACE'): if getattr(request, '_dont_enforce_csrf_checks', False): return self._accept(request) if request.is_secure(): referer = force_text( request.META.get('HTTP_REFERER'), strings_only=True, errors='replace' ) if referer is None: return self._reject(request, REASON_NO_REFERER) referer = urlparse(referer) if '' in (referer.scheme, referer.netloc): return self._reject(request, REASON_MALFORMED_REFERER) if referer.scheme != 'https': return self._reject(request, REASON_INSECURE_REFERER) good_referer = ( settings.SESSION_COOKIE_DOMAIN if settings.CSRF_USE_SESSIONS else settings.CSRF_COOKIE_DOMAIN ) if good_referer is not None: server_port = request.get_port() if server_port not in ('443', '80'): good_referer = '%s:%s' % (good_referer, server_port) else: good_referer = request.get_host() good_hosts = list(settings.CSRF_TRUSTED_ORIGINS) good_hosts.append(good_referer) if not any(is_same_domain(referer.netloc, host) for host in good_hosts): reason = REASON_BAD_REFERER % referer.geturl() return self._reject(request, reason) csrf_token = request.META.get('CSRF_COOKIE') if csrf_token is None: return self._reject(request, REASON_NO_CSRF_COOKIE) request_csrf_token = "" if request.method == "POST": try: request_csrf_token = request.POST.get('csrfmiddlewaretoken', '') except IOError: pass if request_csrf_token == "": request_csrf_token = request.META.get(settings.CSRF_HEADER_NAME, '') request_csrf_token = _sanitize_token(request_csrf_token) if not _compare_salted_tokens(request_csrf_token, csrf_token): return self._reject(request, REASON_BAD_TOKEN) return self._accept(request) def process_response(self, request, response): if not getattr(request, 'csrf_cookie_needs_reset', False): if getattr(response, 'csrf_cookie_set', False): return response if not request.META.get("CSRF_COOKIE_USED", False): return response self._set_token(request, response) response.csrf_cookie_set = True return response 从上面的源码中可以看到,CsrfViewMiddleware中间件中定义了process_request,process_view和process_response三个方法 先来看process_request方法 def _get_token(self, request): if settings.CSRF_USE_SESSIONS: try: return request.session.get(CSRF_SESSION_KEY) except AttributeError: raise ImproperlyConfigured( 'CSRF_USE_SESSIONS is enabled, but request.session is not ' 'set. SessionMiddleware must appear before CsrfViewMiddleware ' 'in MIDDLEWARE%s.' % ('_CLASSES' if settings.MIDDLEWARE is None else '') ) else: try: cookie_token = request.COOKIES[settings.CSRF_COOKIE_NAME] except KeyError: return None csrf_token = _sanitize_token(cookie_token) if csrf_token != cookie_token: # Cookie token needed to be replaced; # the cookie needs to be reset. request.csrf_cookie_needs_reset = True return csrf_token def process_request(self, request): csrf_token = self._get_token(request) if csrf_token is not None: # Use same token next time. request.META['CSRF_COOKIE'] = csrf_token 从Django项目配置文件夹中读取CSRF_USE_SESSIONS的值,如果获取成功,则从session中读取CSRF_SESSION_KEY的值,默认为'_csrftoken',如果没有获取到CSRF_USE_SESSIONS的值,则从发送过来的请求中获取CSRF_COOKIE_NAME的值,如果没有定义则返回None。 再来看process_view方法 在process_view方法中,先检查视图函数是否被csrf_exempt装饰器装饰,如果视图函数没有被csrf_exempt装饰器装饰,则程序继续执行,否则返回None。接着从request请求头中或者cookie中获取携带的token并进行验证,验证通过才会继续执行与URL匹配的视图函数,否则就返回403 Forbidden错误。 实际项目中,会在发送POST,PUT,DELETE,PATCH请求时,在提交的form表单中添加 {% csrf_token %} 即可,否则会出现403的错误 5.csrf_exempt装饰器和csrf_protect装饰器 5.1 基于Django FBV 在一个项目中,如果注册起用了CsrfViewMiddleware中间件,则项目中所有的视图函数和视图类在执行过程中都要进行CSRF验证。 此时想使某个视图函数或视图类不进行CSRF验证,则可以使用csrf_exempt装饰器装饰不想进行CSRF验证的视图函数 from django.views.decorators.csrf import csrf_exempt @csrf_exempt def index(request): pass 也可以把csrf_exempt装饰器直接加在URL路由映射中,使某个视图函数不经过CSRF验证 from django.views.decorators.csrf import csrf_exempt from users import views urlpatterns = [ url(r'^admin/', admin.site.urls), url(r'^index/',csrf_exempt(views.index)), ] 同样的,如果在一个Django项目中,没有注册起用CsrfViewMiddleware中间件,但是想让某个视图函数进行CSRF验证,则可以使用csrf_protect装饰器 csrf_protect装饰器的用法跟csrf_exempt装饰器用法相同,都可以加上视图函数上方装饰视图函数或者在URL路由映射中直接装饰视图函数 from django.views.decorators.csrf import csrf_exempt @csrf_protect def index(request): pass 或者 from django.views.decorators.csrf import csrf_protect from users import views urlpatterns = [ url(r'^admin/', admin.site.urls), url(r'^index/',csrf_protect(views.index)), ] 5.1 基于Django CBV 上面的情况是基于Django FBV的,如果是基于Django CBV,则不可以直接加在视图类的视图函数中了 此时有三种方式来对Django CBV进行CSRF验证或者不进行CSRF验证 方法一,在视图类中定义dispatch方法,为dispatch方法加csrf_exempt装饰器 from django.views.decorators.csrf import csrf_exempt from django.utils.decorators import method_decorator class UserAuthView(View): @method_decorator(csrf_exempt) def dispatch(self, request, *args, **kwargs): return super(UserAuthView,self).dispatch(request,*args,**kwargs) def get(self,request,*args,**kwargs): pass def post(self,request,*args,**kwargs): pass def put(self,request,*args,**kwargs): pass def delete(self,request,*args,**kwargs): pass 方法二:为视图类上方添加装饰器 @method_decorator(csrf_exempt,name='dispatch') class UserAuthView(View): def get(self,request,*args,**kwargs): pass def post(self,request,*args,**kwargs): pass def put(self,request,*args,**kwargs): pass def delete(self,request,*args,**kwargs): pass 方式三:在url.py中为类添加装饰器 from django.views.decorators.csrf import csrf_exempt urlpatterns = [ url(r'^admin/', admin.site.urls), url(r'^auth/', csrf_exempt(views.UserAuthView.as_view())), ] csrf_protect装饰器的用法跟上面一样

优秀的个人博客,低调大师

Linux ssh免密钥认证

hadoop和ansible都需要这个东西,其实很简单。 第一,在需要免秘钥登录的机器上生成公钥和私钥: 1 ssh -keygen 第二,拷贝生成的公钥id_rsa.pub到远程机器上: 1 ssh -copy- id -i /root/ . ssh /id_rsa .pubroot@192.168.0.247 #用此方式拷贝的好处是不用改名 这时再登录192.168.0.247的机器就无需密码了。 1 2 3 [root@zabbix_server~] #ssh192.168.0.247 Lastlogin:MonNov2813:48:332016from192.168.0.3 [root@localhost~] # 如果是普通账号免登录则需先切换普通账号,然后再生成公钥和私钥。 本文转自 王家东哥 51CTO博客,原文链接:http://blog.51cto.com/xiaodongge/1877339

优秀的个人博客,低调大师

Jetski - MCP 分析和认证平台

Jetski 是一个开源 MCP 分析和身份验证平台,隶属于 HyprMCP。它解决了团队在开发 MCP 服务器时面临的三大问题,且无需修改任何代码: 安装和设置:大多数用户从未完成过设置。他们找不到客户端说明,或者无法在浏览器中打开您的 MCP 网址,因此立即流失。 身份验证:识别用户并为他们提供正确的工具和响应仍然很难实现。 日志、分析和可见性:无法了解你的 MCP 如何使用、哪些提示触发哪些工具或为什么会发生错误。 平台管理和部署位于你的 MCP 服务器前端的mcp-gateway实例,并处理复杂的事务。它还收集并汇总网关捕获的所有分析和指标数据。 Jetski 仍在积极开发中,尚处于起步阶段。API 和命令行界面可能会以向后不兼容的方式发生变化。 特点 全面的提示分析查看哪些提示触发了哪些工具、来自哪些客户端以及发生了什么。全面了解你的 MCP 服务器使用模式,并实时了解用户如何与你的工具交互。 自动生成的设置说明,帮助用户轻松连接到客户端。为每个支持的 MCP 客户端自动生成清晰的分步说明,消除用户在入门过程中流失的首要原因。 零代码身份验证,无需编写任何代码即可安全地识别和管理用户。代理可处理所有身份验证逻辑,让你能够根据用户身份提供个性化的工具和响应。 实时调试日志即时调试问题并实时了解服务器行为。查看每个请求、响应和错误的详细日志,轻松快速地识别和修复问题。

优秀的个人博客,低调大师

微信开发之token认证

服务器配置如下 package com.dongpeng; import java.security.MessageDigest; import java.util.Arrays; import javax.servlet.http.HttpServletResponse; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.ResponseBody; @Controller @SpringBootApplication public class Application { public static final String TOKEN = "lianghao_token"; @RequestMapping("/") @ResponseBody public void index(String signature, String timestamp, String nonce, String echostr,HttpServletResponse response)throws Exception { System.out.println("signature:" + signature); System.out.println("timestamp:" + timestamp); System.out.println("nonce:" + nonce); System.out.println("echostr:" + echostr); System.out.println("TOKEN:" + TOKEN); String[] params = new String[] { TOKEN, timestamp, nonce }; Arrays.sort(params); // 将三个参数字符串拼接成一个字符串进行sha1加密 String clearText = params[0] + params[1] + params[2]; String algorithm = "SHA-1"; String sign = new String(org.apache.commons.codec.binary.Hex .encodeHex(MessageDigest.getInstance(algorithm).digest((clearText).getBytes()), true)); // 开发者获得加密后的字符串可与signature对比,标识该请求来源于微信 if (signature.equals(sign)) { response.getWriter().print(echostr); } } public static void main(String[] args) throws Exception { SpringApplication.run(Application.class, args); } } 配置服务端后,提交下面信息 才能成功提交

资源下载

更多资源
Mario

Mario

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

Nacos

Nacos

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service 的首字母简称,一个易于构建 AI Agent 应用的动态服务发现、配置管理和AI智能体管理平台。Nacos 致力于帮助您发现、配置和管理微服务及AI智能体应用。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据、流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。

Spring

Spring

Spring框架(Spring Framework)是由Rod Johnson于2002年提出的开源Java企业级应用框架,旨在通过使用JavaBean替代传统EJB实现方式降低企业级编程开发的复杂性。该框架基于简单性、可测试性和松耦合性设计理念,提供核心容器、应用上下文、数据访问集成等模块,支持整合Hibernate、Struts等第三方框架,其适用范围不仅限于服务器端开发,绝大多数Java应用均可从中受益。

Rocky Linux

Rocky Linux

Rocky Linux(中文名:洛基)是由Gregory Kurtzer于2020年12月发起的企业级Linux发行版,作为CentOS稳定版停止维护后与RHEL(Red Hat Enterprise Linux)完全兼容的开源替代方案,由社区拥有并管理,支持x86_64、aarch64等架构。其通过重新编译RHEL源代码提供长期稳定性,采用模块化包装和SELinux安全架构,默认包含GNOME桌面环境及XFS文件系统,支持十年生命周期更新。

用户登录
用户注册