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

Это ищет строку и заменяет --- переменную $ --- переменной $.строка поиска с preg_replace

Как я могу переписать сценарий так, чтобы он искал --- $ _ SESSION ['variable'] --- и заменяет $ _SESSION ['variable']?

+5

Ermmm ... не будет ли это плохая идея (TM) - вызов 'eval' на произвольные данные сеанса? –

ответ

0

Необходимая функция: preg_quote(). Но прежде, чем я напишу какой-либо код здесь: Действительно ли вы действительно действительно уверены, что ваш $htmlили ваш $_SESSION['variable'] не содержит вредоносных строк, таких как $(cat /etc/passwd)? Если да, проверьте. Если у вас еще есть, идти вперед, используя это:

preg_replace("/(---" . preg_quote($_SESSION['variable'], '/') . "---)/", "\\2", $html) 
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); 

(Не тестировалось, но должно быть в правильном направлении Вы не можете htmlspecialchars, если вы действительно хотите, чтобы ваши переменные содержат активный HTML, обычно это не так. .)

Смежные вопросы