在字符串中阻止PHP解析<! - ?code? - >

时间:2013-01-06 21:42:23

标签: php parsing escaping

我目前有一个数据库,其中包含一些包含

形式文本的字段

The root location is <?=$GLOBALS['root']?>

这个想法是,当在网页上显示输出

The root location is /random/directory/that/changes/

问题是我还想要一个可以编辑这些字段的页面,所以我需要把

The root location is <?=$GLOBALS['root']?>

进入textarea。不幸的是,像

这样的代码
<textarea><?echo $page->text?></textarea>

执行您期望的操作并将<?=$GLOBALS['root']?>的任何内容更改为/ random / directory / that / changes /。我知道有可能这样做,因为phpmyadmin这样做,但我已经看过他们的代码并且无法确定他们是如何完成它的。据我所知,没有任何常见的逃逸功能可以自行解决问题,正如我所预料的那样。

P.S。我意识到将PHP代码放入这样的数据库并不是最好的想法,但我现在已经坚持了。

编辑:对不起,我是个傻瓜。请忽略这个问题。有关详细信息,请参阅下面的答案。

5 个答案:

答案 0 :(得分:2)

<?php echo $page->text; ?>不应该在$page->text中执行PHP代码。但是,其中的PHP代码可能被浏览器解释为processing instruction。要解决这个问题,您需要将其转义为HTML:

<?php echo htmlspecialchars($page->text); ?>

有关htmlspecialcharssee the documentation

的详细信息

答案 1 :(得分:1)

您可以在字符串中引入自己的变量语法并运行str_replace(或使用正则表达式)将它们替换为实际值:

$variables = array(
  'root' => '/random/directory/that/changes/'
};
$string = str_replace('{$root}', $variables['root'], $string);

答案 2 :(得分:1)

对不起,我是个白痴,并没有仔细阅读我留下来处理的代码。你是完全正确的,因为替换不是由PHP自动完成的,但出于某种原因,前一位作者认为使用str_replace("<?=\$GLOBALS['root']?>", $GLOBALS['root'], mysql_result($result, 0, "text")); ......

抱歉浪费你的时间。

答案 3 :(得分:0)

使用双引号(“”)。 要将数据放入DB,请使用一些抽象层,例如PDO。 http://php.net/manual/en/book.pdo.php

答案 4 :(得分:0)

我认为你想要的是从数据库中执行任意代码的eval()函数。但是,不建议从字符串执行任意代码。

http://php.net/manual/en/function.eval.php

<?的问题消失了,因为eval()不支持这些问题。