PHP防止注入攻击实例分析
本文以实例形式详细分析了PHP防止注入攻击的方法。分享给大家供大家参考。具体分析如下:
PHPaddslashes()函数--单撇号加斜线转义
PHPString函数
定义和用法
addslashes()函数在指定的预定义字符前添加反斜杠。
这些预定义字符是:
单引号(')
双引号(")
反斜杠(\)
NULL
语法:
addslashes(string)
提示和注释
提示:该函数可用于为存储在数据库中的字符串以及数据库查询语句准备合适的字符串。
注释:默认情况下,PHP指令magic_quotes_gpc为on,对所有的GET、POST和COOKIE数据自动运行addslashes()。不要对已经被magic_quotes_gpc转义过的字符串使用addslashes(),因为这样会导致双层转义。遇到这种情况时可以使用函数get_magic_quotes_gpc()进行检测。
例子
在本例中,我们要向字符串中的预定义字符添加反斜杠:
<?php $str="Who'sJohnAdams?"; echo$str."Thisisnotsafeinadatabasequery.<br/>"; echoaddslashes($str)."Thisissafeinadatabasequery."; ?>
输出:
Who'sJohnAdams?Thisisnotsafeinadatabasequery.
Who\'sJohnAdams?Thisissafeinadatabasequery.
get_magic_quotes_gpc函数
functionhtml($str) { $str=get_magic_quotes_gpc()?$str:addslashes($str); return$str; }
get_magic_quotes_gpc:
取得PHP环境变数magic_quotes_gpc的值。
语法:longget_magic_quotes_gpc(void);
传回值:长整数
函式种类:PHP系统功能
内容说明:
本函式取得PHP环境设定的变数magic_quotes_gpc(GPC,Get/Post/Cookie)值。传回0表示关闭本功能;传回1表示本功能开启。当magic_quotes_gpc开启时,所有的'(单引号),"(双引号),\(反斜线)and空字符会自动转为含有反斜线的溢出字符。
addslashes--使用反斜线引用字符串
描述:
stringaddslashes(stringstr)
返回字符串,该字符串为了数据库查询语句等的需要在某些字符前加上了反斜线。这些字符是单引号(')、双引号(")、反斜线(\)与NUL(NULL字符)。
一个使用addslashes()的例子是当你要往数据库中输入数据时。例如,将名字O'reilly插入到数据库中,这就需要对其进行转义。大多数据库使用\作为转义符:O\'reilly。这样可以将数据放入数据库中,而不会插入额外的\。当PHP指令magic_quotes_sybase被设置成on时,意味着插入'时将使用'进行转义。
默认情况下,PHP指令magic_quotes_gpc为on,它主要是对所有的GET、POST和COOKIE数据自动运行addslashes()。不要对已经被magic_quotes_gpc转义过的字符串使用addslashes(),因为这样会导致双层转义。遇到这种情况时可以使用函数get_magic_quotes_gpc()进行检测。
例子1.addslashes()示例
$str="IsyournameO'reilly?"; //输出:IsyournameO\'reilly? echoaddslashes($str); ?> get_magic_quotes_gpc()
本函数取得PHP环境配置的变量magic_quotes_gpc(GPC,Get/Post/Cookie)值。返回0表示关闭本功能;返回1表示本功能打开。当magic_quotes_gpc打开时,所有的'(单引号),"(双引号),\(反斜线)and空字符会自动转为含有反斜线的溢出字符。
magic_quotes_gpc
对于php.ini中的magic_quotes_gpc,是设置为off还是为on呢?
个人观点,应该设置为on
总结如下:
1.对于magic_quotes_gpc=on的情况,
我们可以不对输入和输出数据库的字符串数据作
addslashes()和stripslashes()的操作,数据也会正常显示。
如果此时你对输入的数据作了addslashes()处理,
那么在输出的时候就必须使用stripslashes()去掉多余的反斜杠。
2.对于magic_quotes_gpc=off的情况
必须使用addslashes()对输入数据进行处理,但并不需要使用stripslashes()格式化输出
因为addslashes()并未将反斜杠一起写入数据库,只是帮助mysql完成了sql语句的执行。
补充:
magic_quotes_gpc作用范围是:WEB客户服务端;作用时间:请求开始时,例如当脚本运行时.
magic_quotes_runtime作用范围:从文件中读取的数据或执行exec()的结果或是从SQL查询中得到的;作用时间:每次当脚本访问运行状态中产生的数据
代码:
<?php /* 有时表单提交的变量不止一个,可能有十几个,几十个。那么一次一次地复制/粘帖addslashes(),是否麻烦了一点?由于从表单或URL获取的数据都是以数组形式出现的,如$_POST、$_GET)D蔷妥远ㄒ逡桓隹梢浴昂嵘ㄇЬ”的函数 */ functionquotes($content) { //如果magic_quotes_gpc=Off,那么就开始处理 if(!get_magic_quotes_gpc()){ //判断$content是否为数组 if(is_array($content)){ //如果$content是数组,那么就处理它的每一个单无 foreach($contentas$key=>$value){ $content[$key]=addslashes($value); } }else{ //如果$content不是数组,那么就仅处理一次 addslashes($content); } }else{ //如果magic_quotes_gpc=On,那么就不处理 } //返回$content return$content; } ?>
希望本文所述对大家的PHP程序设计有所帮助。