CSRF攻击

简介 CSRF攻击利用了受害者已经通过身份验证并且在一个网站上建立的有效会话,来执行未经授权的操作。当受害者在一个网站上登录并获得一个会话(例如通过使用用户名和密码进行身份验证),该网站会为其分配一个令牌或会话ID,以便在后续的请求中验证用户的身份。 CSRF攻击者会通过诱使受害者访问一个恶意网站或点击恶意链接,来利用受害者的已验证会话。由于受害者在浏览器中仍然保持着有效会话,攻击者可以构造特制的请求,以利用该会话来执行恶意操作,而这些操作是受害者并不知情或未经授权的。 例如,假设受害者在银行网站上登录并建立了一个有效的会话。攻击者可以通过电子邮件或社交媒体发送一个包含恶意链接的消息给受害者。如果受害者点击了该链接,他们的浏览器将自动向银行网站发送一个请求,而这个请求中包含了受害者的有效会话信息。银行网站在验证会话时会认为这个请求是合法的,因为会话是有效的,所以它执行了该请求所代表的操作,如转账、修改账户信息等,而受害者是毫不知情的。 CSRF攻击的目标是利用受害者的已验证会话来执行攻击者所期望的未经授权操作,从而导致受害者的损失或者对系统的安全产生威胁。 补充知识 cookie 一般情况下,cookie是以键值对进行表示的(key-value),例如name=jack,这个就表示cookie的名字是name,cookie携带的值是jack。 cookie有2种存储方式,一种是会话性,一种是持久性。 会话性:如果cookie为会话性,那么cookie仅会保存在客户端的内存中,当我们关闭客服端时cookie也就失效了 持久性:如果cookie为持久性,那么cookie会保存在用户的硬盘中,直至生存期结束或者用户主动将其销毁。 组成 (1)cookie名称 (2)cookie值 (3)Expires:过期时间。当过了过期时间后,浏览器会将该cookie删除。如果不设置Expires,则关闭浏览器后该cookie失效。 (4)Path:用来设置在路径下面的页面才可以访问该cookie,一般设为/,以表示同一站点的所有页面都可以访问该cookie。 (5)Domain:用来指定哪些子域才可以访问cookie,格式一般为“.XXX.com” (6)Secure:如果设置了secure没有值,则代表只有使用HTTPS协议才可以访问 (7)HttpOnly:如果在cookie中设置了HttpOnly属性,那么通过JavaScript脚本等将无法读取到cookie信息。 URL URL(统一资源定位符)的一般格式如下: scheme://host:port/path?query_parameters#fragment_identifier 具体解释如下: Scheme(协议):指定用于访问资源的协议,例如HTTP、HTTPS、FTP等。它是URL的开头部分,通常以双斜杠(//)结尾。 Host(主机):指定目标资源所在的主机名或IP地址。主机名可以是域名(例如example.com)或IP地址(例如192.168.0.1)。 Port(端口):指定用于访问目标资源的端口号(可选)。默认的端口号根据协议而不同,如HTTP默认端口是80,HTTPS默认端口是443。如果URL中没有指定端口,将使用默认端口。 Path(路径):指定资源在服务器上的路径(可选)。路径部分是指服务器上资源的具体位置,可以是文件路径或目录路径。 Query Parameters(查询参数):包含在URL中的键值对参数(可选)。查询参数通常用于向服务器传递额外的信息,多个参数之间使用"&“符号分隔。 Fragment Identifier(片段标识符):用于标识文档中的特定片段(可选)。片段标识符通常由一个锚点或特定位置的标识符组成,用于在文档中导航到指定位置。 实验过程 使用Flask框架进行构建web应用。 文件架构 ├── web-csrf/ │ ├── webA.py │ ├── webB.py │ ├── templates/ │ │ ├── home.html │ │ ├── login.html │ └── static/ │ └── style.css 源码 webA: # webA.py import hashlib import re import mysql.connector from flask import Flask, request, render_template, make_response app = Flask(__name__) db = mysql....

May 21, 2023 · 4 min · 800 words · sirius1y

k8s学习和实践:腾讯云轻量级服务器上搭建网站

Service类型 在 Kubernetes 中,Service 是一种抽象的概念,用于将一组 Pod 组织在一起,并为它们提供统一的访问入口。Service 可以通过一组稳定的 IP 地址和端口号,为其他容器或外部用户提供对这些 Pod 的访问。 为什么需要服务? pod的存在是短暂的,当pod因为节点故障或者人为原因下线的时候,ReplicationController可以上线一个新的pod。但是新的pod和原来的pod的IP是不相同的——为了解决不断变化的pod IP地址的问题,以及在一个固定的IP和端口对外暴露多个pod。 当一个服务被创建时,他会得到一个静态的IP,在服务的生命周期中这个IP不会发生变化。客户端应该通过这个固定IP地址连接到服务,而不是直接连接到pod。 服务的类型 Kubernetes 中的 Service 有以下四种类型: 1、ClusterIP 这是默认的 Service 类型,用于将 Service 暴露在集群内部。它为每个 Service 分配一个虚拟 IP 地址,可以通过该地址访问 Service 中的 Pod。ClusterIP 只能从集群内部访问,不能从集群外部访问。 2、NodePort 这种类型的 Service 将 Service 暴露到集群外部,通过将每个节点上的端口映射到 Service 上,可以让外部用户通过任意节点的 IP 地址和映射端口访问 Service 中的 Pod。NodePort 通常用于测试和开发环境,不太适合生产环境。 3、LoadBalancer 这种类型的 Service 可以将 Service 暴露到集群外部,并使用云提供商的负载均衡器将流量路由到 Service 中的 Pod。LoadBalancer 只能在云提供商支持的环境中使用,并且需要正确配置云提供商的负载均衡器才能正常工作。 4、ExternalName 这种类型的 Service 可以将 Service 暴露到集群外部,但它并不会创建任何代理或负载均衡器,而只是将 Service 映射到一个 DNS 名称。这可以让您在 Kubernetes 中使用外部服务,或者在不同的命名空间中重用服务。...

October 30, 2022 · 6 min · 1193 words · sirius1y

数据结构学习笔记

一、绪论 数据(data)是信息的载体,是描述客观事物的数、字符、图形、图像、声音以及所有能输入计算机中并被计算机程序识别和处理的符号的集合。 数据的最小单位的是数据项; 数据的基本单位是数据元素,一个数据元素可由若干个数据项组成。 数据结构分为两大类:线性结构和非线性结构 两类结构通常分为四类基本结构: 1)集合:结构中的数据元素之间同属于一个集合,此外没有其他关系; 2)线性结构:结构中的数据元素之间存在一种线性关系,一对一的关系; 3)树形结构:一对多的关系; 4)图形结构或网状结构:多对多的关系。 根据视点的不同又可分为:逻辑结构和物理结构: 逻辑结构:面向问题,描述数据元素之间的逻辑关系; 物理结构:又称存储结构,面向计算机,是数据结构在计算机中的表示(映像) 算法的特性:输入性、输出性、确定性、有穷性、有效性(可行性) 算法的标准:正确性(满足所要求界的问题的需求,最重要最基本)、可用性(便于用户使用,良好的界面、完备的用户文档)、可读性(易于理解)、效率(存储单元的开销和运行时间的耗费)、健壮性(对于非法数据的处理) 算法复杂度:(渐进)时间复杂度和空间复杂度 二、线性结构 1、线性表 1.1 顺序表示:顺序表 用顺序结构存储的线性表为顺序表(sequential list)。 顺序表一般用数组进行存储 类模板定义:T* elems,int length,int maxLength 1.2 链表表示 1) 单链表 分为带头结点和不带头结点的单链表; 带头结点的单链表相对不带头结点的单链表在涉及会更改头节点的任务时,操作会更加统一。 类模板定义: (结点)T data,Node* next (单链表)Node* head,int length 2) 双向循环链表 类模板定义: (结点)T data,Node* prior,Node* next (双向循环链表)Node* head,int length *带头结点的双向循环列表只有一个元素结点的条件:head->next!=head && head->next->next==head 3) 静态链表 利用数组来模拟存储空间实现链表。 类模板定义: (结点)T data,Node* next (静态链表)Node* head,Node* avail 设数组a放置了一个静态链表,当链表未使用的时候,其中所有的结点都是形成了一个链表,用avail进行管理,代表未使用的结点。 当进行插入操作的时候,就从avail中取出一个头节点,进行赋值,再放入head链表之中。 在完成每一步操作之后,记得要将next域中更改 插入元素操作: i=avail; avail=a[avail].next; a[i].next=a[head],next; a[head]。next=i; 当需要释放由j所指向的结点时,只需要把结点j放到avail表的最前端,并让avail指向它即可。...

October 26, 2022 · 19 min · 3943 words · sirius1y