php关于输入过滤小结

Web的攻击,大部分是来自于外部,如Url上添加一些字段注入($_GET输入),表单的提交注入(一般为$_POST),所以在接收数据时对数据进行过滤,是很有必要的。

一.  一般php自带的过滤方法有:

1.空过滤

trim过滤字符串首尾空格

$name = trim($_POST[‘name‘]);

2.标签过滤 :

strip_tags会将字符串中的php标签(<?php ?>)Html标签(<h1></h1><script></script>....等)移除。一定程序上阻止了恶意注入。

//for example:
$_POST[‘name‘] = "<script>alert(‘hehe‘);</script>";
var_dump($_POST[‘name‘]);//弹出信息框 ‘hehe‘
$name = strip_tags($_POST[‘name‘]);
var_dump($name);  //string(14) "alert(‘hehe‘);"

3.转数据类型

若知道要接收的数据是整形或浮点形,可以直接转数据类型。

//转整形 
$number = intval($_POST[‘number‘]);
$price  = floatval($_POST[‘price‘]);

4.移除xss攻击(跨站脚本攻击)

xss攻击有时会把标签转换成其他数据,strip_tags防止不了,

ThinkPHP中有个remove_xss方法,可以将大部分xss攻击阻止。这方法在 ./ThinkPHP/Extend/Function/extend.php中,为了方便使用,可以放到项目的common.php里。

方法如下

/**
 * @from extend.php
 * 过滤xss攻击
 * @param str $val
 * @return mixed
 */
function remove_xss($val) {
	// remove all non-printable characters. CR(0a) and LF(0b) and TAB(9) are allowed
	// this prevents some character re-spacing such as <java\0script>
	// note that you have to handle splits with \n, \r, and \t later since they *are* allowed in some inputs
	$val = preg_replace(‘/([\x00-\x08,\x0b-\x0c,\x0e-\x19])/‘, ‘‘, $val);

	// straight replacements, the user should never need these since they‘re normal characters
	// this prevents like <IMG [email protected]:alert(‘XSS‘)>
	$search = ‘abcdefghijklmnopqrstuvwxyz‘;
	$search .= ‘ABCDEFGHIJKLMNOPQRSTUVWXYZ‘;
	$search .= ‘[email protected]#$%^&*()‘;
	$search .= ‘~`";:?+/={}[]-_|\‘\\‘;
	for ($i = 0; $i < strlen($search); $i++) {
		// ;? matches the ;, which is optional
		// 0{0,7} matches any padded zeros, which are optional and go up to 8 chars

		// @ @ search for the hex values
		$val = preg_replace(‘/(&#[xX]0{0,8}‘.dechex(ord($search[$i])).‘;?)/i‘, $search[$i], $val); // with a ;
		// @ @ 0{0,7} matches ‘0‘ zero to seven times
		$val = preg_replace(‘/(&#0{0,8}‘.ord($search[$i]).‘;?)/‘, $search[$i], $val); // with a ;
	}

	// now the only remaining whitespace attacks are \t, \n, and \r
	$ra1 = array(‘javascript‘, ‘vbscript‘, ‘expression‘, ‘applet‘, ‘meta‘, ‘xml‘, ‘blink‘, ‘link‘, ‘style‘, ‘script‘,
	              ‘embed‘, ‘object‘, ‘iframe‘, ‘frame‘, ‘frameset‘, ‘ilayer‘, ‘layer‘, ‘bgsound‘, ‘title‘, ‘base‘);
	$ra2 = array(‘onabort‘, ‘onactivate‘, ‘onafterprint‘, ‘onafterupdate‘, ‘onbeforeactivate‘, ‘onbeforecopy‘, ‘onbeforecut‘,
	         ‘onbeforedeactivate‘, ‘onbeforeeditfocus‘, ‘onbeforepaste‘, ‘onbeforeprint‘, ‘onbeforeunload‘, ‘onbeforeupdate‘, 
	         ‘onblur‘, ‘onbounce‘, ‘oncellchange‘, ‘onchange‘, ‘onclick‘, ‘oncontextmenu‘, ‘oncontrolselect‘, ‘oncopy‘, ‘oncut‘,
	         ‘ondataavailable‘, ‘ondatasetchanged‘, ‘ondatasetcomplete‘, ‘ondblclick‘, ‘ondeactivate‘, ‘ondrag‘, ‘ondragend‘,
	         ‘ondragenter‘, ‘ondragleave‘, ‘ondragover‘, ‘ondragstart‘, ‘ondrop‘, ‘onerror‘, ‘onerrorupdate‘, ‘onfilterchange‘,
	         ‘onfinish‘, ‘onfocus‘, ‘onfocusin‘, ‘onfocusout‘, ‘onhelp‘, ‘onkeydown‘, ‘onkeypress‘, ‘onkeyup‘, ‘onlayoutcomplete‘,
	         ‘onload‘, ‘onlosecapture‘, ‘onmousedown‘, ‘onmouseenter‘, ‘onmouseleave‘, ‘onmousemove‘, ‘onmouseout‘, ‘onmouseover‘,
	         ‘onmouseup‘, ‘onmousewheel‘, ‘onmove‘, ‘onmoveend‘, ‘onmovestart‘, ‘onpaste‘, ‘onpropertychange‘,‘onreadystatechange‘,
	         ‘onreset‘, ‘onresize‘, ‘onresizeend‘, ‘onresizestart‘, ‘onrowenter‘, ‘onrowexit‘, ‘onrowsdelete‘, ‘onrowsinserted‘, 
	         ‘onscroll‘, ‘onselect‘, ‘onselectionchange‘, ‘onselectstart‘, ‘onstart‘, ‘onstop‘, ‘onsubmit‘, ‘onunload‘);
	$ra = array_merge($ra1, $ra2);

	$found = true; // keep replacing as long as the previous round replaced something
	while ($found == true) {
		$val_before = $val;
		for ($i = 0; $i < sizeof($ra); $i++) {
			$pattern = ‘/‘;
			for ($j = 0; $j < strlen($ra[$i]); $j++) {
				if ($j > 0) {
					$pattern .= ‘(‘;
					$pattern .= ‘(&#[xX]0{0,8}([9ab]);)‘;
					$pattern .= ‘|‘;
					$pattern .= ‘|(&#0{0,8}([9|10|13]);)‘;
					$pattern .= ‘)*‘;
				}
				$pattern .= $ra[$i][$j];
			}
			$pattern .= ‘/i‘;
			$replacement = substr($ra[$i], 0, 2).‘<x>‘.substr($ra[$i], 2); // add in <> to nerf the tag
			$val = preg_replace($pattern, $replacement, $val); // filter out the hex tags
			if ($val_before == $val) {
				// no replacements were made, so exit the loop
				$found = false;
			}
		}
	}
	return $val;
}

调用时如下

$name = remove_xss($_POST[‘name‘]);

基本我使用的就这几种方法。如果有其他不错的方法,请一起来分享。

时间: 2024-10-07 12:56:39

php关于输入过滤小结的相关文章

如何实现select组件的选择输入过滤作用

实现select组件的选择输入过滤作用的js代码如下: /** *其中//******之间的部分显示的是在没有选择输入过滤功能的代码上加入的功能代码 ** / /** * @description This plugin allows you to make a select box editable like a text box while keeping it's select-option features * @description no stylesheets or images

Vanilla Masker – 功能强大的输入过滤插件

Vanilla Masker 是一个纯 JavaScript 实现的输入内容过滤和自动转换插件.现在你可以使用一个简单而纯粹的 JavaScript 库来控制你的 input 元素,而不需要加载 jQuery,Zepto 或者其它框架.不用担心兼容性,因为这是一个跨浏览器和跨设备的库. 您可能感兴趣的相关文章 Web 开发中很实用的10个效果[附源码下载] 精心挑选的优秀jQuery Ajax分页插件和教程 12款经典的白富美型 jQuery 图片轮播插件 让网站动起来!12款优秀的 jQuer

输入过滤

//输入过滤 同时去除连续空白字符可参考扩展库的remove_xssfunction get_replace_input($str,$rptype=0){ $str = stripslashes($str); $str = htmlspecialchars($str); $str = get_replace_nb($str); return addslashes($str);}//去除换行function get_replace_nr($str){ $str = str_replace(arra

input输入过滤js

html部分使用方式 <input  onkeyup="usrNameSet(this)" /> 其它的自己可以随便调用 Js部分 //只能输入数字.字母.小数点.汉字.@function usrNameSet(num){ var str=num.value;//var str = document.getElementById("userName").value; var value=str.replace(/[^\a-\z\A-\Z0-9\u4E00

PHP安全,防止SQL注入(输入过滤,输出转义)

(1)magic_quotes_gpc选项打开,在这种情况下所有的客户端GET和POST的数据都会自动进行addslashes处理 (2)防止对数字值的SQL注入,如用intval()等函数进行处理 (3)mysql_real_escape_string( string )  addslashes(string) 以上是利用PHP自带函数来防止SQL注入 下面提供一个例子,是在一个页面实现过滤,然后,需要用到的页面引入代码即可 #整站防注入 if (@magic_quotes_gpc()) {

输入输出函数小结

输入函数 <1>scanf ,sscanf(输入源是字符串),fscanf(输入源是文件)函数 返回值        :返回成功读入的项目的个数.如果没有读取任何项目返回0.当它检测到文件结尾时,它返回EOF. 输入结束标志: 跳过输入队列的换行符,空格开始读入.遇到换行,空格是结束读入, 注意           :输入字符串时逗号并不能作为分隔符:scanf读入多项数据时,若有一项读入出错,其后面的也不会读入 用于           :一次输入一个单词或以某种标准形式输入的混合类型数据的

javascript 键盘输入过滤,只能输入数字,小数一位且只能输入5

$("#right_div2 input[type='text'][class='textClass'][id^='asd_']").live("keydown",function(event) { var desValue = $(this).val()+event.char; if(event.keyCode>31 && event.keyCode != 128) { if(!/(^(\d+)$)|(^(\d+\.)$)|(^(\d+\.[

unity3d 5 InputField 非法路径文件名字符 输入过滤

转载请保留原文链接:http://blog.csdn.net/andyhebear/article/details/51361747 void Start() { if (this.Button == null) { this.Button = this.GetComponentInChildren<UI_ButtonClick>(); } if (this.InputText == null) { this.InputText = this.GetComponentInChildren<

输入、过滤和输出——PowerShell三分钟(八)

今天的三分钟给大家归纳一下PowerShell日常对数据的输入过滤和输出的处理 PowerShell输入数据的方式有很多种,包括直接输入字符.导入数据.捕获界面输入等 对于较少的信息,可以直接手工在PowerShell界面中输入: 这种方式很常见,对于需求信息较少的查询和操作非常方便 除此之外,还有Read-Host用于交互式输入: 由于是交互式输入,多用于必须用户干预的脚本 如果涉及到大量数据的输入,则需要用到Get-Content 首先准备一个txt,每一行都是需要输入的数据 通过Get-C