我正在一个传单地图网站上工作,可以访问实时天气数据。为了避免不得不使用SUID,因为它的安全问题,我使用了从/var/www到我的图像数据的符号链接。这些都是简单的png文件,这是有效的。
然后我想要基于鼠标位置的实时数据悬停在图像数据上。为此,我创建了一个具有实际值的SQLite3数据库。起初,作为测试,我手动将这个数据库放在站点根目录中,一切都很顺利。不幸的是,我无法在那个位置拥有那个数据库。然后,我用这个数据库做了与我的图像数据(有效)完全相同的程序。
过程是:
在我的站点根:
ln -sf /path/to/db/ db
chmod 777 /path/to/db/data.db
然后,一个简单的PHP程序读取该文件以进行查询:
<?php
$lat = floatval($_GET['lat']);
$lon = floatval($_GET['lon']);
$db = new SQLite3('db/sst.db'); # line 6
$results = $db->query("SELECT sst FROM current ORDER BY (($lat-lat)*($lat-lat) + ($lon-lon)*($lon-lon)) ASC LIMIT 1");
while ($row = $results->fetchArray()) {
echo $row['sst'];
}
?>
不幸的是,现在我在浏览器控制台中收到了这个错误:
Failed to load resource: the server responded with a status of 500 (Internal Server Error)
检查/var/log/apache2/error.log文件时,我得到以下错误:
PHP Fatal error: Uncaught exception 'Exception' with message 'Unable to open database:
unable to open database file' in /var/www/Mapea/sst.php:6'nStack trace:'n#0
/var/www/Mapea/sst.php(6): SQLite3->__construct('db/sst.db')'n#1 {main}'n thrown in
/var/www/Mapea/sst.php on line 6
CL询问我对/path
、/path/to
和/path/to/db
的权限后,我发现/path
权限不正确。
使用以下命令后:
chmod 755 /path
我的应用程序现在100%正常工作。
除了对文件的完整路径拥有明显的权限外,SELinux可能是一个额外的问题。
如果在仔细检查文件权限后仍然存在权限问题,这很可能是罪魁祸首。例如,在RHEL 8上,默认的安全策略不允许Apache访问NFS卷上的文件,您需要传递命令
setsebool -P httpd_use_nfs 1
以(永久使用-p)对其进行授权。