对htaccess的认识只停留在文件上传黑名单的绕过,还是得好好学习一下。
htaccess简介
概念
.htaccess
文件(或者”分布式配置文件”)提供了针对目录改变配置的方法, 即,在一个特定的文档目录中放置一个包含一个或多个指令的文件, 以作用于此目录及其所有子目录。作为用户,所能使用的命令受到限制。管理员可以通过 Apache
的 AllowOverride
指令来设置。
概述来说,htaccess
文件是Apache服务器中的一个配置文件,它负责相关目录下的网页配置。通过htaccess文件,可以帮我们实现:网页301重定向、自定义404错误页面、改变文件扩展名、允许/阻止特定的用户或者目录的访问、禁止目录列表、配置默认文档等功能。
作用范围
.htaccess
文件中的配置指令作用于 .htaccess
文件所在的目录及其所有子目录,但是很重要的、需要注意的是,其上级目录也可能会有 .htaccess
文件,而指令是按查找顺序依次生效的,所以一个特定目录下的 .htaccess
文件中的指令可能会覆盖其上级目录中的 .htaccess
文件中的指令,即子目录中的指令会覆盖父目录或者主配置文件中的指令。
配置
通常情况下,Apache是默认启用 .htaccess
的,但是为了以防万一,请检查一下自己站点的配置文件,如 httpd.conf
,是否有这行:
1 |
AllowOverride All |
这行允许重写配置文件。也就是如果能够从 .htaccess
加载配置文件,那么就以 .htaccess
为配置文件对其所在目录进行配置。
功能
.htaccess简介
通过功能,顺便认识一下语法
htaccess访问控制(Allow/Deny)
Order命令
为了限制用户访问一些关键目录,.htaccess可以提供目录访问限制。你只需要在要限制的目录中,加入如下.htaccess文件:
1 |
deny from all |
这会限制所有用户通过浏览器访问该目录,允许指定IP地址的访问:
1 |
Order Allow,Deny |
Order命令是一个难点,也是配置apache的基础,它决定了Apache处理访问规则的顺序。
- 通过Allow,Deny参数,Apache首先找到并应用Allow命令,然后应用Deny命令,以阻止所有访问。
- 通过Deny,Allow参数,Apache首先找到并应用Deny命令,然后应用Allow命令,以允许所有访问。
然后我在本地尝试发现如下配置,也限制了192.168.0.0/16网段主机的访问,去掉 Deny from All 则可以访问
1 |
Order Allow,Deny |
过滤域名或网络主机(Allow/Deny)
下例可以限制所有含有“domain.com”的网络主机访问网站:
1 |
Order Allow,Deny |
禁止访问指定文件(Files)
Files命令可以用于过滤指定文件:
1 |
<Files test.php> |
禁止访问指定文件类型(FilesMatch)
下面的代码将限制访问所有.log和.exe文件:
1 |
<FilesMatch ".(log|exe)$"> |
我们还可以通过Files命令描述文件类型,但是需要在命令后面加一个波浪线(~),该符号启用Files命令的正则表达解析功能:
1 |
<Files ~ "^.*\.([Ll][Oo][Gg])|([eE][xX][eE])"> |
有以下几点需要注意:
- Files之后的波浪线用于开启“正则表达式”分析。请注意,这是个过时的用法,Apache更推荐使用
<FilesMatch>
指令 - 正则表达式必须在双引号之间,有关htaccess的正则表达式用法,请查阅本站《.htaccess正则表达式》一文。
- 双引号中的“管道符”(|)用于将两种文件类型(.log和.exe)分开,相当于逻辑“或”
- Order命令必须嵌在Files节(Section)中,否则将会应用到所有文件
- Satisfy All表示必须同时满足主机级别(Allow/Denay)和用户级别(Require)的限制,All是默认值,该行可以省略。
高级访问控制(Rewrite)
还可以通过运用Rewrite实现更强大的访问控制
详情可看:http://lesca.me/archives/htaccess-rewrite.html
开启mod_rewrite
1 |
sudo a2enmod rewrite |
需要注意点:
- FollowSymlinks必须启用,这是rewrite引擎的安全需求。
- 通常FollowSymlinks在Apache的主配置文件中就已经启用了,所以通常可以省略。
- RewriteEngine命令用于启用rewrite引擎
- IfModule命令用于判断Apache是否安装了mod_rewrite模块,之后笔者会省略该命令,但不代表这是个好习惯
- mod_rewrite会处理所有提交给Apache的URL请求,并与之后的规则进行匹配
密码保护与验证
配置.htaccess
1 |
AuthType Basic |
这个配置文件可以保护.htaccess所在的整个目录,简单说明下参数:
- AuthType:验证类型为基本类型,密码以明文方式传输到服务器上
- AuthName:验证提示,会出现在验证对话框中
- AuthUserFile:验证配置文件,用于匹配用户名与密码,该密码是加密保存的
- require valid-user:只有在AuthUserFile中出现的用户才可以通过验证
生成htpasses文件
如何生成passwd文件呢?我们通过htpasswd命令生成密码文件:
1
htpasswd -c /var/www/passwd
它会提示你输入密码,并确认。之后将密码文件passwd保存在/var/www/目录下
对文件进行密码保护
保护与.htaccess在同一目录下的文件secure.php:
1 |
# password-protect single file |
保护.htaccess所在目录下的多个文件:
1 |
# password-protect multiple files |
对指定IP进行密码保护
仅允许IP地址为192.168.10.5的主机直接访问该目录,其他IP需要验证。
1 |
AuthType Basic |
目录浏览与主页
启用目录浏览
1 |
Options All +Indexes |
禁用目录浏览
1 |
Options All -Indexes |
我们还可以通过IndexIgnore指令来禁用目录浏览。
1 |
IndexIgnore * |
通过IndexIgnore指令,我们可以禁止对指定类型的文件浏览:
1 |
IndexIgnore *.wmv *.mp4 *.avi *.etc |
自定义目录浏览
如果你希望Apache在展示你的WEB目录时看起来与众不同,那么你需要启用FancyIndexing选项:
1 |
<IfModule mod_autoindex.c> |
通过这个选项,你可以实现自定义图标、添加文件类型描述、按日期排序等。
配置目录主页文件
即使启用了目录浏览,Apache未必会展示该目录的内容,因为该目录可能存在像index.htm这样的默认主页文件。Apache会有限展示主页文件,我们可以通过.htaccess设置:
1 |
DirectoryIndex index.html index.php index.htm |
配置错误页面
如果Apache遇到错误,就会输出错误页面。配置自定义的错误页面,也许可以挽留即将离开的用户。
1 |
# custom error documents |
重定向
old_dir 重新定向到 new_dir, 也可以定向到其他 WEB 站点目录
1 |
Redirect /old_dir/ http://www.yourdomain.com/new_dir/index.html |
参考文章:
深究.htaccess的原理,和用户利用其恶意篡改服务器配值导致的深层安全问题
借github上韩国师傅的一个源码实例再次理解.htaccess的功效
PHP htaccess injection cheat sheet
.htaccess简介
.htaccess 详解
Apache .htaccess Guide, Tutorials and Articles
.htaccess利用与Bypass方式总结
Apache中.htaccess文件利用的总结与新思路拓展
FROM :blog.cfyqy.com | Author:cfyqy
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论