<?php
unlink (
$evil_var
);
fwrite (
$fp
,
$evil_var
);
system (
$evil_var
);
exec
(
$evil_var
);
?>
必须时常留意你的代码,以确保每一个从客户端提交的变量都经过适当的检查,然后问自己以下一些问题:此脚本是否只能影响所预期的文件?非正常的数据被提交后能否产生作用?此脚本能用于计划外的用途吗?此脚本能否和其它脚本结合起来做坏事?是否所有的事务都被充分记录了?在写代码的时候问自己这些问题,否则以后可能要为了增加安全性而重写代码了。注意了这些问题的话,也许还不完全能保证系统的安全,但是至少可以提高安全性。还可以考虑关闭 register_globals,magic_quotes 或者其它使编程更方便但会使某个变量的合法性,来源和其值被搞乱的设置。 2、用户输入表单问题验证用户输入的任何数据,保证PHP代码的安全。注意1:JS只是为了提高来访用户的体验而产生的,而不是验证的工具。因为任何一个来访的用户都可能会,也有可能无意间就禁用了客户端脚本的执行,从而跳过这层验证。所以我们必须在PHP的服务器端程序上检验这些数据。注意2:不要使用$_SERVER['HTTP_REFERER']这个超级变量来检查数据的来源地址,一个很小的菜鸟黑客都会利用工具来伪造这个变量的数据,尽可能利用Md5,或者rand等函数来产生一个令牌,验证来源的时候,验证这个令牌是否匹配。3、PHP文件权限问题PHP 被设计为以用户级别来访问文件系统,所以完全有可能通过编写一段 PHP 代码来读取系统文件如/etc/passwd,更改网络连接以及发送大量打印任务等等。因此必须确保 PHP 代码读取和写入的是合适的文件。请看下面的代码,用户想要删除自己主目录中的一个文件。假设此情形是通过 web 界面来管理文件系统,因此 Apache用户有权删除用户目录下的文件。 ?1234567
<?php
$username
=
$_POST
[
'user_submitted_name'
];
$homedir
=
"/home/$username"
;
$file_to_delete
=
"$userfile"
;
unlink (
"$homedir/$userfile"
);
echo
"$file_to_delete has been deleted!"
;
?>
既然 username 变量可以通过用户表单来提交,那就可以提交别人的用户名和文件名,并删除该文件。这种情况下,就要考虑其它方式的认证:只给 PHP 的 web 用户很有限的权限。检查所有提交上来的变量。以下是更加安全的文件名和变量的验证和检查: ?12345678910
<?php