2009-11-21 19 views
0

J'ai un fichier appelé generator.php qui utilise fwrite() pour créer un result.php sur le serveur (Apache, PHP4). L'une des lignes result.php est une instruction PHP include().PHP4 problèmes avec include() dans un fichier créé par fwrite()

Ainsi, generator.php:

if (!is_file($fname)){ 
    $resultfile = fopen($current_path . "/" . $fname, "w+"); 
} 
fwrite($resultfile, '<?php include($_SERVER["DOCUMENT_ROOT"] . "'. '/inc/footer.php"); ?>' . "\n"); 
fclose($resultfile); 
chmod($current_path . "/" . $fname, 0755); 

Et result.php:

<h2>Sponsored Links</h2> 
<!-- begin sidebar_top ad --> 
<?php echo $_SERVER['DOCUMENT_ROOT'] . "/ads/sidebar_top.php" . "<hr />"; 
    include($_SERVER['DOCUMENT_ROOT'] . "/ads/sidebar_top.php"); ?> 
<!-- end sidebar_top ad --> 

Mais cette déclaration include() ne fonctionne pas lorsque je visite result.php dans un navigateur. La déclaration d'écho fait, donc je sais que le chemin est correct.

Un autre test.php avec le même code, que j'ai téléchargé en utilisant FTP dans le même dossier, fonctionne bien.

Le code dans le même dans les deux fichiers, lorsqu'il est récupéré via FTP.

En test.php: (travaux, échos et comprend correctement.)

<?php 
echo $_SERVER['DOCUMENT_ROOT'] . "/ads/sidebar_top.php" . "<hr />"; 
include($_SERVER['DOCUMENT_ROOT'] . "/ads/sidebar_top.php"); 
?> 

Toute idée pourquoi le include() travaille dans test.php (créé manuellement) et non dans result.php (créé à l'aide fwrite()), lorsque les deux sont en le même dossier?

Les seules différences que je connais entre les fichiers:

  1. propriétaire pourrait être différent (ne serait pas result.php être créé par l'utilisateur nobody?)
  2. Les autorisations sont à l'origine différentes. FTP'd fichier (de travail) est 0775, tandis que ceux créés en utilisant fwrite() (include ne fonctionne pas) avait 664, et est chmodé par le generator.php à 0775.
  3. Le fichier de travail test.php a été édité sur un Mac avec Smultron et téléchargé via FTP, alors que le result.php a été créé par fwrite() sous Linux, appelé depuis un navigateur.
+0

Avez-vous essayé de télécharger result.php avec un navigateur FTP et de vérifier manuellement qu'ils sont identiques? En outre, obtenez-vous des erreurs lorsque vous visitez result.php (soit sur la page ou dans le journal)? –

+0

J'ai effectivement coupé 2 lignes du code du résultat.php (en passant par FTP) et créé test.php .. Aussi, si je remplace 'include' par 'require' alors il s'arrête juste à cette phrase. – Pranab

+0

Le fichier est-il fermé avant d'être exécuté? Aussi, pouvons-nous voir les deux fichiers générés? – wallyk

Répondre

0

Lorsque PHP4 mode sans échec est activé, le result.php, étant écrit par un autre uid, ne peut pas accéder au fichier inclus, qui appartient à un autre uid .

Restriction SAFE MODE en vigueur. Le script dont uid est 48 n'a pas le droit d'accéder à /var/www/vhosts/example.com/httpdocs/ads/sidebar_top.php appartenant à uid 10010 dans/var/www/v hosts/example.com/httpdocs/résultats/résultat.php sur la ligne 130

Je résolu en ouvrant php.ini et changeant safe_mode_gid = On, et en ajoutant mon includes à safe_mode_include_dir. J'ai également dû redémarrer Apache pour laisser les changements prendre effet.

0
fwrite($resultfile, '<?php include($_SERVER["DOCUMENT_ROOT"] . "/inc/footer.php"); ?>' . "\n"); 

vous avez eu un supplément "là je pense que

+0

C'est une concaténation superflue, mais je pense que ce n'est pas pertinent pour le problème. – Pranab