-
数组怎么取值_谁看得懂黑客是怎么写Java script的?
2020-12-02 07:40:37在2011年的BlackHat DC 2011大会上Ryan Barnett给出了一段关于XSS的示例java script 代码:($=[$=[ ] ] [(__=!$+$)[_=-~-~-~$]+({}+$)[_/_]+($$=($_=!''+$)[_/_]+$_[+$])])()[__[_/_]+__[_+~$]+$_[_]+$$](_/_)这是一...在2011年的BlackHat DC 2011大会上Ryan Barnett给出了一段关于XSS的示例java script 代码:
($=[$=[ ] ] [(__=!$+$)[_=-~-~-~$]+({}+$)[_/_]+($$=($_=!''+$)[_/_]+$_[+$])])()
[__[_/_]+__[_+~$]+$_[_]+$$](_/_)
这是一段完全合法的java script 代码,效果相当于alert(1)。它可以在大部分浏览器上运行。(虽然目前我测试过手头的浏览器都能运行,但理论上不能保证所有浏览器都能正确运行,原因见下文)
这段代码的好处(对于黑客)是,它不包含任何字符或数字,可以逃过某些过滤器的检查。比如说,如果假定一个AJAX请求将返回一个只包含数字的JSON,于是很可能会简单判断了一下其中不含字母就直接eval了,结果给黑客们留下了后门。上面的代码功能很简单,只是alert(1),但使用同样的原理,完全可以干出更复杂的事,例如alert(document.cookie)。
更重要的是,这段代码再一次提醒我,黑客的想象力是无限的……正如Ryan Barnett的演讲标题:"XSS:The only rule is no rule"。
那么这段代码是如何工作的呢?
我们可以把它分为两个部分来理解:
第一部分:
($=[$=[ ] ] [(__=!$+$)[_=-~-~-~$]+({}+$)[_/_]+($$=($_=!''+$)[_/_]+$_[+$])])()
第二部分:
[__[_/_]+__[_+~$]+$_[_]+$$](_/_)
其中第一部分是核心,我们首先对它进行分析,先缩进一下:
($= [$=[ ] ] [ (__=!$+$)[_=-~-~-~$] + ({}+$)[_/_] + ($$= ($_=!''+$)[_/_] + $_[+$]) ] )()
显然,最外层是(...)()形式的函数调用,我们需要看看这里究竟调用了什么函数,返回了什么。下一步,我们把原来代码中赋值表达式提取出来,将其改写为以下等价形式:
$ = []; //1 __ = !$+$; //2 _ = -~-~-~$; //3 $_=!''+$; //4 $$ = $_[_/_] + $_[+$]; //5 $= [$][ __[_] + //6 ({}+$)[_/_] + //7 $$ //8 ]; //9 $(); //10
现在来一行行看:
1. $先赋值为一个空数组 (后面会被覆盖)
2. __ = ![] + [] = false + [] = "false" 这里利用了java script 运算的强制类型转换特性。首先空数组是一个非null值,因此![]的结果是false(布尔型)。在计算false + []时,由于数组对象无法与其他值相加,在加法之前会先做一个toString的转换,空数组的toString就是"",因此事实上在计算false + ""。这时false被自动转换为字符串。最终结果是"false"+"" = "false"。 **换句话说,在$为空数组时,使用 “+$”的方式可以将任何一个值转为字符串**
3. 在计算~[]时,~需要一个数字操作数,空数组无法直接转换为数字,则作为0处理。因此~[] = ~0 = -1
参考: ~3 = -4 ~[3] = -4 ~[3,2] = -1 (无法转为数字) ~"3" = -4 ~"abc" = -1
因此: _ = -~-~-~[] = -~-~-(-1) = -~-~1 = -~-(-2) = -~2 = -(-3) = 3 理论上,可以用这种方式得出1-9所有数字
4. !''是true,使用+$将其变为字符串 "true"
5. 这里需要注意的是,之前一直用“值+[]”来获得“值”的字符串形式。而“+[]”则是0(正号导致[]被自动转换为数值0)。因此:$$ = "true"[3/3] + "true"[+[ ] ]= "true"[1] + "true"[0] = "rt"
6. __[_] = "false"[3] = "s"
7. ({} + [])导致空对象{}被转换为字符串"[object Object]", 因此({}+$)[_/_] = "[object Object]"[1] = "o"
8. 这里把$覆盖为 [ [ ] ]["s"+"o"+"rt"]。注意这里[]本身是一个包含空数组的数组,其实对这一步来说,任何一个数组都没有关系(不一定要是嵌套数组),但作者巧妙地把$的首次赋值式放在了数组内部,使代码更为紧凑。最终结果是,$ = [ [ ] ]["sort"] = [ [ ] ].sort = Array.prototype.sort。
9. 调用$(),作为整个表达式最终的取值。需要注意,$是全局范围的,是window的一个属性,相当于window.$。而Array.prototype.sort会返回this。对于window.$来说,this就是window。因此,整个第一部分的值,就是window本身!当然,这个过程的正确运作依赖于当前浏览器的Array.prototype.sort实现能对this为window的情况容错。
通过第一部分,我们已经获得将任何值转换为字符串的简单方法,并能产生任意的数值,理论上就可以从java script 的取值系统中提取出大部分字母(不知道是不是全部,需要考证)。并且,我们获取到了window的引用。下面就可以开始上下其手,为所欲为了。哈哈哈哈哈哈!
可以看出,上面的第9步是与浏览器的具体实现相关的,因此也存在着某些浏览器下需要对代码作出修改的可能。
现在看第二部分,事实上已经非常明朗了,唯一需要注意的是,现在$是一个函数,因此~$ = ~0 (无法直接转换为数字则作为0处理) = -1。
[__[_/_]+__[_+~$]+$_[_]+$$](_/_) = ["false"[1]+"false"[3+(-1)]+"true"[3]+"rt"](1) = ["a"+"l"+"e"+"rt"](1)
所以,整条式子相当于:
window["alert"](1)
最后只想再感慨一次:黑客的想象力是无限的。理解代码并不难,问题是一开始时他们是怎么能想出来的 ...? -
arr数组怎么取值_郑州10kjava上机题(查找数组arr中第k大的奇数,如果不存在则返回0. (arr[i] > 0 (i>...
2020-12-29 13:12:08题目:查找数组arr中第k大的奇数,如果不存在则返回0. (arr[i] > 0 (i>=0))计算出时间复杂度(注意代码注释,不要使⽤库函数或脚本中已经实现好的排序算法和⼯具, 需要⾃⼰实现数据结构和所需要的算法)格式:...题目:
查找数组arr中第k大的奇数,如果不存在则返回0. (arr[i] > 0 (i>=0))
计算出时间复杂度(注意代码注释,不要使⽤库函数或脚本中已经实现好的排序算法和⼯具, 需要⾃⼰实现数据结构和所需要的算法)
格式:
public int findKth(int[] arr, int k){//代码}我的一种解题思路:public static int findKth(int[] arr, int k) { //冒泡排序 int temp; for (int i = 0; i < arr.length; i++) { for (int j = 0; j < arr.length - i - 1; j++) { if (arr[j] > arr[j + 1]) { temp = arr[j]; arr[j] = arr[j + 1]; arr[j + 1] = temp; } } } //获取排序后的奇数集合 Listlist = new ArrayList<>(); for (int i = 0; i < arr.length; i++) { if (arr[i] % 2 ==1) { list.add(arr[i]); } } System.out.println(list); //取值 try { return list.get(k - 1); } catch (Exception e) { return 0; } }
-------------------------------------------------分割线--------------------------------------------
今天突然又想到了冒泡排序,去网上研究了一下,发现冒泡有好多种写法,但思路只有一个,就是没一次排序就把最大的数字放到数组的最后面(从小到大排列)。
我上面写的冒泡每次肯定会循环(数组长度-1次)如果数组本来就是排序好的,就白白循环了那么多次,效率不高。
我又参考别的博客,写了一个效率相对高一点的冒泡(但也不是最优的,谁有更高效的可以评论区告知,都学习了)
public static void main(String[] args) { Integer[] arr1 = {99, 111, 3, 9}; Integer[] arr = {99, 111, 3, 9}; System.out.println("第一种:"); maopao1(arr1); System.out.println("第二种:"); maopao2(arr); } //冒泡1 public static void maopao1(Integer[] arr) { for (int i = 0; i < arr.length; i++) { for (int j = 0; j < arr.length - i - 1; j++) { if (arr[j] > arr[j + 1]) { int temp = arr[j]; arr[j] = arr[j + 1]; arr[j + 1] = temp; } } System.out.println("第" + (i + 1) + "轮排序结果"); System.out.println(Arrays.toString(arr)); } } //冒泡2 public static void maopao2(Integer[] arr) { //第一次遍历,把最大的数放置到数组的最后一位 int i = arr.length - 1; //如果i=0数组只有一个元素 while (i > 0) { int flag = 0; for (int j = 0; j < i; j++) { flag = j; //交换位置 if (arr[j] > arr[j + 1]) { int temp = arr[j]; arr[j] = arr[j + 1]; arr[j + 1] = temp; } } //让下一次排序结束的位置 i = flag; System.out.println("第" + (i+1) + "轮排序结果"); System.out.println(Arrays.toString(arr)); } }
结果:
————————————————
这个题是我一个朋友去年的真实面试题,2线城市也可以拿到高薪,但需要的能力肯定也高.3年经验,要10k以上也不是不可以,毕竟这个行业主要看能力!
版权声明:本文为CSDN博主「码农脱贫」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_35499112/article/details/103731065
码农脱贫往期精彩文章包含答案
做前后端分离项目,必须了解 OAuth2.0 的四种授权方式
分布式事务全面分析
分布式锁造成的重大事故之Redis
SQL防注入之Mybatis框架漏洞
高并发场景下的订单和库存处理方案!收藏这个就够了!
程序员福利!Swagger完美解决前后端对接问题!
给个[在看],是对码农脱贫最大的支持
-
java生成随机数用于数组中随机取值
2021-01-28 11:42:41每天的日期宜和忌是怎么决定的。肯定不是这种。 public static void main(String[] args) { //数据源 String f = "搬家、装修、结婚、入宅、领证、动土、出行、旅游、破土、修造、嫁娶、移徙、盖屋、冠笄、开池...每天的日期宜和忌是怎么决定的。肯定不是这种。
public static void main(String[] args) {
//数据源
String f = "搬家、装修、结婚、入宅、领证、动土、出行、旅游、破土、修造、嫁娶、移徙、盖屋、冠笄、开池、竖柱、归宁、放水、针灸、置产、开业、开工、订婚、安葬、开张、求嗣、赴任、祈福、祭祀、开市、纳财、启钻、除服、纳采、立券、求医、塞穴、斋醮、招赘、行丧";
String[] a = f.split("、");
//生成不重复的s个数量的[0-n)区间的随机数
ArrayList<Integer> list=getDiffNO(40, 5);
//取值-赋值
String[] aa = new String[list.size()];
for (int i = 0; i < list.size(); i++) {
aa[i]=a[list.get(i)];
}
//结果
System.out.println(Arrays.toString(aa));System.out.println("结束");
}/**
* 生成不重复的s个数量的[0-n)区间的随机数
* @param n 取值的数字区间[0-n)
* @param s 获取的随机数数量
* @return
*/
private static ArrayList<Integer> getDiffNO(Integer n, Integer s) {
//返回的list
ArrayList<Integer> list = new ArrayList<Integer>();
Random rand = new Random();
boolean[] bool = new boolean[n];
int num = 0;
for (int i = 0; i < s; i++) {
do {
// 产生的数相同继续循环
num = rand.nextInt(n);
} while (bool[num]);
bool[num] = true;
list.add(num);
}
return list;
} -
java遍历json数组
2018-10-17 14:03:20就能获取到json的数据了并根据key取value,但是注意json数据串里如果有数组的话这么取值肯定会有问题的,因为JSONObject 只能取出的是json格式的数据,是不包含数组的,那我们怎么取json串中的数组的数据呢?...我们用java解析json数据是用: JSONObject jsonObject = JSONObject.parseObject(str);就能获取到json的数据了并根据key取value,但是注意json数据串里如果有数组的话这么取值肯定会有问题的,因为JSONObject 只能取出的是json格式的数据,是不包含数组的,那我们怎么取json串中的数组的数据呢?接下来直接看代码吧!
public String saveMiddle() { String url = "api接口地址"; // 获取接口地址返回的json数据 String str = HttpClientUtil.doGet(url); // JSONObject取出json数据 JSONObject jsonObject = JSON.parseObject(str); // 取出content json数组 String content = jsonObject.getString("content"); // 将content json数组存到list中 List<JSONObject> jsonObjectList = JSON.parseArray(content, JSONObject.class); List<ResourcesMiddleEntity> list = new ArrayList<>(); // 遍历json数组并取出想要的数据 for (JSONObject jsonObject2 : jsonObjectList) { long id = jsonObject2.getLong("middleId"); String name = jsonObject2.getString("middleName"); String img = jsonObject2.getString("middleTitleImage"); ResourcesMiddleEntity resourcesMiddleEntity = new ResourcesMiddleEntity(id, name, img); list.add(resourcesMiddleEntity); } audioResourcesService.saveMiddle(list); return JSONUtil.toJsonString(); }
-
JAVA初级(四)数组(1)一维数组
2018-11-29 23:25:36怎么取值?怎么输出? 一,数组是什么? 专业的话来说就的一个有序的序列,里面的每一个数组被成为元素.--是一种数据结构 通俗的话来说就是把一堆东西按照先来后到的顺序从0开始一个一个编号然后按编号顺序排成... -
JAVA初级(四)数组(2)二维数组
2018-11-30 18:02:30我是导航 1,二维数组是什么? 2,二维数组如何定义?如何赋值和取值? ...一,二维数组是什么?...二维数组其实就是在数组里面塞数组,也就是创建一个数组,...那么二维数组要怎么定义呢 类型[][] 名称 = new 类型[长度... -
java字符串转json数组
2020-04-21 17:56:34json字符串,请求对象是调用别人的接口,所以值的格式不是由我们来决定的,json字符串要取值首先想到的是转成java对象,但是这一堆都是键相同的,显然是没法转对象的,所以想到了jsonArray,之前没怎么操作过,所以... -
数组越界java.lang.IndexOutOfBoundsException: Index: 3, Size: 3
2019-09-11 15:54:04这几天在项目上遇到一个问题,老是报java.lang.IndexOutOfBoundsException: Index: 3, Size: 3错误,断点进去看找到了问题所在,因为我在定义一个list数组的时候用上了**=** List<Super> list2 = list1; 然后... -
数组都clone问题,求解释
2018-05-26 17:21:02最近看一本书叫《改善java程序的151个建议》,发现这么一个方法。 ``` public static int ...可是读者发现这个方法有问题,排序的是克隆对象,取值却还是从原来的数组中取. 请教大家,这个方法应该到底怎么写。 -
Intelij Idea_Java怎么自定义LiveTemplates达成下述String变量.fori简易需求?
2019-08-28 14:25:28我新建了一个Java的Templates Group 然后想自定义一个快捷标识 一如定义一个数组:int[]arr=new int [3]; 然后可以通过arr.fori方式生成循环结构 那我定义一个String:String s="dsdsdsf" 我如何可以... -
java学习之实现二维数组排序
2020-11-14 11:40:42那么java的二维数组是怎么排序的呢? 解决方法如下: 方法一: 思路:新建一个一维数组将二维数组的数据按行存入,然后对一维数组排序,最后将排过序的一维数组按序存入二维数组 实现原理为一维数组排序,此处... -
java CSP测试里小明上学问题
2019-03-06 15:25:39我用了两个数组,一个一维数组存储r,y,g,n,另一个二维数组存储k,t,两个数组分别通过for循环从键盘输入进行取值存储。通过函数count.countNumber(arryOne,arryTwo)将两个数组传进去计算。函数里通过if判断k的值,... -
二叉堆(JAVA实现)
2016-04-04 13:18:43实现思路堆一般都是数组实现的(不明白用数组怎么写树的,请自己脑补,很容易想的)。 拿最小堆来说,堆的根节点一定是最小的,堆只可以从根节点取值,所以堆的调整是最重要的工作。 比如对数列: 10 1 11 9 6 -
java面试题
2020-11-07 15:16:161.List和Map的区别,如何取值;Map怎么取出所有key值 1) ① List是存储单列元素的集合,Map是存储键值对的集合。 ② List是有序集合,Map是无序集合。 ③ Lis的元素可重复,Map的key必须唯一。 2) 通过Map.... -
jquery easyui 后台取值
2011-01-05 10:44:28现在写的红色部分是测试用的,主要是想传数组 对jquery不大熟悉,请大家指教 <br/>问题补充</strong><br/>嗯,这个是我加多了,删除了,谢谢 我就是想在前台用户选择了 多行... -
java中ArrayList集合的三种遍历方式,简单易懂
2019-05-26 22:42:47在java中存储数据的方式有很多种,最开始接触到的是定义一个变量去接收,然后是数组,集合等等,但是这些数据仅仅是存储在内存当中,不能实现永久保存,而且数组的长度是固定的,而集合刚好解决了这个问题,集合的... -
Java程序员面试宝典pdf
2013-02-21 13:06:13面试题047 如何理解数组在Java中作为一个类 75 面试题048 new Object[5]语句是否创建了5个对象 77 面试题049 如何拷贝数组的数据 78 面试题050 二维数组的长度是否固定 79 5.2 集合框架 80 面试题051 什么是集合 80 ... -
差值查找—Java实现
2018-08-20 16:19:10在介绍插值查找之前,首先考虑一个新问题,为什么上述算法一定要是折半,而不是折四分之一或者折更多呢? ... 同样的,比如要在取值范围1 ~ 10000 之间 100 个元素从小到大均匀分布的数组中查... -
面试-机试-编程题--剑指offer
2016-08-30 10:40:26如果要面试java,最好要...这个题目涉及到用list存数组,map取值,还有就是怎么才能根据控制台中输入的是几行的数据,再回车然后继续往下程序运行,主要是用了for循环。 以下是代码部分: [java -
hdu 5038 Grade(水)
2014-09-22 17:17:09这个题目应该随便怎么搞都可以,我说一下我的思路,可以根据题目的数据计算出价值的取值范围为0~10000,所以用一个1w的数组表示数组,下标代表价值,数组值代表数目, 然后这个题目要特判一下全是一样的值的情况。 ... -
struts2 的一个警告 ,请大家帮忙看下
2011-02-12 16:27:10然后截取 priceImport 这个变量 获得数组后迭代取值操作。 <p> 功能上是ok的 。 但是系统就是报上面贴的警告 。 说 ;">priceImport[] 这个名字有缺陷 , 请问怎么fix这个警告</span></p> </p> -
3.4.8 找出数组中出现次数超过一半的数,现在有一个数组,已知一个数出现的次数超过了一半,请用O(n)的复杂度的算法找出这个数。 3.4.9 找出被修改过的数字 3.5.0 设计DNS服务器中cache的数据结构。要求设计一个...
-
FTP下载过程中对V3格式文件进行转换
2017-09-28 09:03:23怎么实现。网上的本地转换代码确实可用,但是我对字节流、转码这一块不太懂,不知道有 没有大神来看看,怎么写? 下面是本地v3转wav的代码 ``` package cn.sh.ideal.utils; import java.io.File; import java.io... -
华为编程开发规范与案例
2008-09-04 16:44:56在新的编程思想中,指针基本上被禁止使用(JAVA中就是这样),至少也是被限制使用。而在我们交换机的程序中大量使用指针,并且有增无减。 2、防止指针/数组操作越界 【案例1.2.1】 在香港项目测试中,发现ISDN话机...