Spark SQL----ANSI Compliance

news2025/1/17 15:44:56

Spark SQL----ANSI Compliance

  • 一、算术运算
  • 二、Cast
    • 2.1 Rounding in cast
  • 三、存储分配
  • 四、Type coercion
    • 4.1 类型提升和优先级
    • 4.2 最不常见类型解析
  • 五、SQL函数
    • 5.1 函数调用
    • 5.2 具有不同行为的函数
  • 六、SQL操作符
  • 七、ANSI模式的有用函数
  • 八、SQL关键字(可选,默认禁用)

在Spark SQL中,有两个选项符合SQL标准:spark.sql.ansi.enabled和spark.sql.storeAssignmentPolicy(详细信息请参阅下表)。
当spark.sql.ansi.enabled设置为true时,Spark SQL使用符合ANSI的方言,而不是符合Hive的方言。例如,如果SQL运算符/函数的输入无效,Spark将在运行时抛出异常,而不是返回null结果。一些ANSI方言功能可能不是直接来自ANSI SQL标准,但它们的行为与ANSI SQL的风格一致。
此外,Spark SQL有一个独立的选项来控制在表中插入行时的隐式强制转换行为。类型转换行为在标准中被定义为存储分配规则。
当spark.sql.storeAssignmentPolicy设置为ANSI时,Spark SQL符合ANSI存储分配规则。这是一个单独的配置,因为它的默认值是ANSI,而默认情况下禁用配置spark.sql.ansi.enabled。

Property NameDefaultMeaningSince Version
spark.sql.ansi.enabledfalse当为true时,Spark会尝试遵守ANSI SQL规范:
1。Spark SQL会对无效操作抛出运行时异常,包括整数溢出错误、字符串解析错误等。
2。Spark将使用不同的类型强制规则来解决数据类型之间的冲突。规则始终基于数据类型优先级。
3.0.0
spark.sql.storeAssignmentPolicyANSI在不同数据类型的列中插入值时,Spark将执行类型转换。目前,Spark支持三种类型强制规则策略:ANSI、legacy和strict
1。使用ANSI策略,Spark根据ANSI SQL执行类型强制。在实践中,行为与PostgreSQL基本相同。它不允许某些不合理的类型转换,例如将字符串转换为int或将double转换为boolean。在插入数字类型列时,如果值超出目标数据类型的范围,则会引发溢出错误
2。对于遗留策略,Spark允许类型强制,只要它是有效的Cast,这是非常宽松的。例如,允许将string转换为int或将double转换为boolean。这也是仅在Spark2.x中的行为,并且与Hive兼容
3。通过严格的策略,Spark不允许在类型强制中出现任何可能的精度损失或数据截断,例如不允许将double转换为int或将decimal转换为double。
3.0.0

以下小节介绍了启用ANSI模式时算术运算、类型转换和SQL解析的行为变化。对于Spark SQL中的类型转换,有三种类型,本文将逐一介绍:强制转换、存储赋值和类型强制。

一、算术运算

在Spark SQL中,默认情况下不检查对数字类型(十进制除外)执行的算术操作是否溢出。这意味着,如果一个操作导致溢出,其结果与Java/Scala程序中的相应操作相同(例如,如果两个integers的总和大于可表示的最大值,则结果为负数)。另一方面,Spark SQL对于小数溢出返回null。当spark.sql.ansi.enabled设置为true并且在数字和间隔(interval)算术运算中发生溢出时,它会抛出一个算术异常。

-- `spark.sql.ansi.enabled=true`
SELECT 2147483647 + 1;
org.apache.spark.SparkArithmeticException: [ARITHMETIC_OVERFLOW] integer overflow. Use 'try_add' to tolerate overflow and return NULL instead. If necessary set spark.sql.ansi.enabled to "false" to bypass this error.
== SQL(line 1, position 8) ==
SELECT 2147483647 + 1
       ^^^^^^^^^^^^^^

SELECT abs(-2147483648);
org.apache.spark.SparkArithmeticException: [ARITHMETIC_OVERFLOW] integer overflow. If necessary set spark.sql.ansi.enabled to "false" to bypass this error.

-- `spark.sql.ansi.enabled=false`
SELECT 2147483647 + 1;
+----------------+
|(2147483647 + 1)|
+----------------+
|     -2147483648|
+----------------+

SELECT abs(-2147483648);
+----------------+
|abs(-2147483648)|
+----------------+
|     -2147483648|
+----------------+

二、Cast

当spark.sql.ansi.enabled设置为true时,CAST语法的显式强制转换将为标准中定义的非法强制转换patterns抛出运行时异常,例如从string强制转换为integer。此外,ANSI SQL模式不允许以下类型转换,它们在ANSI模式关闭时是允许的:

  • Numeric <=> Binary
  • Date <=> Boolean
  • Timestamp <=> Boolean
  • Date => Numeric

下表给出了CAST表达式中源数据类型和目标数据类型的有效组合。“Y”表示该组合在语法上不受限制地有效,“N”表示该组合无效。
此表格见这里。
在上表中,所有具有新语法的CAST都标记为红色Y:
CAST(Numeric AS Numeric):如果值超出目标数据类型的范围,则引发溢出异常。
CAST(String AS (Numeric/Date/Timestamp/Timestamp_NTZ/Interval/Boolean)):如果无法将值解析为目标数据类型,则引发运行时异常。
CAST(Timestamp AS Numeric):如果自epoch以来的秒数超出目标数据类型的范围,则引发溢出异常。
CAST(Numeric AS Timestamp):如果numeric值乘以1000000(微秒/秒)超出Long类型的范围,则引发溢出异常。
CAST(Array AS Array):如果元素的转换中有异常,则引发异常。
CAST(Map AS Map):如果在key和value的转换上有任何异常,则引发异常。
CAST(Struct AS Struct):如果在struct字段的转换上存在异常,则引发异常。
CAST(Numeric AS String):将十进制值强制转换为字符串时,始终使用纯字符串表示法,而不是在需要指数时使用科学表示法
CAST(Interval AS Numeric):如果day-time interval的微秒数或year-month interval的月数超出目标数据类型的范围,则引发溢出异常。
CAST(Numeric AS Interval):如果目标interval的结束单位的numeric时间超出Int类型(year-month intervals)或Long类型(day-time intervals)的范围,则引发溢出异常。

-- Examples of explicit casting

-- `spark.sql.ansi.enabled=true`
SELECT CAST('a' AS INT);
org.apache.spark.SparkNumberFormatException: [CAST_INVALID_INPUT] The value 'a' of the type "STRING" cannot be cast to "INT" because it is malformed. Correct the value as per the syntax, or change its target type. Use `try_cast` to tolerate malformed input and return NULL instead. If necessary set "spark.sql.ansi.enabled" to "false" to bypass this error.
== SQL(line 1, position 8) ==
SELECT CAST('a' AS INT)
       ^^^^^^^^^^^^^^^^

SELECT CAST(2147483648L AS INT);
org.apache.spark.SparkArithmeticException: [CAST_OVERFLOW] The value 2147483648L of the type "BIGINT" cannot be cast to "INT" due to an overflow. Use `try_cast` to tolerate overflow and return NULL instead. If necessary set "spark.sql.ansi.enabled" to "false" to bypass this error.

SELECT CAST(DATE'2020-01-01' AS INT);
org.apache.spark.sql.AnalysisException: cannot resolve 'CAST(DATE '2020-01-01' AS INT)' due to data type mismatch: cannot cast date to int.
To convert values from date to int, you can use function UNIX_DATE instead.

-- `spark.sql.ansi.enabled=false` (This is a default behaviour)
SELECT CAST('a' AS INT);
+--------------+
|CAST(a AS INT)|
+--------------+
|          null|
+--------------+

SELECT CAST(2147483648L AS INT);
+-----------------------+
|CAST(2147483648 AS INT)|
+-----------------------+
|            -2147483648|
+-----------------------+

SELECT CAST(DATE'2020-01-01' AS INT)
+------------------------------+
|CAST(DATE '2020-01-01' AS INT)|
+------------------------------+
|                          null|
+------------------------------+

-- Examples of store assignment rules
CREATE TABLE t (v INT);

-- `spark.sql.storeAssignmentPolicy=ANSI`
INSERT INTO t VALUES ('1');
org.apache.spark.sql.AnalysisException: [INCOMPATIBLE_DATA_FOR_TABLE.CANNOT_SAFELY_CAST] Cannot write incompatible data for table `spark_catalog`.`default`.`t`: Cannot safely cast `v`: "STRING" to "INT".

-- `spark.sql.storeAssignmentPolicy=LEGACY` (This is a legacy behaviour until Spark 2.x)
INSERT INTO t VALUES ('1');
SELECT * FROM t;
+---+
|  v|
+---+
|  1|
+---+

2.1 Rounding in cast

当将带有小数的十进制数转换为以SECOND作为结束单位的间隔类型(如INTERVAL HOUR TO SECOND)时,Spark将小数部分舍入到“nearest neighbor”,除非两个邻居距离相等,在这种情况下,四舍五入。

三、存储分配

如开头所述,当spark.sql.storeAssignmentPolicy被设置为ANSI(这是默认值)时,Spark SQL在表插入上遵循ANSI存储分配规则。下表给出了表插入中源数据类型和目标数据类型的有效组合。
此表格见这里。

  • Spark不支持interval类型的表列。
  • 对于Array/Map/Struct类型,数据类型检查规则递归地应用于其组件元素。

在插入表时,Spark会在数值溢出时抛出异常。

CREATE TABLE test(i INT);

INSERT INTO test VALUES (2147483648L);
org.apache.spark.SparkArithmeticException: [CAST_OVERFLOW_IN_TABLE_INSERT] Fail to insert a value of "BIGINT" type into the "INT" type column `i` due to an overflow. Use `try_cast` on the input value to tolerate overflow and return NULL instead.

四、Type coercion

4.1 类型提升和优先级

当spark.sql.ansi.enabled设置为true时,Spark SQL使用一些规则来管理如何解决数据类型之间的冲突。这种冲突解决的核心是类型优先级列表,它定义了给定数据类型的值是否可以隐式地提升到另一个数据类型。

Data typeprecedence list(从最窄到最宽)
ByteByte -> Short -> Int -> Long -> Decimal -> Float* -> Double
ShortShort -> Int -> Long -> Decimal-> Float* -> Double
IntInt -> Long -> Decimal -> Float* -> Double
LongLong -> Decimal -> Float* -> Double
DecimalDecimal -> Float* -> Double
FloatFloat -> Double
DoubleDouble
DateDate -> Timestamp_NTZ -> Timestamp
TimestampTimestamp
StringString, Long -> Double, Date -> Timestamp_NTZ -> Timestamp , Boolean, Binary **
BinaryBinary
BooleanBoolean
IntervalInterval
MapMap***
ArrayArray***
StructStruct***
  • 对于最不常见的类型解析,float被跳过以避免精度损失。
  • 字符串可以提升为多种数据类型。请注意,Byte/Short/Int/Decimal/Float不在此precedent列表中。Byte/Short/Int和String之间最不常见的类型是Long, Decimal和Float之间最不常见的类型是Double。
  • 对于复杂类型,优先级规则递归地应用于其组成元素。特殊规则适用于未类型化的NULL。NULL可以被提升为任何其他类型。这是优先级列表作为有向树的图形描述:
    在这里插入图片描述

4.2 最不常见类型解析

一组类型中最不常见的类型是该组类型的所有元素从优先级列表中可访问的最窄(narrowest)类型。
最不常见的类型解析用于:

  • 派生函数的参数类型,这些函数需要多个参数的共享参数类型,例如coalesce、最小或最大。
  • 派生算术运算或比较等运算符的操作数类型。
  • 派生表达式(如大小写表达式)的结果类型。
  • 派生数组和映射构造函数的元素、键或值类型。如果最不常见的类型解析为FLOAT,则应用特殊规则。对于浮点类型值,如果任何类型是INT、BIGINT或DECIMAL,则最不常见的类型将被推到DOUBLE,以避免潜在的数字丢失。
-- The coalesce function accepts any set of argument types as long as they share a least common type. 
-- The result type is the least common type of the arguments.
> SET spark.sql.ansi.enabled=true;
> SELECT typeof(coalesce(1Y, 1L, NULL));
BIGINT
> SELECT typeof(coalesce(1, DATE'2020-01-01'));
Error: Incompatible types [INT, DATE]

> SELECT typeof(coalesce(ARRAY(1Y), ARRAY(1L)));
ARRAY<BIGINT>
> SELECT typeof(coalesce(1, 1F));
DOUBLE
> SELECT typeof(coalesce(1L, 1F));
DOUBLE
> SELECT (typeof(coalesce(1BD, 1F)));
DOUBLE

> SELECT typeof(coalesce(1, '2147483648'))
BIGINT
> SELECT typeof(coalesce(1.0, '2147483648'))
DOUBLE
> SELECT typeof(coalesce(DATE'2021-01-01', '2022-01-01'))
DATE

五、SQL函数

5.1 函数调用

在ANSI模式下(spark.sql.ansi.enabled=true),Spark SQL的函数调用:

  • 通常,它遵循存储分配规则,将输入值存储为SQL函数的声明参数类型
  • 特殊规则适用于非类型化的NULL。NULL可以升级为任何其他类型。
> SET spark.sql.ansi.enabled=true;
-- implicitly cast Int to String type
> SELECT concat('total number: ', 1);
total number: 1
-- implicitly cast Timestamp to Date type
> select datediff(now(), current_date);
0

-- implicitly cast String to Double type
> SELECT ceil('0.1');
1
-- special rule: implicitly cast NULL to Date type
> SELECT year(null);
NULL

> CREATE TABLE t(s string);
-- Can't store String column as Numeric types.
> SELECT ceil(s) from t;
Error in query: cannot resolve 'CEIL(spark_catalog.default.t.s)' due to data type mismatch
-- Can't store String column as Date type.
> select year(s) from t;
Error in query: cannot resolve 'year(spark_catalog.default.t.s)' due to data type mismatch

5.2 具有不同行为的函数

在ANSI模式下,某些SQL函数的行为可能会有所不同(spark.sql.ansi.enabled=true)。

  • size:输入为null,则此函数返回null。
  • element_at:如果使用无效索引,此函数将引发ArrayIndexOutOfBoundsException。
  • elt:如果使用无效索引,此函数将引发ArrayIndexOutOfBoundsException。
  • parse_url:如果输入字符串不是有效的url,此函数将抛出IllegalArgumentException。
  • to_date:如果输入字符串无法解析,或者pattern字符串无效,则此函数将失败并抛出异常。
  • to_timestamp:如果输入字符串无法解析,或者pattern字符串无效,则此函数将失败并抛出异常。
  • unix_timestamp:如果输入字符串无法解析,或者pattern字符串无效,则此函数将失败并抛出异常。
  • to_unix_timestamp:如果输入字符串无法解析,或者pattern字符串无效,则此函数将失败并抛出异常。
  • make_date:如果结果日期无效,则此函数应失败并抛出异常。
  • make_timestamp:如果结果时间戳无效,此函数将失败并抛出异常。
  • make_interval:如果结果间隔无效,此函数将失败并抛出异常。
  • next_day:如果输入不是有效的星期几,则此函数引发IllegalArgumentException。

六、SQL操作符

在ANSI模式下,某些SQL操作符的行为可能会有所不同(spark.sql.ansi.enabled=true)。

  • array_col[index]:如果使用无效的索引,将抛出ArrayIndexOutOfBoundsException。

七、ANSI模式的有用函数

当ANSI模式打开时,它会为无效操作抛出异常。你可以使用以下SQL函数来抑制此类异常。

  • try_cast:与cast相同,只是它在运行出错时返回NULL结果,而不是抛出异常。
  • try_add:与add运算符+相同,只是它在整数值溢出时返回NULL结果,而不是抛出异常。
  • try_subtract:与subtract运算符-相同,只是它在整数值溢出时返回NULL结果,而不是抛出异常。
  • try_multiply:与multiply运算符*相同,只是它在整数值溢出时返回NULL结果,而不是抛出异常。
  • try_divide:与除法运算符/相同,只是它在除0时返回NULL结果,而不是抛出异常。
  • try_sum:与函数sum相同,只是它在integral/decimal/interval值溢出时返回NULL结果,而不是抛出异常。
  • try_avg:与函数avg相同,只是它在decimal/interval值溢出时返回NULL结果,而不是抛出异常。
  • try_element_at:与函数element_at相同,只是它在数组的索引越界时返回NULL结果,而不是抛出异常。
  • try_to_timestamp:与函数to_timestamp相同,只是它在字符串解析错误时返回NULL结果,而不是抛出异常。

八、SQL关键字(可选,默认禁用)

当spark.sql.ansi.enabled和spark.sql.ansi.enforceReservedKeywords都为true时,Spark SQL将使用ANSI模式解析器。
使用ANSI模式解析器,Spark SQL有两种关键字:

  • 非保留关键字:仅在特定上下文中具有特殊含义,并可在其他上下文中用作标识符的关键字。例如,EXPLAIN SELECT …是一个命令,但EXPLAIN可以在其他地方用作标识符。
  • 保留关键字:保留的关键字不能用作表、视图、列、函数、别名等的标识符。
    使用默认的解析器,Spark SQL有两种关键字:
  • 非保留关键字:与启用ANSI模式时的定义相同。
  • 严格非保留关键字:比非保留关键字的更严格,不能用作表别名。
    默认情况下,spark.sql.ansi.enabled和spark.sql.ansi.enforceReservedKeywords均为false。
    后面的链接是Spark SQL中所有关键字的列表。

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

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

相关文章

特征工程的力量

为什么你应该使用逻辑回归来建模非线性决策边界&#xff08;使用 Python 代码&#xff09; 作为一名大数据从业者&#xff0c;复杂的机器学习技术非常具有吸引力。使用一些深度神经网络 (DNN) 获得额外的 1% 准确率&#xff0c;并在此过程中启动 GPU 实例&#xff0c;这让人非常…

Markdown、Latex编辑小工具

Markdown、Latex编辑小工具 文章说明主要代码效果展示源码下载 文章说明 本文主要为了书写Latex的书写风格&#xff0c;以及了解自己实现一个markdown类型的编辑器的过程&#xff1b;目前实现了当前的效果&#xff1b;书写文章进行记录&#xff0c;方便后续查阅 目前还未添加好…

鸿蒙 HarmonyOs 动画效果 快速入门

一、理论 1.1 animation属性 名称参数类型必填描述durationnumber否设置动画时长&#xff0c;默认值&#xff1a;1000&#xff0c;单位&#xff1a;毫秒temponumber否动画播放速度。数值越大&#xff0c;速度越快&#xff0c;默认为1curvestring | Curve否 设置动画曲线。 默…

在node环境使用MySQL

什么是Sequelize? Sequelize是一个基于Promise的NodeJS ORM模块 什么是ORM? ORM(Object-Relational-Mapping)是对象关系映射 对象关系映射可以把JS中的类和对象&#xff0c;和数据库中的表和数据进行关系映射。映射之后我们就可以直接通过类和对象来操作数据表和数据了, 就…

昇思25天学习打卡营第13天|MindNLP ChatGLM-6B StreamChat

学AI还能赢奖品&#xff1f;每天30分钟&#xff0c;25天打通AI任督二脉 (qq.com) MindNLP ChatGLM-6B StreamChat 本案例基于MindNLP和ChatGLM-6B实现一个聊天应用。 1 环境配置 %%capture captured_output # 实验环境已经预装了mindspore2.2.14&#xff0c;如需更换mindspo…

len()函数——计算字符串长度或元素个数

自学python如何成为大佬(目录):https://blog.csdn.net/weixin_67859959/article/details/139049996?spm1001.2014.3001.5501 语法参考 len()函数的主要功能是获取一个&#xff08;字符、列表、元组等&#xff09;可迭代对象的长度或项目个数。其语法格式如下&#xff1a; l…

精密空气加热器负载组

小型便携式 &#xff1a;精密空气加热器&#xff08;负载组&#xff09;能够对数据中心热通道/冷通道冷却系统进行全面测试。EAK 是一款 19 英寸机架式设备&#xff08;10U 高&#xff09;&#xff0c;可轻松安装到各种标准服务器机架中。通过集成可调节的热量水平&#xff08;…

【Android面试八股文】性能优化相关面试题: 什么是内存抖动?什么是内存泄漏?

文章目录 一、什么是内存抖动?内存抖动的问题卡顿OOM(Out Of Memory)二、什么是内存泄漏(Memory Leak)?引用计数法可达性分析法一、什么是内存抖动? 在Java中,每创建一个对象,就会申请一块内存,存储对象信息; 每分配一块内存,程序的可用内存也就少一块; 当程序…

java设计模式(十二)享元模式(Flyweight Pattern)

1、模式介绍&#xff1a; 享元模式是一种结构型设计模式&#xff0c;旨在通过共享对象来有效支持大量细粒度的对象。它通过将对象的状态分为内部状态&#xff08;可共享&#xff09;和外部状态&#xff08;不可共享&#xff09;来减少内存消耗和提高性能。内部状态存储在享元对…

SpringMVC基础详解

文章目录 一、SpringMVC简介1、什么是MVC2、MVC架构模式与三层模型的区别3、什么是SpringMVC 二、HelloWorld程序1、pom文件2、springmvc.xml3、配置web.xml文件4、html文件5、执行Controller 三、RequestMapping注解1、value属性1.1、基础使用1.2、Ant风格&#xff08;模糊匹配…

详细分析Java中@RequiredArgsConstructor注解的基本知识(附Demo)

目录 前言1. 基本知识2. 源码解读3. Demo3.1 简易Demo3.2 staticName属性3.3 onConstructor属性3.4 access属性 4. AllArgsConstructor比较 前言 从源码中学习&#xff0c;事因是看到项目代码中有所引用 RequiredArgsConstructor 是 Lombok 提供的一个注解&#xff0c;用于自…

容器:deque

以下是对于deque容器知识的整理 1、构造 2、赋值 3、大小操作 4、插入 5、删除 6、数据存取 7、排序 #include <iostream> #include <deque> #include <algorithm> using namespace std; /* deque容器&#xff1a;双端数组&#xff0c;可以对头端进行插入删…

2024年06月CCF-GESP编程能力等级认证Scratch图形化编程四级真题解析

本文收录于《Scratch等级认证CCF-GESP图形化真题解析》专栏,专栏总目录:点这里,订阅后可阅读专栏内所有文章。 一、单选题(共 10 题,每题 2 分,共 30 分) 第1题 小杨父母带他到某培训机构给他报名参加 CCF 组织的 GESP 认证考试的第 1 级,那他可以选择的认证语言有几…

树状数组——点修区查与区修点查

树状数组是一种代码量小&#xff0c;维护区间的数据结构 他可以实现&#xff1a; 1.区间修改&#xff0c;单点查询 2.单点修改&#xff0c;区间查询 当然&#xff0c;二者不可兼得&#xff0c;大人全都要的话&#xff0c;请选择线段树 前置知识&#xff1a; lowbit(x)操作…

zerotier-one自建根服务器方法四

一、简介 前面几篇文章已经写完了安装配置服务器&#xff0c;今天写一下客户端如何连接自建的服务器。 二、准备工作 准备一个有公网IP的云主机。 要稳定性、安全性、不差钱的可以使用阿里、腾讯等大厂的云服务器。 本人穷屌丝一枚&#xff0c;所以我用的是免费的“三丰云…

常见sql语句练习

Tips&#xff1a;之前查看网上的文章感觉太乱了&#xff0c;所以自己整理了一套sql语句来练习&#xff0c;主要也可以拿来应对面试&#xff0c;需要的可以自行下载练习 包含基本语句、聚合函数、模糊查询、范围查询、排序、聚合、分组、分页、子查询、索引和视图、左右连接、双…

商城积分系统的代码实现(下)-- 积分订单的退款与结算

一、接着上文 用户在消耗积分的时候&#xff0c;需要根据一定的逻辑&#xff0c;除了扣减账户的当前余额&#xff0c;还需要依次消费积分订单的余额。 private void updatePointsOrderByUse(Integer schoolId, Long userId, String pointsType, int usingPoints) {List<Po…

数字证书与PKI解析

目录 1. 什么是数字证书 2. 为什么需要数字证书 3. 数字证书的格式 4. 什么是PKI 5. PKI的组成要素组件 5.1 用户 5.2 认证机构&#xff08;CA&#xff09; 5.3 仓库 5.4 PKI的体系结构 5.4.1 层次结构模型 5.4.2 交叉证明模型 5.4.3 混合模型 1. 什么是数字证书 要…

Django任意URL跳转漏洞(CVE-2018-14574)

目录 Django介绍 URL跳转漏洞介绍 Django任意URL跳转漏洞介绍 环境搭建 防御方法 前段时间在面试时&#xff0c;问到了URL跳转漏洞&#xff0c;我没有回答好&#xff0c;下午把URL跳转漏洞学习了&#xff0c;发现也不难&#xff0c;看来还需要学习的东西很多呀&#xff0c…

burp靶场xss漏洞(中级篇)下

靶场地址 All labs | Web Security Academy 第九关&#xff1a;反射型&#xff08; 转义&#xff09; 1.在搜索框随机输入字符并用Burp抓包 2.测试不同字符在JavaScript字符串中的反映&#xff0c;发现查询结果被包裹在script标签中 而单引号会被转义为 \ 3.构造payload跳出j…