【问题标题】:PHP socket_connect() Permission DeniedPHP socket_connect() 权限被拒绝
【发布时间】:2013-08-07 22:46:50
【问题描述】:

好的,所以我运行了一个不错的 php 服务器,它使用我编写的这个小函数打开了一个 AF_UNIX 套接字。像这样被调用

$IPC_connector = socket_create_IPC('/tmp/connection');


function socket_create_IPC($FILE)
{
    #Create a AF_UNIX socket
    if(!($socket = socket_create(AF_UNIX, SOCK_STREAM, 0)))
    {
        $errorcode = socket_last_error();
        $errormsg = socket_strerror($errorcode);

        die("Couldn't create socket: [$errorcode] $errormsg \n");
    }

    #Bind
    if( !socket_bind($socket, $FILE) )
    {
        $errorcode = socket_last_error();
        $errormsg = socket_strerror($errorcode);

        die("Could not bind socket : [$errorcode] $errormsg \n");
    }

    if(socket_listen($socket) === false) 
    {
        die("socket_listen() failed: reason: " . socket_strerror(socket_last_error($socket)) . "\n");
    }

    socket_set_nonblock($socket);

    return $socket;
}

然后我写了一个这样连接到这个服务器的客户端

if(!($IPC = socket_create(AF_UNIX, SOCK_STREAM, 0)))
{
    $errorcode = socket_last_error();
    $errormsg = socket_strerror($errorcode);

    die("Error:Couldn't create socket - [$errorcode] $errormsg \n");
}
echo "socket_create(): ".socket_strerror(socket_last_error($IPC))."\n";

if(!(socket_connect($IPC, '/tmp/connection')))
    echo "socket_connect() failed, reason: ".socket_strerror(socket_last_error($IPC))."\n";

客户端实际上是从一个网页的 AJAX 请求中调用的,它应该连接到服务器,获取一些数据,然后将该数据返回给网页。 ajax 请求是用 javascript 发出的。 我已经在没有 AJAX 请求的情况下测试了客户端/服务器连接并且它可以工作,但是一旦我通过网页尝试使用 AJAX 连接,客户端就会返回“socket_connect() failed, reason: Permission denied”来自脚本中的 echo 语句。也许我缺少一些小疏忽?我假设 Ajax 是通过 httpd (apache) 调用的。我确定这可能是某种类型的文件权限问题,但我无法弄清楚究竟是什么原因造成的。

到目前为止我尝试过的事情

确保 php.ini 中的 safe_mode 已关闭, 尝试“setsebool -P httpd_can_network_connect on”来阻止 SElinux, 还尝试了“setenforce 0”,这也没有什么区别。 我尝试将 /tmp 和所有子目录的文件权限更改为 777 无济于事。 我的想法不多了,我想也许有人以前见过这个问题, 我还查看了这个,这是我的服务器正在创建的文件 ->

[root@ip-000-000-000-000 tmp]# ls -lZa connection
srwxr-xr-x. root root unconfined_u:object_r:user_tmp_t:s0 connection

如果有人对 AJAX 调用感兴趣,我会使用这个

function communication (IP, MechanismID, CommandName) {
    $.post('php/connectDisconnect.php', {
        IP : IP,
        MechanismID : MechanismID,
        CommandName : CommandName
        }, 
        function(data) {
            if(data.search("Error") != -1)
                alert(data);
    });
}

其中 connectDisconnect.php 是上面的客户端。

【问题讨论】:

  • 暂时没有时间看完整的Q,但首先想到的是同源限制。 (如果我离开了,我稍后会删除它。)
  • @TecBrat --我查看了“同源政策”,但我不太确定它是否适用于此,我可能非常错误,但似乎该政策是为了获取数据从网络上的其他地方。我的问题是连接在同一台服务器上运行的两个 php 脚本? -- 输入这个让我得到了答案,所以我非常感谢你。
  • 就像我说的那样,我之前很匆忙,并没有阅读整个问题,但我很高兴它给你带来了一个很好的答案。

标签: php ajax sockets ipc selinux


【解决方案1】:

事实证明,ajax 调用是以 apache 用户身份运行的,并且从我的服务器为套接字创建的文件归 root 所有。我通过将这几行代码添加到我调用 socket_create() 的服务器来解决此问题。

#Deletes the old pipe in case the server crashed last time it closed and didn't use socket_close()
$command = "rm -f /tmp/connection";
exec($command);

#Creates the data pipe for the webpage to connect to
$IPC_connector = socket_create_IPC('/tmp/connection');

#Makes it to where the webpage can actually talk to the server
$command = "chown apache:apache /tmp/connection";
exec($command);

这对我来说已经足够好,我想这不是解决这个问题的正确方法。如果有人有更好的建议或更好的做法,你会推荐我想听听。

【讨论】:

  • 作为查看此内容的其他人的说明,只要为 SELinux 设置了 setenforce 0,这解决了问题,我仍在尝试解决拒绝我对此权限的 SELinux 问题。
  • 我通过wiki.centos.org/HowTos/SELinux 修复了他们列表中的数字 7。它使用 audit2allow ^_^
猜你喜欢
  • 2023-03-23
  • 2012-07-27
  • 2018-03-19
  • 2015-07-15
  • 2020-09-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多