php PDO连接从命令行工作,但不能通过Apache?

brtdzjyr  于 2023-01-12  发布在  PHP
关注(0)|答案(4)|浏览(126)

我有一个非常简单的测试脚本:

<?php

$DSN = "mysql:host=db.example.edu;port=3306;dbname=search_data";

try {
    $DB = new PDO($DSN, "username", "super-secret-password!");
} catch (PDOException $e) {
    header('Content-Type: text/plain');
    print "Could not connect to database, rawr. :-(";
    exit;
}

$SQL = "SELECT phrase FROM search ORDER BY RAND() LIMIT 10";

foreach ($DB->query($SQL) as $row) {
    print $row['phrase']."\n";
}

?>

当我从命令行执行这个脚本时,它工作得很完美:

$ php test.php
corporal punishment
Stretches
voluntary agencies and the resettlement of refugees
music and learning
Nike Tiger Woods Scandal
Hermeneia
PSYCHINFO
anthony bourdain
Black-White Couples and their Social Worlds
colonization, hodge

但当我通过Web浏览器访问完全相同的脚本时,它会说:

Could not connect to database, rawr. :-(

我已经尝试了var_dump的错误,和消息是:“SQLSTATE[HY 000] [2003]无法连接到”www.example.com“上的MySQL服务器db.example.edu(13)"。
这是令人费解的,这是在完全相同的服务器上的完全相同的脚本--为什么当我从命令行执行它时,它工作,而当Apache执行它时,它失败?

34gzjxbg

34gzjxbg1#

如果这是运行SELinux的Red Hat派生发行版(RHEL、CentOS、Fedora、ScientificLinux)(或使用SELinux的任何非Red Hat派生发行版),编写本文时的默认策略设置是禁止Apache与其他服务器或数据库建立外部连接。作为root用户,必须启用以下两个SELinux布尔值。使用-P选项可在重新引导后保留更改。

setsebool -P httpd_can_network_connect=1
setsebool -P httpd_can_network_connect_db=1

请注意,httpd_can_network_connect可能不是必需的。请先尝试仅打开httpd_can_network_connect_db

wlzqhblo

wlzqhblo2#

问题相同,但原因不同
我的解决方案只是简单的apt-get install php-mysql
请务必检查phpinfo()中的pdo_mysql
找到它在这个职位:PDOException“找不到驱动程序”
我想知道为什么CLI在这样的条件下工作O_O可能是安装不正确,或者被覆盖了?好了,现在,它工作得很好!

b4qexyjb

b4qexyjb3#

我在PHP ftp ftp_connect中遇到了同样的问题,必须设置

setsebool -P httpd_can_network_connect=1

这是令人困惑的,因为像fil_get_contents和curl这样的其他东西在设置之前可以通过PHP和apache正常工作。

oug3syen

oug3syen4#

此外,使用上述公认答案

setsebool -P httpd_can_network_connect=1
setsebool -P httpd_can_network_connect_db=1

我还必须更改httpd试图访问的文件的安全上下文。
通过apache运行的php脚本试图访问httpd的普通文档根目录之外的证书文件.更改文件权限以允许httpd访问不足以允许httpd访问该文件.我还必须更改安全上下文,所以在更改之前:

[admin]$ ls -Z ../../certs/rds-ca-2015-root-us-east-1-BUNDLE.pem 
-rw-r--r--. admin apache unconfined_u:object_r:unlabeled_t:s0 ../../certs/rds-ca-2015-root-us-east-1-BUNDLE.pem

更改上下文使用:

sudo chcon -v --type=httpd_sys_content_t ../../certs/rds-ca-2015-root-us-east-1-BUNDLE.pem```

以获得:

[admin]$ ls -Z ../../certs/rds-ca-2015-root-us-east-1-BUNDLE.pem 
-rw-r--r--. admin apache unconfined_u:object_r:httpd_sys_content_t:s0 ../../certs/rds-ca-2015-root-us-east-1-BUNDLE.pem

现在一切都很好。一个很好的资源是/var/log/audit/audit.log,并密切关注错误。在我的例子中,指向解决方案方向的错误是:

type=AVC msg=audit(1509047616.042:4049): avc:  denied  { read } for  pid=17096 comm="httpd" name="rds-ca-2015-root-us-east-1-BUNDLE.pem" dev="xvdb" ino=262146 scontext=system_u:system_r:httpd_t:s0 tcontext=unconfined_u:object_r:unlabeled_t:s0 tclass=file

相关问题