如何防止脚本在目录中运行?

Posted

技术标签:

【中文标题】如何防止脚本在目录中运行?【英文标题】:How can I prevent scripts from running inside a directory? 【发布时间】:2012-06-25 12:45:50 【问题描述】:

我的网络根文件夹中有一个用于存储图像的文件目录,我想知道如何保护该文件夹。我阻止人们将脚本上传到该文件夹​​,我检查文件扩展名,如果它不是图像则不会保存到该文件夹​​。

但是伪造扩展很容易,如果有人设法将脚本上传到我的文件目录并从浏览器访问它会发生什么

所以我需要一种方法来防止脚本在该文件夹中运行并且只允许图像运行。

我知道 htaccess 可以做到这一点,但我不知道如何设置它。我的 .htaccess 文件是这样的:

AddHandler cgi-script .php .pl .py .jsp .asp .htm .shtml .sh .cgi
Options -ExecCGI
ForceType application/octet-stream
<FilesMatch "(?i)\.(gif|jpe?g|png)$">
  ForceType none
</FilesMatch>
Options All -Indexes

但它不起作用,我在该文件夹中保存了一个 php 文件,然后尝试从浏览器访问它,我仍然可以访问它。你知道怎么做吗?或者如果您对此有更安全的方法,请告诉我。

谢谢

【问题讨论】:

【参考方案1】:

我认为它不起作用,因为您只添加一个额外的处理程序,您还没有删除其他处理程序。

将另一个 .htaccess 文件放在要保护的文件夹中(而不是弄乱 match 指令)是最简单的方法,其中包含:

# Fix PHP, you should do matching commands for JSP and ASP, & html
RemoveType application/x-httpd-php php
# .... add the other remove-handler statements here .... #

# Optionally make these equivalent to text files.
# UPDATE: Taken this out as you dont want people to see PHP files at all
#AddType text/html php

# To disable cgi and server side includes & indexes
# You need to check the setup of Apache, some of the file types
# listed should already be handled as CGI (.pl, .py, .sh)
Options -ExecCGI -Includes -Indexes

# Completely block access to PHP files
<FilesMatch "\.(php|phps|html|htm|jsp|asp)$">
    Order allow,deny
    Deny from all
</Files>
# Add in any additional types to block

这涵盖了 PHP 和 CGI​​,你应该为 JSP 和 ASP 做匹配的命令

更新:添加代码以完全阻止对 PHP 文件的访问 - 抱歉,最初认为您只是不希望它们执行。另请注意,我已经注释掉了将 PHP 文件转换为文本文件的行。

【讨论】:

如果您希望将所有配置放在一个文件中,则不需要巧妙的匹配指令,只需将上面的配置指令放在引用您希望的目录的 块中配置 正确@Cheekysoft。我通常更喜欢将 .htaccess 文件放在它们所属的文件夹中,因为这意味着即使移动它们仍然可以工作。当然更好的是根本不使用它们,而是将它们放在适当的 Apache 配置文件中,如果您可以访问它们。 我尝试在 files 目录中的 .htaccess 文件中使用您的代码,但我仍然可以访问 .php 文件。 已更新以完全阻止通过扩展名访问一系列文件类型。只需将正则表达式调整为套件。

以上是关于如何防止脚本在目录中运行?的主要内容,如果未能解决你的问题,请参考以下文章

Chrome - 防止脚本在页面中运行

如何防止 cron 作业执行(如果它已经在运行)

防止 Apache/PHP 运行影响另一个 vHost 的代码

flock防止crontab脚本周期内未执行完重复执行(转)

防止多次执行 Lua 脚本

脚本完成时如何防止关闭 out-gridview