使用preg_replace搜索字符串

时间:2009-11-04 13:31:52

标签: php regex

$html = file_get_contents("1.html");
eval("print \"" . addcslashes(preg_replace("/(---(.+?)---)/", "\\2", $html), '"') . "\";");

这会搜索一个字符串并用$ variable替换--- $ variable ---。

如何重写脚本以便搜索--- $ _ SESSION ['variable'] ---并替换为$ _SESSION ['variable']?

2 个答案:

答案 0 :(得分:1)

您可以将替换更改为:

preg_replace("/(---\\\$_SESSION\\['(.+?)'\\]---)/", "\${\$_SESSION['\\2']}", $html)

但我完全不推荐它。与往常一样,eval是一个很大的线索,你做错了。

1.html中的$或会话变量的非模板化使用会导致错误。 1.html中的任意代码或会话变量可以通过${...}语法执行,可能会危及您的服务器。会话变量中的小于号或符号将按原样输出,从而导致跨站点脚本攻击。

更好的策略是将字符串保持为字符串,而不是PHP命令。找到---...---部分并单独替换它们:

$parts= preg_split('/---(.+?)---/', $html, null, PREG_SPLIT_DELIM_CAPTURE);
for ($i= 1; $i<count($parts); $i+= 2) {
    $part= trim($parts[$i]);
    if (strpos($part, "\$_SESSION['")==0) {
        $key= stripcslashes(substr($part, 11, -2));
        $parts[$i]= htmlspecialchars($_SESSION[$key], ENT_QUOTES);
    }
}
$html= implode('', $parts);

(未经过测试,但应该沿着正确的方向排列。如果您真的希望变量包含活动HTML,则可能不需要htmlspecialchars;通常情况并非如此。)

答案 1 :(得分:0)

您需要的功能是preg_quote()。但在此之前我发布任何代码:您真的确实确保您的$html 您的$_SESSION['variable']不包含$(cat /etc/passwd)等恶意字符串}?如果你是,仔细检查。如果仍然,请继续使用:

preg_replace("/(---" . preg_quote($_SESSION['variable'], '/') . "---)/", "\\2", $html)