当前位置: 首页 > news >正文

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攻击,通常采用以下方法:

  1. 使用CSRF Token:在提交表单时,服务器生成一个随机的Token,存储在Session中,并将Token放在表单的隐藏字段中。当用户提交表单时,服务器会验证Token是否匹配,从而防止跨站请求。(python的Django就是用这个)

  2. 使用SameSite Cookie属性:设置Cookie的SameSite属性为Strict或Lax,使浏览器在跨站请求时不会发送Cookie,从而防止CSRF攻击。

  3. 验证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 注入是一种网络攻击手段&#xff0c;攻击者通过在 Web 应用程序的输入字段中插入恶意 SQL 代码&#xff0c;试图访问、篡改或删除数据库中的数据。这种攻击通常发生在应用程序未对用户输入进行充分验证或过滤的情况下。 举个例子&#xff0c;例如&#xff0c;…...

【HDFS】客户端读某个块时,如何对块的各个副本进行网络距离排序?

本文包含如下内容: ① 通过图解+源码分析/A1/B1/node1和 /A1/B2/node2 这两个节点的网络距离怎么算出来的 ② 客户端读文件时,副本的优先级。(怎么排序的,排序规则都有哪些?) ③ 我们集群发现的一个问题。 客户端读时,通过调用getBlockLocations RPC 获取文件的各个块。…...

【数字化处理】仿生假体控制中肌电信号的数字化处理研究(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…...

谷歌推出Flax:JAX的神经网络库

在优化理论中&#xff0c;损失或成本函数测量拟合或预测值与实际值之间的距离。对于大多数机器学习模型&#xff0c;提高性能意味着最小化损失函数。 但对于深度神经网络&#xff0c;执行梯度下降以最小化每个参数的损失函数可能会消耗大量资源。传统方法包括手动推导和编码&a…...

PDF换行的难度,谁能解决?

换行的时候确认不了长度&#xff1a; import java.awt.*;public class Test {public static void main(String[] args) {String str1 "淘淘淘淘淘淘淘淘淘淘淘淘淘淘淘淘淘淘淘淘淘淘淘淘淘淘淘淘淘淘淘淘淘淘淘淘淘";String str2 "AAAAAAAAAAAAAAAAAAAAAAAAA…...

山东布谷科技直播程序源码使用Redis进行服务器横向扩展

当今&#xff0c;直播程序源码平台作为新媒体时代主流&#xff0c;受到了世界各地人民的喜爱&#xff0c;这也使得直播程序源码平台用户数量的庞大&#xff0c;也难免会出现大量用户同时访问服务器&#xff0c;使服务器过载的情况&#xff0c;当服务器承受不住的时候&#xff0…...

symfony3.4中根据角色不同跳转不同页面

在Symfony 3.4中&#xff0c;可以使用安全组件来实现控制不同角色跳转到不同页面的功能。 首先&#xff0c;确保你已经安装了Symfony的安全组件&#xff0c;并配置了安全相关的配置文件。这些文件通常是 security.yml 和 security.yml。 在配置文件中&#xff0c;你可以定义不…...

Dockerfile部署golang,docker-compose

使用go镜像打包&#xff0c;运行在容器内 redis和mysql用外部的 项目目录结构 w1go项目&#xff1a; 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操作系统&#xff0c;是一个基于POSIX和UNIX的多用户…...

Ubuntu下RabbitMQ安装与简单使用

一&#xff1a;RabbitMQ基本安装 1.更新依赖包(提前更新依赖包避免出现报错) sudo apt-get update 2.由于rabbitMq使用erlang语言开发&#xff0c;在安装rabbitMq之前需要安装erlang sudo apt-get install erlang 3.查看erlang是否安装成功 sudo erl 安装成功会出现下面的提示…...

力扣62.不同路径(动态规划)

/*** 一个机器人位于一个 m x n 网格的左上角 &#xff08;起始点在下图中标记为 “Start” &#xff09;。* 机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角&#xff08;在下图中标记为 “Finish” &#xff09;。* 问总共有多少条不同的路径&#xff1f; *…...

TypeScript 泛型的概念和基本使用

什么是TypeScript 泛型&#xff1f; 在定义函数&#xff0c;接口&#xff0c;类的时候不能预先确定使用的数据类型&#xff0c;而是在调用使用这些函数&#xff0c;接口&#xff0c;类的时候才能确定的数据类型&#xff1b; 1&#xff0c;单个泛型的参数 例如通过使用any这种…...

redis的事务和watch机制

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

objectMapper.getTypeFactory().constructParametricType 方法的作用和使用

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

【websocket - Tornado】简易聊天应用

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

TCP 三次握手,四次挥手

1、三次握手 第一次握手 SYN 等于1&#xff0c;SeqX 第二次握手 SYN等于1 ACK等于1&#xff0c;SeqY&#xff0c;AckX1 第三次SYN等于0 ACK等于1&#xff0c;SeqX1&#xff0c;AckY1 ackRow都是对应请求seqraw&#xff0c;三次握手后&#xff0c;Seq就是服务器前一个包中的ac…...

Nginx之Rewrite重定向

常见的Nginx正则表达式 ^&#xff1a;匹配输入字符串的起始位置 $&#xff1a;匹配输入字符串的结束位置 *&#xff1a;匹配前面的字符零次或多次。如“ol*”能匹配“o”及“ol”、“oll” &#xff1a;匹配前面的字符一次或者多次。如“ol”能匹配"ol"及“oll”、&q…...

uni-app微信小程序开发自定义select下拉多选内容篇

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

VUE+view table.exportCsv()导出.csv文档时如何防止数据格式为科学计数

当使用table.exportCsv()方法导出数据时&#xff0c;出现科学计数法问题&#xff0c;像电话号码&#xff0c;身份证号码等&#xff0c;当数据大于15位后面的会用0替代。 针对这一问题&#xff0c;解决方法如下&#xff1a;就是再数字前加上制表符“\t”注意双引号&#xff0c;…...

Java基础练习六(排序)

排序 1. 第n大数 给定一个整数数组&#xff0c;输入一个值 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; …...

国防科技大学计算机基础课程笔记02信息编码

1.机内码和国标码 国标码就是我们非常熟悉的这个GB2312,但是因为都是16进制&#xff0c;因此这个了16进制的数据既可以翻译成为这个机器码&#xff0c;也可以翻译成为这个国标码&#xff0c;所以这个时候很容易会出现这个歧义的情况&#xff1b; 因此&#xff0c;我们的这个国…...

OpenLayers 可视化之热力图

注&#xff1a;当前使用的是 ol 5.3.0 版本&#xff0c;天地图使用的key请到天地图官网申请&#xff0c;并替换为自己的key 热力图&#xff08;Heatmap&#xff09;又叫热点图&#xff0c;是一种通过特殊高亮显示事物密度分布、变化趋势的数据可视化技术。采用颜色的深浅来显示…...

MongoDB学习和应用(高效的非关系型数据库)

一丶 MongoDB简介 对于社交类软件的功能&#xff0c;我们需要对它的功能特点进行分析&#xff1a; 数据量会随着用户数增大而增大读多写少价值较低非好友看不到其动态信息地理位置的查询… 针对以上特点进行分析各大存储工具&#xff1a; mysql&#xff1a;关系型数据库&am…...

在HarmonyOS ArkTS ArkUI-X 5.0及以上版本中,手势开发全攻略:

在 HarmonyOS 应用开发中&#xff0c;手势交互是连接用户与设备的核心纽带。ArkTS 框架提供了丰富的手势处理能力&#xff0c;既支持点击、长按、拖拽等基础单一手势的精细控制&#xff0c;也能通过多种绑定策略解决父子组件的手势竞争问题。本文将结合官方开发文档&#xff0c…...

在rocky linux 9.5上在线安装 docker

前面是指南&#xff0c;后面是日志 sudo dnf config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo sudo dnf install docker-ce docker-ce-cli containerd.io -y docker version sudo systemctl start docker sudo systemctl status docker …...

【解密LSTM、GRU如何解决传统RNN梯度消失问题】

解密LSTM与GRU&#xff1a;如何让RNN变得更聪明&#xff1f; 在深度学习的世界里&#xff0c;循环神经网络&#xff08;RNN&#xff09;以其卓越的序列数据处理能力广泛应用于自然语言处理、时间序列预测等领域。然而&#xff0c;传统RNN存在的一个严重问题——梯度消失&#…...

django filter 统计数量 按属性去重

在Django中&#xff0c;如果你想要根据某个属性对查询集进行去重并统计数量&#xff0c;你可以使用values()方法配合annotate()方法来实现。这里有两种常见的方法来完成这个需求&#xff1a; 方法1&#xff1a;使用annotate()和Count 假设你有一个模型Item&#xff0c;并且你想…...

2025 后端自学UNIAPP【项目实战:旅游项目】6、我的收藏页面

代码框架视图 1、先添加一个获取收藏景点的列表请求 【在文件my_api.js文件中添加】 // 引入公共的请求封装 import http from ./my_http.js// 登录接口&#xff08;适配服务端返回 Token&#xff09; export const login async (code, avatar) > {const res await http…...

论文解读:交大港大上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(一)

宇树机器人多姿态起立控制强化学习框架论文解析 论文解读&#xff1a;交大&港大&上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架&#xff08;一&#xff09; 论文解读&#xff1a;交大&港大&上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化…...

【HTML-16】深入理解HTML中的块元素与行内元素

HTML元素根据其显示特性可以分为两大类&#xff1a;块元素(Block-level Elements)和行内元素(Inline Elements)。理解这两者的区别对于构建良好的网页布局至关重要。本文将全面解析这两种元素的特性、区别以及实际应用场景。 1. 块元素(Block-level Elements) 1.1 基本特性 …...