【问题标题】:PHP - /tmp permission errorPHP - /tmp 权限错误
【发布时间】:2013-12-11 20:40:35
【问题描述】:

基本上,我有一个.htaccess 文件,其中php_value session.auto_start 设置为1。 所以我的会话将从任何文件开始。

但是,现在我的/functions 文件夹中有一个脚本,但是它给出了关于/tmp 权限的错误,导致"Failed to write session data"虽然它不使用 , 开始会话或对会话执行任何操作。

但这会产生一个错误,对我来说,它似乎找不到我确实拥有的 /tmp 文件夹。直接在我的根文件夹 (/) 中的文件没有这个问题。
我也试过将/tmp的权限设置为777,没有用。

提前致谢


我遇到的错误

Warning: Unknown: open(/tmp/sess_cfed7db100fd58b62eaca2a519ebaf7a, O_RDWR) failed: Permission denied (13) in Unknown on line 0

Warning: Unknown: Failed to write session data (files). Please verify that the current setting of session.save_path is correct (/tmp) in Unknown on line 0

脚本本身:

<?php
define ('INCLUDE_CHECK',true);
require('connect.php'); //This file doesn't use any sessions as well

if(isset($_POST['signupemail'])){
    $email = mysqli_real_escape_string($link, $_POST['signupemail']);
    $thearray = mysqli_fetch_array(mysqli_query($link, "SELECT COUNT(*) FROM `users` WHERE email=\"".$email."\""));

    if($thearray[0] > 0){
        echo '"This emailaddress is already in use"';
        exit;
    }
    echo "true";


} else if(isset($_POST['uname'])){

    if(!preg_match('/^[a-zA-Z0-9_-]{3,16}$/ ',$_POST['uname'])){
        echo '"<small>Please only use alphanumeric characters, underscores and hyphens</small>"';
        exit;
    }

    $uname = mysqli_real_escape_string($link, $_POST['uname']);
    $thearray = mysqli_fetch_array(mysqli_query($link, "SELECT COUNT(*) FROM `users` WHERE uname=\"".$uname."\"")); 
    $forbiddennames = array(1 => 'super-user','superuser', 'root', 'admin', 'administrator', 'system', 'website', 'site', 'owner', 'manager', 'founder','moderator');    

    if(in_array(strtolower($_POST['uname']), $forbiddennames)) {
        echo '"'.$_POST['uname'].' is a forbidden username"';
        exit;
    } 
    if($thearray[0] > 0){
        echo '"This username is already in use, please choose another"';
        exit;
    } 


    echo "true";

}
?>

当我手动浏览到我的脚本时出现错误,因此没有设置任何$_POST 参数。我使用这个脚本来验证一个人的电子邮件和/或密码,当检查时,它停止了,不知道如何处理结果(由AJAX 获取)。

【问题讨论】:

    标签: php .htaccess session tmp


    【解决方案1】:

    我想我记得一些 php.ini 设置阻止访问不在网络服务器目录树中的文件。不过,我不知道这是否适用于 php 内部生成的文件。

    如果您在 Red Hat Enterprise linux 或 CentOs 或 Scientific Linux 等衍生产品上运行,则 selinux 也可能存在问题。如果您将 selinux 设置为 permissive (sudo setenforce Permissive),请检查问题是否消失。如果这“解决”了问题,请三思而后行让 selinux 处于 Permissive 模式,尤其是如果您的服务器可以从 Internet 访问,那么最好了解 selinux 和重新标记。

    【讨论】:

    • open_basedir 是指令。不过,描述说“脚本可能无法在外部打开文件”,这让我认为它可能不适用于在“内部”php 生成的会话文件。
    • open_basedir 通常伴随着open_basedir restriction in effect 消息。
    • 谢谢,但我在一个相对受限的主机上。我无法访问 php.ini(但我可以使用 php_values),或者打开 SSH。脚本在/functions 中,在我的目录树中,对吧?它只是不在我的根文件夹/ 中。正如@user555 所说,我不确定这是否是问题所在,但无论如何谢谢:)
    • 您在 /functions 中的脚本可能在您的目录树中,但 /tmp 不是 .. 如果它真的是 /functions,而不是 /home/yourname/functions,那么您的 php 文件似乎可以在其中运行无法访问 /tmp 的 chroot 环境。
    • @Isaiah 您可以使用phpinfo() 找出open_basedir 的设置
    【解决方案2】:

    嗯,原来是浏览器相关的。 当我在 FireFox 中测试它时,没有问题。 在谷歌浏览器中,大问题。

    我不知道它是什么,但是在从我的站点中删除缓存、cookie 和所有内容后,它运行良好。似乎它正在搜索旧会话。

    【讨论】:

    • 这可能是预先存在的会话的问题,PHP 试图“恢复”。如果您之前使用 Chrome 进行过测试并进行过会话,Firefox 将为您提供一个新会话。 Chrome“隐身”窗口可能也可以正常工作。也许您更改了 PHP 文件处理程序之类的东西,而 PHP 无法访问它之前创建的内容。
    • @PeerBr,是的,它可能是。
    猜你喜欢
    • 1970-01-01
    • 2012-01-04
    • 2014-04-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-11
    • 1970-01-01
    相关资源
    最近更新 更多