精华内容
下载资源
问答
  • 在2011年的BlackHat DC 2011大会上Ryan Barnett给出了一段关于XSS的示例java script 代码:($=[$=[ ] ] [(__=!$+$)[_=-~-~-~$]+({}+$)[_/_]+($$=($_=!''+$)[_/_]+$_[+$])])()[__[_/_]+__[_+~$]+$_[_]+$$](_/_)这是一...

    069a9d08768377813c3462a9adad5519.png

    在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中第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));    }  }

    结果: 

    46e491a9d3abcd0261b508f6e8d4e2f7.png

    ————————————————

    这个题是我一个朋友去年的真实面试题,2线城市也可以拿到高薪,但需要的能力肯定也高.3年经验,要10k以上也不是不可以,毕竟这个行业主要看能力!

    版权声明:本文为CSDN博主「码农脱贫」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。

    原文链接:https://blog.csdn.net/qq_35499112/article/details/103731065

    2b6acdfdff6c307478b92f4160a64c89.png

    码农脱贫往期精彩文章包含答案

    做前后端分离项目,必须了解 OAuth2.0 的四种授权方式

    分布式事务全面分析

    分布式锁造成的重大事故之Redis

    SQL防注入之Mybatis框架漏洞

    高并发场景下的订单和库存处理方案!收藏这个就够了!

    程序员福利!Swagger完美解决前后端对接问题!

    给个[在看],是对码农脱贫最大的支持
    展开全文
  • 每天的日期宜和忌是怎么决定的。肯定不是这种。 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();
        }

     

    展开全文
  • 怎么取值?怎么输出?   一,数组是什么? 专业的话来说就的一个有序的序列,里面的每一个数组被成为元素.--是一种数据结构 通俗的话来说就是把一堆东西按照先来后到的顺序从0开始一个一个编号然后按编号顺序排成...
  • 我是导航 1,二维数组是什么? 2,二维数组如何定义?如何赋值和取值?   ...一,二维数组是什么?...二维数组其实就是在数组里面塞数组,也就是创建一个数组,...那么二维数组怎么定义呢 类型[][] 名称 = new 类型[长度...
  • java字符串转json数组

    2020-04-21 17:56:34
    json字符串,请求对象是调用别人的接口,所以值的格式不是由我们来决定的,json字符串要取值首先想到的是转成java对象,但是这一堆都是键相同的,显然是没法转对象的,所以想到了jsonArray,之前没怎么操作过,所以...
  • 这几天在项目上遇到一个问题,老是报java.lang.IndexOutOfBoundsException: Index: 3, Size: 3错误,断点进去看找到了问题所在,因为我在定义一个list数组的时候用上了**=** List<Super> list2 = list1; 然后...
  • 最近看一本书叫《改善java程序的151个建议》,发现这么一个方法。 ``` public static int ...可是读者发现这个方法有问题,排序的是克隆对象,取值却还是从原来的数组中取. 请教大家,这个方法应该到底怎么写。
  • 我新建了一个Java的Templates Group 然后想自定义一个快捷标识 一如定义一个数组:int[]arr=new int [3]; 然后可以通过arr.fori方式生成循环结构 那我定义一个String:String s="dsdsdsf" 我如何可以...
  • 那么java的二维数组怎么排序的呢? 解决方法如下: 方法一: 思路:新建一个一维数组将二维数组的数据按行存入,然后对一维数组排序,最后将排过序的一维数组按序存入二维数组 实现原理为一维数组排序,此处...
  • 我用了两个数组,一个一维数组存储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:16
    1.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中存储数据的方式有很多种,最开始接触到的是定义一个变量去接收,然后是数组,集合等等,但是这些数据仅仅是存储在内存当中,不能实现永久保存,而且数组的长度是固定的,而集合刚好解决了这个问题,集合的...
  • 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的数组表示数组,下标代表价值,数组值代表数目, 然后这个题目要特判一下全是一样的值的情况。 ...
  • 然后截取 priceImport 这个变量 获得数组后迭代取值操作。 <p> 功能上是ok的 。 但是系统就是报上面贴的警告 。 说 ;">priceImport[] 这个名字有缺陷 , 请问怎么fix这个警告</span></p>  </p>
  • 3.4.8 找出数组中出现次数超过一半的数,现在有一个数组,已知一个数出现的次数超过了一半,请用O(n)的复杂度的算法找出这个数。 3.4.9 找出被修改过的数字 3.5.0 设计DNS服务器中cache的数据结构。要求设计一个...
  • 怎么实现。网上的本地转换代码确实可用,但是我对字节流、转码这一块不太懂,不知道有 没有大神来看看,怎么写? 下面是本地v3转wav的代码 ``` package cn.sh.ideal.utils; import java.io.File; import java.io...
  • 在新的编程思想中,指针基本上被禁止使用(JAVA中就是这样),至少也是被限制使用。而在我们交换机的程序中大量使用指针,并且有增无减。 2、防止指针/数组操作越界 【案例1.2.1】 在香港项目测试中,发现ISDN话机...

空空如也

空空如也

1 2
收藏数 26
精华内容 10
关键字:

java数组怎么取值

java 订阅