让你的Apache配置更安全的方法

一、确保你安装的是最新的补丁

如果门是敞开的话,在窗户上加锁就毫无意义。同样道理,如果你没有打补丁,继续下面的操作就没有什么必要。


二、隐藏Apache的版本号及其它敏感信息

默认情况下,很多Apache安装时会显示版本号及操作系统版本,甚至会显示服务器上安装的是什么样的Apache模块。这些信息可以为黑客所用,并且黑客还可以从中得知你所配置的服务器上的很多设置都是默认状态。

 

这里有两条语句,你需要添加到你的httpd.conf文件中:

 

ServerSignature Off

 

ServerTokens Prod

 

ServerSignature出现在Apache所产生的像404页面、目录列表等页面的底部。ServerTokens目录被用来判断Apache会在Server HTTP响应包的头部填充什么信息。如果把ServerTokens设为Prod,那么HTTP响应包头就会被设置成:

 

Server:Apache

 

如果你非常想尝试其它事物,你可以通过编辑源代码改成不是Apache的其它东西,或者你可以通过下面将要介绍的mod_security实现。


三、确保Apache以其自身的用户账号和组运行

有的Apache安装过程使得服务器以nobody的用户运行,所以,假定Apache和你的邮件服务器都是以nobody的账号运行的,那么通过Apache发起的攻击就可能同时攻击到邮件服务器,反之亦然。

 

User

apache

Group apache


四、确保web根目录之外的文件没有提供服务

我们不让Apache访问web根目录之外的任何文件。假设你的所以web站点文件都放在一个目录下(例如/web),你可以如下设置:

 

?/P>

 

Order Deny,Allow

 

Deny from all

 

Options None

 

AllowOverride None

 

?/P>

 

?/P>

 

Order Allow,Deny

 

Allow from all

 

?/P>

 

注意,因为我们设置Opitins None 和AllowOverride None,这将关闭服务器的所有Option和Override。你现在必须明确把每个目录设置成Option或者Override。


五、关闭目录浏览

你可以在Directory标签内用Option命令来实现这个功能。设置Option为None或者-Indexes。

 

Options -Indexes


六、关闭includes

这也可以通过在Directory标签内使用Option命令来实现。设置Option为None或者-Includes。

 

Options -Includes


七、关闭CGI执行程序

如果你不用CGI,那么请把它关闭。在目录标签中把选项设置成None或-ExecCGI就可以:

 

Options -ExecCGI


八、禁止Apache遵循符号链接

同上,把选项设置成None或-FollowSymLinks:

 

Options -FollowSymLinks


九、关闭多重选项

如果想关闭所有选项,很简单:

 

Options None

 

如果只想关系一些独立的选项,则通过将Options做如下设置可实现:

 

Options -ExecCGI -FollowSymLinks -Indexes


十、关闭对.htaccess文件的支持

在一个目录标签中实现:

 

AllowOverride None

 

如果需要重载,则保证这些文件不能够被下载,或者把文件名改成非.htaccess文件。比如,我们可以改成.htt

pdo

verride文件,然后像下面这样阻止所有以.ht打头的文件:

 

AccessFileName .httpdoverride

 

?/P>

 

Order allow,deny

 

Deny from all

 

Satisfy All


十一、运行mod_security

Run mod_security是O’Reilly出版社出版的Apache Security一书的作者,Ivan Ristic所写的一个非常好用的一个Apache模块。可以用它实现以下功能:

 

·简单过滤

 

·基于过滤的常规表达式

 

·URL编码验证

 

·Unicode编码验证

 

·审计

 

·空字节攻击防止

 

·上载存储限制

 

·服务器身份隐藏

 

·内置的Chroot支持

 

·更多其它功能


十二、关闭任何不必要的模块

Apache通常会安装几个模块,浏览Apache的module documentation,了解已安装的各个模块是做什么用的。很多情况下,你会发现并不需要激活那些模块。

 

找到httpd.conf中包含LoadModule的代码。要关闭这些模块,只需要在代码行前添加一个#号。要找到正在运行的模块,可以用以下语句:

 

grep LoadModule httpd.conf

 

以下模块通常被激活而并无大用:mod_imap, mod_include, mod_info, mod_userdir, mod_status, mod_cgi, mod_autoindex。

php目录操作函数

mkdir();函数

php创建文件夹和文件
///创建文件夹
function createdir($dir)
{
if(file_exists($dir) && is_dir($dir)){//如果存在这个文件并且这个文件是个目录就不动作
}
else{
   mkdir($dir,0777);//否则就创造这个目录
}
}

file_exists();函数

file_exists -- 检查文件或目录是否存在
<?php
$filename = '/path/to/foo.txt';

if (file_exists($filename)) {
    print "The file $filename exists";
} else {
    print "The file $filename does not exist";
}
?>

is_dir();函数

is_dir();测试文件是否为目录。
为目录就返回true,不就返回false


is_file();

Is_File('目标文件路径和文件名')
为文件返回"True",不为文件返回"False"。


is_link();
文件系统函数库

is_link();测试文件是否为链接文件。
true 值则表示指定的 filename 存在并为符号链接文件.

rmdir 命令
功能:删除空目录
rmdir [选项] dirname
- p 递归删除目录dirname,当子目录删除后其父目录为空时,也一同被删除。如果整个路径被删除或者由于某种原因保留部分路径,则系统在标准输出上显示相应的信息。

要清空并除去目录,请输入:
rm mydir/* mydir/.*
rmdir mydir
该命令除去 mydir 文件中的内容接着除去空目录。rm 命令显示一条关于尝试除去目录 .(点)和.. (点,点)的错误消息,然后 rmdir 命令除去它们。


建立一个文件名字为aa.txt
$fp=fopen('aa.txt',   'w+');   //建立一新文件  
chmod('aa.txt',   0777);   //设定权限,不然的话建立后无法修改,删除   //好象这行不用也可以
fwrite($fp,   '要写入的内容');   //写内容  
fclose($fp);   //关闭文件

unlink()函数
功能:删除文件
unlink($filename)删除文件名为$filename的文件


删除指定目录下的所有文件
function dir_clear($dir) {
    $directory = dir($dir);                //创建一个dir类(Php手册上这么说的),用来读取目录中的每一个文件
    while($entry = $directory->read()) {   //循环每一个文件,并取得文件名$entry
        $filename = $dir.'/'.$entry;       //取得完整的文件名,带路径的
        if(is_file($filename)) {           //如果是文件,则执行删除操作
            @unlink($filename);
        }
    }
    $directory->close();                   //关闭读取目录文件的类
    result();
}
删除指定目录下的所有文件以及所有文件夹以及本身***强烈推荐这种方法!!!
function rmdir_tree($dirname)//定义一个函数rmdir_tree,要删除的文件名为$dirname
{
$handle=opendir($dirname);//打开名为$dirname的文件夹
while ($file=readdir($handle)) //跑回圈读取打开的文件夹
{
    if (($file==".") || ($file=="..")) continue;//继续跑的条件,如果不满足就不跑了
    $fullname=$dirname."/".$file;//完整的文件名(包括路径)
    if (filetype($fullname)=="dir")
      rmdir_tree($fullname);//调用刚刚定义的函数,实现递归
    else
      unlink($fullname);//删除文件
}
closedir($handle);//关闭打开了的文件夹
rmdir($dirname);//删除自身(文件夹)
}