PHP是一个很容易学习的语言 许多人在没有任何编程背景下学习它作为一种去增加一些互动元素到他们的网站的方法 不幸的是这往往意味着PHP程序员尤其是那些较新的Web开发程序员 并没有觉察他们网站中潜在安全风险 这里是一些比较常见的安全问题以及如何去避免它们
永远永远信任你的用户
不能说足够的次数你应该永远永远 信任你的用户向你发送你期望的数据 我听到很多人回应大概是哦没有恶意的人将对我的网站感兴趣这就错了 这里总是有怀有恶意的用户可以利用一个安全漏洞问题可以很容易被发现因为一个用户无意中做错了
因此 所有网页的发展的戒律我不能再压缩了的话就是永远永远相信你的用户假定你的网站从使用者收集的每片数据含有恶意代码始终 你认为已经检查客户端验证的这些数据例如在JavaScript 如果你能够达到这个目标你应该有了一个良好的开端如果PHP的安全性很重要这一点就要重要地学习个人来说PHP安全是一个重大的问题
全局变量
在许多语言你必须明确地设定一个变量以使用它 在PHP中有一个选项 register_globals 你可以在phpini中设置让你可以使用全局变量而不需要事先声明
考虑下面的代码
if ($password == my_password) {
$authorized = ;
}
if ($authorized == ) {
echo Lots of important stuff;
}
许多人看上去觉得没什么问题而事实上这方面的代码在整个网站上应用 但是如果一个服务器开启register_globals然后只需添加?authorized=的URL将让任何人都看到 这是一个最普遍的PHP的安全问题
所幸的是这有两个简单的解决办法 第一也许最好的就是把register_globals关闭 二是你必须明确只有你使用变量 在上面的例子中这将意味着加入?authorized=; 在脚本的开始
$authorized =
;if ($password ==
my_password
) {$authorized =
;}if ($authorized ==
) {echo
Lots of important stuff
;}
错误信息
错误信息是一个非常有用的工具无论是程序员和黑客 开发者需要它们去改正错误 黑客可以利用它们来找出一个网站的各种信息 从目录结构的服务器数据库登录信息 如果可能的话最好是关闭所有的错误报告 PHP可以完成这项工作 htaccess或phpini设置error_reporting 的值改为 如果你有一个开发环境您可以设定不同的错误报告级别
SQL注入
PHP的一个最大优点就是它可以方便地与数据库中操作最显着的MySQL的 很多人使用这个数据库不少网站包括这一个依赖于数据库的函数 然而正如你所料有这么大的权力你就要够面对庞大的潜在安全问题 所幸的是有很多解决办法 最常见面安全问题是一个数据库 SQL注入当用户利用一个安全故障在你的数据库运行SQL语句 让我们用一个常见的例子 许多登录系统具有以下特点:一条线看起来象不像是在检查从表单输入的用户名和密码 比如去控制访问一个管理员区
$check = mysql_query(
Select Username
Password
UserLevel FROM Users Where Username =
$_POST[
username
]
and Password =
$_POST[
password
]
);
看上去很眼熟? 就表面看来它好像做得不错上述并不像可以做许多破坏 但话又说回来我在username 输入框输入这样的值并提交
或者 = #
这个执行语句现在是这个样子
elect Username
Password FROM Users Where Username =
or
=
#
and Password =
;
散列符号(#)告诉MySQL的它之后一切都会被忽略 所以实际上只是执行的SQL到这一点 永远等于 所以SQL将从数据库返回所有的用户名和密码 在大多数用户登录数据库的首个户名和密码组合都是管理员用户 他干脆输入了几个符号作为管理员已登录你的网站 果他们其实都知道的用户名和密码他们会有同样的权力如
一个小创意上述情况可以进一步发挥让用户建立自己的登录帐号 阅读信用卡号码甚至删除数据库
[] []