2009-09-07 11 views
2

Dans mon CMS j'ai ajouté ce code <div><?php include("my_contact_form.php") ?></div> qui met à jour un db. Je peux le voir là-bas.Syntaxe PHP affichant en source HTML

Je possède ce code php dans ma page d'affichage après l'appel db:

$content = $row['content']; 

quand j'echo $ contenu dans le corps ce message est affiché dans la source HTML:

<div><?php include("my_contact_form.php") ?></div> 

Comment cela pourrait-il être? Pourquoi ne montrerait-il pas mon formulaire de contact? Si quelqu'un a des suggestions, je serais extrêmement reconnaissant. À la vôtre.

Répondre

3

La solution simple est d'exécuter eval() sur votre contenu. La fermeture de la balise PHP et l'ouverture de la balise PHP vous permettent d'intégrer HTML et PHP dans l'instruction eval().

À propos du choix de stocker votre PHP et les fichiers DB vs. En supposant que votre but est d'avoir PHP qui peut être édité par les administrateurs à partir d'une interface, et exécuté par votre serveur.

Vous avez deux choix:

écrire le PHP aux fichiers et inclure ou exec() les fichiers. Ecrivez le PHP dans la BD, et exec() ou cachez le contenu dans les fichiers et include().

Si vous utilisez un serveur dédié ou VPS, l'écriture dans des fichiers est le meilleur choix. Toutefois, si vous utilisez un système d'hébergement partagé, l'écriture sur la base de données est en fait le choix le plus sûr. Cependant, cela vient avec la tâche que vous devez utiliser un système très sûr pour interroger la base de données, pour éliminer toute possibilité d'injection SQL.

La raison pour laquelle la base de données est plus sûre dans un environnement partagé est due au fait que vous aurez besoin d'un accès en écriture pour le processus PHP aux fichiers PHP. Malheureusement, sur "chaque" configuration d'hébergement partagé, le même utilisateur PHP s'exécute sur chaque compte et dispose ainsi d'un accès en écriture aux mêmes fichiers PHP. Ainsi, un utilisateur malveillant doit simplement s'inscrire à l'hébergement et atterrir sur la même machine physique que vous, ou exploiter un compte différent pour accéder au vôtre. Avec l'enregistrement du PHP dans mysql, PHP ne peut pas écrire dans les fichiers mysql car il n'a pas les privilèges. Donc, vous finissez avec un code plus sécurisé, si vous éliminez la possibilité d'injection SQL.Notez que si vous avez une vulnérabilité d'injection SQL avec capacité d'écriture, vous avez également ouvert une vulnérabilité d'exécution de code à distance.


Edit:

Désolé la syntaxe correcte est:

eval("\r\n?>\r\n ".$php."\r\n<?php\r\n"); 

Cest été testé pour fonctionner de manière intensive sur toutes les configurations PHP/configuration.

+0

Merci pour cela - des solutions simples sont les meilleures pour moi! Merci pour les informations supplémentaires aussi. Malheureusement eval() comme vous le suggérez n'a pas fonctionné pour moi ici. Donc, plan C, j'ai décidé de créer un template tinymce sélectionnable qui a un iframe qui appelle la page contact_form et tout le traitement se passe dans l'iframe. Cela marche. Merci tout le monde! –

+1

@John, voir la syntaxe mise à jour. Cela devrait fonctionner pour n'importe quel code PHP. – bucabay

+0

Merci - c'est tout !!! Brillant, à la vôtre. –

2

Vous faites écho à $ content, qui imprime simplement la valeur, mais n'exécute pas de PHP à l'intérieur.

+0

Merci Miff. Comment dois-je appeler cela pour afficher le contenu $ alors? Merci –

11

Il semble que vous stockez le code PHP dans la base de données et que vous attendiez qu'il soit exécuté lorsque vous l'écrivez. Cela n'arrivera pas, dans la mesure où l'interpréteur PHP est concerné, c'est juste du texte (pas du code PHP), donc ça va juste faire écho.

Vous pouvez forcer PHP à interpréter (/ exécuter) le code de votre chaîne avec le eval() function, mais cela s'accompagne d'un grand nombre d'avertissements de sécurité.

Le stockage de code dans la base de données est rarement la bonne solution.

+5

+1 pour avoir fait remarquer que eval() sur le contenu généré par l'utilisateur est probablement la chose la plus stupide que vous puissiez faire – Ian

+0

Finalement, vous devrez pirater le code du CMS lui-même . Ou peut-être y a-t-il une option dans la configuration de votre CMS quelque part, pour exécuter du code PHP dans le champ dans lequel vous le stockez? –

+1

@iAn - il semble qu'il fait cela en tant qu'utilisateur d'un CMS.Par conséquent, eval() n'est pas exécuté sur du texte entré par un utilisateur aléatoire, mais plutôt par l'éditeur de side ou l'admin. Encore des problèmes de sécurité, mais pas aussi mauvais que de le faire pour les données d'un formulaire Web public, etc –

1

Si vous utilisez un CMS existant, comme Joomla, Drupal, etc.
Le CMS gère le texte de la DB comme ce qu'il est - texte. Il n'exécutera pas le texte, il est probablement juste en le tirant comme une chaîne de la DB et en l'écho sur la page. Voir answer de Brenton Alker pour une meilleure explication.

Si possible, il serait préférable de travailler dans les fonctionnalités du CMS, et d'éviter de pirater la source de votre CMS pour utiliser eval(). Selon le CMS que vous utilisez, il peut y avoir une fonctionnalité (par exemple: un bouton dans votre éditeur, ou similaire) pour inclure le code d'un autre fichier.

Ou peut-être il y a une fonctionnalité pour créer "objets", "modules", quel-ils-voulaient-les-appeler, ce qui vous permettrait de placer le code (en HTML) que vous essayez à inclure dans un "objet", stocké dans le DB, vous permettant de l'inclure dans de nombreuses pages. Cela permettrait d'atteindre les mêmes objectifs que de faire un include() en PHP (réutilisation du code, éviter les doublons, apporter des modifications à un endroit, etc.) mais cela vous éviterait aussi d'avoir à pirater le CMS ou à risquer la sécurité.

Si vous avez construit votre propre CMS
Vous pouvez construire une telle fonctionnalité dans. Tout dépend de vos besoins et importance de la sécurité.

En fin de compte, si vous utilisez eval(), et si quelqu'un hacks soit:

  • Votre DB
  • Votre interface d'administration de CMS

alors ils seront en mesure d'exécuter du code PHP sur votre serveur . Et si vous avez exec() activé dans votre php.ini (qui n'est pas sûr), alors ils seront également en mesure d'exécuter le code qu'ils veulent sur votre serveur lui-même ... eeek!

0

Merci pour cela - des solutions simples sont les meilleures pour moi! Merci pour les informations supplémentaires aussi. Malheureusement eval() comme vous le suggérez n'a pas fonctionné pour moi ici. Donc, plan C, j'ai décidé de créer un template tinymce sélectionnable qui a un iframe qui appelle la page contact_form et tout le traitement se passe dans l'iframe. Cela marche. Merci tout le monde!