Рекомендации: Zend View: загрузка контента из базы данных и рендеринг PHP-кода, включенного в контент - PullRequest
2 голосов
/ 05 ноября 2011

Допустим, я загружаю значение из базы данных, которая возвращает что-то вроде:

<?php
//Zend_Controller_Action
public function indexAction()
{
  $dbContent = "<p>Hello <?php echo $user?>!</p>";
  $this->view->paragraph = $dbContent;
}
?>

Как это возможно, что

<?php echo $user?>

будет обработано?

Какие меры предосторожности необходимо предпринять (вопросы безопасности, XXS)?

Большое спасибо действительно!

== Редактировать: == Извините, я, очевидно, неправильно сформулировал свой вопрос. Что я на самом деле имею в виду:

Я бы не хотел использовать механизм шаблонов, такой как smarty .

В моем проекте будет контент с PHP-кодом внутри строки, который необходимо проанализировать.

Пример:

<?php
//Zend_Controller_Action
public function indexAction()
{
  $dbContent = "<p>Hello <?php echo $user?>!</p>";
  $this->view->paragraph = $dbContent;
}

<?php
//viewscript.phtml
$user = 'John Doe';
echo $this->paragraph;
?>

предполагается вывести:

Привет, Джон Доу!

Есть ли какое-нибудь безопасное решение для этого без внешнего шаблонизатора?

Еще раз спасибо ...: -)

Ответы [ 3 ]

2 голосов
/ 06 ноября 2011

Если найдено решение здесь , которое, кажется, идеально удовлетворяет мои потребности.

Спасибо всем, кто ответил здесь,

== ОБНОВЛЕНИЕ ==

К сожалению, опубликованная ссылка не работает.Однако решение было довольно простым.Насколько я помню, он прошел следующие шаги:

  1. Извлечение содержимого из базы данных и сохранение его в файле
  2. Использование Zend_Cache для проверки, существует ли этот файл
  3. Если файл существует, просто отобразите его.Если нет, перейдите к шагу 1.

== ОБНОВЛЕНИЕ II == Найдена копия страницы: archive.org

1 голос
/ 05 ноября 2011

В Zend Framework вы всегда сможете напечатать строку (или что угодно) с контроллера, но это очень плохая практика .

Вы должны указать значение $ user из контроллера для представления следующим образом:

$this->view->paragraph = $user;

и затем в представлении : 1011 *

<p>Hello <?php echo $this->paragraph; ?>!</p>

Чтобы убедиться, что этот код из XSS, вы должны сделать некоторую проверку перед (до того, как вы напечатаете значение), как это:

$user = strip_tags($user);
0 голосов
/ 05 ноября 2011

Zend Framework не поддерживает автоматическое экранирование выходных данных, но вы можете предотвратить XSS разными способами.

Прежде всего вставьте все значения в слой вида , а затем напечатайте их с помощью View Helper подобно Zend \ View \ Escape , по умолчанию возвращает строку в htmlspecialchars () , но вы можете установить функцию обратного вызова просто с помощью:

//view.phtml
$this->setEscape('yourClass','methodName');
$this->setEscape('functionName');
echo $this->escape($this->myGreatDbValue);

Конечно, вы можете создать свой собственный помощник View для всех ваших потребностей.

Другой способ - создать пользовательский класс View с расширением Zend \ View \ Abstract , переопределением магического метода __get () и фильтрацией вывода.

Прочитать документацию для Zend View Helper и Zend Filter: http://framework.zend.com/manual/en/zend.filter.html http://framework.zend.com/manual/en/zend.view.helpers.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...