PHP程序员站--PHP编程开发平台
 当前位置:主页 >> PHP基础 >> 基础文章 >> 

如何书写安全的PHP代码

如何书写安全的PHP代码

来源:互联网  作者:  发布时间:2009-02-24
SQL注入 PHP的一个最大优点就是,它可以方便地与数据库中操作,最

SQL注入

PHP的一个最大优点就是,它可以方便地与数据库中操作,最显着的MySQL的. 很多人使用这个数据库。不少网站,包括这一个,依赖于数据库的函数. 然而,正如你所料,有这么大的权力你就要够面对庞大的潜在安全问题. 所幸的是,有很多解决办法. 最常见面安全问题是一个数据库 SQL注入-当用户利用一个安全故障在你的数据库运行SQL语句. 让我们用一个常见的例子. 许多登录系统具有以下特点:一条线,看起来象不像是在检查从表单输入的用户名和密码, 比如去控制访问一个管理员区:

$check = mysql_query("Select Username, Password, UserLevel FROM Users Where Username = '".$_POST['username']."' and Password = '".$_POST['password']."'");

看上去很眼熟? 就表面看来,它好像做得不错.上述并不像可以做许多破坏. 但话又说回来,我在"username" 输入框输入这样的值并提交:

'' 或者 1=1 #

这个执行语句现在是这个样子:

elect Username, Password FROM Users Where Username = '' or 1=1 #' and Password = '';

散列符号(#)告诉MySQL的它之后一切,都会被忽略. 所以实际上只是执行的SQL到这一点. 1永远等于1 ,所以SQL将从数据库返回所有的用户名和密码. 在大多数用户登录数据库的首个户名和密码组合都是管理员用户, 他干脆输入了几个符号作为管理员已登录你的网站, 果他们其实都知道的用户名和密码,他们会有同样的权力如。

一个小创意,上述情况可以进一步发挥,让用户建立自己的登录帐号, 阅读信用卡号码,甚至删除数据库。

所幸的是,这种情况还是很容易避免. 通过检查要进入数据库的数据,并删除或取消它们, 我们可以防止任何人在这个数据库上执行他们自己的SQL语句. 函数的方法如下:

function make_safe($variable) {$variable = addslashes(trim($variable));return $variable;}

现在,修改了我们的执行语句.用_POST取代上面的执行变量, 我们现在把所有的用户数据通过make_safe函数,在以下代码:

$username = make_safe($_POST['username']);$password = make_safe($_POST['password']);$check = mysql_query("Select Username, Password, UserLevel FROM Users Where Username = '".$username."' and Password = '".$password."'");

现在,如果一个用户输入恶意的上述数据,查询看上去像下面这样,是完全无害. 以下查询将选择从数据库中的用户都和"\' or 1=1 #"相等的。

Select Username, Password, UserLevel FROM Users Where Username = '\' or 1=1 #' and Password = ''

现在,除非你曾经提供了一个非常特殊的用户名和空白密码, 你的恶意攻击者将不能做任何损害的事. 像这样检查所有的数据通过你的数据库是非常重要的,尽管你认为这是已经很安全. HTTP头可以由用户伪造. 他们参照地址可以伪造.浏览器用户字符串可以伪造. 不要信任一条用户发送的数据,虽然,你认为是安全的。

文件操作

一些现今的网站的URL,是这个样子的:

index.php?page=contactus.html

"index.php"文件包括"contactus.html"文件,而且这个网站似乎正常运行. 不过,用户可以很容易地将"contactus.html"改成他们自己喜的东西. 举例来说, 如果您正在使用Apache的mod_auth去保护文件,并储存你的密码在一个文件名为".htpasswd"(传统姓名)里 ,然后,如果用户访问以下地址, 脚本将输出你的用户名和密码:

index.php?page=.htpasswd

通过改变URL,在某些系统中, 在另一个可以运行PHP的服务器去引用文件。害怕? 你应该害怕. 再次所幸的是,这是比较容易防范. 首先,你必须确保正确设置" open_basedir"在你的php.ini文件,并已设置"allow_url_fopen "为"Off" . 这将阻止大多数这类型的攻击,以保护远程文件和文件系统. 其次,如果可以的话,请检查文件要求对有效文件. 如果你限制了某些文件可以用这个脚本, 你可以节省不少后来恶果。

使用默认

当mysql是安装,它使用了默认用户的"root"和空白的密码. SQL Server的用途"sa"作为默认的用户和提供了一个空白的密码. 如果有人发现你的数据库服务器地址,并想尝试登录, 这些都是首次组合,他们会尝试. 如果你没有设定不同的密码(最好也和用户, 那么你很可能一天一觉醒来发现你的数据库已经被删除,所有用户号码被盗. 和所有软件一样,你如果使用的软件是默认用户名和密码,改变他们。

不要让安装文件在线

很多PHP项目用安装文件来安装. 其中有不少是一旦运行就自我删除的,但许多不是这样的,直到您删除安装文件. 如果让安装文件在线请注,他们可能仍然可用, 有人可以用它来复盖你的整个网站。

预见性

试想一下,你的网站让一个坏人盯上. 这个坏的人要打破你的管理区, 改变你的所有产品的描述如"这个产品很差劲" . 我猜测,他们首先会去http://www.yoursite.com/admin/ -万一它存在. 将你的敏感文件和文件夹像预测一样,他们很容易就受到黑客攻击。

为此,要确保你的姓名你的敏感文件和文件夹,让他们很难猜测. 把你的 admin 位于http://www.yoursite.com/jsfh8sfsifuhsi8392/ 或者更难去写的,但它为你的网站添加一些额外的保障.如果你需要一个记得快的地址, 但不用"admin"或"administration" (或你的用户名和密码) . 用一些不经常用的。

这同样适用于用户名和密码. 如果你有管理区,不要使用" admin "作为用户名和" password "作为密码. 针对一些特殊的情况,最好是两个字母和数字(有的黑客利用一些所谓的"词典攻击" , 尝试每一个字,在字典里的密码,直到他们找到密码。添加一对密码,使这一类攻击无用) . 这也是明智的去定期改变你的密码 (每两个月). 最后,要确保当一个用户名输入" Wrong Password " 当错误的密码输入时你的错误讯息给没有输出.如: " Unknown Username ",恶意用户都知道,他们已经成功地猜测一个有效的用户名. 对上述两种手段,采用通用的"登录错误"的错误信息 ,如果是用户名和密码输入错误的恶意用户就没有任何办法设想正确的用户和密码。

最后,彻底和完全地设想

你假设你的网站不会受到攻击,或面要对任何问题的话,但当最终出事,你将有大量的麻烦. 如果,在另一方面, 假设你的每一个客人到你的网站是为了攻击你,你永远处于战争状态, 你就能帮助你把你的网站做得安全,并准备得没有一点闪失。


延伸阅读:
PHP+SQL注入式攻击专题连载
PHP开发安全建议20点
安全编程法则

Tags: php   php安全   SQL注入   php注入   代码   安全   密码   文件   数据库    
最新文章
推荐阅读
月点击排行榜
PHP程序员站 Copyright © 2007-2010,PHPERZ.COM All Rights Reserved 粤ICP备07503606号