PHP安全

转自http://www.cnblogs.com/crazyant/archive/2011/02/23/2823775.html
1、           Magic Quotes选项
PHP.INI中中有三个以magic_quotes_开头的选项 magic_quotes_gpc如果是On的话,就会自动用‘\’转义从GET,POST,COOKIE来的数据,这是为什么我们想在URL中输入' ; show tables;--有时候失败的原因,因为被转义了呗 magic_quotes_runtime如果是on,会自动转义来自数据库或字符串中数据magic_quotes_sybase会用单引号代替反斜杠来转义 我们可以使用addslashes函数来达到同样目的,不过有时候得用stripslashes来取消转义哦
2、           PHP的命令执行函数
a)      system:执行一个外部的应用程序并显示输出的结果
b)      exec:执行一个外部的应用程序
c)       passthru:执行一个UNIX系统命令并返回原始的输出
d)      shell_exec:执行shell命令并返回输出的字符串
e)      "``"运算符:与shell_exec功能相同
system举例-列出C盘内容:
?
1
2
3
4
5
6
7
8
9
10
11
12
13
<?php
 
echo  "<pre>" ;
 
$last_line  = system( "dir c:" , $retval );
 
echo  "</pre>" ;
 
  echo  "命令输出的最后一行:"  . $last_line  . "<br />" ;
 
echo  "命令的返回值:"  . $retval ;
 
?>
exec执行外部应用程序-列出C盘内容:
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<?php
 
$output  = array ();
 
echo  "<pre>" ;
 
$last_line  = exec ( "dir c:" , $output );
 
echo  "</pre>" ;
 
while (list( $key , $value ) = each( $output ))
 
{
 
     echo  $value  . "<br />" ;
 
}
 
  
echo  "命令输出的最后一行:"  . $last_line  . "<br />" ;
echo  "命令的返回值:"  . $retval ;
 
?>
string shell_exec( string cmd )
?
1
2
3
4
5
6
7
8
9
10
11
12
<?php
 
echo  "<pre>" ;
 
$output  = shell_exec( "dir c:" );
 
echo  "</pre>" ;
 
  
echo  nl2br ( $output ) . "<br />" ;
 
?>
?
1
2
3
4
5
6
7
8
9
10
11
12
<?php
 
echo  "<pre>" ;
 
$output  = `dir c:`;
 
echo  "</pre>" ;
 
  
echo  nl2br ( $output ) . "<br />" ;
 
?>
3、           EVAL函数攻击
下面的例子我换参数为system("dir c:");,执行失败了,是因为我的php.ini中 ; Magic quotes for incoming GET/POST/Cookie data. magic_quotes_gpc = On 这句话导致system括号里的双引号被转义,导致执行失败
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<?php
 
$myvar  = "varname" ;
 
  
 
if  (isset( $_GET [ "arg" ]))
 
{
 
     $arg  = $_GET [ "arg" ];
 
     //arg参数可以替换成system造成命令注入攻击
 
     eval ( "\$myvar = $arg;" ); //eval 能够执行里面的字符串的PHP代码
 
     echo  "\$myvar = "  . $myvar ;
 
  
 
}
 
?>
4、           防范命令注入攻击和EVAL注入攻击的方法
使用函数 escateshellarg 函数过滤传来的字符串参数即可
5、           客户端脚本攻击-SQL Insertion
客户端脚本攻击,就是用户在留言板框内输入js脚本,然后别人就中招了 解决方法就是HTML输出过滤 在PHP中有两种方法可以进行HTML输出过滤: l  使用strip_tags来删除字符串中的PHP和HTML标签 l  使用 htmlspecialchars函数来讲特殊字符转换成HTML编码,而不是执行,这是解决该问题的最佳方法 l  跨网站脚本攻击XSS解决方法 很简单,仍然使用htmlspecialchars将来自URL的参数过滤一下即可,这样不让来自URL的js代码执行就OK 如果在表单中用的是action=$_SERVER['PHP_SELF']或者action=$SCRIPT_NAME的时候,会被XSS注入,解决方法: 在action后面的URL加上htmlspecialchars过滤 action写成空,即action=''默认是提交到自身页面的,所以没必要,该情况用于表单是自身处理的情况
6、           SQL注入攻击的防御方法:
a)      如果确定是整数,用intval过滤参数
b)      如果确定是浮点数,用floatval或doubleval函数过滤
c)       如果是字符串,则用addslashes函数将单引号,双引号,反斜杠,NULL等字符转义

请注意,PHP.INI中的magic_quotes_gpc如果为ON,那么字符串中引号等会被自动加上反斜杠转义,那么如果我们再加上addslashes函数就会有了两个反斜杠,使得SQL语句中出现了一个反斜杠后被执行,会出错误的。 解决方法,使用get_magic_quotes_gpc判断是不是将该值设置为ON了,如果是ON返回1,如果offf返回0

get_magic_quotes_gpc — 获取当前 magic_quotes_gpc 的配置选项设置,如果 magic_quotes_gpc 为关闭时返回 0,否则返回 1。在 PHP 5.4.O 起将始终返回 FALSE,因为这个魔术引号功能已经从 PHP 中移除了。

<?php
// 如果启用了魔术引号
echo $_POST['lastname'];             // O\'reilly
echo addslashes($_POST['lastname']); // O\\\'reilly

// 适用各个 PHP 版本的用法
if (get_magic_quotes_gpc()) {
    $lastname = stripslashes($_POST['lastname']);
}
else {
    $lastname = $_POST['lastname'];
}

// 如果使用 MySQL
$lastname = mysql_real_escape_string($lastname);

echo $lastname; // O\'reilly
$sql = "INSERT INTO lastnames (lastname) VALUES ('$lastname')";
?>



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值