月度归档:2013年06月

php清除bom编辑格式的一个类,

[php]
<?php
header('content-Type: text/html; charset=utf-8');

if(isset($_GET['dir'])){ //设置文件目录,如果没有设置,则自动设置为当前文件所在目录
	$basedir=$_GET['dir'];
}else{
	$basedir='.';
}

$auto=1;

//设置为1标示检测BOM并去除,设置为0标示只进行BOM检测,不去除

echo '当前查找的目录为:'.$basedir.'当前的设置是:';
echo $auto ? '检测文件BOM同时去除检测到BOM文件的BOM<br />':'只检测文件BOM不执行去除BOM操作<br />';

$bom  = new unbom($auto);
$bom->checkdir($basedir);

class unbom{

	public $_auto;

	public function __construct($auto){
		$this->_auto = $auto;
	}

		public function checkdir($basedir){
			if($dh=opendir($basedir)){
				while (($file=readdir($dh)) !== false){
					if($file != '.' && $file != '..'){
						if(!is_dir($basedir.'/'.$file)){
							echo '文件: '.$basedir.'/'.$file .self::checkBOM($basedir.'/'.$file).' <br>';
						}else{
							$dirname=$basedir.'/'.$file;
							self::checkdir($dirname);
						}
					}
				}
				closedir($dh);
			}
		}

		private function checkBOM($filename){
			$contents=file_get_contents($filename);
			$charset[1]=substr($contents,0,1);
			$charset[2]=substr($contents,1,1);
			$charset[3]=substr($contents,2,1);
			if(ord($charset[1])==239 && ord($charset[2])==187 && ord($charset[3])==191){
				if($this->_auto == 1){
					$rest=substr($contents,3);
					self::rewrite($filename,$rest);
					return (' <font color=red>找到BOM并已自动去除</font>');
				}else{
					return (' <font color=red>找到BOM</font>');
				}
			}else{
				return (' 没有找到BOM');
			}
		}

		private function rewrite($filename,$data){
			$filenum=fopen($filename,'w');
			flock($filenum,LOCK_EX);
			fwrite($filenum,$data);
			fclose($filenum);
		}
}
?>
[/php]

PHP开发web应用安全总结

  • XSS跨站脚本

概念:恶意攻击者往Web页面里插入恶意html代码,当用户浏览该页之时,嵌入其中Web里面的html代码会被执行,从而达到恶意用户的特殊目的。

危害:

  1. 盗取用户COOKIE信息。
  2. 跳转到钓鱼网站。
  3. 操作受害者的浏览器,查看受害者网页浏览信息等。
  4. 蠕虫攻击。

描述:反射型跨站。GET或POST内容未过滤,可以提交JS以及HTML等恶意代码。

代码:

[cce_php]
<?php echo $_GET['msg']; 
//正常URL  
user.php?msg=henhao  
//带JS的URL  
user.php?msg=<script>alert(1)</script>  
//恶意跳转URL  
user.php?msg=<script>window.history.back(-1);</script> 

?>
[/cce_php]

解决方法:

输出过滤,php端输出到view的模板页面上的数据都需要经过过滤:

[cce_php]
//输出过滤HTML JS标签  
$var = str_replace(array('<iframe','<meta','<script'), '', $var); $var = str_replace(array('..',')','<','='), array('..',')','<','='), $var);    
$var = addslashes($var);   
[/cce_php]
  • CSRF跨站攻击

概念:CSRF跨站请求伪造,也被称成为“one click attack”或者session riding,通常缩写为CSRF或者XSRF,是一种对网站的恶意利用。XSS利用站点内的信任用户,而CSRF则通过伪装来自受信任用户的请求来利用受信任的网站。与XSS攻击相比,CSRF攻击往往不大流行(因此对其进行防范的资源也相当稀少)和难以防范,所以被认为比XSS更具危险性。

危害:强迫受害者的浏览器向一个易受攻击的Web应用程序发送请求,最后达到攻击者所需要的操作行为。

例子:

  1. <img src=“http://a.com/addfriend.php?id=123”/>

1. 上面是一个图片的html标签,但是src中是一个添加id为123好友的新增好友链接。

2. 恶意用户可以将这段代码植入其它网站网页上面,甚至可以img设置为0,0,让用户不知不觉中点击这个链接,达到用户并不像加这个人好友,但是添加的目的。

3. 当很多人都无意加了id为123这个人为好友的时候,id为123的恶意用户就有权限来查看这些人的信息,甚至可以发送很多恶意的信息,达到恶意用户的目的。

解决方法:

1. http://a.com/addfriend.php?id=123 使用POST方法会相对安全一点。

2. 采用类似随即码或者令牌的形式,让用户操作唯一性。 (每次用户登录网站随机生成一个token,存放在cookie中,用户的所有操作中都需要经过token验证)

 

  • flash安全问题

例子:

  1. http://images.sohu.com/bill/s2010/liulin/nokia/1602600902.swf?clickthru=javascript:alert(1)

解决方法:

在网站根目录中,添加crossdomain.xml文件,这个文件主要是控制flash的域访问。

淘宝的:http://www.taobao.com/crossdomain.xml

  1. <?xml version=”1.0″ ?>
  2. <cross-domain-policy>
  3. <allow-access-from domain=”*.taobao.com” />
  4. <allow-access-from domain=”*.taobao.net” />
  5. <allow-access-from domain=”*.taobaocdn.com” />
  6. <allow-access-from domain=”*.tbcdn.cn” />
  7. <allow-access-from domain=”*.allyes.com” />
  8. </cross-domain-policy>
  • sql注入安全问题

概念:所谓SQL注入,就是通过把SQL命令插入到Web表单递交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令。

危害:

1. 查询数据库中敏感信息。

2. 绕过认证。

3. 添加、删除、修改服务器数据。

4. 拒绝服务。?id=(BENCHMARK(100000000, MD5(RAND()));

例子:

  1. $sql = “SELECT name FROM users WHERE id = ‘”. $_GET[‘id’] . “‘”;

当ID值为:1’ or 1=’1  SQL语句(已测试可以注入):

  1. SELECT name FROM users WHERE id = ‘1’ or 1=’1 ‘

说明:1=1的时候,条件语句WHEREOR之前的不起作用。 ‘的作用是组装SQL语句。

解决方法:

SQL组装的时候,对外部变量以及所有变量都进行过滤:

PHPWIND中,可以用sqlEscape、sqlImplode、sqlSingle、sqlMulti等函数过滤组装。过滤主要是一些’单引号这些可以破坏SQL组装的数据。

  1. /**
  2.  * SQL组装-私有SQL过滤
  3.  * @param  string $val 过滤的值
  4.  * @param  int    $iskey 0-过滤value值,1-过滤字段
  5.  * @return string
  6.  */
  7. private function build_escape_single($val, $iskey = 0) {
  8.     if ($iskey === 0) {
  9.         if (is_numeric($val)) {
  10.             return ” ‘” . $val . “‘ “;
  11.         } else {
  12.             return ” ‘” . addslashes(stripslashes($val)) . “‘ “;
  13.         }
  14.     } else {
  15.         $val = str_replace(array(‘`’, ‘ ‘), ”, $val);
  16.         return ‘ `’.addslashes(stripslashes($val)).’` ‘;
  17.     }
  18. }

  •  XML注入安全问题

概念:和SQL注入原理一样,XML是存储数据的地方,如果在查询或修改时,如果没有做转义,直接输入或输出数据,都将导致XML注入漏洞。攻击者可以修改XML数据格式,增加新的XML节点,对数据处理流程产生影响。

危害:

1. 攻击者可以新增XML节点

2. 破坏原来的XML结构,影响业务流程,甚至产生严重的错误。

例子:

  1. $xml = “<USER role=guest><name>“ . $_GET[‘name’] . “</name><email>“ . $_GET[‘email’] . “</email></USER>”;

需要得到的XML结构:

  1. <?xml version=”1.0″ encoding=”UTF-8″?>
  2. <USER role=guest>
  3. <name>user1</name>
  4. <email>user1@a.com</email>
  5. </USER>

恶意代码:

  1. user1@a.com</email></USER><USER role=admin><name>test</name><email>user2@a.com

意外的XML文档:

  1. <?xml version=”1.0″ encoding=”UTF-8″?>
  2. <USER role=guest>
  3. <name>user1</name>
  4. <email>user1@a.com</email>
  5. </USER>
  6. <USER role=admin>
  7. <name>test</name>
  8. <email>user2@a.com</email>
  9. </USER>

解决方法:

1. 对php处理XML文档的时候,进行标签过滤

2. 尽量减少直接被外部访问到xml文档,可以采用文件名用散列方法等。

  • url跳转漏洞

概念:Web应用程序接收到用户提交的URL参数后,没有对参数做”可信任URL”的验证,就向用户浏览器返回跳转到该URL的指令。

危害:钓鱼网站

例子:

http://m.yahoo.cn/log.php?c=web&u=http://www.163.com

解决方法:

对跳转的php函数进行进一步优化,使页面跳转可以在可信任的范围内。 例如可以有跳转域名白名单方法,这个访问各大公司使用比较多

 

  • 文件系统跨越漏洞

概念:对文件目录参数没有进行过滤,导致恶意用户可以通过在参数中输入一些执行命令,或者跨越访问的行为,来超出用户的访问权限。

例子:通过一个或多个../跨越目录限制

  1. $fp = fopen(“image/{$_GET[‘filename’]}”, ‘r’);

Getfile?filename=../../../../etc/passwd

解决方法:

1. 对文本操作的时候一定要谨慎,不可信任

2. 严格使用phpwind中安全类库 escapePath函数

 

  • 系统命令漏洞

概念:用户提交的参数用于执行系统命令的参数。

解决:

1. 谨慎使用系统命令,对使用系统命令的地方需要进行安全评审

2. 对命令语句进行严格过滤

  • 文件上传漏洞

概念:Web应用程序在处理用户上传的文件时,没有判断文件的扩展名是否在允许的范围内,或者没检测文件内容的合法性,就把文件保存在服务器上,甚至上传脚本木马到web服务器上,直接控制web服务器。

情况:

1. 未限制扩展名

2. 未检查文件内容

3. 病毒文件

解决方法:

1. 使用安全的,可信任的上传组件。

2. 检查文件扩展名,保证文件的类型正确。

3. 检查文件内容,保证用户不伪造文件类型。

 

  • 任意文件下载漏洞

解决方法:

1. Apache虚拟目录指向

2. Java/PHP读取文件

  • 权限控制漏洞

概念:属于业务逻辑上的安全管理。

访问控制:

1. 水平访问:Web应用程序接收到用户请求,修改某条数据时,没有判断数据的所属人,或判断数据所属人时,从用户提交的request参数(用户可控数据)中,获取了数据所属人id,导致恶意攻击者可以通过变换数据ID,或变换所属人id,修改不属于自己的数据。

2. 垂直访问:由于web应用程序没有做权限控制,或仅仅在菜单上做了权限控制,导致的恶意用户只要猜测其他管理页面的URL,就可以访问或控制其他角色拥有的数据或页面,达到权限提升目的。

存在情况:

1. URL级别的。(例如论坛需要操作评分的时候,有一个提交的URL地址,该地址提交过去,如果不做权限判断,那么恶意用户就可以随意的拿这个URL地址来进行恶意行为)

2. 菜单级别。(会员中心或者后台管理中心,会有菜单,管理员可以看到多个功能,普通管理员只能看到一部分功能。但是如果你对管理员操作的功能区不做权限判断,那么普通管理员只要猜测或者获取管理区的URL,就可以进行管理员操作了)

危害:

1. 属于业务逻辑的漏洞,这些危害性是巨大的,可以让普通用户就可能获取管理员的权限,对网站进行恶意破坏或者做非法行为。

解决方案:

1. 项目先期,做一份详细的权限规划文档。

2. 在开发中严格按照权限文档的要求去做权限。

3. 后期测试需要覆盖权限这一块功能区。

4. 程序员需要经常注意这些方面的要求。

 

  • cookie安全设置

解决:

cookie httponly flag : 在用到用户名登陆密码之类的安全性比较高的cookie的时候,可以在cookie中设置httponly属性,该属性只允许php等访问cookie,而不允许js访问。

cookie secure flag : 在涉及到https这样的情况,需要对cookie加密传输,那么可以设置这个属性

 

  • session安全

1. SESSION是保存在服务器端的,具有比COOKIE一定的安全性。

2. 使用COOKIE的时候,如果长时间没有动作,可以设置一个时间值,来对COOKIE进行过期。

3. 尽量让用户每次的cookie值都是不同的,这样可以保证cookie被盗取也不能长期使用的问题。

来自:http://blog.csdn.net/initphp/article/details/7684686


PHP SQL安全设置方法

PHP防止SQL注入的一些方法

1. 使用mysql_real_escape_string函数。此函数转义 SQL 语句中使用的字符串中的特殊字符

$userId = mysql_real_escape_string($_POST[“userId”]);

$userPwd = mysql_real_escape_string($_POST[“userPwd”]);

2. 这是比较基础性的方法,就是写SQL语句的时候尽量写得规范一点。

不规范:$sql = “select * from myTable where id=3”;

规范:$sql = “SELECT * FROM `myTable` WHERE `id`=’3′”;

标点符号不能省略。

3. 使用正则把SQL语句中的关键词过滤掉。

正则。。。再慢慢研究~

4. php.ini中把register_globals设为off

PHP几个防SQL注入攻击自带函数区别

SQL注入攻击是黑客攻击网站最常用的手段。如果你的站点没有使用严格的用户输入检验,那么常容易遭到SQL注入攻击。SQL注入攻击通常通过给站点数据库提交不良的数据或查询语句来实现,很可能使数据库中的纪录遭到暴露,更改或被删除。

为了防止SQL注入攻击,PHP自带一个功能可以对输入的字符串进行处理,可以在较底层对输入进行安全上的初步处理,也即Magic Quotes。(php.ini magic_quotes_gpc)。如果magic_quotes_gpc选项启用,那么输入的字符串中的单引号,双引号和其它一些字符前将会被自动加 上反斜杠\。

但Magic Quotes并不是一个很通用的解决方案,没能屏蔽所有有潜在危险的字符,并且在许多服务器上Magic Quotes并没有被启用。所以,我们还需要使用其它多种方法来防止SQL注入。

许 多数据库本身就提供这种输入数据处理功能。例如PHP的MySQL操作函数中有addslashes()、 mysql_real_escape_string()、mysql_escape_string()等函数,可将特殊字符和可能引起数据库操作出错的字 符转义。那么这三个功能函数之间有什么却别呢?下面我们就来详细讲述下。

虽然国内很多PHP程序员仍在依靠addslashes防止SQL注入,还是建议大家加强中文防止SQL注入的检查。addslashes的问题在 于黑客 可以用0xbf27来代替单引号,而addslashes只是将0xbf27修改为0xbf5c27,成为一个有效的多字节字符,其中的0xbf5c仍会 被看作是单引号,所以addslashes无法成功拦截。

当然addslashes也不是毫无用处,它是用于单字节字符串的处理,多字节字符还是用mysql_real_escape_string吧。

另外对于php手册中get_magic_quotes_gpc的举例:
if (!get_magic_quotes_gpc()) {
$lastname = addslashes($_POST[‘lastname’]);
} else {
$lastname = $_POST[‘lastname’];
}
最好对magic_quotes_gpc已经开放的情况下,还是对$_POST[’lastname’]进行检查一下。

再说下mysql_real_escape_string和mysql_escape_string这2个函数的区别:
mysql_real_escape_string 必须在(PHP 4 >= 4.3.0, PHP 5)的情况下才能使用。否则只能用 mysql_escape_string ,两者的区别是:mysql_real_escape_string 考虑到连接的当前字符集,而mysql_escape_string 不考虑。

总结一下:

* addslashes() 是强行加\;
* mysql_real_escape_string() 会判断字符集,但是对PHP版本有要求;
* mysql_escape_string不考虑连接的当前字符集。

dz中的防止sql注入就是用addslashes这个函数,同时在dthmlspecialchars这个函数中有进行一些替换$string = preg_replace(‘/&((#(\d{3,5}|x[a-fA-F0-9]{4}));)/’, ‘&\\1’,这个替换解决了注入的问题,同时也解决了中文乱码的一些问题

PHP DOMDocument操作 XML类 属性、方法

属性:

Attributes 存储节点的属性列表(只读)
childNodes 存储节点的子节点列表(只读)
dataType 返回此节点的数据类型
Definition 以DTD或XML模式给出的节点的定义(只读)
Doctype 指定文档类型节点(只读)
documentElement 返回文档的根元素(可读写)
firstChild 返回当前节点的第一个子节点(只读)
Implementation 返回XMLDOMImplementation对象
lastChild 返回当前节点最后一个子节点(只读)
nextSibling 返回当前节点的下一个兄弟节点(只读)
nodeName 返回节点的名字(只读)
nodeType 返回节点的类型(只读)
nodeTypedValue 存储节点值(可读写)
nodeValue 返回节点的文本(可读写)
ownerDocument 返回包含此节点的根文档(只读)
parentNode 返回父节点(只读)
Parsed 返回此节点及其子节点是否已经被解析(只读)
Prefix 返回名称空间前缀(只读)
preserveWhiteSpace 指定是否保留空白(可读写)
previousSibling 返回此节点的前一个兄弟节点(只读)
Text 返回此节点及其后代的文本内容(可读写)
url 返回最近载入的XML文档的URL(只读)
Xml 返回节点及其后代的XML表示(只读)

方法:

 

appendChild 为当前节点添加一个新的子节点,放在最后的子节点后
cloneNode 返回当前节点的拷贝
createAttribute 创建新的属性
createCDATASection 创建包括给定数据的CDATA段
createComment 创建一个注释节点
createDocumentFragment 创建DocumentFragment对象
createElement 创建一个元素节点
createEntityReference 创建EntityReference对象
createNode 创建给定类型,名字和命名空间的节点
createPorcessingInstruction 创建操作指令节点
createTextNode 创建包括给定数据的文本节点
getElementsByTagName 返回指定名字的元素集合
hasChildNodes 返回当前节点是否有子节点
insertBefore 在指定节点前插入子节点
Load 导入指定位置的XML文档
loadXML 导入指定字符串的XML文档

 

removeChild 从子结点列表中删除指定的子节点
replaceChild 从子节点列表中替换指定的子节点
Save 把XML文件存到指定节点
selectNodes 对节点进行指定的匹配,并返回匹配节点列表
selectSingleNode 对节点进行指定的匹配,并返回第一个匹配节点
transformNode 使用指定的样式表对节点及其后代进行转换

一个不够健壮的静态PHP工具类,逐步封装起来

[cce_php]
<?php
class Tools{

	//Set the time
	static public function getDate(){
		return date('Y-m-d H:i:s');
	}
	
	/**
	 * 设置 RFC格式时间 Tue, 04 Jun 2013 16:32:13 +0800
	 * 应用场景 XML 时间标准
	 * @param $time
	 * @return  string in time 
	 */
	static public function timeRfc($time){
		if($time === time()){
			$rfc = $time;
			$timerfc = date("r",$rfc);
		}else {
			self::alertExit('抱歉,您没有设置time时间值');
		}
		return $timerfc;
	}
	
	/*** 
	 * 输入任意字符串,告诉别人什么没有设置,并且停止执行PHP 
	 * @param $string
	 **/
	static public function alertExit($string){
		return exit("<script type=\"text/javascript\">alert('{$string}')</script>");
	}
	
	

	/**
	 * 	将数组转换为JSON字符串(in gbk2312-gbk-utf-8)
	 *	@param	array	     $array	要转换的数组
	 *	@return   string		转换得到的json字符串
	 * @return   json to string in array
	 */
	static public function Json($array) {
		self::arrJson($array, 'urlencode', true);
		$json = json_encode($array);
		return urldecode($json);
	}
	
	/**
	 *  使用特定function对数组中所有元素做处理 递归
	 * @param unknown $array
	 * @param unknown $function
	 * @param string $apply_to_keys_also
	 */
	private function arrJson(&$array, $function, $apply_to_keys_also = false){
		static $recursive_counter = 0;
		if (++$recursive_counter > 1000) {
			die('possible deep recursion attack');
		}
		foreach ($array as $key => $value) {
			if (is_array($value)) {
				self::arrJson($array[$key], $function, $apply_to_keys_also);
			} else {
				$array[$key] = $function($value);
			}
	
			if ($apply_to_keys_also && is_string($key)) {
				$new_key = $function($key);
				if ($new_key != $key) {
					$array[$new_key] = $array[$key];
					unset($array[$key]);
				}
			}
		}
		$recursive_counter--;
	}
	
	
	
}
?>
[/cce_php]

PHP常用正则表达式汇总

1. 平时做网站经常要用正则表达式,下面是一些讲解和例子,仅供大家参考和修改使用:
2. “^\d+$”  //非负整数(正整数 + 0)
3. “^[0-9]*[1-9][0-9]*$”  //正整数
4. “^((-\d+)|(0+))$”  //非正整数(负整数 + 0)
5. “^-[0-9]*[1-9][0-9]*$”  //负整数
6. “^-?\d+$”    //整数
7. “^\d+(\.\d+)?$”  //非负浮点数(正浮点数 + 0)
8. “^(([0-9]+\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\.[0-9]+)|([0-9]*[1-9][0-9]*))$”  //正浮点数
9. “^((-\d+(\.\d+)?)|(0+(\.0+)?))$”  //非正浮点数(负浮点数 + 0)
10. “^(-(([0-9]+\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\.[0-9]+)|([0-9]*[1-9][0-9]*)))$”  //负浮点数
11. “^(-?\d+)(\.\d+)?$”  //浮点数
12. “^[A-Za-z]+$”  //由26个英文字母组成的字符串
13. “^[A-Z]+$”  //由26个英文字母的大写组成的字符串
14. “^[a-z]+$”  //由26个英文字母的小写组成的字符串
15. “^[A-Za-z0-9]+$”  //由数字和26个英文字母组成的字符串
16. “^\w+$”  //由数字、26个英文字母或者下划线组成的字符串
17. “^[\w-]+(\.[\w-]+)*@[\w-]+(\.[\w-]+)+$”    //email地址
18. “^[a-zA-z]+://(\w+(-\w+)*)(\.(\w+(-\w+)*))*(\?\S*)?$”  //url
19. /^(d{2}|d{4})-((0([1-9]{1}))|(1[1|2]))-(([0-2]([1-9]{1}))|(3[0|1]))$/ // 年-月-日
20. /^((0([1-9]{1}))|(1[1|2]))/(([0-2]([1-9]{1}))|(3[0|1]))/(d{2}|d{4})$/ // 月/日/年
21. “^([w-.]+)@(([[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.)|(([w-]+.)+))([a-zA-Z]{2,4}|[0-9]{1,3})(]?)$” //Emil
22. /^((\+?[0-9]{2,4}\-[0-9]{3,4}\-)|([0-9]{3,4}\-))?([0-9]{7,8})(\-[0-9]+)?$/ //电话号码
23. “^(d{1,2}|1dd|2[0-4]d|25[0-5]).(d{1,2}|1dd|2[0-4]d|25[0-5]).(d{1,2}|1dd|2[0-4]d|25[0-5]).(d{1,2}|1dd|2[0-4]d|25[0-5])$” //IP地址
24.
25. 匹配中文字符的正则表达式: [\u4e00-\u9fa5]
26. 匹配双字节字符(包括汉字在内):[^\x00-\xff]
27. 匹配空行的正则表达式:\n[\s| ]*\r
28. 匹配HTML标记的正则表达式:/< (.*)>.*< \/\1>|< (.*) \/>/
29. 匹配首尾空格的正则表达式:(^\s*)|(\s*$)
30. 匹配Email地址的正则表达式:\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*
31. 匹配网址URL的正则表达式:^[a-zA-z]+://(\\w+(-\\w+)*)(\\.(\\w+(-\\w+)*))*(\\?\\S*)?$
32. 匹配帐号是否合法(字母开头,允许5-16字节,允许字母数字下划线):^[a-zA-Z][a-zA-Z0-9_]{4,15}$
33. 匹配国内电话号码:(\d{3}-|\d{4}-)?(\d{8}|\d{7})?
34. 匹配腾讯QQ号:^[1-9]*[1-9][0-9]*$
35.
36.
37. 元字符及其在正则表达式上下文中的行为:
38.
39. \ 将下一个字符标记为一个特殊字符、或一个原义字符、或一个后向引用、或一个八进制转义符。
40.
41. ^ 匹配输入字符串的开始位置。如果设置了 RegExp 对象的Multiline 属性,^ 也匹配 ’\n’ 或 ’\r’ 之后的位置。
42.
43. $ 匹配输入字符串的结束位置。如果设置了 RegExp 对象的Multiline 属性,$ 也匹配 ’\n’ 或 ’\r’ 之前的位置。
44.
45. * 匹配前面的子表达式零次或多次。
46.
47. + 匹配前面的子表达式一次或多次。+ 等价于 {1,}。
48.
49. ? 匹配前面的子表达式零次或一次。? 等价于 {0,1}。
50.
51. {n} n 是一个非负整数,匹配确定的n 次。
52.
53. {n,} n 是一个非负整数,至少匹配n 次。
54.
55. {n,m} m 和 n 均为非负整数,其中n < = m。最少匹配 n 次且最多匹配 m 次。在逗号和两个数之间不能有空格。 56. 57. ? 当该字符紧跟在任何一个其他限制符 (*, +, ?, {n}, {n,}, {n,m}) 后面时,匹配模式是非贪婪的。非贪婪模式尽可能少的匹配所搜索的字符串,而默认的贪婪模式则尽可能多的匹配所搜索的字符串。 58. 59. . 匹配除 "\n" 之外的任何单个字符。要匹配包括 ’\n’ 在内的任何字符,请使用象 ’[.\n]’ 的模式。 60. (pattern) 匹配pattern 并获取这一匹配。 61. 62. (?:pattern) 匹配pattern 但不获取匹配结果,也就是说这是一个非获取匹配,不进行存储供以后使用。 63. 64. (?=pattern) 正向预查,在任何匹配 pattern 的字符串开始处匹配查找字符串。这是一个非获取匹配,也就是说,该匹配不需要获取供以后使用。 65. 66. (?!pattern) 负向预查,与(?=pattern)作用相反 67. 68. x|y 匹配 x 或 y。 69. 70. [xyz] 字符集合。 71. 72. [^xyz] 负值字符集合。 73. 74. [a-z] 字符范围,匹配指定范围内的任意字符。 75. 76. [^a-z] 负值字符范围,匹配任何不在指定范围内的任意字符。 77. 78. \b 匹配一个单词边界,也就是指单词和空格间的位置。 79. 80. \B 匹配非单词边界。 81. 82. \cx 匹配由x指明的控制字符。 83. 84. \d 匹配一个数字字符。等价于 [0-9]。 85. 86. \D 匹配一个非数字字符。等价于 [^0-9]。 87. 88. \f 匹配一个换页符。等价于 \x0c 和 \cL。 89. 90. \n 匹配一个换行符。等价于 \x0a 和 \cJ。 91. 92. \r 匹配一个回车符。等价于 \x0d 和 \cM。 93. 94. \s 匹配任何空白字符,包括空格、制表符、换页符等等。等价于[ \f\n\r\t\v]。 95. 96. \S 匹配任何非空白字符。等价于 [^ \f\n\r\t\v]。 97. 98. \t 匹配一个制表符。等价于 \x09 和 \cI。 99. 100. \v 匹配一个垂直制表符。等价于 \x0b 和 \cK。 101. 102. \w 匹配包括下划线的任何单词字符。等价于’[A-Za-z0-9_]’。 103. 104. \W 匹配任何非单词字符。等价于 ’[^A-Za-z0-9_]’。 105. 106. \xn 匹配 n,其中 n 为十六进制转义值。十六进制转义值必须为确定的两个数字长。 107. 108. \num 匹配 num,其中num是一个正整数。对所获取的匹配的引用。 109. 110. \n 标识一个八进制转义值或一个后向引用。如果 \n 之前至少 n 个获取的子表达式,则 n 为后向引用。否则,如果 n 为八进制数字 (0-7),则 n 为一个八进制转义值。 111. 112. \nm 标识一个八进制转义值或一个后向引用。如果 \nm 之前至少有is preceded by at least nm 个获取得子表达式,则 nm 为后向引用。如果 \nm 之前至少有 n 个获取,则 n 为一个后跟文字 m 的后向引用。如果前面的条件都不满足,若 n 和 m 均为八进制数字 (0-7),则 \nm 将匹配八进制转义值 nm。 113. 114. \nml 如果 n 为八进制数字 (0-3),且 m 和 l 均为八进制数字 (0-7),则匹配八进制转义值 nml。 115. 116. \un 匹配 n,其中 n 是一个用四个十六进制数字表示的Unicode字符。 117. 118. 匹配中文字符的正则表达式: [u4e00-u9fa5] 119. 120. 匹配双字节字符(包括汉字在内):[^x00-xff] 121. 122. 匹配空行的正则表达式:n[s| ]*r 123. 124. 匹配HTML标记的正则表达式:/<(.*)>.*|< (.*) />/
125.
126. 匹配首尾空格的正则表达式:(^s*)|(s*$)
127.
128. 匹配Email地址的正则表达式:w+([-+.]w+)*@w+([-.]w+)*.w+([-.]w+)*
129.
130. 匹配网址URL的正则表达式:http://([w-]+.)+[w-]+(/[w- ./?%&=]*)?
131.
132. 利用正则表达式限制网页表单里的文本框输入内容:
133.
134. 用正则表达式限制只能输入中文:onkeyup=”value=value.replace(/[^u4E00-u9FA5]/g,”)” onbeforepaste=”clipboardData.setData(‘text’,clipboardData.getData(‘text’).replace(/[^u4E00-u9FA5]/g,”))”
135.
136. 用正则表达式限制只能输入全角字符: onkeyup=”value=value.replace(/[^uFF00-uFFFF]/g,”)” onbeforepaste=”clipboardData.setData(‘text’,clipboardData.getData(‘text’).replace(/[^uFF00-uFFFF]/g,”))”
137.
138. 用正则表达式限制只能输入数字:onkeyup=”value=value.replace(/[^d]/g,”) “onbeforepaste=”clipboardData.setData(‘text’,clipboardData.getData(‘text’).replace(/[^d]/g,”))”
139.
140. 用正则表达式限制只能输入数字和英文:onkeyup=”value=value.replace(/[W]/g,”) “onbeforepaste=”clipboardData.setData(‘text’,clipboardData.getData(‘text’).replace(/[^d]/g,”))”
141.
142. =========常用正则式
143.
144.
145.
146. 匹配中文字符的正则表达式: [\u4e00-\u9fa5]
147.
148. 匹配双字节字符(包括汉字在内):[^\x00-\xff]
149.
150. 匹配空行的正则表达式:\n[\s| ]*\r
151.
152. 匹配HTML标记的正则表达式:/< (.*)>.*< \/\1>|< (.*) \/>/
153.
154. 匹配首尾空格的正则表达式:(^\s*)|(\s*$)
155.
156. 匹配IP地址的正则表达式:/(\d+)\.(\d+)\.(\d+)\.(\d+)/g //
157.
158. 匹配Email地址的正则表达式:\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*
159.
160. 匹配网址URL的正则表达式:http://(/[\w-]+\.)+[\w-]+(/[\w- ./?%&=]*)?
161.
162. sql语句:^(select|drop|delete|create|update|insert).*$
163.
164. 1、非负整数:^\d+$
165.
166. 2、正整数:^[0-9]*[1-9][0-9]*$
167.
168. 3、非正整数:^((-\d+)|(0+))$
169.
170. 4、负整数:^-[0-9]*[1-9][0-9]*$
171.
172. 5、整数:^-?\d+$
173.
174. 6、非负浮点数:^\d+(\.\d+)?$
175.
176. 7、正浮点数:^((0-9)+\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\.[0-9]+)|([0-9]*[1-9][0-9]*))$
177.
178. 8、非正浮点数:^((-\d+\.\d+)?)|(0+(\.0+)?))$
179.
180. 9、负浮点数:^(-((正浮点数正则式)))$
181.
182. 10、英文字符串:^[A-Za-z]+$
183.
184. 11、英文大写串:^[A-Z]+$
185.
186. 12、英文小写串:^[a-z]+$
187.
188. 13、英文字符数字串:^[A-Za-z0-9]+$
189.
190. 14、英数字加下划线串:^\w+$
191.
192. 15、E-mail地址:^[\w-]+(\.[\w-]+)*@[\w-]+(\.[\w-]+)+$
193.
194. 16、URL:^[a-zA-Z]+://(\w+(-\w+)*)(\.(\w+(-\w+)*))*(\?\s*)?$
195. 或:^http:\/\/[A-Za-z0-9]+\.[A-Za-z0-9]+[\/=\?%\-&_~`@[\]\’:+!]*([^<>\”\”])*$
196.
197. 17、邮政编码:^[1-9]\d{5}$
198.
199. 18、中文:^[\u0391-\uFFE5]+$
200.
201. 19、电话号码:^((\(\d{2,3}\))|(\d{3}\-))?(\(0\d{2,3}\)|0\d{2,3}-)?[1-9]\d{6,7}(\-\d{1,4})?$
202.
203. 20、手机号码:^((\(\d{2,3}\))|(\d{3}\-))?13\d{9}$
204.
205. 21、双字节字符(包括汉字在内):^\x00-\xff
206.
207. 22、匹配首尾空格:(^\s*)|(\s*$)(像vbscript那样的trim函数)
208.
209. 23、匹配HTML标记:< (.*)>.*< \/\1>|< (.*) \/>
210.
211. 24、匹配空行:\n[\s| ]*\r
212.
213. 25、提取信息中的网络链接:(h|H)(r|R)(e|E)(f|F) *= *(‘|”)?(\w|\\|\/|\.)+(‘|”| *|>)?
214.
215. 26、提取信息中的邮件地址:\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*
216.
217. 27、提取信息中的图片链接:(s|S)(r|R)(c|C) *= *(‘|”)?(\w|\\|\/|\.)+(‘|”| *|>)?
218.
219. 28、提取信息中的IP地址:(\d+)\.(\d+)\.(\d+)\.(\d+)
220.
221. 29、提取信息中的中国手机号码:(86)*0*13\d{9}
222.
223. 30、提取信息中的中国固定电话号码:(\(\d{3,4}\)|\d{3,4}-|\s)?\d{8}
224.
225. 31、提取信息中的中国电话号码(包括移动和固定电话):(\(\d{3,4}\)|\d{3,4}-|\s)?\d{7,14}
226.
227. 32、提取信息中的中国邮政编码:[1-9]{1}(\d+){5}
228.
229. 33、提取信息中的浮点数(即小数):(-?\d*)\.?\d+
230.
231. 34、提取信息中的任何数字 :(-?\d*)(\.\d+)?
232.
233. 35、IP:(\d+)\.(\d+)\.(\d+)\.(\d+)
234.
235. 36、电话区号:/^0\d{2,3}$/
236.
237. 37、腾讯QQ号:^[1-9]*[1-9][0-9]*$
238.
239. 38、帐号(字母开头,允许5-16字节,允许字母数字下划线):^[a-zA-Z][a-zA-Z0-9_]{4,15}$
240.
241. 39、中文、英文、数字及下划线:^[\u4e00-\u9fa5_a-zA-Z0-9]+$