当前位置: 首页 > 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; …...

进程地址空间(比特课总结)

一、进程地址空间 1. 环境变量 1 &#xff09;⽤户级环境变量与系统级环境变量 全局属性&#xff1a;环境变量具有全局属性&#xff0c;会被⼦进程继承。例如当bash启动⼦进程时&#xff0c;环 境变量会⾃动传递给⼦进程。 本地变量限制&#xff1a;本地变量只在当前进程(ba…...

PHP和Node.js哪个更爽?

先说结论&#xff0c;rust完胜。 php&#xff1a;laravel&#xff0c;swoole&#xff0c;webman&#xff0c;最开始在苏宁的时候写了几年php&#xff0c;当时觉得php真的是世界上最好的语言&#xff0c;因为当初活在舒适圈里&#xff0c;不愿意跳出来&#xff0c;就好比当初活在…...

Qt Widget类解析与代码注释

#include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this); }Widget::~Widget() {delete ui; }//解释这串代码&#xff0c;写上注释 当然可以&#xff01;这段代码是 Qt …...

理解 MCP 工作流:使用 Ollama 和 LangChain 构建本地 MCP 客户端

&#x1f31f; 什么是 MCP&#xff1f; 模型控制协议 (MCP) 是一种创新的协议&#xff0c;旨在无缝连接 AI 模型与应用程序。 MCP 是一个开源协议&#xff0c;它标准化了我们的 LLM 应用程序连接所需工具和数据源并与之协作的方式。 可以把它想象成你的 AI 模型 和想要使用它…...

大数据零基础学习day1之环境准备和大数据初步理解

学习大数据会使用到多台Linux服务器。 一、环境准备 1、VMware 基于VMware构建Linux虚拟机 是大数据从业者或者IT从业者的必备技能之一也是成本低廉的方案 所以VMware虚拟机方案是必须要学习的。 &#xff08;1&#xff09;设置网关 打开VMware虚拟机&#xff0c;点击编辑…...

ardupilot 开发环境eclipse 中import 缺少C++

目录 文章目录 目录摘要1.修复过程摘要 本节主要解决ardupilot 开发环境eclipse 中import 缺少C++,无法导入ardupilot代码,会引起查看不方便的问题。如下图所示 1.修复过程 0.安装ubuntu 软件中自带的eclipse 1.打开eclipse—Help—install new software 2.在 Work with中…...

让AI看见世界:MCP协议与服务器的工作原理

让AI看见世界&#xff1a;MCP协议与服务器的工作原理 MCP&#xff08;Model Context Protocol&#xff09;是一种创新的通信协议&#xff0c;旨在让大型语言模型能够安全、高效地与外部资源进行交互。在AI技术快速发展的今天&#xff0c;MCP正成为连接AI与现实世界的重要桥梁。…...

Element Plus 表单(el-form)中关于正整数输入的校验规则

目录 1 单个正整数输入1.1 模板1.2 校验规则 2 两个正整数输入&#xff08;联动&#xff09;2.1 模板2.2 校验规则2.3 CSS 1 单个正整数输入 1.1 模板 <el-formref"formRef":model"formData":rules"formRules"label-width"150px"…...

并发编程 - go版

1.并发编程基础概念 进程和线程 A. 进程是程序在操作系统中的一次执行过程&#xff0c;系统进行资源分配和调度的一个独立单位。B. 线程是进程的一个执行实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位。C.一个进程可以创建和撤销多个线程;同一个进程中…...

解析奥地利 XARION激光超声检测系统:无膜光学麦克风 + 无耦合剂的技术协同优势及多元应用

在工业制造领域&#xff0c;无损检测&#xff08;NDT)的精度与效率直接影响产品质量与生产安全。奥地利 XARION开发的激光超声精密检测系统&#xff0c;以非接触式光学麦克风技术为核心&#xff0c;打破传统检测瓶颈&#xff0c;为半导体、航空航天、汽车制造等行业提供了高灵敏…...