2010-12-07 9 views
2

Donc c'est assez étrange expérience que j'ai eu au cours de la dernière heure.
Dire que j'ai une source de données qui est contrôlée par une sélection
$fileName = "../data/".$_POST["file"];
$fh = fopen($fileName);


Il y a un fichier nommé « USA » dans le dossier de données. Lorsque l'option de sélection démarre, jQuery l'envoie à un fichier PHP qui ouvrira le fichier approprié et récupérera le contenu correct du fichier et les placera dans une instruction select différente. Cela ne fonctionne pas (Échec d'ouvrir l'erreur de flux se produit) Mais ce n'est pas la partie étrange. La partie est bizarre si j'utilise un nom absolu plutôt que la poste, comme ...

$fileName = "../data/USA";
$fh = fopen($fileName);


J'ai aussi vérifié que $ _POST [ "file"] était enfait "USA"

+2

Veuillez vérifier que $ _POST ["file"] a l'une des valeurs que vous avez l'intention d'autoriser, et arrêtez le script si ce n'est pas le cas. Le simple fait de le coller dans un répertoire et d'utiliser des fonctions de fichier entraîne une vulnérabilité de sécurité. Imaginez que quelqu'un puisse vous envoyer quelque chose comme ../../system_file_youd_rather_not_make_public comme $ _POST ["file"] value –

+0

déjà fait. Quelle est la partie déroutante! – Michael

+0

Avez-vous essayé var_dump ($ _ POST ["file"]); et ... ce fichier devrait avoir une extension ...? –

Répondre

2
$file = trim($_POST["file"]); 
$fileName = "../data/".$file; 
$fh = fopen($fileName, "r"); 
+0

Oh oui, je fais ça aussi. Je n'ai pas copié et collé mon code, je l'ai simplement tapé sur une version grossière. – Michael

+0

Mis à jour, votre $ _POST ["file"] semble avoir des données supplémentaires. Trim devrait enlever les espaces autour d'elle. Vérifiez également ce qui est exactement dans $ _POST ["fichier"] en utilisant var_dump() – tHeSiD

+0

En outre, postez votre contrôle html qui transmet les données au fichier php. Nous pouvons mieux comprendre quand nous voyons la source. ;) – tHeSiD

0

Les <select> doit avoir un nom:

<select name="file"> 
     <option value="1">1</option> 
     <option value="2">2</option> 
     <option value="3">3</option> 
     <option value="4">4</option> 
     <option value="5">5</option> 
    </select> 

Je ne vois pas dans votre exemple. $_POST['file'] obtiendra la valeur du <option value="1">

Si cela ne fonctionne toujours pas ajouter var_dump($_POST["file"]); et voir ce qu'il y a dedans. Cela devrait vous donner quelque chose comme ça string(1) "USA"