修改.htaccess以拒绝访问文件夹,但只允许使用ajax从我的网站访问特定文件


Modify .htaccess to deny access into folder, but allow access only from my site using ajax to specific files

在我的网站"www.website.com"中,我有一个文件夹被禁止使用此.htaccess:访问

RewriteEngine On
RewriteBase /
RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}' /([^/]+)/.*' HTTP [NC]
RewriteRule .* - [F,L]

现在,我只想使用Ajax(POST)从我的网站"www.website.com"访问特定的PHP文件。我修改了.htaccess,如下所示:

RewriteEngine On
RewriteBase /
RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}' /([^/]+)/.*' HTTP [NC]
RewriteCond %{HTTP_REFERER} !^$
RewriteCond %{HTTP_REFERER} !^http(s)?://.*website.com [NC]
RewriteRule '.(php)$ - [NC,F,L]

但是有了这段代码,我可以访问所有的php文件。我只需要在*Add.php*Edit.php中访问。这些文件在几个子文件夹中。我该怎么办?这样做对吗?

经过大量的搜索、阅读和测试,我得出结论,确保使用Ajax的网站安全的最佳方法是:

1-只有一个(如果可能的话)文件,如router.php,将根据POST/GET导航变量"路由",使用包含到子文件夹中的文件。

2-除了SESSION-based authentication,您还可以实现Basic HTTP authentication和/或HTTPS (SSL),以在登录时保护用户凭据。如果您不使用HTTPs,则应该使用字段或表单加密,因为在"wire"中,所有内容都是纯文本。我发现这很有用http://www.itsyndicate.ca/jquery/

3-在每次POST中,将Token-based Authentication与根据用户凭据创建的令牌一起使用,发送请求,然后重新计算和比较。

4-我尝试过很多组合,在文档ROOT中只使用一个.htaccess,但总是缺少一些东西,或者配置不正确,或者没有按我预期的那样工作。因此,我发现在每个子文件夹中使用一个.htaccess比在根文件夹中使用更简单。在子文件夹中,这取决于它们包含的内容。htaccess应该是这样的:

### No Direct Access to All files ###
<IfModule mod_authz_host.c>
    Order Deny,Allow
    Deny from all
#   Allow from 127.0.0.1
</IfModule>
### One of the alternative ways with mod_rewrite ###
<IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteBase /
    RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}' /([^/]+)/.*' HTTP [NC]
    RewriteRule .* - [F,L]
</IfModule>
### permit ONLY filetypes in a pattern ###
<IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteBase /
    RewriteCond %{REQUEST_FILENAME} ^(.+)'.(css|js|gif|png|jpe?g|woff)$
    RewriteRule .? - [S=1]
    RewriteRule ^(.+)$ - [F,L,NC]
</IfModule>

我更喜欢THE_REQUEST,因为它不包括浏览器发送的任何附加标头。与大多数其他变量不同,这个值没有被取消转义(解码),它没有欺骗的意义。我使用跳过[S=1],因为我更喜欢告诉"如果是这样,那么这个规则无效",所以在任何其他情况下,"拒绝"它的规则都是有效的。

5-为了获得额外的安全性,您可以在php文件中使用代码,实现本文中描述的方法之一:阻止直接访问php包含文件

6-此外,如果你是这里描述的禁止图片Hotlinking(而且不仅仅是),请注意裁判可能会被欺骗!!