DVWA靶场实战(十)——XSS(DOM)

 

DVWA靶场实战(十)

 

五、XSS(DOM):

1.漏洞原理:

  XSS全称为Cross Site Scripting,由于和层叠样式表(Cascading Style Sheets,CSS)重名,所以为了区别别叫做XSS。主要基于JavaScript语言进行恶意攻击,因为JS非常灵活操作html、css、浏览器。

2.漏洞分类:

(1)反射型:

  非持久型XSS,最容易出现的XSS漏洞。在用户请求某个URL地址的时候,会携带一部分数据。当客户端进行访问某个链接时,攻击者可以将恶意代码注入到URL,如果服务器未对URL携带的参数做判断和过滤,直接返回响应页面,那么XSS攻击代码就会被一起传输到用户的浏览器,触发反射型XSS。

(2)存储型:

  被保存到服务器上,显示到HTML页面中,经常出现在用户评论的页面,攻击者将XSS代码保存到数据库中,当用户在此访问这个页面时,就会触发并执行XSS代码,窃取用户的敏感信息。

(3)DOM型:

  DOM全称为Document Object Model即文档对象模型,是W3C制定的标准接口规范,是一种处理HTML和XML文件的标准API。DOM提供了对整个文档的访问模型,将文档作为一个树形结构。

  而DOM型的XSS是一种基于文档对象模型(DOM)的一种漏洞。这种XSS与反射型XSS、存储型XSS有着本质的区别,它的攻击代码不需要服务器解析响应,触发XSS依靠浏览器的DOM解析,客户端的JavaScript脚本可以访问浏览器的DOM并修改页面的内容,不依赖服务器的数据,直接从浏览器获取数据并执行。

3.漏洞危害:

(1)窃取cookie:

  大部分人喜欢将密码存储到浏览器中,所以当黑客一般渗透的时候就会先来浏览器查看已保存的cookie来盗取各种用户账号。

(2)未授权操作:

  JS特性很强大,黑客会直接代替用户在html进行各类操作。比如劫持会话、刷广告,执行弹窗广告,还能记录用户的键盘输入。

(3)传播蠕虫病毒

4.利用方式:

  利用网页开发时web应用程序对用户输入过滤不足导致将恶意代码注入到网页中,使用户浏览器加载并执行恶意代码,通常是JavaScript解析器,浏览器不会判断代码是否恶意,只要符合语法规则就可以直接解析。

5.防御措施:

(1)输入过滤:

  有时候需要多次过滤,比如黑客使用双写的时候就需要多次过滤,需要注意多个过滤器的先后次序,当多个过滤器一起生效的时,有可能后进行的过滤导致前面的过滤失效。

(2)纯前端渲染:

  在纯前端渲染中,我们会明确告诉浏览器,下面要设置的内容是文本(.innerText),还是属性(.setAttribute),还是样式(.style)等等。浏览器不会被轻易的被欺骗,执行预期外的代码。

(3)转义HTML:

  如果拼接HTML是必要的,就需要采用合适的转义库,对HTML模板各处插入点进行充分的转义。

(4)标签和属性基于白名单过滤:

  对于副文件编辑器来说,其产物本身就是HTML代码,所以没办法简单粗暴使用转义来处理,应该要对内容中的标签和属性,基于白名单进行过滤。

6.实战:

(1)Low:

  代码分析:

<?php

# No protections, anything goes

?>

  我们这里看见完全没设防,所以我们可以随意尝试一些基本的攻击语句。

  我们开始攻击,利用弹窗输出语句alert(),来进行尝试。

  首先点击发现URL中只有English这里可以进行攻击,我们尝试语句“http://192.168.1.22:81/dvwa/vulnerabilities/xss_d/?default=<script>alert(“test”)</script>”弹出发现成功。

(2)Medium:

  代码分析: 

<?php

// Is there any input?
if ( array_key_exists( "default", $_GET ) && !is_null ($_GET[ 'default' ]) ) {
    $default = $_GET['default'];
    
    # Do not allow script tags
    if (stripos ($default, "<script") !== false) {
        header ("location: ?default=English");
        exit;
    }
}

?>

  这次代码将“<script”过滤了,当匹配到<script字符串的时候就会将URL后面的参数修正为?Default=English,在这里可以通过oneerror事件装载文档或图像的过程中如果发生了错误就会触发。

  所以我们使用另外一个方式“/?default=English</option></select><img src=x onerror=alert(1)>”,可以发现成功。

(3)High:

  代码分析:

<?php

// Is there any input?
if ( array_key_exists( "default", $_GET ) && !is_null ($_GET[ 'default' ]) ) {

    # White list the allowable languages
    switch ($_GET['default']) {
        case "French":
        case "English":
        case "German":
        case "Spanish":
            # ok
            break;
        default:
            header ("location: ?default=English");
            exit;
    }
}

?>

  设置了白名单,只对default进行检查,可以使用&连接另一个自定义变量来绕过。

  我们同样开始攻击,利用语句“/?default=English&<script>alert(“test”)</script>”进行攻击,得到以下界面,我们可以发现攻击成功。

(4)Impossible:

  代码分析:

<?php

# Don't need to do anything, protection handled on the client side

?>

  交由客户端处理即可。

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

相关文章

  • 从图像中抽象出概念再生成新的图像,网友:人类幼崽这个技能AI终于学会了

    点击上方↑↑↑“OpenCV学堂”关注我来源:公众号 量子位 授权复制人类幼崽2岁就能做的事,AI竟然才学会?早在2017年,就有网友吐槽:2岁幼童只要见过一次犀牛的照片,就能在其他图片里认出不同姿势、视角和风格的卡通犀牛,但AI却做不到。直到现在,这一点终于被科学家攻克了!最新研究发现,只要给AI喂3-5张图片,AI就能抽象出图片里的物体或风格,再随机生成个性化的新图片。有网友评价:非常酷,这可能是我这几个月来看到的最好的项目。它是如何工作的?让我们先来看几个例子。当你上传3张不同角度的陶瓷猫照片,可能会得到以下4张新图像:两只在船上钓鱼的陶瓷猫、陶瓷猫书包、班克斯艺术风格的猫以及陶瓷猫主题的午餐盒。同样的例子还有艺术品:铠甲小人:碗:不只是提取图像中的物体,AI还能生成特定风格的新图像。例如下图,AI提取了输入图像的绘画风格,生成了一系列该风格的新画作。更神奇的是,它还能将两组输入图像相结合,提取一组图像中的物体,再提取另一组的图像风格,两者结合,生成一张崭新的图像。除此之外,有了这个功能,你还可以对一些经典图像“下手”,给它们添加一些新元素。那么,这么神奇的功能背后是什么原理呢?

  • [GO]go redis实现滑动窗口限流-redis版

    上一篇是单机当前进程的滑动窗口限流,这一个是使用goredislist结构实现的滑动窗口限流,原理都一样,但是支持分布式原理可以参考上一篇介绍funcLimitFreqs(queueNamestring,countuint,timeWindowint64)bool{ currTime:=time.Now().Unix() length:=uint(ListLen(queueName)) iflength<count{ ListPush(queueName,currTime) returntrue } //队列满了,取出最早访问的时间 earlyTime,_:=strconv.ParseInt(ListIndex(queueName,int64(length)-1),10,64) //说明最早期的时间还在时间窗口内,还没过期,所以不允许通过 ifcurrTime-earlyTime<=timeWindow{ returnfalse }else{ //说明最早期的访问应该过期了,去掉最早期的 ListPop(queueName) ListPush(queueName,currT

  • 没内鬼,来点干货!SQL优化和诊断

    SQL优化与诊断Explain诊断Explain各参数的含义如下:列名说明id执行编号,标识select所属的行。如果在语句中没有子查询或关联查询,只有唯一的select,每行都将显示1.否则,内层的select语句一般会顺序编号,对应于其在原始语句中的位置select_type显示本行是简单或复杂select,如果查询有任何复杂的子查询,则最外层标记为PRIMARY(DERIVED、UNION、UNIONRESUIT)table访问引用哪个表(引用某个查询,如“derived3”)type数据访问/读取操作类型(All、index、range、ref、eq_ref、const/system、NULL)possible_key揭示哪一些索引可能有利于高效的查找key显示mysql实际决定采用哪个索引来优化查询key_len显示mysql在索引里使用的字节数ref显示了之前的表在key列记录的索引中查找值所用的列或常量rows为了找到所需要的行而需要读取的行数,估算值Extra额外信息,如usingindex、filesort等select_type常见类型及其含义SIMPLE:不包含子

  • 腾讯云NLP助力中科院&河海大学情感分析科研项目

    今年4月,极光大数据发布了一份《2019年社交网络行业研究报告》,报告中详细展示了中国目前主要社交产品的用户数据和使用情况,包括了微信、微博、陌陌、百度贴吧、多闪等。报告显示,截止到19年2月,整个社交网络行业的用户规模为9.73亿,安装渗透率达到88.5%。微信仍然是当之无愧的国民级应用,其次是腾讯的另一款社交产品QQ。紧随腾讯的这两款产品之后,最大的社交网络产品是新浪微博,它的月活用户达到3亿,日均使用时长是34分钟。此外,新浪微博的用户明显要更加年轻。(报告中使用的数据截止到2019年2月)中科院&河海大学联合团队,也曾对亿级别的微博用户数据进行过数据分析,他们对海量微博用户的留言和评论数据进行情感属性的科研分析,并将项目成果发表在了Nature子刊上。在该科研项目中,正是使用了腾讯云自然语言处理(NLP)平台的情感分析接口,他们高度赞扬了腾讯云NLP接口的稳定性和高效性,还主动在MIT深圳研究院等高校圈子做了推荐。我们都知道高校和科研院所的社科研究项目中一般都涉及到大量的文本处理工作,而如何在较少的定制开发前提下,获取高效及稳定的智能文本处理能力支持,是行业的一个普遍性

  • 【数据结构基础】栈简介(使用ES6)

    开篇数据结构这词大家都不陌生吧,这可是计算机专业人员的必修专业课之一,如果想成为专业的开发人员,必须深入理解这门课程,在这系列文章里,笔者将使用ES6,让大家熟悉数据结构这门专业课的内容。到底什么是数据结构?数据结构是计算机存储、组织数据的方式。数据结构是指相互之间存在一种或多种特定关系的数据元素的集合。通常情况下,精心选择的数据结构可以带来更高的运行或者存储效率。数据结构往往同高效的检索算法和索引技术有关(来源百度百科)。更多关于数据结构的介绍,大家可以先看看笔者的这篇文章《JavaScript数据结构:什么是数据结构?》。本篇文章笔者将从数据结构最基础的结构开始介绍——stack(栈),笔者将从以下几个方面进行介绍:什么是栈?如何用JS简单的实现栈?创建更高效的基于对象Stack类实际应用举例练习题本篇文章阅读时间预计10分钟。01什么是栈?栈是一种高效的数据结构(后进先出(LIFO)原则的有序集合),因为数据只能在栈顶添加或删除,所以这样的操作很快,而且容易实现。栈的使用遍布程序语言实现的方方面面。编程语言中的编译器也会使用到堆栈,计算机内存也会使用堆栈来存储变量和方法调用,浏览

  • “编程不规范,同事两行泪!”

    本文转载自公众号:CSDN译者|罗昭成责编|沭七出品|CSDN(ID:CSDNnews)以下为译文:还有什么事情比自己动手去创造更有趣?看着你发明的东西慢慢地进入生活?我们人类,是万物之主,是造物主。但是在数字化时代,发明创造的方式发生了变化。现在,我们都创造数字化产品。我们建网站、写软件来满足我们的需求。虽然我们创造不再依赖于我们的创造力,但是我们仍然可以与艺术家其名。编程的世界非常地宽广,涉及重多领域,我们有很多选择。你可以选择使用函数式编程,还是使用面向对象编程?你可以选择做服务端还是客户端?那么,你心中已经有抉择了吗?下面,有100种编程语言,可以用来实现你的需求。语言、框架、库都在逐渐增多。你可以通过多种方式完成相同的代码功能。虽然这些语言可能差别很大,但是大多数语言都遵循相同的思想。所以,他们也会出现相同的问题。以下是编程七宗罪,你可以想办法避免他们发生。虽然我不是基督教徒,但是我也喜欢定义七宗罪。协作时不使用版本控制上帝保佑,我们有版本控制工具。如我所说,如果我们没有像Git这种版本管理工具,代码的世界将变得异常艰难。版本控制让我们在协作的时候,修改或移动变得非常简单。想

  • 后台系统设计(下篇:输入)

    最近在做一个标准版中台(就是展示配置+部分运营数据展示),做的有些吃力,刚好看到了一篇后台系统的组件整理(https://mp.weixin.qq.com/s/tY42iiEih-F1CWat9vQlnw),赶紧做好笔记以备不时之需。常见类型·输入框·步进器/微调器·滑块一、Input输入框允许用户输入和编辑文本的区域。外观单行文本框,用于输入少量的文本:多行文本,用于输入长字符串,多行文本区域显示:富文本,允许使用附加的格式、内联图像/链接等文本输入。最佳用法·容错格式,允许用户输入多种格式,并智能的处理从而满足程序的数据要求。例如电话输入,允许用户输入空格和—,系统后台自动清理数据以满足格式要求,而不是报错提示。·对于简短、固定的单行输入可采用结构化格式,通过潜在的限制使输入的字符数量、类型不易出错,并使用户能够直观的看到输入格式。例如银行卡号、身份证、时间等信息。·掩码,对于重要的私人信息或数据应该给予掩码保护。例如密码、电话及身份证等信息,也分为全部掩码及部分掩码。对于密码输入可提供「查看」操作,以便用户确认。·对于搜索操作的文本框,可提供清空快捷操作,从而方便用户快速更换关键

  • 数据分析师在物联网的哪个环节?

    2005年,国际电信联盟的一份报告中描绘了“物联网”时代的图景:当司机出现操作失误时汽车会自动报警;公文包会提醒主人忘带了什么东西;衣服会“告诉”洗衣机对颜色和水温的要求等等。这么美好的图景里面,我们——学过统计、用R用SAS跑模型、努力学习Python(【统计师的Python日记】已经更新到第6天了→第6天:数据合并)、平凡又伟大、美丽又善良的数据分析师,主要参与哪个环节?不是部署报警器,也不是研发智能洗衣机,本质上就是跟你白天刚刚做的工作:整理、分析、建模、预测。本着学习的态度,数说君收集了一些资料,和大家一起探讨一下物联网中数据分析师的角色。物联网(InternetofThings)用最简单的一句话就是各种感知器的广泛应用,具体来说,要实现“物-物互联”,主要分三个层次[1]:(1)感知层:由各种传感器以及传感器网关构成,包括二氧化碳浓度传感器、温度传感器、湿度传感器、二维码标签、RFID标签和读写器、摄像头、GPS等感知终端。感知层的作用相当于人的眼耳鼻喉和皮肤等神经末梢,它是物联网识别物体、采集信息的来源,其主要功能是识别物体,采集信息。(2)网络层:由各种私有网络、互联网、

  • Dagger2进阶必备技能

    之前写过一篇文章介绍Dagger2的初步知识,本篇文章主要介绍Dagger2的进阶知识点. 主要包含的内有有 @Binds与@Provides的使用 Provider与Lazy的使用 依赖与包含 Dagger.Android @Binds与@Provides 相信大家经常会使用@Provides来在Module里面提供需要注入对象的构造,但从来没有用过@Binds. 如果我们需要注入一个接口的实现,我们常常会这么做: @Provides publicXXInterfaceprovidesXX(XXImpimp){ returnimp; } 复制 其实这样的代码可以通过@Binds简化为 @Binds publicabstractXXInterfacebindXX(XXImpimp); 复制 同时你需要将你的Module改为abstract即可,但是要注意这两个不能共存于一个Module,是不是很简单. Provider与Lazy 大家想必会使用过Lazy,很多语言都有Lazy,如最近大红大紫的Kotlin就可以通过bylazy{}来实现对象的延迟加载. 没错,Lazy<T

  • XSS 前端防火墙 —— 整装待发

    到目前为止,我们把能用前端脚本防御XSS的方案都列举了一遍。 尽管看起来似乎很复杂累赘,不过那些是理论探讨而已,在实际中未必要都实现。我们的目标只是为了预警,能发现问题就行,并非要做到滴水不漏的程度。 事实上,HTML5早已制定了一套浏览器XSS解决方案——ContentSecurityPolicy,并且大多主流浏览器实现了这个标准。 既然我们使用前端脚本重新实现一遍,因此得在各个方面占有优势。 兼容性 CSP目前主流浏览器大多已支持,IE10、11支持部分功能。对于IE10之前的,当然就束手无策了。如果使用前端脚本实现,可根据浏览器的实际能力进退。 对于第一篇介绍的DOM-XSS,只要支持标准事件模型即可开启,因此兼容IE9完全可行。 事实上,IE8就已开放了浏览器API接口,并支持原生访问器的操作。所以,IE8是支持钩子程序,并能拦截可疑元素。 考虑到实际中,大多情况不做拦截,仅仅上报日志用以预警。对于这样低的需求,任何版本的浏览器都是完全可行的,甚至连IE6也没问题。 由于国内IE浏览器仍占有相当一部分比例,因此使用前端脚本的方案,能覆盖到更广的用户群体中。 部署 CSP是通过H

  • Spring Boot package打包失败

    [ERROR]Failedtoexecutegoalorg.apache.maven.plugins:maven-jar-plugin:3.2.0:jar(default-jar)onprojectdemo:Executiondefault-jarofgoalorg.apache.maven.plugins:maven-jar-plugin:3.2.0:jarfailed:Arequiredclasswasmissingwhileexecutingorg.apache.maven.plugins:maven-jar-plugin:3.2.0:jar:org/apache/maven/shared/io/logging/MessageSink   SpringBoot项目直接运行主类可以但是打包jar时失败。 翻阅了很多博客大都是缺少依赖包或将JAVA_HOME设为JRE的问题,参照他们的思路并没有解决错误。   问题:此次问题出现的原因是src\main\java下放置了两个根目录不同的package导致打包时找不到@SpringBootApplication入口类

  • # 分治算法实例代码

    目录平面点集最接近点对问题选择问题残缺棋盘问题 平面点集最接近点对问题 大致是要先横坐标排序,再纵坐标排序。 OI-wiki详解 选择问题 和快速排序的过程有点相似,都需要将元素分成小于某个数的一堆,和大于这个数的一堆,然后递归下去。 #include<iostream> #include<cstdio> #include<cstdlib> #include<algorithm> usingnamespacestd; inta[1001]; intselect(intleft,intright,intk){ if(left>=right) returna[left]; intx=a[left]; inti=left; intj=right+1; while(true){ do{ i++; }while(a[i]<x); do{ j--; }while(a[j]>x); if(i>=j) break; swap(a[i],a[j]); } if(j-left+1==k) returnx; a[left]=a[j];

  • myaql 面试题

    面试题 having和where的区别? 两个都是过滤 having必须和聚合函数结合使用 where后面跟表达式 写出删除和插入的sql语句 首先创建一个表 删除表有三种: 1,删除固定一行 deletefromtableNAMEwhere 表达式; 2,删除全部数据 deletefromtableNAME; 3,快速删除数以万计的数据 turncatetabletableNAME; 插入数据有三四种: 1,按字段插入 insertintotableNAME(字段名称) values("插入的内容"); 2,全部插入 insertintotableNAMEvalues(" "."",xx); 3,批量插入insertintotableNAMEvalues            (x," ",""),        &n

  • STM32 磁场传感器HMC5883

    一、IIC协议 默认(出厂)HMC5883LL7位从机地址为0x3C的写入操作,或0x3D的读出操作。 要改变测量模式到连续测量模式,在通电时间后传送三个字节:0x3C0x020x00 将00写入第二寄存器或模式寄存器以完成从单一模式切换到连续测量模式的设置。随着数据速率在出厂默认的15Hz更新,在查询HMC5883L数据寄存器进行新的测量之前,I2C主机允许产生一个67毫秒的延迟。要计算新数据时钟,发送:0x3D,并记录下的DXRA,DXRB,DZRA,DZRB,DYRA,DYRB设在寄存器3到8上的时钟脉冲。HMC5883L,将自动重新点回寄存器3进行下一个0x3D的查询。全部六个寄存器在新的数据写入任何一个寄存器前必须正确读取   (1)首先确定IIC从机地址,即IIC设备的地址查手册知为0x3C (2)确定HMC5883_Init()初始化操作的配置。注意选择连续测量模式测量数据才能够实时变化 HMC5883_WriteReg(0x00,0x14);//配置寄存器A:输出速率30HZ正常测量 HMC5883_WriteReg(0x02,0x00);//配置模式寄存器

  • 游戏害了这一代中国男性

    在将来,但凡我有选择的权利(指除了没饭吃为生存不得不屈从现实),绝不加入大型游戏开发团队,参与任何一款大型游戏开发工作,但我愿意支持或者参与作为艺术的独立游戏作品开发。 先来说一个有趣的社会现象:社会各行各业的顶尖人才,基本都是男性,但随着时代推移,在普通人群体中,尤其是青年群体,男性越来越式微,不仅专业素养不如女性,在外形、气质、成熟度等各个方面都稍逊一筹。讲道理,中国社会在向母系社会迈进。 先来说说有游戏以前的社会。女性比较关注情感、外貌、兴趣爱好等,大部分当不了哲学家和科学家,因为对宏大的命题缺少兴趣,男性比较关注有成就感,有好奇心喜欢探索,不太在意细节,这就造成男性在事业上往往更成功。 男性(指占绝大部分的群体)为什么会随时代变化越来越弱势,被广大女性所看不起,归根结底还是游戏的原因。市面上任何一款大型游戏,其主流重度用户,基本都是青年男性,可以说,这些大型游戏完全满足了男性本应在现实中寻找的成就感,这就直接导致他们既没有在原来弱势的地方:情商、外在有任何进步,反而在原先强势的地方:学习和事业上一败涂地。 要写Java了,不瞎扯了。

  • win10中Nginx常用命令

    开启 startnginx   查看是否启动 tasklist/fi"imagenameeqnginx.exe"   修改配置文件后重载 nginx-sreload   干掉当前Nginx进程 taskkill/fi"imagenameeqnginx.EXE"/f   关闭 nginx.exe-sstop

  • 解决启动java的web项目时端口占用问题

    解决启动java的web项目时端口占用问题   首先看下端口被占用,出现的提示情况   启动项目报错.png 第一步:打开cmd命令窗口,输入netstat-ano|findstr8080命令,从结果中可以看到8080端口被进程7864占用   查找占用端口的进程.png 第二步:输入taskkill/f/t/im7864命令,终止该进程即可  

  • P2014 选课 - 树形DP[树形背包DP]

    P2014选课 传送门 思路: 树形背包DP模型,\(f[i,j]\)表示以\(i\)为根的子树中,选了\(j\)门课的最大学分。树形DP常以子树\(i\)为阶段。树形背包DP相当于树上分组背包DP。\(f[u,j]=max\{f[u,j],f[u,j-k]+f[v,k]~|~v\in~son(u)\}\)。我们枚举从u的子树v中选的课数k,将\(f[v,k]\)作为获得的价值加到\(f[u,j-k]\)得到\(f[u,j]\)。注意到当前子树根节点u是必须选的,所以要从\(f[u,j-1]\)加上\(a[u]\)转移到\(f[u,j]\)。最终答案为\(f[1,M]\)。 Tips: 1.注意到题目给定的是一个森林,我们可以建一个虚拟节点0,将森林转化为一个以0为根节点的树,然后就可以直接树形DP了。 注意0号节点不代表课程,所以不需要从\(f[0,j-1]+a[0]\)转移到\(f[0,j]\)。 2.初始化DP数组\(f[u,0]=0\)。 3.对于树形DP的判重,好像记录\(vis\)数组和记录\(fa\)是等效的。 4.树形DP,别忘了DFS(v)啊。。。 ACCode: #

  • Java刷题日记,20201208

    Java刷题日记,20201208 虽然我什么都不会,但不妨碍我在比赛中抱着大佬的大腿躺~ 开篇语 因为试题量[1]过大,因此只记录自己做错的试题,所以有一些会试题量特别大有些试题量特别小,但每一道都尽量带有解析。 在每一次的刷题日记结束后,还会做一次今日的刷题总结,反馈一次今天的题目整体难度感知以及感觉自己对知识点的掌握程度。 在多天刷题日记后,会有一天不做新题,回顾旧题,但每天都会有一次更新。 PS.但可能会有一天各种原因没有做或者就是我偷懒了,会在第二天的刷题总结中进行反思。 题目 1.第一题 阅读下列利用递归来求n!的程序classFactorialTest{ staticlongFactorial(intn){//定义Factorial()方法 if(n==1) return1; else returnn*Factorial(______); } publicstaticvoidmain(Stringa[]){//main()方法 intn=8; System.out.println(n+"!="+Factorial(n)); } } 复制 为保证程序正确运行,在下划线

  • 347,猜数字大小 II

    想了解更多数据结构以及算法题,可以关注微信公众号“数据结构和算法”,每天一题为你精彩解答。也可以扫描下面的二维码关注 我们正在玩一个猜数游戏,游戏规则如下: 我从1到n之间选择一个数字,你来猜我选了哪个数字。 每次你猜错了,我都会告诉你,我选的数字比你的大了或者小了。 然而,当你猜了数字x并且猜错了的时候,你需要支付金额为x的现金。直到你猜到我选的数字,你才算赢得了这个游戏。 示例: n=10,我选择了8.第一轮:你猜我选择的数字是5,我会告诉你,我的数字更大一些,然后你需要支付5块。 第二轮:你猜是7,我告诉你,我的数字更大一些,你支付7块。 第三轮:你猜是9,我告诉你,我的数字更小一些,你支付9块。 游戏结束。8就是我选的数字。 你最终要支付5+7+9=21块钱。 给定n≥1,计算你至少需要拥有多少现金才能确保你能赢得这个游戏。 答案: publicstaticintgetMoneyAmount(intn){ returnDP(1,n); } publicstaticintDP(intleft,intright){ if(left>=right) return0;

  • 创建一个web项目

    File--->New----->project   新建项目名称:    在WEB-INF下新建文件夹lib,存放依赖的第三方jar包:    file----->projectstructure:      选中刚才创建的lib目录,点击OK:   然后点击Apply:    再点击OK:      配置Tomcat容器:Run----->EditConfigurations 点击Tomcatserver(要是没有找到这个选项,就点击33itemsmore)       然后点击apply:   然后点击server:    然后先点击apply,再点击ok    从idea的database面板连接数据库:方便从IDEA来查看数据库的内容,如果不连接,那么打开CMD窗口,查看数据库 cmd:mysq

相关推荐

推荐阅读