nginx(八十六)uri转义杂谈

news2024/11/24 22:53:46

一   关于nginx uri过往整理

HTTP1.1(四)URI

HTTP1.1(五)URI编码

HTTP杂谈(三)URL特殊字符

以下'涉及': 

  1) location  与'$uri'  --> '路由匹配'  --> 通过'debug日志观察'

  2) proxy_paas  --> attach_url'是否'有,有'是否是变量',决定透传给'上游uri'的形式

  3) $request、$request_uri、$uri  --> '日志记录和响应体值形式'

  4) if ($uri ~ '^([a-zA-Z0-9=%&?\-_]+$)')  --> 'URI白名单或者URI截断'

  5) rewrite .. break 、set、proxy_paas 改变 '$args'

HTTP框架提供的变量 

proxy_pass指令

nginx(七十六)nginx与HTTP请求行的深入探论

nginx(七十八)日志的深入探究

$uri、try_files、index关系

nginx(三十二)rewrite模块

nginx(七十九)rewrite模块指令再探之(一)变量漫谈

nginx(八十)rewrite模块指令再探之(二)

使用 $uri 可导致 CRLF 注入

二   关于$uri和$request_uri难点探究

①   相关参考

url解码遇到%的问题

nginx uri转义原理深入讲解

源码探究URL转义

url特殊字符导致404

nginx uri中文

nginx lua uri 防盗链针对包含中文的问题

nginx url解码引发的waf漏洞

②   转义、编码、解码

escape   --> '转义'

encode   --> '编码'

decode   --> '解码'

遗留:编码和转义是'一个意思'吗? 

③  日志细节探讨 

1) 关注: log_format 'escape属性'探究

2) 对比'nginx日志'和'响应体'理解

 

说明: 默认是'escape=default'

 

细节: 浏览器自动对'中文'进行'编码'传输

原因: 由于'中文'不是浏览器认为的合法'ASCII字符',会按照'既定的规则'进行'编码'

'特殊的字符'转换成'ASCII码'规则: 

  1) 一个'中文'字符'utf-8'编码,对应'3'个'字节'

  2) 每个'字节'对应'%hexhex'形式

  3) 例如:'我'--> '%E6%88%91'

  

思考1: 为什么'nginx日志'和'响应体'不一样? 

  1) escape  '转义'  --> '仅仅是nginx 日志格式的可读性'

  2) charset '编码'  --> 设置'网页[响应体]'编码格式,而页面的解码与编码不一致则导致'乱码'

思考2: 为什么'$args'没有转义,nginx到底对于'url各部分'是如何处理转义的?

思考3: 为什么'十六进制的%'变为'\x'

 

 

 

④  %探究

1) 问题引入: '$uri'和'$request_uri'为什么'不一致'?

2) 测试2:在一个'uri中'包含了特殊字符'%'

现象: '400'报错

原理: '%号'后面如果'不是两位16进制数'会导致异常'NGX_HTTP_PARSE_INVALID_REQUEST'

目的: 防止'sql注入'等'攻击'风险

补充: 如果'特殊字符%'用在'查询参数中'则没问题

 

 

3) 测试3: 如何传递'%'特殊字符呢?  --> 将'%'符号转义为'%25'

注意:特殊字符导致'400、404'的报错

  

⑤  nginx的uri转义机制

遗留:'阅读' src/core/ngx_string.h 和 src/core/ngx_string.c '源'文件

ngx_escape_uri函数 

nginx模块和核心api

 rfc3986#section-2.2 

⑥  ngx_proxy模块对URI处理

补充: 'rewrite ... break;'会改变'proxy_paas'的uri形式

 proxy_pass带attach_url导致解码后传输给上游 400报错

遗留:

  1) 物料:弄两个nginx,一个作为'代理',一个作为'上游'服务器

  备注:代理'proxy_paas'中'attach_url'三种形式  --> '本周闭环'

  2) 测试: url带'特殊'字符,观察'代理和上游日志',以及'响应体'

⑦  $uri做if判断和做proxy_pass的attach_url

案例1: if ($uri ~ ^([a-zA-Z0-9_/]+)$) {...} 观察debug日志'匹配'情况

案例2: url'特殊'字符,多个'location 路由',观察匹配哪个'location'

案例3: proxy_paas的attach_url使用'$uri',观察'CLCF'漏洞注入的现象

--> '本周闭环'

nginx $uri导致的CRLF注入漏洞

⑧  nginx 过滤掉查询字符串

rewrite ^(.+)$ $1? break;

# rewrite ^ $uri?  break

proxy_pass  http://$proxy_name$uri;

⑨  ngx_lua 的 URI 转义机制

 

1) 自动把原始 url 带给后端应该是 'ngx_proxy 模块'的行为,和 'ngx_lua 没有'任何关系

2) 想强制 uri的归一化,应该使用'ngx.req.set_uri()' 这样的 Lua API 来'改写'当前请求的uri

题外话: 加载'相对资源'的时候,会传递一个'Referer'请求头

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/857001.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

PDF能转CAD格式吗?学会这种方法轻松实现转换

PDF文件可以转换成CAD格式吗?答案是可以的,PDF格式在各种设备和软件上都有很好的兼容性,而CAD格式则是更加专业的CAD软件设计,将PDF转换为CAD格式可以确保在设计过程中不会出现无法编辑的现象,极大的提高工作效率&…

arcgis pro 3.0.2 安装及 geemap

arcgis pro 3.0.2 安装及 geemap arcgis pro 3.0.2 安装 arcgis pro 3 版本已经很多了,在网上找到资源就可以进行安装 需要注意的是:有的文件破解文件缺少,导致破解不成功。 能够新建地图就是成功了! geemap安装 1.需要进行环…

mac安装redis 配置密码

brew install redis 两个重要目录文件 /opt/homebrew/opt/redis/bin/redis-server /opt/homebrew/etc/redis.conf 配置文件默认是非守护进程运行redis 默认是不用密码验证,配置为开启密码验证 重启redis brew services restart redis 客户端调用 redis-cli 密码 …

浅谈绿色节约型校园电力能耗监控系统的设计与应用方案

贾丽丽 安科瑞电气股份有限公司 上海嘉定 201801 摘 要:校园中能源的消耗与浪费占用了校园总费用支出的很大比例,而电能的消耗又是能源消耗的重中之重,重点阐述了校园能耗监控系统方案设计、关键技术。以北方某高校为例应用该方案&#x…

find命令用法及参数

find 命令是在 Linux 和 Unix 系统中用于查找文件的强大工具。它可以递归地在指定的目录和子目录中搜索符合条件的文件,并执行一些操作。 以下是 find 命令的一些常见用法和参数: 基本用法 查找指定名称的文件: find /path/to/directory …

最新SQLMap进阶技术

点击星标,即时接收最新推文 本文选自《web安全攻防渗透测试实战指南(第2版)》 五折购买链接:u.jd.com/3ibjeF6 SQLMap进阶:参数讲解 (1)--level 5:探测等级。 参数“--level 5”指需…

Vue组件化开发思想;Vue的全局组件;Vue的局部组件;Vue的开发模式和解析;Vue CLI安装和使用;Vue项目的创建方式–Vite

目录 1_Vue组件化开发思想1.1_认识组件化开发1.2_Vue的组件化1.3_注册组件的方式 2_Vue的全局组件3_Vue的局部组件4_Vue的开发模式和解析4.1_Vue的开发模式4.2_单文件的特点4.3_如何支持SFC4.4_VSCode对SFC文件的支持 5_Vue CLI安装和使用5.1_Vue CLI脚手架5.2_Vue CLI 安装和使…

CRM五大功能提高提高销售效率

如今,CRM是企业提高销售效率、转化更多客户的重要工具。市面上有许多CRM管理系统,推荐一款知名的CRM管理系统 1、简单易用 Zoho CRM的用户界面干净简洁,操作简单直观,无需复杂的配置和培训,即使没有IT基础的“小白”…

利用C++nlohmann库解析json文件

json文件示例&#xff1a; 代码运行环境VS2019 一、git下载nlohmann库文件源代码 源代码文件目录 二、利用VS2019新建工程&#xff0c;并配置项目属性 配置VC目录---包含目录 三、项目源代码 #include <iostream> #include <fstream> #include <nlohmann/jso…

Fast Tone Mapping for High Dynamic Range Images

Abstract 我们提出了一种快速、有效、灵活的色调再现方法&#xff0c;在低动态范围再现设备中保留了高动态范围场景的可视性和对比度印象。 一个单一的参数控制能见度和对比度在一个简单和优雅的方式和互动速度。 新方法使用简单&#xff0c;计算效率高。 实验表明&#xff0c…

金融反欺诈的应用实践

“根据980起全球重大金融欺诈事件分析&#xff0c;60%的欺诈发生在移动端&#xff0c;同比增长170%。“&#xff0c;在香港近日举办的金融科技沙龙上&#xff0c;顶象金融业务安全专家史博表示&#xff0c;金融业已成为不法分子重要的攻击对象。 本届金融科技沙龙由Databricks…

面试热题(螺旋矩阵)

给你一个 m 行 n 列的矩阵 matrix &#xff0c;请按照 顺时针螺旋顺序 &#xff0c;返回矩阵中的所有元素 一看到这个大家有没有想到 就是一个螺旋形状&#xff0c;那这道题我们应该怎么解决&#xff1f; 我们先来仔细的看&#xff0c;它这种螺旋形状的遍历是先【右-下-左-上】…

01Mysql创建表

目录 一、题目要求 二、具体操作代码 三、查看结果&#xff1a; 一、题目要求 建立一张表&#xff1a; 表里面有多个字段&#xff0c;每一个字段对应一种数据类型 注意&#xff1a;表名&#xff0c;字段名都要起的有意义 二、具体操作代码 CREATE TABLE DataInfo (id INT …

python爬虫实战(2)--爬取某博热搜数据

1. 准备工作 使用python语言可以快速实现&#xff0c;调用BeautifulSoup包里面的方法 安装BeautifulSoup pip install BeautifulSoup完成以后引入项目 2. 开发 定义url url https://s.微博.com/top/summary?caterealtimehot定义请求头&#xff0c;微博请求数据需要cookie…

Windows 环境下 Python3 离线安装 cryptography 失败

发布Flask Web项目时&#xff0c;报错缺少Cryptography&#xff0c;于是尝试重新安装该库&#xff0c;但本机没有网络&#xff0c;只支持手动离线安装&#xff0c;尝试了pip、setup.py两种方式安装&#xff0c;结果都报错。。最后使用将安装包拷贝至本机(在其他电脑上安装的sit…

java.lang.OutOfMemoryError- unable to create new native thread 问题排查

问题描述 最近连续两天大约凌晨3点&#xff0c;线上服务开始异常&#xff0c;出现OOM报错。且服务所在的物理机只能ping通&#xff0c;但是无法登录。报错信息如下&#xff1a; ERROR 04-12 03:01:43,930 [DefaultQuartzScheduler_Worker-3] JobRunShell[JobRunShell]:211 Jo…

交叉编译驱动和应用出现警告提示错误“cc1:all warnings being treated as errors”解决方法

最近新玩的rk3588的板子,编译驱动时出现了警告提示错误“cc1:all warnings being treated as errors”,导致编译失败,仔细看了一下,就是内部出现了一个警告,一个未使用的变量出现的警告,导致了驱动编译失败,但是如果这样其他驱动会不会也这样,然后就写了一个printk的de…

算法练习--链表相关

文章目录 合并两个有序链表删除排序链表中的重复元素 1删除排序链表中的重复元素 2环形链表1环形链表2相交链表反转链表 合并两个有序链表 将两个升序链表合并为一个新的 升序 链表并返回。 新链表是通过拼接给定的两个链表的所有节点组成的。 示例 1&#xff1a; 输入&…

怎么改ip地址 如何更改电脑ip地址

在网络世界中&#xff0c;IP地址是一个重要的标识&#xff0c;它被用于识别和定位设备在互联网中的位置。尽管大多数用户在日常生活中不需要更改IP地址&#xff0c;但在某些特定情况下&#xff0c;可能需要进行IP地址的更改。接下来&#xff0c;我们将介绍一些常见的方法来改变…

从零开始学习 Java:简单易懂的入门指南之面向对象(九)

面向对象进阶 前情回顾1.1 如何定义类1.2 如何通过类创建对象1.3 封装1.3.1 封装的步骤1.3.2 封装的步骤实现 1.4 构造方法1.4.1 构造方法的作用1.4.2 构造方法的格式1.4.3 构造方法的应用 1.5 this关键字的作用1.5.1 this关键字的作用1.5.2 this关键字的应用1.5.2.1 用于普通的…