Problème de modification de fichier, post etc... SOS ! :(

Mammouth du PHP | 959 Messages

04 avr. 2007, 14:50

Bonjour,
apès avoir passé des week-end entier sur cela, je vous explique mon gros problème:

j'ai réuçi à établir une zone "d'admin"
voiçi l'arbre des fichiers et dossiers pour vous mettre dans le bain... :

+ mon_site ( - = Fichier )
- index.php ( + = Dossier)
- base.php
+ admin
-index.php
____________________________

le fichier mon_site/base.php a pour code: (fichier de "vocabulaire")
<?php
$title="Bonjour tout le Monde";
$copyright="Copyright &copy; 2007";
?>
____________________________

le fichier mon_site/index.php a pour code:
<?php
require('base.php')
?>
<?php echo stripslashes($title) ?>
<?php echo stripslashes($copyright) ?>
____________________________

Et c'est la que se passe mon problème :
le fichier mon_site/admin/index.php a pour code:
<?php
require("../base.php");

$title = $_POST['title'];
$copyright = $_POST['copyright'];

$fichier=fopen("../base.php","w");
fputs($fichier, "<?php\n");
fputs($fichier, "$"."title=\"".stripslashes($title)."\";\n");
fputs($fichier, "$"."copyright=\"".stripslashes($copyright)."\";\n");
fputs($fichier, "?>\n");
fclose($fichier);

echo "<center><table width=\"60%\" border=\"1\" cellspacing=\"0\" cellpadding=\"3\" bordercolor=\"#000000\">
  <tr>
    <td></td>
  </tr>
  <tr>
    <td><table width=\"100%\" border=\"0\" cellspacing=\"0\" cellpadding=\"3\">
  <tr>
    <td>Titre de la page d'Accueil</td>
    <td><form action=\"index.php\" method=\"post\" style='margin-top: 3px; margin-bottom: 3px'>
	<input name=\"title\" type=\"text\" value=\"".stripslashes($title)."\" size=\"35\"></td>
  </tr>
  
  <tr>
    <td>Copyright</td>
    <td><form action=\"index.php\" method=\"post\" style='margin-top: 3px; margin-bottom: 3px'>
	<input name=\"copyright\" type=\"text\" value=\"".stripslashes($copyright)."\" size=\"35\"></td>
  </tr>  
  <tr>
    <td></td>
    <td><input name=\"submit\" type=\"submit\" value=\"Modifier\"></form></td>
  </tr>
  
</table></td>
  </tr>
</table></center>";
?>
Et se qu'il se passe véritablement, c'est que quand de vais sur : http://monsite.fr/admin/index.php , non seulement, les champs de la page son vides ! (alors qu'il devrait y avoir le texte choisi dans base.php), mais en plus, le vocabulaire inclus dans http://monsite.fr/index.php n'y est plus, donc cela veut dire que quand on va sur http://monsite.fr/admin/index.php , sa vide tous les mots entre =" et "; de base.php

Après avoir passer de nombreux week-end.... j'ai fait beaucoup de test....
et j'ai donc constaté, que, dans le fichier php de admin/index.php,
et donc, en isolant la partie :
$title = $_POST['title'];
$copyright = $_POST['copyright'];
et bé, tout marcher, le texte dans les champs, le voc ne se vidé pas dans base.php et donc le index.php non plus, MAIS :cry: quand je modifi le texte dans les champs (admin/index.php) et que je fait "Modifier", bé sa modifi rien.....


résultat :
$title = $_POST['title'];
$copyright = $_POST['copyright'];
=
- sers a modifier :D
- mais vide le voc de base.php (à son exécution) :cry:
- rien ne s'affiche dans les champs.... (admin/index.php) :cry:


Merci de votre future aide ! SOS ! :cry: :cry: :cry:

PS: inutile de me dire que cela sers à rien parce-que se n'ai pas protégé, et que si quelqu'un le découvrer.... :

c'est protéger avec le .htaccess :wink:

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

04 avr. 2007, 15:53

A mon avis tu as un soucis avec ta fonction fputs :
<?php
$fichier=fopen("../base.php","w"); 
fputs($fichier, "<?php\n"); 
fputs($fichier, "$"."title=\"".stripslashes($title)."\";\n"); 
fputs($fichier, "$"."copyright=\"".stripslashes($copyright)."\";\n"); 
fputs($fichier, "?>\n"); 
fclose($fichier); 
Dans la mesure ou ton fichier est ouvert en écriture (w-write) et pas en "compléture" (a-append), je pense que chacun de tes fputs écrase le précédent.

Essaye en écrivant ta chaine au préalable et en l'insérant avec un seul fwrite ou fputs :
<?php
$fichier=fopen("../base.php","w"); 
$str = "<?php\n"; 
$str.= "$"."title=\"".stripslashes($title)."\";\n"; 
$str.= "$"."copyright=\"".stripslashes($copyright)."\";\n"; 
$str.= "?>\n"; 
fputs($fichier, $str); 
fclose($fichier); 
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...

Mammouth du PHP | 959 Messages

04 avr. 2007, 18:31

:cry: :cry: j'ai essayé, sa donne maleureusement la même chose.... :cry:

je rapel que:

- c'est :
$title = $_POST['title'];
$copyright = $_POST['copyright']; 
qui vide les champs, qui supprime tout à l'exécution de la page...
et si on l'enlève, pour poster du texte malgrès qu'il n'y est rien, sa marche pas....


donc à mon avi, c'est sa qui a un problème.... :
(admin/index.php)
$title = $_POST['title'];
$copyright = $_POST['copyright']; 

ViPHP
ViPHP | 3607 Messages

04 avr. 2007, 18:49

le problème vient plutôt du fait qu'il y a confusion entre les variables qui viennent du fichier base.php et celle que tu redéfinis ensuite avec POST, vu qu'elles ont le même nom, je pense qu'il y a collision...

Mammouth du PHP | 959 Messages

04 avr. 2007, 23:21

Merci, mais que dois-je faire ? :?

Mammouth du PHP | 959 Messages

09 avr. 2007, 20:45

:cry: :cry:
je désespère..., il y a t-il une solution ?

Normalement oui, sinon, il n'y aurait pas de problème... :roll:

Mammouth du PHP | 693 Messages

10 avr. 2007, 09:35

Change de nom un des deux jeux de variable. Et puis, pourquoi ne pas travailler directement avec le tableau POST ?

Mammouth du PHP | 959 Messages

10 avr. 2007, 21:13

Mais si Je Change le nom des variables, de l'admin, il y aura rien qui se modifiras !? non ? :roll: :?

Mammouth du PHP | 959 Messages

21 avr. 2007, 09:11

il y a t-il un autre moyen alors ? par MySQL ?

El Konkonbré M@squed
Invité n'ayant pas de compte PHPfrance

28 avr. 2007, 00:40

Salut.

Code pour : mon_site/admin/index.php
<?php
require('../base.php');

// Initialisation de la variable.
empty($_POST['modifier']) ? $modifier = '' : $modifier = $_POST['modifier'];

/* Ci-dessous ne sera exécuté que lorsque la condition sera vérifié,
c'est à dire lorsque l'on aura appuyé sur le bouton Modifier
Pourquoi : if ($modifier == 'oui')
Parce que dans notre formulaire on a mis : <input type="hidden" name="modifier" value="oui">
*/
if ($modifier == 'oui')
{

// Mettre les 2 fonctions : "nettoie" et "nettoie_reception" (plus bas) dans un fichier extérieur qui ensuite sera includé
function nettoie($chaine)
{
$chaine = htmlentities($chaine);

/* Ci-dessous permet de remplacer les 2 choses les plus chiantes qui soient : les simples quotes et l'antislash
 J'ai remplacé ces 2 chieurs par des caractères peu employés (voir table ASCII)
 Et cela est fonctionnel quelque soit magic_quotes_gpc */
if (!get_magic_quotes_gpc())
   {
   $chaine = str_replace('\'', chr(172), $chaine); /* mqgpc à OFF donc 0 c'est bon */
   $chaine = str_replace('\\',chr(184) , $chaine); //off good
   }
       else
           {
           $chaine = str_replace('\\\'', chr(172), $chaine); /* mqgpc à ON donc 1 c'est bon */
           $chaine = str_replace('\\\\',chr(184) , $chaine); //on good
           }

$chaine = stripslashes($chaine);
$chaine = trim($chaine);
//$chaine = ereg_replace('[ ]{2,}', ' ', $chaine);
return $chaine;
}

// On enregistre les données
$fichier = fopen('../base.php', 'w+'); // w+ comme ça si le fichier n'existe pas, il est créé à la volée et cela ne provoque pas d'erreur.
fwrite($fichier, "<?php\n");
fwrite($fichier, "\$title='".nettoie($_POST['title'])."';\n");
fwrite($fichier, "\$copyright='".nettoie($_POST['copyright'])."';\n");
fwrite($fichier, "?>\n");
fclose($fichier);

echo '<div align="center">Donn&eacute;es modifi&eacute;es.<br><a href="index.php" title="Retour aux param&eacute;tages">Retour aux param&eacute;tages</a></div>';
}


// Mettre les 2 fonctions : "nettoie" (plus haut) et "nettoie_reception" dans un fichier extérieur qui ensuite sera includé
function nettoie_reception($chaine)
{
$chaine = str_replace(chr(172), '\'', $chaine);
$chaine = str_replace(chr(184), '\\', $chaine);
$chaine = trim($chaine);

return $chaine;
}


// Affichage du formulaire en arrivant sur la page.
if ($modifier != 'oui')
{
echo '
<div align="center">
<form action="index.php" method="post" style="margin: 0px;">
<input type="hidden" name="modifier" value="oui">

<table width="60%" border="1" cellspacing="0" cellpadding="3" bordercolor="#000000">
  <tr>
        <td>Titre de la page d\'Accueil</td>
        <td><input name="title" type="text" value="'.nettoie_reception($title).'" size="35"></td>
  </tr>
  
  <tr>
        <td>Copyright</td>
        <td><input name="copyright" type="text" value="'.nettoie_reception($copyright).'" size="35"></td>
  </tr>

  <tr>
    <td colspan="2" align="center"><input name="submit" type="submit" value="Modifier"></td>
  </tr>


</table>

</form>
</div>
';
}
?>
-Au passage tu remarqueras que pour le formulaire, le fait de le mettre entre un echo 'code' plutôt que echo "code", évite de devoir mettre des atislashs partout

-Pour les variables il est préférable de les mettres entre de simple quote plutôt qu'entre des guillemets(double quote).

-Préfrable de mettre fwrite parce que fputs est un alias.

Code pour : mon_site/index.php
<?php
require('base.php');

/* Mettre les 2 fonctions dans un fichier extérieur qui ensuite sera includé.
 Pour comprendre voir le fichier "admin/index.php" */
function nettoie_reception($chaine)
{
$chaine = str_replace(chr(172), '\'', $chaine);
$chaine = str_replace(chr(184), '\\', $chaine);
$chaine = trim($chaine);

return $chaine;
}

echo nettoie_reception($title);
echo '<br />';
echo nettoie_reception($copyright);
?>
Voilà, c'est fonctionnel puisque j'ai testé.
Si tu n'as pas tout compris, tu sais où me trouver :wink:

Je te laisse le soin de mettre le Doctype qu'il te plaira.

Bye.

Mammouth du PHP | 959 Messages

28 avr. 2007, 11:11

Ouai ! Merci !
Trop Content :wink: :D

Je t'embète encore, il y a un tout petit défaut qui est surment corrigable :
Quand dans la zone d'admin, je mais <b>mon texte</b> , il me sors la même chose dans l'index total... et moi je voudrait que sa face du gras puisque j'ai mis mon texte entre <b>et</b>
(pas la pène de me poser la question, sa fais cela avec toutes les balises...)

Merci d'avance !

Mammouth du PHP | 991 Messages

28 avr. 2007, 11:17

essaye avec <strong> à la place de <b> ... qui sait
DevOps, Symfony4, Hoa

Mammouth du PHP | 959 Messages

28 avr. 2007, 11:39

Sans te vexer, je ne suis pas étonné que sa ne marche pas, j'ai essayé...
(pas la pène de me poser la question, sa fais cela avec toutes les balises...)
PS: Pour vous mettre sur la piste :
en faite le fichier admin "code" les "<" en "<" et les ">" en ">" et vous le savez, mais c'est pour exemple : il code aussi les "&" en "&" , bon, c'est toujours pareil... lol
en il faudrait que le fichier admin.php ne code pas les trucs ci-dessus pour que sa marche... :)

El Konkonbré M@squed
Invité n'ayant pas de compte PHPfrance

28 avr. 2007, 18:31

Salut.

J'espère que tu as créé un fichier externe pour les 2 fonctions utilisées.

Ex : functions.php
dans lequel tu mets ces 2 fonctions
Pour résoudre ton problème j'ai modifié la fonction : nettoie_reception
<?php

function nettoie($chaine)
{
$chaine = htmlentities($chaine);

if (!get_magic_quotes_gpc())
   {
   $chaine = str_replace('\'', chr(172), $chaine); /* mqgpc à OFF donc 0 c'est bon */
   $chaine = str_replace('\\',chr(184) , $chaine); //off good
   }
       else
           {
           $chaine = str_replace('\\\'', chr(172), $chaine); /* mqgpc à ON donc 1 c'est bon */
           $chaine = str_replace('\\\\',chr(184) , $chaine); //off good
           }


$chaine = stripslashes($chaine);
$chaine = trim($chaine);
//$chaine = ereg_replace('[ ]{2,}', ' ', $chaine);
return $chaine;
}

#----------

function nettoie_reception($chaine)
{
$chaine = str_replace(chr(172), '\'', $chaine);
$chaine = str_replace(chr(184), '\\', $chaine);
$chaine = str_replace('"', '"', $chaine); // Ajouté pour ton problème
$chaine = str_replace('<', '<', $chaine); // Ajouté pour ton problème
$chaine = str_replace('>', '>', $chaine); // Ajouté pour ton problème
$chaine = trim($chaine);

return $chaine;
}

?>
L'inconvénient de tout ça, c'est que si une personne met par exemple dans un champ de texte : <script>alert('Attention');</script>
Ceci sera interprété et une boite d'alerte apparaitra.
C'est ce que l'on appelle une faille d'injection XSS.
C'est considéré comme une faille à partir du moment où n'importe quel visiteur peu injecter ce type de code.

Mais je pars du principe où tu en es conscient et que de toute façon seulement toi à accès a cette partie de l'admin.

Une fois que tu a créé ce fichier externe (functions.php), tu l'includes comme tu l'as fait pour base.php et tu n'oublies pas de virer les fonctions utilisées dans le code source de index.php et admin/index.php.

Bye.

Mammouth du PHP | 959 Messages

28 avr. 2007, 20:12

Yeah !!!
Sa MARCHE nickel !
trop content ! :D :D :D :D :D :D :D
Mille foit merci (Je le dit pas, sinon, sa va saturer le serveur SQL de PHPFrance, et il va planter, le linux aussi, le disque dur va mourir = tous les messages perdus ! :lol: :lol: ) (Je le souhaîte pas :lol: )