-
PromQL(Prometheus Query Language) 是 Prometheus 自己开发的数据查询 DSL 语言,语言表现力非常丰富,支持条件查询、操作符,并且内建了大量内置函数,供我们针对监控数据的各种维度进行查询。监控数据结构毕竟有限,相比于SQL语言,语法更简单直接。查询数据方式分为瞬时向量查询和范围向量查询:目标实例状态:up查询指标最新样本(称为瞬时向量):例如node_cpu_seconds_total可以通过附加一组标签来进一步过来这些时间序列:node_cpu_seconds_total{job="Linux Server"}查询指标近5分钟内样本(称为范围向量,时间单位 s,m,h,d,w,y):node_cpu_seconds_total{job="Linux Server"}[5m]node_cpu_seconds_total{job="Linux Server"}[1h]支持的数据操作类型:比较操作符:= 等于!= 不等于 > 大于 < 小于 >= 大于等于 <= 小于等于示例:node_cpu_seconds_total{job="Linux Server",mode="iowait"} node_cpu_seconds_total{job="Linux Server",mode=~"user|system",cpu!="0"}算术操作符 + 加法 - 减法 * 乘法 / 除法内存使用率:100 - (node_memory_MemFree_bytes+node_memory_Cached_bytes+node_memory_Buffers_bytes) /node_memory_MemTotal_bytes * 100正则匹配操作符 =~ 正则表达式匹配!~ 正则表达式匹配结果取反磁盘使用率:100-(node_filesystem_free_bytes{mountpoint="/",fstype=~"ext4|xfs"}/node_filesystem_size_bytes{mountpoint="/",fstype=~"ext4|xfs"} * 100)聚合操作符sum (在维度上求和)max (在维度上求最大值)min (在维度上求最小值)avg (在维度上求平均值)count(统计样本数量)所有实例CPU system使用率总和:sum(node_cpu_seconds_total{job="Linux Server",mode="system"}) 逻辑操作符 and 与or 或大于10并且小于50:prometheus_http_requests_total > 10 and prometheus_http_requests_total < 50
-
MySQL的通配符很有用。但这种功能是有代价的:通配符搜索的处理一般要比前面讨论的其他搜索所花时间更长。这里给出一些使用通配符要记住的技巧。不要过度使用通配符。如果其他操作符能达到相同的目的,应该 使用其他操作符。在确实需要使用通配符时,除非绝对有必要,否则不要把它们用 在搜索模式的开始处。把通配符置于搜索模式的开始处,搜索起 来是最慢的。仔细注意通配符的位置。如果放错地方,可能不会返回想要的数.
-
通配符的分类:%百分号通配符:表示任何字符出现任意次数(可以是0次)._下划线通配符:表示只能匹配单个字符,不能多也不能少,就是一个字符.like操作符: LIKE作用是指示mysql后面的搜索模式是利用通配符而不是直接相等匹配进行比较.注意: 如果在使用like操作符时,后面的没有使用通用匹配符效果是和=一致的,SELECT * FROM products WHERE products.prod_name like '1000';只能匹配的结果为1000,而不能匹配像JetPack 1000这样的结果.%通配符使用: 匹配以"yves"开头的记录:(包括记录"yves") SELECT FROM products WHERE products.prod_name like 'yves%';匹配包含"yves"的记录(包括记录"yves") SELECT FROM products WHERE products.prod_name like '%yves%';匹配以"yves"结尾的记录(包括记录"yves",不包括记录"yves ",也就是yves后面有空格的记录,这里需要注意) SELECT * FROM products WHERE products.prod_name like '%yves';通配符使用: SELECT FROM products WHERE products.prod_name like '_yves'; 匹配结果为: 像"yyves"这样记录.SELECT FROM products WHERE products.prod*name like 'yves*'; 匹配结果为: 像"yvesHe"这样的记录.(一个下划线只能匹配一个字符,不能多也不能少)
-
【问题描述】TIK编写如下代码:with tik_instance.if_scope(((input_a > 1) and (input_a < input_b))): out_c.set_as(16)with tik_instance.else_scope(): out_c.set_as(32)得到的CCE代码是 if (1 < inputscalar_a) { out_c1[0] = (half)1.600000e+01f; } else { out_c1[0] = (half)3.200000e+01f; }问题:CCE代码中遗漏了条件input_a < input_b【备注】除非官方文档有明确答案,否则请不要直接给我个链接,谢谢。[暂时解决方案]拆成多条分支语句,但我认为这极大削弱了TIK的可编程性和维护性。
yd_274662286 发表于2021-07-06 12:35:32 2021-07-06 12:35:32 最后回复 yd_274662286 2021-07-06 17:03:15
1031 4 -
1 SHA1算法简介安全哈希算法(Secure Hash Algorithm)主要适用于数字签名标准(Digital Signature Standard DSS)里面定义的数字签名算法(Digital Signature Algorithm DSA)。对于长度小于2^64位的消息,SHA1会产生一个160位的消息摘要。当接收到消息的时候,这个消息摘要可以用来验证数据的完整性。在传输的过程中,数据很可能会发生变化,那么这时候就会产生不同的消息摘要。SHA1有如下特性:不可以从消息摘要中复原信息;两个不同的消息不会产生同样的消息摘要。2 术语和概念2.1位(Bit),字节(Byte)和字(Word)SHA1始终把消息当成一个位(bit)字符串来处理。本文中,一个“字”(Word)是32位,而一个“字节”(Byte)是8位。比如,字符串“abc”可以被转换成一个位字符串:01100001 01100010 01100011。它也可以被表示成16进制字符串: 0x616263.2.2 运算符和符号下面的逻辑运算符都被运用于“字”(Word)X^Y = X, Y逻辑与X \/ Y = X, Y逻辑或X XOR Y= X, Y逻辑异或~X = X逻辑取反X+Y定义如下:字 X 和 Y 代表两个整数 x 和y, 其中 0 <= x < 2^32 且 0 <= y < 2^32. 令整数z = (x + y) mod 2^32. 这时候 0 <= z < 2^32. 将z转换成字Z, 那么就是 Z = X + Y.循环左移位操作符Sn(X)。X是一个字,n是一个整数,0<=n<=32。Sn(X) = (X<<n)OR(X>>32-n)X<<n定义如下:抛弃最左边的n位数字,将各个位依次向左移动n位,然后用0填补右边的n位(最后结果还是32位)。X>>n是抛弃右边的n位,将各个位依次向右移动n位,然后在左边的n位填0。因此可以叫Sn(X)位循环移位运算3 SHA1算法描述在SHA1算法中,我们必须把原始消息(字符串,文件等)转换成位字符串。SHA1算法只接受位作为输入。假设我们对字符串“abc”产生消息摘要。首先,我们将它转换成位字符串如下:01100001 01100010 01100011―――――――――――――‘a’=97 ‘b’=98 ‘c’=99这个位字符串的长度为24。下面我们需要5个步骤来计算MD5。3.1 补位 消息必须进行补位,以使其长度在对512取模以后的余数是448。也就是说,(补位后的消息长度)%512 = 448。即使长度已经满足对512取模后余数是448,补位也必须要进行。 补位是这样进行的:先补一个1,然后再补0,直到长度满足对512取模后余数是448。总而言之,补位是至少补一位,最多补512位。还是以前面的“abc”为例显示补位的过程。原始信息: 01100001 01100010 01100011补位第一步:01100001 01100010 01100011 1 首先补一个“1”补位第二步:01100001 01100010 01100011 10…..0 然后补423个“0”我们可以把最后补位完成后的数据用16进制写成下面的样子61626380 00000000 00000000 0000000000000000 00000000 00000000 0000000000000000 00000000 00000000 0000000000000000 00000000现在,数据的长度是448了,我们可以进行下一步操作。3.2 补长度 所谓的补长度是将原始数据的长度补到已经进行了补位操作的消息后面。通常用一个64位的数据来表示原始消息的长度。如果消息长度不大于2^64,那么第一个字就是0。在进行了补长度的操作以后,整个消息就变成下面这样了(16进制格式)61626380 00000000 00000000 0000000000000000 00000000 00000000 0000000000000000 00000000 00000000 0000000000000000 00000000 00000000 00000018如果原始的消息长度超过了512,我们需要将它补成512的倍数。然后我们把整个消息分成一个一个512位的数据块,分别处理每一个数据块,从而得到消息摘要。3.3 使用的常量一系列的常量字K(0), K(1), ... , K(79),如果以16进制给出。它们如下:Kt = 0x5A827999 (0 <= t <= 19)Kt = 0x6ED9EBA1 (20 <= t <= 39)Kt = 0x8F1BBCDC (40 <= t <= 59)Kt = 0xCA62C1D6 (60 <= t <= 79).3.4 需要使用的函数在SHA1中我们需要一系列的函数。每个函数ft (0 <= t <= 79)都操作32位字B,C,D并且产生32位字作为输出。ft(B,C,D)可以如下定义ft(B,C,D) = (B AND C) or ((NOT B) AND D) ( 0 <= t <= 19)ft(B,C,D) = B XOR C XOR D (20 <= t <= 39)ft(B,C,D) = (B AND C) or (B AND D) or (C AND D) (40 <= t <= 59)ft(B,C,D) = B XOR C XOR D (60 <= t <= 79).3.5 计算消息摘要必须使用进行了补位和补长度后的消息来计算消息摘要。计算需要两个缓冲区,每个都由5个32位的字组成,还需要一个80个32位字的缓冲区。第一个5个字的缓冲区被标识为A,B,C,D,E。第一个5个字的缓冲区被标识为H0, H1, H2, H3, H4。80个字的缓冲区被标识为W0, W1,..., W79另外还需要一个一个字的TEMP缓冲区。为了产生消息摘要,在第4部分中定义的16个字的数据块M1, M2,..., Mn会依次进行处理,处理每个数据块Mi 包含80个步骤。在处理每个数据块之前,缓冲区{Hi} 被初始化为下面的值(16进制)H0 = 0x67452301H1 = 0xEFCDAB89H2 = 0x98BADCFEH3 = 0x10325476H4 = 0xC3D2E1F0.现在开始处理M1, M2, ... , Mn。为了处理 Mi,需要进行下面的步骤(1). 将 Mi 分成 16 个字 W0, W1, ... , W15, W0 是最左边的字(2). 对于 t = 16 到 79 令 Wt = S1(Wt-3 XOR Wt-8 XOR Wt- 14 XOR Wt-16).(3). 令 A = H0, B = H1, C = H2, D = H3, E = H4.(4) 对于 t = 0 到 79,执行下面的循环TEMP = S5(A) + ft(B,C,D) + E + Wt + Kt;E = D; D = C; C = S30(B); B = A; A = TEMP;(5). 令 H0 = H0 + A, H1 = H1 + B, H2 = H2 + C, H3 = H3 + D, H4 = H4 + E.在处理完所有的 Mn, 后,消息摘要是一个160位的字符串,以下面的顺序标识H0 H1 H2 H3 H4.对于SHA256,SHA384,SHA512。你也可以用相似的办法来计算消息摘要。对消息进行补位的算法完全是一样的。
-
获得键盘输入会员号。将会员卡号存储在变量中。使用运算符分解会员卡号的个位上的数字。将分解后的数字相加判断是否中奖。首先要使用Scanner的类的方法获得用户从键盘输入的数据。Scanner类是用于扫描输入文本的使用程序。如果使用Scanner类,必须使用import语句导入Scanner类,即指定Scanner类的位置,它将位于java。util包中。(1)导入Scanner类import java.util.*;(2)创建Scanner对象,获得键盘输入的数据Scanner input = new Scanner(System.in):(3)将数据存入变量,输出这个变量.import java.util.Scanner; //导入Scanner类public class Lucky{ public static void main(String[] args){ int custNo; //客户会员号 //输入会员卡号 System.out.println("请输入4位会员卡号:"); Scanner input=new Scanner(System.in); //System.in代表系统输入 custNo=input.nextInt(); //nextInt()获取从键盘输入的一个整数,并赋值给num变量 System.out.println("会员卡号是:"+custNo); }}4位会员卡号和10求余可得个位数4位会员卡号除以10再和10求余可得十位数4位会员卡号除以100再和10求余可得百位数4位会员卡号除以1000可得十位数计算各位之和import java.util.Scanner; //导入Scanner类public class Lucky{ public static void main(String[] args){ int custNo; //客户会员号 //输入会员卡号 System.out.println("请输入4位会员卡号:"); Scanner input=new Scanner(System.in); //System.in代表系统输入 custNo=input.nextInt(); //nextInt()获取从键盘输入的一个整数,并赋值给num变量 System.out.println("会员卡号是:"+custNo); //利用"/"和"%"运算符获得每位数字 int ge=custNo%10; //分解获得个位数 int shi=custNo/10%10; //分解获得十位数 int bai=custNo/100%10; //分解获得百位数 int qian=custNo/1000; //分解获得千位数 System.out.print("千位数:"+qian+",百位数:"+bai+",十位数:"+shi+",个位数:"+ge,); //利用"+"运算符计算数字之和 int sum=ge+shi+bai+qian; System.out.println("会员卡号"+custNo+"各位之和:"+sum); }}10.使用关系运算符中的">"判断import java.util.Scanner; //导入Scanner类public class Lucky{ public static void main(String[] args){ int custNo; //客户会员号 //输入会员卡号 System.out.println("请输入4位会员卡号:"); Scanner input=new Scanner(System.in); //System.in代表系统输入 custNo=input.nextInt(); //nextInt()获取从键盘输入的一个整数,并赋值给num变量 System.out.println("会员卡号是:"+custNo); //利用"/"和"%"运算符获得每位数字 int ge=custNo%10; //分解获得个位数 int shi=custNo/10%10; //分解获得十位数 int bai=custNo/100%10; //分解获得百位数 int qian=custNo/1000; //分解获得千位数 System.out.print("千位数:"+qian+",百位数:"+bai+",十位数:"+shi+",个位数:"+ge,); //利用"+"运算符计算数字之和 int sum=ge+shi+bai+qian; System.out.println("会员卡号"+custNo+"各位之和:"+sum); //判断是否中奖 if(sum>20){ System.out.println("会员卡号"+custNo+"的会员,恭喜您中奖了!奖品是MP4!"); }else{ System.out.println("会员卡号"+custNo+"的会员,很遗憾,您没有中奖!"); } }}
-
ADC2.0Script条件表达式概述及配置流程功能介绍流程图中事件、活动、网关组件出口方向可以连接一个或者多个顺序流,顺序流支持Script方式配置流转条件,流程选取条件成立的顺序流来执行。Script条件表达式使用Juel语言,格式为“${表达式}”。其中,表达式由操作对象和操作符组成,并支持使用“()”嵌套子表达式,操作对象支持解析对象、字符串、数组、数字、布尔、null等数据类型及其方法。配置流程1. 单击任意“顺序流”,则右上角显示对应的“属性(顺序流)”。图 1 配置2. 在“属性(顺序流)”中,单击“条件”,填写属性配置信息。a. 单击“条件”右侧空白处,弹出“条件”框。b. 在“条件”框内,“条件类型”选择“Script条件”,并输入“Script条件”。操作对象获取流程变量与上下文对象表达式中可以获取和使用流程变量或上下文对象,使用“.”获取对象某个元素。获取起始节点入参对象为API_Input ,例如:${API_Input.orderid eq “API-20170624-00000002”}。获取某个Service Task的入参、出参对象为API10_input、API10_output。其中,API10为环节ID,例如:${API10_input.title eq “title1”}、${API10_output.title eq “title2”}。流程上下文对象为_context,包含当前流程实例相关参数,配置在Debug页面Input、Service task节点Input/Output、Script task中的参数会自动写入流程上下文,例如:${_context.orderid eq “API-20170624-00000002”}。流程变量对象可在“Tip Parameter”窗口中单击获取,如下图所示。流程上下文对象可在“Tip Parameter”窗口中单击获取,如下图所示。使用BpmUtils工具类方法(暂不支持,330之后的版本会支持)系统为条件表达式提供的工具类,可以使用${BpmUtils.xxxx()}的格式调用,分别有以下类型:调用方式类型说明${BpmUtils.isLastTaskSuccess()}判断上个活动是否成功${BpmUtils.isAllTaskSuccess()}判断之前所有活动是否都成功${BpmUtils.getLastTaskResult()}获取上个活动的结果${BpmUtils.getAllTaskResult ()}获取所有活动的结果使用操作对象方法对于获取到的对象、字符串、数组、数字、布尔、null等数据类型,条件表达式中支持调用其对应的方法,下面将选取常用的json对象、String类型的字符串进行详细介绍,详情见下表:数据类型调用方法样例json对象get${API_Input.get("testtype") eq "test"}String类型equals${API10_input.get("testtype").equals("test")}contains${ API10_input.get("testtype").contains("test")}操作符操作符“[]”和“.”导航数据可通过使用“.”和“[]”实现。· “.”和“[]”的用法相同的情况:表达式为“${_context.orderid}等于${_context[“ordered”]} ”时,“.”和“[]”都可以使用。例如${_context.results[0].orderid}。· “.”和“[]”的用法不同的情况:o 存取的属性名称包含一些特殊字符,如“.”或“–”等,只能使用“[]”。例如:${API_Input.test-type}是不正确的方式,应使用${API_Input[“test-type”]}。o 动态取值时,只能使用“[]”。例如:${_context[API_Input.obtainMode]},obtainMode是一个变量,如果obtainMode的值为“orderid”,则表达式等于${_context[“orderid”]};如果obtainMode的值为“ticketid”,则表达式等于${_context[“ticketid”]},这种动态取值只能用“[]”方式,使用“.”的方式无法动态取值。o 数组等不存在key的数据类型,无法使用“.”的方式取值,只能通过“[]”或者“get()”取值。例如:${_context.results[0].orderid}或者${_context.results.get(0).orderid},其中results为数组。关系操作符· 关系操作符类型如下表:关系操作符含义样例结果eq或==等于${8 == 8}或${8 eq 8}truene或!=不等于${8 != 8}或${8 ne 8}falselt或<小于${6 < 8}或${6 lt 8}truegt或>大于${6 > 8}或${6 gt 8}falsele或<=小于等于${6 <= 8}或${6 le 8}truege或>=大于等于${6 >= 8}或${6 ge 8}false· 使用关系操作符时的规则为:A 关系操作符 Bo 字符串比较:若A或B为String时,将另一个也转为String,然后做词汇上的比较,也就是逐个比较字符串中字符的编码值。o null对象比较:若A或B为String时,将另一个也转为String,然后做词汇上的比较,也就是逐个比较字符串中字符的编码值。o Json对象比较:将获取的json对象转换为字符串或者null比较。o 数字比较:按照运算符比较。· 使用关系操作符时,书写格式要求严格:o 例如:${API_Input.orderid} eq ${_context.orderid}、${${API_Input.orderid} eq ${_context.orderid},二者格式均错误。o 例如:${API_Input.orderid eq _context.orderid},格式正确。逻辑操作符· 逻辑操作符类型如下表:逻辑操作符含义样例结果and或&&与${A && B}或${A and B}A、B都为true返回true,其他返回falseor或 ||或${A || B}或${A or B}A、B都为false返回false,其他返回truenot或 !非${!A}或${not A}A为true返回false,A为false返回true· 逻辑操作符的规则为:将以上A、B运算或者转换为Boolean类型,然后按操作符运算。算数操作符算数操作符类型如下表:算数操作符含义样例结果+加${8+6}14-减${8-6}2*乘${8*6}48div或/除${8/6}或${8 div 6}1mod或%取余${8%6}或${8 mod 6}2Empty操作符Empty操作符用来判断操作对象是否为null对象或者空的,例如${empty _context.result}。Empty操作符的规则为:empty A· A为null对象返回true· A为空String返回true· A为空Array返回true· 其他返回false条件操作符例如:条件语句:A ? B : C的表达式为${A ? B : C},该表达式的含义为:A如果为true则返回B结果,A如果为false返回C结果。
-
Shell 在使用的过程中经常需要用到算术运算符除了日常使用的+-*/分别代表加减乘除,还有%取余运算符、=赋值运算符、==判断相等运算符、!=判断不等于运算符。接下来就通过实例来学习一下,了解其中的细节吧~1、使用expr算术表达式使用 expr 进行算术运算需要注意两个问题:(1)运算符之间要有空格,如下所示,只有第一个 expr 85 + 23 是计算正确的,所以使用的时候千万不要忘记加空格!wyp@UOS-WYP1:~/Desktop$ expr 85 + 23 108 wyp@UOS-WYP1:~/Desktop$ expr85 + 23 bash: expr85:未找到命令 wyp@UOS-WYP1:~/Desktop$ expr 85+23 85+23 wyp@UOS-WYP1:~/Desktop$ expr 85 +23 expr: syntax error: unexpected argument “+23” wyp@UOS-WYP1:~/Desktop$ expr 85+ 23 expr: syntax error: unexpected argument “23”(2)乘法运算符使用 \*,乘法运算符前需要加 \,如下所示wyp@UOS-WYP1:~/Desktop$ expr 85 \* 23 1955 wyp@UOS-WYP1:~/Desktop$ expr 85 * 23 expr: syntax error2、使用 $(( ))如下可以看到使用这种方法没有格式的限制,是比较方便的。wyp@UOS-WYP1:~/Desktop$ echo $((85+23)) 108 wyp@UOS-WYP1:~/Desktop$ echo $(( 85 + 23)) 108 wyp@UOS-WYP1:~/Desktop$ echo $((85 + 23)) 108 wyp@UOS-WYP1:~/Desktop$ echo $((85+ 23)) 108 wyp@UOS-WYP1:~/Desktop$ echo $(( 85+23)) 108 wyp@UOS-WYP1:~/Desktop$ echo $(( 85+ 23)) 108 wyp@UOS-WYP1:~/Desktop$ echo $((85*23)) 1955 3、使用 $[ ]这种方式和 $((算术表达式))一样,如下所示wyp@UOS-WYP1:~/Desktop$ echo $[85+23] 108 wyp@UOS-WYP1:~/Desktop$ echo $[ 85 + 23 ] 108 wyp@UOS-WYP1:~/Desktop$ echo $[85+ 23] 108 wyp@UOS-WYP1:~/Desktop$ echo $[85* 23] 1955接下来通过赋值方式将上述知识演示一遍哦:a=85,b=23首先是+-*/分别代表加减乘除和%取余运算符wyp@UOS-WYP1:~/Desktop$ a=85 b=23 wyp@UOS-WYP1:~/Desktop$ echo $[$a/$b] 3 wyp@UOS-WYP1:~/Desktop$ echo $[$a%$b] 16 wyp@UOS-WYP1:~/Desktop$ echo $[$a*$b] 1955 wyp@UOS-WYP1:~/Desktop$ echo $[85/3] 28 wyp@UOS-WYP1:~/Desktop$ expr $a \* $b 1955 wyp@UOS-WYP1:~/Desktop$ expr $a / $b 3 wyp@UOS-WYP1:~/Desktop$ expr $a % $b 16 wyp@UOS-WYP1:~/Desktop$ a=85 b=23 wyp@UOS-WYP1:~/Desktop$ echo $(($a+$b)) 108 wyp@UOS-WYP1:~/Desktop$ echo $(($a-$b)) 62 wyp@UOS-WYP1:~/Desktop$ expr $a + $b 108其次是运算符 == 和 != 在等式成立的时候返回1,不成立返回0wyp@UOS-WYP1:~/Desktop$ expr $a == $b 0 wyp@UOS-WYP1:~/Desktop$ expr $a != $b 1 wyp@UOS-WYP1:~/Desktop$ echo $(($a==$b)) 0 wyp@UOS-WYP1:~/Desktop$ echo $(($a!=$b)) 1 wyp@UOS-WYP1:~/Desktop$ echo $[$a==$b] 0 wyp@UOS-WYP1:~/Desktop$ echo $[$a!=$b] 1最后是赋值运算符=就简单了,将赋值运算符右边计算的值赋值到左边的变量中wyp@UOS-WYP1:~/Desktop$ c=$(expr $a - $b) wyp@UOS-WYP1:~/Desktop$ echo $c 62 wyp@UOS-WYP1:~/Desktop$ c=$(($a+$b)) wyp@UOS-WYP1:~/Desktop$ echo $c 108 wyp@UOS-WYP1:~/Desktop$ c=$(($a%$b)) wyp@UOS-WYP1:~/Desktop$ echo $c 16
-
SQL注入什么是SQL注入 程序中如果使用了未经校验的外部输入来构造SQL语句访问数据库,就很可能引入SQL注入漏洞。攻击者可以通过构造恶意输入来改变原本的SQL逻辑或者执行额外的SQL语句。如果代码使用存储过程,而这些存储过程作为包含未筛选的用户输入的字符串来传递,也会发生SQL注入。攻击原理攻击者会将一些恶意代码插入到字符串中。然后会通过各种手段将该字符串传递到数据库的实例中进行分析和执行。只要这个恶意代码符合SQL语句的规则,在代码编译与执行的时候,就不会被系统所发现。攻击者可以通过SQL注入绕过程序原有逻辑执行恶意SQL达到不法的目的。 示例用户名:tom 密码:321 正常输入: name=tom&pwd=321后端SQL: SELECT * FROM db_user WHERE NAME = 'tom' AND pwd = '321'恶意输入: name=tom’ or ‘1’ = ‘1 &pwd=111后端SQL: SELECT * FROM db_user WHERE NAME = 'tom' OR 1 = 1 AND pwd = '111' 我们可以从上面的例子看出,只要tom是有效的用户,SQL注入就可以绕开密码的验证,攻击者还可以通过通过构造恶意输入来执行代码原有逻辑以外的SQL,比如通过传入name=tom';drop table db_user-- 如果程序执行了该语句,后果可想而知后面加两个-,这意味着注释,它将后面的语句注释,让他们不起作用,这样语句永远都--能正确执行,用户轻易骗过系统,获取合法身份 如何防御 检查变量数据类型和格式固定格式的变量,比如数字,日期,邮箱,手机号等变量在SQL语句执行前严格的校验变量格式,确保变量格式规范,这样很大程度可以避免SQL注入攻击过滤特殊符号,sql语句无固定格式的变量在SQL语句执行前可以做一些特殊符号和sql语句的过滤,比如 ;,--,OR,AND等使用预编译语句a).使用PrepareStatement和占位符通过预编译sql语句防止sql注入(预编译的sql语句会带着?占位符进行编译,恶意的攻击参数无法改变已经编译好的sql语句逻辑)b). mybatis使用#{ } (#{ }会预编译,${ }则直接进行变量替换操作) 2 表达式注入什么是表达式Java统一表达式语言(英语:Unified Expression Language,简称JUEL)是一种特殊用途的编程语言,主要在Java Web应用程序用于将表达式嵌入到web页面。Java规范制定者和Java Web领域技术专家小组制定了统一的表达式语言。JUEL最初包含在JSP 2.1规范JSR-245中,后来成为Java EE 7的一部分,改在JSR-341中定义。Java中表达式根据框架分为好多种OGNL- 一个被WebWork和Apache Struts 2使用的开源的表达式语言。MVEL- 一个被众多Java项目使用的开源的表达式语言。Apache Commons JEXL - 一个旨在促进Java项目实现动态和脚本功能的开源的表达式语言。SpEL - Spring表达式语言,一个开源的EL表达式语言,是Spring Framework的一部分。它主要用于Spring portfolio项目,但也可以用于其他项目。 (摘自维基百科,https://zh.wikipedia.org/wiki/%E7%BB%9F%E4%B8%80%E8%A1%A8%E8%BE%BE%E5%BC%8F%E8%AF%AD%E8%A8%80) 什么是表达式注入 表达式根据框架分为好多种,但表达式注入的原理基本一样,表达式全部或部份外部可控从而让使用者可以通过表达式达到程序设计功能以外的能力,恶意攻击者可以通过表达式注入达到一些不法目的。 示例表达式根据框架分为好多种,这里以SpEL表达式为例。Spring Expression Language(简称SpEL)是一种强大的表达式语言,支持在运行时查询和操作对象图。语言语法类似于Unified EL,但提供了额外的功能,特别是方法调用和基本的字符串模板功能。同时因为SpEL是以API接口的形式创建的,所以允许将其集成到其他应用程序和框架中。SpEL是Spring框架中的一种语言表达式,类似于Struts2中的OGNL。 SpEL使用 #{…} 作为定界符,所有在大括号中的字符都将被认为是 SpEL表达式,我们可以在其中使用运算符,变量以及引用bean,属性和方法如:引用其他对象:#{car}引用其他对象的属性:#{car.brand}调用其它方法 , 还可以链式操作:#{car.toString()}调用其它方法 , 还可以链式操作:#{car.toString()}调用静态方法静态属性:#{T(java.lang.Math).PI}SpEL还支持许多运算符,如:算术运算符:+,-,*,/,%,^(加号还可以用作字符串连接)比较运算符:< , > , == , >= , <= , lt , gt , eg , le , ge逻辑运算符:and , or , not , |if-else 运算符(类似三目运算符):?:(temary), ?:(Elvis)正则表达式:#{admin.email matches '[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,4}'} 图中的spel接口直接将用户输入的参数作为表达式内容进行解析,这就造成了表达式外部可控,用户可以通过input参数进行表达式注入输入 input=new ProcessBuilder("calc").start()系统执行用户传入的命令,打开了计算器。 也可以采用T() 调用一个类的静态方法,它将返回一个 Class Object,然后再调用相应的方法或属性,也是可以实现相同的功能。输入 input=T(java.lang.Math).random()常见的命令注入payload${12*12}T(java.lang.Runtime).getRuntime().exec("")T(Thread).sleep(10000)"".getClass().forName('java.lang.Runtime').getRuntime().exec("")new java.lang.ProcessBuilder({""}).start()原理SpEL内部使用了反射,可以直接获得对象的属性信息,如果SpEL表达式外部可控,同样用户可以通过表达式执行精心构造的任意代码,导致命令执行。 如何防御 尽量避免使用外部输入的内容作为EL表达式内容通过参数白名单或者黑名单控制参数的合法性如果涉及到执行表达式的方法传入的参数外部可控,就存在表达式注入的安全风险,需要通过白名单参数校验来限制 如果是java程序,需搜索检查如下关键类方法el.ExpressionFactory.createValueExpression()javax.el.ValueExpression.getValue() 指定正确EvaluationContext(针对SpEL表达式注入)Spring官方推出了SimpleEvaluationContext作为安全类来防御该类漏洞,SimpleEvaluationContext旨在仅支持SpEL语言语法的一个子集。它不包括 Java类型引用,构造函数和bean引用,指定正确EvaluationContext,是防止SpEl表达式注入漏洞产生的首选。 3 命令注入 什么是命令注入是指通过提交恶意构造的参数破坏命令语句结构,从而达到执行恶意命令的目的。在Web应用中,有时候会用到一些命令执行的函数,比如java的java.lang Runtime. Exec,php中system、exec、shell_exec等,当用户能够控制这些函数中的参数时,就可以将恶意参系统命令拼接到正常命令中,从而造成命令注入攻击 示例 输入:input=ipconfig 结果:这是一个非常简单的命令注入的例子,用户通过接口传入的参数没有经过任何处理就直接被Runtime的exec方法执行,实际上发生的命令注入漏洞时命令来源通常比较复杂,可能是程序读取的文件或是系统参数可以被用户修改,也可能是直接或是间接传入的参数,还有根据用户传入的参数进行命令拼接的。但是发生命令注入根本原因是一样的--程序执行的命令是用户可控的,通过命令的执行,应用程序会授予攻击者一种原本不该拥有的特权或能力 如果攻击者能通过命令注入漏洞获取直接执行系统命令的能力,那他基本可以获取程序拥有的所有权限,危害可想而知。 如何防御选择不调用系统命令的实现方法保证所有命令行参数的来源可控,不使用用户传入数据或者用户可以控制的数据做命令来源严格校验参数,可以使用黑白名单校验的方式控制命令的范围降低程序的权限, 参考http://rui0.cn/archives/1043https://blog.csdn.net/qq_31481187/article/details/108025512https://blog.csdn.net/weixin_41679427/article/details/110310166?utm_medium=distribute.pc_aggpage_search_result.none-task-blog-2~aggregatepage~first_rank_v2~rank_aggregation-2-110310166.pc_agg_rank_aggregation&utm_term=%E8%A1%A8%E8%BE%BE%E5%BC%8F%E6%B3%A8%E5%85%A5%E6%BC%8F%E6%B4%9E&spm=1000.2123.3001.4430
-
封装封装是把客观事物封装成抽象的类,并且类可以把自己的数据和方法只让可信的类或者对象操作,对不可信的进行信息隐藏。继承继承是让某个类获得另一个类的属性和方法。它可以使用现有类的除了私有以外的所有功能,不需要重新编写原来的类的情况下对这些功能进行扩展。多态多态是一个类实例的相同方法在不同情形有不同表现形式,多态机制使具有不同内部结构的对象可以共享相同的外部接口。
-
Oracle数据库完整性的五个约束条件是什么。和第二题一样五个约束条件: 非空、唯一、主码、外码、检查。 (1) not null(非空)约束 (2) unique(惟一)约束 (3) primary key(主键)约束 (4) foreign key(外键)约束 (5) check(校验)约束什么是存储过程,它的优点有哪些。 在Oracle过程中,我们可以自定义子程序,这种程序块被称为存储过程,存放在数据字典中,可以在不同的用户和应用程序之间共享,并可实现对程序的优化和重组, 优点: 存储过程在服务端,执行速度快 存储过程在第一次被执行后就常驻在高速缓存中,后续可以直接调用,从而提高了系统性能 丰富权限管理手段,提高数据库的安全性 可自动完成所需要先执行的任务,方便用户的使用请利用LOOP循环语句编写程序,求解10的阶乘。SQl>set serveroutput on;SQL>DECLAREN number:=1;count1 number:=2;BEGIN LOOP n:=n*count1;count1:=count1+1; IF count1>10 THEN EXIT; END IF; END LOOP; DBMS_OUTPUT.PUT_LINE(’10的阶乘为:’ || to_char(n));END; 创建一个函数,用于统计学生表(XSB)中不同性别的人数。SQL>CREATE OR REPLACE FUNCTION count_num(in_sex IN char) RETURN numberAS out_num number;BEGIN IF in_sex=‘男’ THEN SELECT COUNT(*) INTO out_num FROM XSB WHERE xb=‘男’; ELSE SELECT COUNT(*) INTO out_num FROM XSB WHERE xb=‘女’; END IF ; RETURN(out_num);END; SQL的基本运算符,常用运算符功能,单行运算符,多行运算符,in like含义,逻辑运算符。SQL基本数据类型: 1、字符型: varchar2(可变长度),char(定长字符串),long(变长字符串) 2、数字型: Number(p,s),Int(eger)十进制整型, float(二进制) 3、日期型: date (精确到秒)Timestamp(精确到秒后六位)
-
身份运算符Python语言身份运算符比较两个对象的存储单元。具体使用示例如下:>>> a = 20>>> b = 20>>>a is b #is是判断两个标识符是不是引用自一个对象 True>>>a is not b #is not 是判断两个标识符是不是引用自不同对象false主义! is与==的区别。is用来判断变量引用对象是否为同一个,==用来判断应用变量的值是否相等。列如:>>> p = [a,b,c]>>> q = p>>> q is pTrue>>> q == pTrue>>> t = p[:] >>> t is pfalse>>> t == pTrue
-
成员运算符Python语言支持成员运算符。包括字符串,列表和元组。使用示例如下:>>> a = 'abc'>>> b = 5>>> c = [1,3,'abc',3.14,'name']>>>a in c #如果在指定的序列中找到值a,则返回Ture,否则返回Falsetrue>>>b not in c #如果在指定的序列中没有找到值b,则返回True,否则返回FalseTrue
上滑加载中
推荐直播
-
探秘仓颉编程语言:华为开发者空间的创新利器
2025/02/22 周六 15:00-16:30
华为云讲师团
本期直播将与您一起探秘颉编程语言上线华为开发者空间后,显著提升开发效率,在智能化开发支持、全场景跨平台适配能力、工具链与生态完备性、语言简洁与高性能特性等方面展现出的独特优势。直播看点: 1.java转仓颉的小工具 2.仓颉动画三方库lottie 3.开发者空间介绍及如何在空间用仓颉编程语言开发
即将直播 -
大模型Prompt工程深度实践
2025/02/24 周一 16:00-17:30
盖伦 华为云学堂技术讲师
如何让大模型精准理解开发需求并生成可靠输出?本期直播聚焦大模型Prompt工程核心技术:理解大模型推理基础原理,关键采样参数定义,提示词撰写关键策略及Prompt工程技巧分享。
去报名 -
华为云 x DeepSeek:AI驱动云上应用创新
2025/02/26 周三 16:00-18:00
华为云 AI专家大咖团
在 AI 技术飞速发展之际,DeepSeek 备受关注。它凭借哪些技术与理念脱颖而出?华为云与 DeepSeek 合作,将如何重塑产品与应用模式,助力企业数字化转型?在华为开发者空间,怎样高效部署 DeepSeek,搭建专属服务器?基于华为云平台,又该如何挖掘 DeepSeek 潜力,实现智能化升级?本期直播围绕DeepSeek在云上的应用案例,与DTSE布道师们一起探讨如何利用AI 驱动云上应用创新。
去报名
热门标签