DVWA靶场实战(九)——Weak Session IDS

DVWA靶场实战(九)

九、Weak Session IDS:

1.漏洞原理:

  Weak Session IDS也叫做弱会话,当用户登录后,在服务器就会创造一个会话(session),叫做会话控制,接着访问页面的时候就不用登录,只需要携带Session去访问。

  SessionID作为特定用户访问站站点所需要的唯一内容。如果能够计算或轻易猜到该sessionID,则攻击者将可以轻易的获取访问控制权,无需登录直接进入特定用户界面,进而进行其他操作。

  用户访问服务器的时候,在服务器端会创造一个新的会话(session),会话中会保存用户的状态和相关信息,用于标识用户。

  服务器端维护所有在线用户的session,此时认证,只需要知道哪个是用户在浏览器当前的页面即可。为了告诉服务器应该用一个session,浏览器需要把当前用户持有的SessionID告知服务器。用户拿到SessionID就会加密保存到cookie上,之后只要cookies随着http请求发送服务器,服务器就知道你是谁了。SessionID一旦在生命周期内被窃取,就相当于用户失窃。

2.Session:

Session利用的实质:由于SessionID是用户登录之后才持有的唯一认证凭证,因此黑客不需要再攻击登录过程(比如密码),就可以轻易获取访问权限,无需登录密码就可以直接进入特定用户界面,进而查找其他漏洞如XSS、文件上传等。

Session劫持:就是一种通过窃取用户SessionID,使用该SessionID登录进目标账户的攻击方法,此时攻击者实际上是使用了目标账户有效的Session。如果SessionID是保在Cookie中的,则这种攻击可以称为Cookie劫持。SessionID还可以保存在URL中,作为一个请求的一个参数,但是这种方式的安全性难以经受考验。

3.攻击步骤:

(1)目标用户需要先登录站点;

(2)登录成功后,该用户会得到站点提供的一个会话标识SessionID;

(3)攻击者通过某种攻击手段捕获SessionID;

(4)攻击者通过捕获到的SessionID访问站点即可获得目标用户合法会话。

4.获取Session的几种方法:

(1)暴力破解:尝试各种SessionID,直到破解为止;

(2)预测:如果SessionID使用非随机的方式产生,那么就有可能计算出来。

(3)窃取:使用网络嗅探,XSS攻击等方式获取。

5.防御方式:

(1)更改Session名称:PHP中Session的默认名称是PHPSESSID,此变量会保存在Cookie中,如果攻击者不分析站点,就不能猜到Session名称,阻挡部分攻击。

(2)关闭透明化SessionID:透明化SessionID指当浏览器中的HTTP请求没有使用Cookie来存放SessionID时,SessionID则使用URL来传递。

(3)设置HttpOnly通过设置Cookie的HttpOnly为true,可以防止客户端访问这个Cookie,从而有效的防止XSS攻击。

(4)关闭所有的phpinfo类dump request信息的页面。

(5)使用User-Agent检测请求的一致性:但有专家警告不要依赖于检查User-Agent的一致性。这里是因为服务器群集中的HTTP的代理服务器会对User-Agent进行编辑,而本群集中的多个代理服务器在编辑该值时可能会不一致。

(6)加入Token校验:同样是用于检测请求的一致性,给攻击者制造一些麻烦,使攻击者即使获取了SessionID,也无法进行破坏,减少对系统造成的损失。但Token需要存放在客户端,如果攻击者有办法获取到SessionID,那么也同样可以获取到Token。

6.实战:

(1)Low:

  代码分析:

<?php

$html = "";

if ($_SERVER['REQUEST_METHOD'] == "POST") {
    if (!isset ($_SESSION['last_session_id'])) {
        $_SESSION['last_session_id'] = 0;
    }
    $_SESSION['last_session_id']++;
    $cookie_value = $_SESSION['last_session_id'];
    setcookie("dvwaSession", $cookie_value);
}
?>

  看代码low级别还是没有什么防护。

  开始进行攻击,我们打开BurpSuite,我们开始发包然后进行尝试。

                

  我们这里可以看见Cookie这一栏,“Cookie: PHPSESSID=1fa3jls5mq9ok54q3l4j44u0q1; security=low”,重新打开一个没有Cookie的账户,复制进去就可以登入。

(2)Medium:

  代码分析:

<?php

$html = "";

if ($_SERVER['REQUEST_METHOD'] == "POST") {
    $cookie_value = time();
    setcookie("dvwaSession", $cookie_value);
}
?> 

  我们看这个级别的代码,可以知道这里是通过时间戳来生成session的,所以我们这里利用时间戳转换器来转换就可以了。

  我们开始攻击,这里提供一个时间戳转换器的网址:http://tool.lu/timestamp/

  与Low等级相同,我们找到Cookie,然后截包将时间戳,修改为现在就可以攻击成功了。 

(3)High:

  代码分析:

<?php

$html = "";

if ($_SERVER['REQUEST_METHOD'] == "POST") {
    if (!isset ($_SESSION['last_session_id_high'])) {
        $_SESSION['last_session_id_high'] = 0;
    }
    $_SESSION['last_session_id_high']++;
    $cookie_value = md5($_SESSION['last_session_id_high']);
    setcookie("dvwaSession", $cookie_value, time()+3600, "/vulnerabilities/weak_id/", $_SERVER['HTTP_HOST'], false, false);
}

?> 

  这里我们可以看见使用了md5进行了加密。

  所以我们这里开始攻击,使用md5解密,发现从零开始的整数进行加密,设置拆解后构造的SessionID,可以直接免密登录。

(4)Impossible:

  代码分析:

<?php

$html = "";

if ($_SERVER['REQUEST_METHOD'] == "POST") {
    $cookie_value = sha1(mt_rand() . time() . "Impossible");
    setcookie("dvwaSession", $cookie_value, time()+3600, "/vulnerabilities/weak_id/", $_SERVER['HTTP_HOST'], true, true);
}
?> 

  我们这里查看代码SessionID作为起始值。

本文转载于网络 如有侵权请联系删除

相关文章

  • Docker容器网络配置

    Docker容器网络配置1、Linux内核实现名称空间的创建1.1ipnetns命令可以借助ipnetns命令来完成对NetworkNamespace的各种操作。ipnetns命令来自于iproute安装包,一般系统会默认安装,如果没有的话,请自行安装。[root@localhost~]#dnf-yinstalliproute复制注意:ipnetns命令修改网络配置时需要sudo权限。可以通过ipnetns命令完成对NetworkNamespace的相关操作,可以通过ipnetnshelp查看命令帮助信息:[root@localhost~]#ipnetnshelp Usage: ipnetnslist ipnetnsaddNAME ipnetnsattachNAMEPID ipnetnssetNAMENETNSID ip[-all]netnsdelete[NAME] ipnetnsidentify[PID] ipnetnspidsNAME ip[-all]netnsexec[NAME]cmd... ipnetnsmonitor ipnetnslist-id[targe

  • 换台路由器而已,结果我笑岔气直不起腰,客户笑出眼泪坐地上起不来

    20多年的IT运维生涯中,也发生过很多有趣的事,今天就跟大家分享一个。先交代一下故事背景:几年前签的一个客户,是一家美资企业的中国分公司,建在保税区内,有独立的IT部门,一个IT主管(负责向美国的IT经理汇报),下面有4个IT,分管PC运维、网络运维、ERP系统、数据库维护和开发;我们公司是PC配件和网络设备的备件商、供应商,以及网络运维服务商,很多人看到这里也许会问,为什么公司有IT,还需要外包呢?首先,请注意,我们是备件商,因为如果买设备放着备用,太浪费了,而且设备放在一边,不上电不使用,时间长了,也会有损坏风险,所以付点钱,让有相应设备的公司来提供备件服务是比较划算的。网络运维供应商,就好理解了,他们就一个人,有时候忙不过来,需要我们支持,有的问题解决不了,还是需要我们支持,还有就是万一此人离职,还有我们能持续服务,不会中断。某天早上,接到IT主管电话,说是一台juniperSSG5坏了,连电源灯都不亮。这台设备我知道,是很多年前电信装专线赠送的,不属于他们公司自采资产,所以并不在我们备件服务范围之内,但是这条专线是直连海关的,一旦出问题,直接影响他们出货,所以他说十万火急,虽然

  • Python 爬虫进阶必备 | 某菠菜网站请求验证码 data 参数加密逻辑分析

    今日网站这个网站同样来自群友投稿aHR0cDovLViMy5pZ3VaS5jb20vIy8=需要分析的是刷新验证码提交的data参数加密定位先搜索data参数,结果里检索的到200+的匹配项,所以暂时跳过这种定位方式不过这个页面的请求是xhr请求,所以还是用老方法xhr断点看看打上断点之后重新刷新页面断点是断在y.send的位置,这个是请求发出的地方,网上看堆栈可以看到堆栈里大多都是angular.js相关的内容“Angular是一款十分流行且好用的Web前端框架,目前由Google维护既然是框架内容,先暂时不看继续向上看,可以看到下面几个需要注意的堆栈这里有好几个vm,点击eval对应的堆栈点进去可以看到下面这样的代码虽然这样里的代码经过了混淆,不过还是可以通过关键字,分析出这里是一个post请求构造的代码1的位置可以看出这是一个post方法2的位置是构建参数packet3的位置可以看出是完成上面packet参数提交并完成请求提交,回调的地方分析到这,打上断点重新刷新看看url不是验证码请求的链接就放过ps:其他请求可能也会走这个接口,为了准确性我们只分析需要的链接直到这个位置的ur

  • 【STM32F429】第4章 ThreadX FileX文件系统移植到STM32F429(SD卡)

    论坛原始地址(持续更新):http://www.armbbs.cn/forum.php?mod=viewthread&tid=100749第4章ThreadXFileX文件系统移植到STM32F429(SD卡)本章节为大家讲解SD卡的ThreadXFileX文件系统移植。4.1初学者重要提示4.2SD卡硬件接口设计4.3SD卡基础知识4.4各种存储卡区别4.5关于SD卡内部是否自带擦写均衡4.6ThreadXFlieX移植步骤4.7ThreadXFlieX应用代码测试4.8ThreadXFlieX移植接口文件fx_stm32_sdio_driver.c说明4.9SDIO使用DMA方式的4字节对齐问题(重要)4.10实验例程4.11总结4.1初学者重要提示1、SDIO的相关知识点可以看第3章。2、操作SD卡是以扇区(512字节)为单位进行操作。3、SD卡联盟强烈强烈建议使用此软件来格式化SD/SDHC/SDXC卡,而不要使用各个操作系统随附的格式化工具。通常,操作系统附带的格式化工具可以格式化包括SD/SDHC/SDXC卡在内的各种存储介质,但是可能无法针对SD/SDHC/SDX

  • React Native按需加载 手Q狼人杀探索之路

    |导语最近特别火的狼人杀和最近特别火的ReactNative会擦出什么样的火花呢?本文和您一同探讨RN性能优化的现实场景。项目简介:狼人杀游戏是多人实时性游戏,对流畅度等性能都有要求。作为大型游戏,无论从代码规模和迭代速度来看,手Q的安装包和版本迭代速度都无法用native来承载这样的游戏。从而ReactNative成为了比较好的选择。手QReactNative简介在手Q目前使用的ReactNative版本是0.15版本。下面的数据分析都是基于手QRN0.15版本进行的分析数据。问题分析开发过ReactNative的同学,大体都对白屏界面有所了解。作为RN原生自带功能,基本上每个使用RN的业务都在优化这一阶段。通过对狼人杀的测试来看,首次从RN启动到渲染,耗时基本有1.7s左右。而这些耗时数据还是在iPhone6s中测试得出,可想低端局的情况可能会更加糟糕。分析性能工欲善其事必先利其器,要分析其耗时。还得从源头着手,根据常规做法,都会将ReactNative打包的js拆分成BaseBundle和业务Bundle。从上图,RN加载流程来看,加载BaseBundle与业务Bundle的耗时

  • 【直播】我的基因组81:看看我的vcf文件的vaf分布情况

    这一讲中,我们对VCF中的"VAF"简单的来看一起,如果你对VCF文件还不了解的话,那你就要自我批评一下了。在基因组直播刚开始的时候,我还专门对VCF文件进行了简述。【直播】我的基因组28-必须要理解vcf格式记录的变异位点信息.今天不说别的,我们专门对看一下VAF的分布情况。VAF",就是variantallelefrequency或者variantallelefraction对于NGS测序数据来说,就是跟参考基因不同的reads与总的测序reads的比值。一般在VCF文件里面,会有DP4这个信息,可以很容易算出vaf值,如下;得到上面数据的代码是:首先是shellcatautochr.highQuali.varType|perl-alne'{nextif/^#/;/DP4=(.*?);.*VARTYPE=(.*?)\s/;print"$F[0],$1,$2"}'>DP4.stat复制然后是Ra=read.csv('DP4.stat',stringsAsFactors=F,header=F

  • Hadoop(十七)之MapReduce作业配置与Mapper和Reducer类

    前言  前面一篇博文写的是Combiner优化MapReduce执行,也就是使用Combiner在map端执行减少reduce端的计算量。一、作业的默认配置  MapReduce程序的默认配置  1)概述  在我们的MapReduce程序中有一些默认的配置。所以说当我们程序如果要使用这些默认配置时,可以不用写。  我们的一个MapReduce程序一定会有Mapper和Reducer,但是我们程序中不写的话,它也有默认的Mapper和Reducer。  当我们使用默认的Mapper和Reducer的时候,map和reducer的输入和输出都是偏移量和数据文件的一行数据,所以就是相当于原样输出!2)默认的MapReduce程序/** *没有指定Mapper和Reducer的最小作业配置 */ publicclassMinimalMapReduce{ publicstaticvoidmain(String[]args)throwsException{ //构建新的作业 Configurationconf=newConfiguration(); Jobjob=Job.getInstance(c

  • python类方法@classmethod与@staticmethod

    python类方法@classmethod与@staticmethod 目录python类方法@classmethod与@staticmethod一、@classmethod介绍语法举例二、@staticmethod介绍语法举例 一、@classmethod 介绍 与普通的类方法有所不同的是,用@classmethod修饰的类方法不传入self实例本身,而是传入cls,代表这个类自身,可以来调用类的属性,类的方法,实例化对象等。 语法 使用的语法也非常简单,直接在类方法上加上装饰器@classmethod即可,另外传入cls参数作为方法的第一个参数。 classA(object): @classmethod deffunc(cls): pass 复制 举例 classA(object): num=1 deffunc1(self): print('func1') @classmethod deffunc2(cls): print('func2') print(cls.num) cls().func1() if__name__=='__main__': A.func2() -

  • MVVM解析

    闲来无事看到了一个关于Vue的MVVM的简单讲解,觉得写得不错,做个分享。 文章地址 https://github.com/DMQ/mvvm 文章内容我就不贴出,比较简洁明了,我记录一下我的一些思考总结。 PS:建议先仔细读这篇文章。 MVVM MVVM即双向数据绑定,是一种设计模式,一般是Web前端框架的核心概念,肯定也不是Vue只此一家有。 简单来说就是,数据跟视图的实时绑定。如果我们自己要实现这个需求,那核心的问题有三个: 1、如何监听到数据变化? 2、数据变化如何通知到视图? 3、视图如何更新? 这三个问题先放着,后面大家就知道我为什么这么划分这三个问题。 讨论文章 实现数据绑定的做法有大致如下几种: 1、发布者-订阅者模式(backbone.js) 2、脏值检查(angular.js) 3、数据劫持(vue.js) 那文章中把实现数据绑定归类为这几种,不过我觉得他的说法有问题。 首先,发布订阅模式是一种消息通知的设计模式,它解决的是通知的问题,也就是我上面提到的第2个问题。 然后,无论是脏值检查还是数据劫持,它解决的是监听数据变化的问题,也即是上面第1个问题。 也就是说

  • 13、动词

    十三、动词 动词的定义 动词就是表示动作或者心理行为的词语。很多人都知道表示动作的词语就是动词,但是忽略了,表示心理行为的词语也是动词。比如:know(知道),think(认为),like(喜欢),这些词语并不表示动作,但是这些词语也是动词,因为它们是表示心理行为的。有时候,还要注意,中文跟英语不一样,一个词语在中文里面是动词,在英语里面不一定是动词,所以要看英语。如果英语规定是动词,即使中文不是动词,在英语里面也要按照动词的作用去使用。 一、谓语动词和非谓语动词 动词从用法来分,可以分为谓语动词和非谓语动词。它们的区别就是一个作谓语,另一个不能作谓语(作主语,表语,宾语等) 但是,不管是谓语动词还是非谓语动词,意思都是一样的。这个我们在第一节课已经提到了。非谓语是一个比较难,也很重要的内容,后面会专门讲述,这里主要讲谓语动词。 谓语动词有四种:实义动词,系动词,助动词和情态动词。 二、实义动词(不及物动词和及物动词) 实义动词,有些语法书也称为行为动词。实义动词,顾名思义,就是有实际意义的动词。 大部分动词都是有实际意义。但是也有少数动词是没有意义的,或者意义不完整的,比如系动词,助

  • 使用无密码用户连接 Windows7/10 的远程桌面

    设置被远程控制的电脑 打开“策略编辑器”: WIN+R,打开“运行”,输入:“gpedit.msc”,回车   依次找到:计算机配置->Windows设置->安全设置->安全选项->"账户-使用空密码的本地账户只允许进行控制台登陆"      双击它,或右键->属性。选择“已禁用”,然后应用、保存。    远程桌面 Win+R,打开“运行”,输入:“mstsc”,回车,输入上述计算机的IP地址,输入用户名(在目标计算机上存在的用户,且没有密码),即可。  

  • ELK了解

    第1章ELK简介 E: elasticsearch 存储数据 java L: logstash 收集,过滤,转发,匹配 java K: kibana 过滤,分析,图形展示 java F:filebeat 收集日志,过滤 go 复制 第2章:传统日志分析需求 1.找出访问网站频次最高的IP排名前十 2.找出访问网站排名前十的URL 3.找出中午10点到2点之间www网站访问频次最高的IP 4.对比昨天这个时间段和今天这个时间段访问频次有什么变化 5.对比上周这个时间和今天这个时间的区别 6.找出特定的页面被访问了多少次 7.找出有问题的IP地址,并告诉我这个IP地址都访问了什么页面,在对比前几天他来过吗?他从什么时间段开 始访问的,什么时间段走了 8.找出来访问最慢的前十个页面并统计平均响应时间,对比昨天这也页面访问也这么慢吗? 9.找出搜索引擎今天各抓取了多少次?抓取了哪些页面?响应时间如何? 10.找出伪造成搜索引擎的IP地址 11.5分钟之内告诉我结果 复制 第3章:日志收集分类 代理层:nginxhaproxy web层:nginxtomcatjavaphp

  • 第三次上机作业

    1、定义学生类 1、测试类   2.1   2、测试类 2、运行结果   3、 测试类   3、运行结果   4、1 测试类 运行结果   5.1   测试类   运行结果   第三次上机,在教室听老师说和自己动手是完全不同的两个感觉,听懂和会编程也是完全不一样的,自己去动手走程序的时候,很难入手,而且会出现很多错误,要反复不停的去调试程序,而且需要反复看书,然后看看别人的思路,才能很顺利的编写完。

  • lnmp 安装FTP服务 并配置FTP用户

    lnmp默认是不带FTP服务的,需要的童鞋要自行安装.步骤也很简单 一,进入lnmp目录,找到pureftpd.sh 二,直接运行该脚本  ./pureftpd.sh复制 按任意键开始安装,等待,安装成功如下 可以使用以下命令服务 lnmpftpadd添加FTP lnmpftplist显示FTP用户 lnmpftpdel删除FTP复制 三,配置FTP 使用lnmpftpadd添加FTP服务 如图显示,成功添加FTP用户 执着而坚韧的蜗牛,求知于珠海,在通往理想的道路上披荆砍刺,瘦小的身躯蕴含着独特的思维和丰富的表达.在思索中洞悉IT世界的变化.从意气风发的学生会成员到渐渐成熟的IT职业人,我准备好了,跟着我的心灵深处的渴望一起去创造IT神话!

  • Partial Order Pruning: for Best Speed/Accuracy Trade-off in Neural Architecture Search

    CVPR2019文章   github地址:https://github.com/lixincn2015/Partial-Order-Pruning     目前大多数设计高精度网络结构的工作通常采用FLOP来评估网络的复杂度。但是仅仅FLOP指标不能真正决定实际的推理速度。比如说,在硬件和软件高度优化的Nvidia GPU上,3x3的卷积的FLOPs是1x1卷积的9倍,但是速度上却不是9倍。另外一个决定推理速度的是内存的访问(memoryaccess)。而且,考虑到硬件和软件的多样性,我们无法找出同一个网络结构在所有的平台上都是最优的。     在实际真实的场景中,部署深度神经网络时,在目标平台上达到一个速度与精度的平衡是非常重要的。然而目前大多数现有的自动结构搜索只关注于高精度。在本文中,我们提出一个较好的速度与精度折中的搜索出来的网络,称为“PartialOrderPruning”。    It prunesthearchitecturesearchspacewithapartia

  • cf E. Thief in a Shop - fft + 多项式快速幂 + 母函数

    传送门 其实是个假的多项式快速幂 在\(n\)种物品里,选择\(k\)个物品,然后看有几种权值和有哪些 就是母函数模板吧,然后k次多项式乘法,而且是对于一个多项式来说,那就进行多项式快速幂。同时用fft维护,(真多项式快速幂应该不是这么简单) 如果说用ntt的话,要用双膜去求,因为只取一个膜会被使得多项式的值变成0的。其实我感觉就不能取模,所以还是fft维护比较好 #include<cstdio> #include<iostream> #include<cmath> usingnamespacestd; constintN=3e6+5;//刚好比n大的2的k次方再乘2 structComplex{ doublex,y; Complex(doublex=0,doubley=0):x(x),y(y){}; inlineComplexoperator+(constComplexb)const{ returnComplex(x+b.x,y+b.y); } inlineComplexoperator-(constComplexb)const{ returnCo

  • 跑步运动软件调研

    跑步运动软件调研 1调研背景   随着生活水平的提高,身体健康已经被越来越多的人放在重要的位置。相比健身房运动,跑步是一种相对而言更大众更廉价的运动方式。从2012年开始,民众对路跑运动的热衷开始显现,并从2015年开始呈现爆发之势。国内的跑步市场异常庞大,2017年中国大陆举办了超过2000场跑步赛事,参赛人次约420万人次。   跑步时会遇到各种问题。比如新手如何快速入门跑到10公里?我的实时配速是多少?我的跑步轨迹是什么,附近有没有推荐的路线?我的跑步装备是否适合我的身体?最近有没有什么路跑赛事值得我去参加?等等。这些需求催生了各种移动端跑步软件的兴起,比如我使用过的Keep,悦跑圈,爱燃烧,Nike+RunClub(NRC)。接下来,我会以这4款软件为例进行跑步运动软件调研与分析。 2四款产品简介   Keep致力于为用户提供健身教学、跑步、骑行、交友及健身饮食指导、装备购买等一站式运动解决方案。成立于2014年10月,2017年8月用户量突破1亿。   悦跑圈主打“跑步+社交”,创立于2014年2月。目前,悦跑圈用户规模超过6300万,注册跑团达到2万个,覆盖全世界2100个

  • 大厂git分支管理规范:gitflow规范指南

    目录1.GitFlow原理介绍2.Git的常用分支介绍2.1Production分支2.2Develop分支2.3Feature分支2.4Release分支2.5Hotfix分支3.GitFlow各分支操作原理示意3.1Master/Develop分支3.2Feature分支3.3Release分支3.4Hotfix分支4.GitFlow命令示例4.1Develop相关4.2Feature相关4.3Release相关4.4Hotfix相关 1.GitFlow原理介绍 在使用Git的过程中如果没有清晰流程和规划,否则,每个人都提交一堆杂乱无章的commit,项 目很快就会变得难以协调和维护。 Git版本管理同样需要一个清晰的流程和规范,VincentDriessen为了解决这个问题提出了A SuccessfulGitBranchingModel 以下是基于VincentDriessen提出的GitFlow流程图: 2.Git的常用分支介绍 2.1Production分支 也就是我们经常使用的Master分支,这个分支最近发布到生产环境的代码,最近发布的 Release,这个分支只能从其

  • 今天难得有空写了一下2048这个游戏,源码已经发上了,不喜勿碰.

    #include<iostream> #include<cstdlib> #include<cstdio> #include<map> #include<string> usingnamespacestd; map<int,string>zdy; longlongsum; intx,y,dt[5][5],fx,cl[5],zsjs,djs,dx; boolbh=false;  chard,dj[10]={}; intcx(inti){//查询函数,用来查找下一个有数字空间(包括本个)  if(i==dx)return998; if(cl[i]!=0)returni; if(cl[i]==0)returncx(i+1); } voidsx(){ for(inti=0;i<=(dx-1);i++){ if(cx(i+1)!=998){ if((cl[i]!=0)&&(cl[i]==cl[cx(i+1)])){ cl[i]*=2; sum+=cl[i]; cl[cx(i+1)]=

  • JS限定手机版中图片大小随分辨率自动调整

    <scripttype="text/javascript"> varObjImg=jQuery(".Dy_Contentimg"); for(vari=0;i<ObjImg.length;i++){ loadImage(ObjImg.eq(i)); } functionloadImage(Obj){ varb_width=320; varimg=newImage(); img.src=jQuery(Obj).attr("src"); if(img.complete){ vari_width=img.width; vari_height=img.height; if(i_width>b_width){ varbx=b_width/i_width; jQuery(Obj).width(b_width); jQuery(Obj).height((bx*i_height).toFixed(0)); } return; } img.onload=function(){ vari_width=this.width; vari_height=this.height; if(

  • ubuntu运行sh显示unexpected operator

    1.第一个原因,bash是sh的superset,可能使用的sh不支持[],换成bash,也许可以解决。2.ubuntu的sh默认解释器,是dash,所以明确指定为bash执行,或者修改默认解释器。方法: sudodpkg-reconfiguredash 选择no即可.

相关推荐

推荐阅读