$html = file_get_contents("1.html");
eval("print \"" . addcslashes(preg_replace("/(---(.+?)---)/", "\\2", $html), '"') . "\";");
这会搜索一个字符串并用$ variable替换--- $ variable ---。
如何重写脚本以便搜索--- $ _ SESSION ['variable'] ---并替换为$ _SESSION ['variable']?
答案 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)