2010-01-23 174 views
2

我期待与PHP函数的fwrite()的一个问题is_writable()返回false

$filename = 'rss.xml'; 

if (file_exists($filename)) { 
    echo "The file $filename exists"; 
} 

if (is_writable($filename)) { 
    $fp = fopen($filename, 'w'); 
    fwrite($fp, $feed); 
    fclose($fp); 
} 
else{ 
    echo '<br />not writable..'; 
    if(!is_readable($filename)){ 
    echo ' and not readable!'; 
    } 
} 

一旦执行该脚本返回:

The file rss.xml exists 
not writable.. 

CHMOD为rss.xml是755和安全模式已关闭。

我在(MT)mediatemple.com上(DV)主办,该脚本工作正常,当我在(GS)解决方案托管。

我找不到什么是错=/

+0

如果删除文件,PHP可以重新创建吗? (当前文件可能由不同的用户拥有,而PHP正在运行。) – 2010-01-23 11:06:53

回答

-1

CHMOD 0755意味着只有文件所有者才能写入(组和其他人可以读取和执行)。您应该将CHMOD更改为0775甚至0777,具体取决于PHP的用户/组。

+8

恕我直言,设置777是一个安全问题。人们应该避免让程序员设置文件权限的托管者777.我是对的吗? – Dan 2010-01-23 12:06:00

+0

必须同意@Dan - 这是一个糟糕的解决方案。 – 2010-01-23 12:28:39

+0

你可以从这个答案中删除绿色复选标记吗?这不是正确的解决方案,人们绝对不应该在他们的生产服务器上这样做。 – pfrenssen 2014-11-20 16:16:12

3

755表示:

  • rwx:读,写,执行业主
  • r-x:读取,执行对组
  • r-x:读取,执行别人的

因此,每个人都可以阅读(并执行)该文件,但只有所有者才能写入该文件。

也许拥有该文件的用户不运行PHP脚本的人吗?即该文件可能属于任何人,而你的脚本是由Apache的用户(通常www-data运行?


第一个想法可能是删除文件,让脚本尝试重新创建它;如果它重新创建正确(这意味着阿帕奇有需要含有它的directoy write权利),它应该能够对其进行修改,在那之后。

否则,您应该尝试将write的权限设置为other - 如果您的脚本由另一个用户运行,而不是该文件的所有者; chmod o+w rss.xml应该做的伎俩。

0

755意味着文件的所有者可以修改它,而不是其他任何人。所有者可能不是网络服务器,但你自己(你的FTP帐户?),所以PHP不能修改它。试着给它更广泛的执行。从775开始,如果这不起作用,请尝试777.

有一些网络主机与您的FTP帐户一样运行网络服务器,因此他们没有获得有关文件权限的支持问题,但在我认为这是一个很大的安全漏洞。我认为Mediatemple做正确的事情,不要将Web服务器作为您的FTP帐户运行。

0

编辑:我忽略了,正如Pascal Martin和其他人指出的那样,755可能意味着该文件合法不可写,并且您可能必须777或更改所有者。我将这个答案留在原地,以防万一设置正确,并且is_writable()仍然返回false,这正是我所假设的。

奇数。有关于is_writable User Contributed Notes的简短讨论。对于在那里发布的人,切换到PHP 5解决了它(虽然我怀疑这是一个服务器/ PHP /哪个进程作为哪个用户问题运行)。

你可以尝试什么:

  • 找出用户PHP运行与使用posix_getuid()
  • 更改您要写信给到精确的用户文件的拥有者(不仅仅是组)
  • 如果它有效,那么它可能真的是一些小故障,你可能不得不考虑尝试一个fopen()并且如果它失败的话就截获错误信息。

当然:是否该文件实际上fwrite()能够绕过检查?

0

在不同hostings PHP运行和访问文件或者作为

OWNER

集团

世界

第一种变体最适合你安全。

它的话,你应该设置文件的权限644,在最后一种情况 - 666

为什么要设置777,如果你只存储数据就在那里可执行文件?

0

制作一个文件夹,用于保存带有0777权限的文件,然后将文件放在低权限级别0644中。因此,每个机构都可以访问该文件夹,但并非每个人都可以更改文件(0644) =我找到了最好的解决方案。 其他较不安全的解决方法是不要制作文件夹,只是将您的文件权限更改为666或者某些人更喜欢777 =不是一个好的安全解决方案