PHP开发实例大全(提高卷) 中文完整pdf扫描版[244MB]
一、转义或者转换的目的
1. 转义或者转换字符串防止sql注入
2. 转义或者转换字符防止html非过滤引起页面布局变化
3. 转义或者转换可以阻止javascript等脚本的xss攻击,避免出现类似恶意弹窗等等形式
二、函数
1. addslashes($str);
此函数转义预定义的字符:单引号(‘),双引号(“),反斜线(\)与NULL(NULL字符)
转义出现在html中的单引号(‘)和双引号(“),经过测试效果不是很好,转义html中的特字符就使用htmlspecialchar()函数
2. htmlspecialchars($str);
此函数只转换5个字符,和号(&),双引号(“),单引号(‘),小于(<),大于(>),转换为实体形式,输出时浏览器会自动还原的,如果有意识的转换回来使用htmlspecialchars_decode();
3. htmlentities();
此函数会把所有html表示都转换为实体形式的,如果把thml实体转换为字符使用html_lentity_decode()
http://www.3qphp.com/php/phpjch/4.html
三、实例
场景说明:比如想在留言板贴出一段html代码或者javascript代码让别人指导,如何让留言板里面的内容显示出来的是一段html代码或者javascript代码,而不是被浏览器把这段html代码或者javascript给解析了的效果
下面的代码段中没有添加转义的任何措施,看看效果
<?php echo "输出的结果是:"; echo $_GET['n']; ?> <form method="get" action=""><textarea cols="50" rows="5" name="n"></textarea><input type="submit"></form>
图1是原页面效果
(图1)
1. 在表单中提交html代码留言如图2-1
(图2-1)
图2-2为输出结果
(图2-2)
2. 在表单中提交一段js代码如图3-1
(图3-1)
结果如图3-2出现弹窗,而不是我想要的js代码,这是ie内核的浏览器下,非ie的像谷歌,火狐没有出现此弹窗但是也没有输出那段js代码到页面
(图3-2)
可是代码如果进行了转义处理就不会像上面这样了,添加htmlspecialchars()函数进行处理
<?php echo "留言板输出的结果是:"; echo htmlspecialchars($_GET['n']); ?>
<form method="get" action=""><textarea cols="50" rows="5" name="n"></textarea><input type="submit"></form>
同样提交上面的html代码结果如下图4-1输出的html代码,而不是输出一个表单
(图4-1)
同样提交上面的javascript代码结果如下图5-1输出的js代码,而不是变成弹窗
(图5-1)
四、开源系统中的应用
1. phpcms中使用代码
/** * 返回经addslashes处理过的字符串或数组 * @param $string 需要处理的字符串或数组 * @return mixed */ function new_addslashes</a>($string){ if(!is_array($string)) return addslashes($string); foreach($string as $key => $val) $string[$key] = new_addslashes($val); return $string; } /** * 返回经stripslashes处理过的字符串或数组 * @param $string 需要处理的字符串或数组 * @return mixed */ function new_stripslashes($string) { if(!is_array($string)) return stripslashes($string); foreach($string as $key => $val) $string[$key] = new_stripslashes($val); return $string; } /** * 返回经htmlspecialchars处理过的字符串或数组 * @param $obj 需要处理的字符串或数组 * @return mixed */ function new_html_special_chars($string) { $encoding = 'utf-8'; if(strtolower(CHARSET)=='gbk') $encoding = 'ISO-8859-15'; if(!is_array($string)) return htmlspecialchars</a>($string,ENT_QUOTES,$encoding); foreach($string as $key => $val) $string[$key] = new_html_special_chars($val); return $string; } function new_html_entity_decode($string) { $encoding = 'utf-8'; if(strtolower(CHARSET)=='gbk') $encoding = 'ISO-8859-15'; return html_entity_decode($string,ENT_QUOTES,$encoding); } function new_htmlentities($string) { $encoding = 'utf-8'; if(strtolower(CHARSET)=='gbk') $encoding = 'ISO-8859-15'; return htmlentities</</a>a>($string,ENT_QUOTES,$encoding); }
2. ecshop中的使用
/* 对用户传入的变量进行转义操作。*/ if (!get_magic_quotes_gpc()) { if (!empty($_GET)) { $_GET = addslashes_deep($_GET); } if (!empty($_POST)) { $_POST = addslashes_deep($_POST); } $_COOKIE = addslashes_deep($_COOKIE); $_REQUEST = addslashes_deep($_REQUEST); } /** * 递归方式的对变量中的特殊字符进行转义 * * @access public * @param mix $value * * @return mix */ function addslashes_deep($value) { if (empty($value)) { return $value; } else { return is_array($value) ? array_map('addslashes_deep', $value) : addslashes($value); } } /** * 将对象成员变量或者数组的特殊字符进行转义 * * @access public * @param mix $obj 对象或者数组 * @author Xuan Yan * * @return mix 对象或者数组 */ function addslashes_deep_obj($obj) { if (is_object($obj) == true) { foreach ($obj AS $key => $val) { $obj->$key = addslashes_deep($val); } } else { $obj = addslashes_deep($obj); } return $obj; } /** * 递归方式的对变量中的特殊字符去除转义 * * @access public * @param mix $value * * @return mix */ function stripslashes_deep($value) { if (empty($value)) { return $value; } else { return is_array($value) ? array_map('stripslashes_deep', $value) : stripslashes($value); } } /** * html代码输入 * @param unknown $str * @return string */ function html_in($str) { $search = array( "'<script[^>]*?>.*?</script>'si", // 去掉 javascript "'<iframe[^>]*?>.*?</iframe>'si" // 去掉iframe ); $replace = array("", ""); $str = @preg_replace($search, $replace, $str); $str = htmlspecialchars($str); if (!get_magic_quotes_gpc()) { $str = addslashes($str); } return $str; } /** * html代码输出 * @param unknown $str * @return string */ function html_out($str) { if (function_exists('htmlspecialchars_decode')) { $str = htmlspecialchars_decode($str); } else { $str = html_entity_decode($str); } $str = stripslashes($str); return $str; }
转载请注明:谷谷点程序 » addslashes,htmlspecialchars,htmlentities转换或者转义php特殊字符防止xss攻击以及sql注入