WEB安全-SQL注入,CSRF跨站伪造,OXX跨站脚本
SQL 注入攻击
SQL 注入是一种网络攻击手段,攻击者通过在 Web 应用程序的输入字段中插入恶意 SQL 代码,试图访问、篡改或删除数据库中的数据。这种攻击通常发生在应用程序未对用户输入进行充分验证或过滤的情况下。
举个例子,例如,假设有一个简单的登录表单,用户需要输入用户名和密码。在后端,应用程序使用 SQL 查询来检查数据库中是否存在匹配的用户记录:
# 不安全的示例,不要在实际项目中使用
username = request.POST['username']
password = request.POST['password']sql = f"SELECT * FROM users WHERE username='{username}' AND password='{password}'"
应用程序直接将用户输入的 username
和 password
插入到 SQL 查询中。这使得攻击者可以通过在输入字段中插入恶意 SQL 代码来尝试 SQL 注入攻击。如下:
admin'-- # -- 是sql中的注释
SQL 查询变为:
SELECT * FROM users WHERE username='admin'--' AND password=''
“--”使得查询的其余部分(AND password=''
)被注释掉,使得查询的其余部分(AND password=''
)被注释掉。
python解决SQL注入
为了防止 SQL 注入攻击,您应该始终对用户输入进行验证和过滤。在 Python 和许多其他编程语言中,可以使用参数化查询(parameterized queries)或预编译语句(prepared statements)来确保用户输入不会被解释为 SQL 代码。例如,使用 Python 的 SQLite 库,您可以这样做:
import sqlite3# 安全的示例
username = request.POST['username']
password = request.POST['password']conn = sqlite3.connect('my_database.db')
cursor = conn.cursor()sql = "SELECT * FROM users WHERE username=? AND password=?"
cursor.execute(sql, (username, password))
使用 ?
占位符代替直接插入用户输入。然后,将用户输入作参数传递给 execute()
函数。这样,即使用户输入包含恶意 SQL 代码,也不会被解释为 SQL 代码,从而防止了 SQL 注入攻击。
当然,合理地控制输入也是一种方法,比如校验长度,检验字符是否合法等等。
Python的web开发框架Django有着强大的ORM操作。Django ORM 防止 SQL 注入攻击的主要方式包括:使用参数化查询来生成和执行 SQL 语句,自动转义用户输入中的特殊字符,提供高级查询 API 以更安全地编写数据库查询,以及实现数据库无关性,使开发者无需关心特定数据库的 SQL 方言和安全性问题。这些特性使得 Django ORM 能有效地降低 SQL 注入攻击的风险。
CSRF 跨站伪造攻击
CSRF(Cross-Site Request Forgery,跨站请求伪造)是一种网络攻击手段,攻击者通过诱导用户在没有意识的情况下执行非预期的操作。这种攻击通常发生在用户已经登录目标网站,攻击者利用用户的登录状态发起恶意请求,从而达到攻击目的。
攻击原理:攻击者构造一个恶意链接或者嵌入恶意代码的第三方网站,诱导用户点击或访问。当用户点击链接或访问网站时,浏览器会自动带上目标网站的登录凭证(如Cookie),发起恶意请求,导致非预期操作。
假设有一个银行网站,用户可以通过访问 http://bank.com/transfer?to=Bob&amount=100
进行转账操作。攻击者可以构造一个恶意链接,引诱用户点击:
<a href="http://bank.com/transfer?to=Attacker&amount=10000" target="_blank">点击领取优惠券
</a>
当用户点击这个链接时,如果用户已经登录银行网站,浏览器会带上银行网站的Cookie发起请求,导致用户在不知情的情况下完成了转账操作。(通常发生在表单上)
为了防范CSRF攻击,通常采用以下方法:
-
使用CSRF Token:在提交表单时,服务器生成一个随机的Token,存储在Session中,并将Token放在表单的隐藏字段中。当用户提交表单时,服务器会验证Token是否匹配,从而防止跨站请求。(python的Django就是用这个)
-
使用SameSite Cookie属性:设置Cookie的SameSite属性为Strict或Lax,使浏览器在跨站请求时不会发送Cookie,从而防止CSRF攻击。
-
验证Referer:检查请求的Referer是否来自可信的源,但这种方法并不完全可靠,因为Referer可能被篡改或禁用。
Django防止CSRF手段
Django框架已经内置了CSRF保护机制,只需要在设置中启用中间件即可:
# settings.py
MIDDLEWARE = [# ...'django.middleware.csrf.CsrfViewMiddleware', # 确保此中间件已启用# ...
]
在HTML模板中,使用{% csrf_token %}
生成CSRF Token:
<form method="post">{% csrf_token %}<!-- 其他表单字段 --><input type="submit" value="提交">
</form>
处理表单请求时,框架会自动验证CSRF Token,如果验证失败,将拒绝处理请求。
CSRF攻击只会在表单上吗?
那不是。
CSRF攻击主要发生在表单提交的操作上,因为表单通常用于执行敏感操作,如登录、注册、修改密码、转账等。但实际上,CSRF攻击并不仅限于表单,它可以发生在任何可以执行操作的HTTP请求上
比如(1)通过GET请求触发的操作:虽然GET请求应该是幂等的,但有些网站可能会使用GET请求执行操作。攻击者可以通过构造恶意链接或者使用<img>
标签发起GET请求,从而触发CSRF攻击。
<img src="http://example.com/delete?id=1" width="0" height="0" style="display:none;">
当用户访问包含这个<img>
标签的网页时,浏览器会尝试加载图片,实际上是自动发起一个GET请求到http://example.com/delete?id=1
。同样,如果用户已经登录到example.com
且服务器没有进行CSRF防护,这个请求可能会导致用户在不知情的情况下删除ID为1的文章。
(2)通过AJAX发起的请求:攻击者可在第三方网站上使用JS发起AJAX请求,尝试执行操作。虽然同源策略限制了跨域请求,但攻击者仍可尝试绕过限制,或利用浏览器漏洞发起请求。
<script>function csrfAttack() {const xhr = new XMLHttpRequest();xhr.open("POST", "http://example.com/update");xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");xhr.withCredentials = true; // 尝试发送Cookiexhr.send("id=1&content=Hacked");}csrfAttack();
</script>
尝试发起CSRF攻击的JavaScript示例。当用户访问包含这段代码的网页时,浏览器会自动执行csrfAttack()
函数,发起一个AJAX POST请求到http://example.com/update
,尝试修改ID为1的文章内容为"Hacked"。
OXX 跨站脚本攻击
XSS(Cross-Site Scripting,跨站脚本攻击)是一种网络攻击手段,攻击者通过在目标网站上注入恶意脚本,当其他用户访问该网站时,恶意脚本会在用户的浏览器上执行,从而窃取用户数据、劫持用户会话等。
XSS攻击主要分为两类:存储型XSS和反射型XSS。
(1)存储型XSS:攻击者将恶意脚本提交到目标网站的数据库中,当其他用户访问包含恶意脚本的页面时,浏览器会执行恶意脚本。
<script>/* 恶意代码 */</script>
(2)反射型XSS:攻击者将恶意脚本放在URL参数中,诱导用户点击。当用户点击链接时,服务器将恶意脚本返回到用户浏览器,浏览器执行恶意脚本。
http://example.com/search?q=<script>/* 恶意代码 */</script>
在 Django 模板中,默认情况下,所有变量都会被自动转义。这意味着特殊字符(如尖括号、引号等)会被替换为 HTML 实体,从而防止恶意脚本执行。当然对用户输入进行验证和过滤才是至关重要。
{{ hh }}
其他攻击
会话劫持(Session Hijacking):攻击者窃取用户的会话 ID 或 Cookie,以冒充用户身份访问受保护的资源。
Distributed Denial of Service(DDoS):攻击者通过大量请求来使目标服务器过载,导致正常用户无法访问网站。
远程文件包含(Remote File Inclusion, RFI)和本地文件包含(Local File Inclusion, LFI):攻击者利用 Web 应用程序的漏洞,将恶意文件包含到服务器上,以执行恶意代码或窃取敏感信息。
点击劫持(Clickjacking):攻击者使用透明层或 iframe 欺骗用户点击看似无害的元素,实际上触发了恶意操作。
等等
相关文章:
WEB安全-SQL注入,CSRF跨站伪造,OXX跨站脚本
SQL 注入攻击 SQL 注入是一种网络攻击手段,攻击者通过在 Web 应用程序的输入字段中插入恶意 SQL 代码,试图访问、篡改或删除数据库中的数据。这种攻击通常发生在应用程序未对用户输入进行充分验证或过滤的情况下。 举个例子,例如,…...
【HDFS】客户端读某个块时,如何对块的各个副本进行网络距离排序?
本文包含如下内容: ① 通过图解+源码分析/A1/B1/node1和 /A1/B2/node2 这两个节点的网络距离怎么算出来的 ② 客户端读文件时,副本的优先级。(怎么排序的,排序规则都有哪些?) ③ 我们集群发现的一个问题。 客户端读时,通过调用getBlockLocations RPC 获取文件的各个块。…...

【数字化处理】仿生假体控制中肌电信号的数字化处理研究(Matlab代码实现)
💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…...

谷歌推出Flax:JAX的神经网络库
在优化理论中,损失或成本函数测量拟合或预测值与实际值之间的距离。对于大多数机器学习模型,提高性能意味着最小化损失函数。 但对于深度神经网络,执行梯度下降以最小化每个参数的损失函数可能会消耗大量资源。传统方法包括手动推导和编码&a…...
PDF换行的难度,谁能解决?
换行的时候确认不了长度: import java.awt.*;public class Test {public static void main(String[] args) {String str1 "淘淘淘淘淘淘淘淘淘淘淘淘淘淘淘淘淘淘淘淘淘淘淘淘淘淘淘淘淘淘淘淘淘淘淘淘淘";String str2 "AAAAAAAAAAAAAAAAAAAAAAAAA…...

山东布谷科技直播程序源码使用Redis进行服务器横向扩展
当今,直播程序源码平台作为新媒体时代主流,受到了世界各地人民的喜爱,这也使得直播程序源码平台用户数量的庞大,也难免会出现大量用户同时访问服务器,使服务器过载的情况,当服务器承受不住的时候࿰…...
symfony3.4中根据角色不同跳转不同页面
在Symfony 3.4中,可以使用安全组件来实现控制不同角色跳转到不同页面的功能。 首先,确保你已经安装了Symfony的安全组件,并配置了安全相关的配置文件。这些文件通常是 security.yml 和 security.yml。 在配置文件中,你可以定义不…...

Dockerfile部署golang,docker-compose
使用go镜像打包,运行在容器内 redis和mysql用外部的 项目目录结构 w1go项目: Dockerfile # 这种方式是docker项目加上 本地的mysql和redis环境 # go打包的容器 FROM golang:alpine AS builder# 为我们镜像设置一些必要的环境变量 ENV GO111MODULEon …...

什么是Linux,如何在Windows操作系统下搭建Linux环境,远程连接Linux系统
文章目录 什么是LinuxLinux的诞生及发展为什么要学习LinuxLinux内核Linux发行版什么是虚拟机如何在VMware虚拟机中搭建Linux系统环境远程连接 Linux 系统Linux 帮助网站 什么是Linux Linux是一套免费使用和自由传播的类Unix操作系统,是一个基于POSIX和UNIX的多用户…...
Ubuntu下RabbitMQ安装与简单使用
一:RabbitMQ基本安装 1.更新依赖包(提前更新依赖包避免出现报错) sudo apt-get update 2.由于rabbitMq使用erlang语言开发,在安装rabbitMq之前需要安装erlang sudo apt-get install erlang 3.查看erlang是否安装成功 sudo erl 安装成功会出现下面的提示…...

力扣62.不同路径(动态规划)
/*** 一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为 “Start” )。* 机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为 “Finish” )。* 问总共有多少条不同的路径? *…...
TypeScript 泛型的概念和基本使用
什么是TypeScript 泛型? 在定义函数,接口,类的时候不能预先确定使用的数据类型,而是在调用使用这些函数,接口,类的时候才能确定的数据类型; 1,单个泛型的参数 例如通过使用any这种…...

redis的事务和watch机制
这里写目录标题 第一章、redis事务和watch机制1.1)redis事务,事务的三大命令语法:开启事务 multi语法:执行事务 exec语法:取消事务 discard 1.2)redis事务的错误和回滚的情况1.3)watch机制语法&…...

objectMapper.getTypeFactory().constructParametricType 方法的作用和使用
在使用 Jackson 库进行 JSON 数据的序列化和反序列化时,经常会使用到 ObjectMapper 类。其中,objectMapper.getTypeFactory().constructParametricType 方法用于构造泛型类型。 具体作用和使用如下: 作用: 构造泛型类型&#x…...

【websocket - Tornado】简易聊天应用
1、背景 项目测试的过程中需要自己搭建一个webscoket站点,确保此类服务接入后台系统后访问不受影响。python的服务框架常用的有Flask、Django、Tornado,每个框架的侧重点不同,导致使用的场景就会有所差异。 Flask轻量级,采用常规的同步编程方式,需要安装其他模块辅助,主…...

TCP 三次握手,四次挥手
1、三次握手 第一次握手 SYN 等于1,SeqX 第二次握手 SYN等于1 ACK等于1,SeqY,AckX1 第三次SYN等于0 ACK等于1,SeqX1,AckY1 ackRow都是对应请求seqraw,三次握手后,Seq就是服务器前一个包中的ac…...
Nginx之Rewrite重定向
常见的Nginx正则表达式 ^:匹配输入字符串的起始位置 $:匹配输入字符串的结束位置 *:匹配前面的字符零次或多次。如“ol*”能匹配“o”及“ol”、“oll” :匹配前面的字符一次或者多次。如“ol”能匹配"ol"及“oll”、&q…...

uni-app微信小程序开发自定义select下拉多选内容篇
分享-2023年高级前端进阶:前端登顶之巅-最全面的前端知识点总结站点 *分享一个使用比较久的🪜 技术框架公司的选型:uni-app uni-ui vue3 vite4 ts 需求分析:微信小程序-uni-ui内容 1、创建一个自定义的下拉,支持多…...

VUE+view table.exportCsv()导出.csv文档时如何防止数据格式为科学计数
当使用table.exportCsv()方法导出数据时,出现科学计数法问题,像电话号码,身份证号码等,当数据大于15位后面的会用0替代。 针对这一问题,解决方法如下:就是再数字前加上制表符“\t”注意双引号,…...
Java基础练习六(排序)
排序 1. 第n大数 给定一个整数数组,输入一个值 n, 输出数组中第 n 大的数。 import java.util.Arrays; import java.util.Scanner;public class Work0801 {public static void main(String[] args) {int[] arr {2,3,1,8,3,9,6};// 冒泡排序,第n大数for (int i 0; …...

19c补丁后oracle属主变化,导致不能识别磁盘组
补丁后服务器重启,数据库再次无法启动 ORA01017: invalid username/password; logon denied Oracle 19c 在打上 19.23 或以上补丁版本后,存在与用户组权限相关的问题。具体表现为,Oracle 实例的运行用户(oracle)和集…...

业务系统对接大模型的基础方案:架构设计与关键步骤
业务系统对接大模型:架构设计与关键步骤 在当今数字化转型的浪潮中,大语言模型(LLM)已成为企业提升业务效率和创新能力的关键技术之一。将大模型集成到业务系统中,不仅可以优化用户体验,还能为业务决策提供…...

解决Ubuntu22.04 VMware失败的问题 ubuntu入门之二十八
现象1 打开VMware失败 Ubuntu升级之后打开VMware上报需要安装vmmon和vmnet,点击确认后如下提示 最终上报fail 解决方法 内核升级导致,需要在新内核下重新下载编译安装 查看版本 $ vmware -v VMware Workstation 17.5.1 build-23298084$ lsb_release…...

理解 MCP 工作流:使用 Ollama 和 LangChain 构建本地 MCP 客户端
🌟 什么是 MCP? 模型控制协议 (MCP) 是一种创新的协议,旨在无缝连接 AI 模型与应用程序。 MCP 是一个开源协议,它标准化了我们的 LLM 应用程序连接所需工具和数据源并与之协作的方式。 可以把它想象成你的 AI 模型 和想要使用它…...

智能在线客服平台:数字化时代企业连接用户的 AI 中枢
随着互联网技术的飞速发展,消费者期望能够随时随地与企业进行交流。在线客服平台作为连接企业与客户的重要桥梁,不仅优化了客户体验,还提升了企业的服务效率和市场竞争力。本文将探讨在线客服平台的重要性、技术进展、实际应用,并…...

【单片机期末】单片机系统设计
主要内容:系统状态机,系统时基,系统需求分析,系统构建,系统状态流图 一、题目要求 二、绘制系统状态流图 题目:根据上述描述绘制系统状态流图,注明状态转移条件及方向。 三、利用定时器产生时…...
【JavaSE】绘图与事件入门学习笔记
-Java绘图坐标体系 坐标体系-介绍 坐标原点位于左上角,以像素为单位。 在Java坐标系中,第一个是x坐标,表示当前位置为水平方向,距离坐标原点x个像素;第二个是y坐标,表示当前位置为垂直方向,距离坐标原点y个像素。 坐标体系-像素 …...

【7色560页】职场可视化逻辑图高级数据分析PPT模版
7种色调职场工作汇报PPT,橙蓝、黑红、红蓝、蓝橙灰、浅蓝、浅绿、深蓝七种色调模版 【7色560页】职场可视化逻辑图高级数据分析PPT模版:职场可视化逻辑图分析PPT模版https://pan.quark.cn/s/78aeabbd92d1...

无人机侦测与反制技术的进展与应用
国家电网无人机侦测与反制技术的进展与应用 引言 随着无人机(无人驾驶飞行器,UAV)技术的快速发展,其在商业、娱乐和军事领域的广泛应用带来了新的安全挑战。特别是对于关键基础设施如电力系统,无人机的“黑飞”&…...

免费PDF转图片工具
免费PDF转图片工具 一款简单易用的PDF转图片工具,可以将PDF文件快速转换为高质量PNG图片。无需安装复杂的软件,也不需要在线上传文件,保护您的隐私。 工具截图 主要特点 🚀 快速转换:本地转换,无需等待上…...