如何通过文件权限禁止特定文件?

时间:2014-04-16 00:10:32

标签: php .htaccess

我有一个sendmessage.php文件和其他发送电子邮件的类似文件。我想禁止直接访问这些文件,让它们可行,但我不知道为什么。

怎么做?

这是我使用它们的方式

            $.ajax({
                type: 'POST',
                url: 'sendmessage-contact.php',
                data: $("#contact").serialize(),
                success: function(data) {
                    if(data == "true") {
                        $("#send").fadeOut("fast", function(){
                            $(this).before("<p><strong style='color:#D60096'></strong></p>");
                            setTimeout("$.fancybox.close()", 3000);
                        });
                    }
                }
            });

1 个答案:

答案 0 :(得分:2)

在你的情况下执行一个简单的deny form all可能不符合你的要求,所以我提出另一个建议:

相反,您应该在页面加载时生成随机散列字符串并将其写入会话:

session_start();
//$_SERVER['HTTP_X_REQUESTED_WITH'] is pretty much pointless, just illustrating redundancy here, may not work for you so remove as desired
if(isset($_POST['hash_key']) && $_SERVER['HTTP_X_REQUESTED_WITH']):
    if(isset($_SESSION['hash_key']) && $_POST['hash_key'] === $_SESSION['hash_key']):
        //call your function to process this
        return myFunction($_POST['contact']);
    else:
        //no session key, deny them
        header('HTTP/1.0 403 Forbidden');
    endif;
elseif(!isset($_POST['hash_key']) && !isset($_SERVER['HTTP_X_REQUESTED_WITH'])):
    //not trying to post, not trying to send ajax, generate a new hash key
    $_SESSION['hash_key'] = md5(uniqid(rand( ), true)); 
endif;

现在,在生成HTML的页面后面,您需要创建一个带有此值的隐藏输入。

<input type="hidden" id="hash_key" name="hash_key" value="<?php echo $_SESSION['hash_key'];?>"/>

现在您可以将此值传递给ajax函数中的服务器:

$.ajax({
    type: 'POST',
    url: 'sendmessage-contact.php',
    data: {
        'contact' : $("#contact").serialize(),
        'hash_key' : $("#hash_key").val()
    },
    success: function(data){
        console.log(data);
    }
});

现在,如果机器人尝试向您的脚本发送垃圾邮件,那么它将无关紧要,因为它们会因为无法匹配我们创建的唯一生成的字符串而遇到403禁用错误我们的$_SESSION['hash_key']

<强>声明

请勿在任何情况下实际使用md5(uniqid(rand( ), true))。为简洁起见,我只提供了这一点,并不是一种完全安全的方法。

修改

过分冗长。简化。