Лучшая практика для HTML, выходящего из предоставленных пользователями данных с PHP (и ZF)

У меня были проблемы с открытым ResultSets в Oracle, даже при том, что соединение было закрыто. Ошибка, которую я получил, была

"ORA-01000: maximum open cursors exceeded"

Так: Всегда закрывайте свой ResultSet!

5
задан tuomassalo 19 November 2009 в 15:56
поделиться

4 ответа

  1. Отфильтруйте как можно скорее. Вы должны убедиться, что весь текстовый ввод соответствует UTF-8, чтобы ваши функции обработки текста работали предсказуемо.

    Но не пытайтесь отфильтровать «опасные» персонажи или фрагменты! Это не работает. Только исправляйте или отклоняйте неверные данные при вводе. Нет ничего неправильного в символах < или '.

  2. Выйдите из как можно позже. Добавьте экранирование SQL в свою функцию запроса SQL (или лучше - используйте подготовленные операторы). HTML-escape в ваших HTML-шаблонах. Quoted-Printable-escape в ваших функциях генерации электронной почты, экранирование оболочки при выполнении команд CLI и т. Д.

    Не позволяйте экранированным данным распространяться по всему вашему приложению, потому что чем дольше сохраняются экранированные данные, тем больше у вас шансов » Я перепутаю его с неэкранированными данными или прерву экранирование во время обработки.

10
ответ дан 18 December 2019 в 11:57
поделиться

Это не ' Это полное решение, но одна чрезвычайно полезная вещь в такой ситуации - это нотация в венгерском стиле. Постоянно используемая венгерская нотация меня просто раздражает, но это то место, где такие метаданные в имени переменной очень ценны. Хорошая практика - называть переменные с префиксом, который говорит, чего от них ожидать ... например, $ rawUserInput, $ escapedUserInput и т. Д.

Это не решает полностью проблему, но это хорошая практика кодирования.

2
ответ дан 18 December 2019 в 11:57
поделиться

Есть дюжина способов сделать это. Вот некоторые из них:

  • Вы можете написать свой собственный вид класс, как описано в Zend Framework Manual и избегайте любых переменные, когда они присваиваются или запрашивается из представления.
  • В случае наборов данных вы можете обернуть их в пользовательский ArrayIterator который выводит экранирование, когда извлечение из него предметов вместе с любые другие вещи, которые вы хотите автоматизировать на выходе.
  • Или вы можете использовать View Script подойдите к .
  • Или, если вы не хотите, чтобы авторы шаблонов пишут любой PHP или какой бы то ни было синтаксис шаблона, вы можете попросите их написать только структурированный HTML, а затем вставьте значения через DomDocument extension.

Что касается подробного описания PHP в шаблоне, ну ... он может не предлагать кратчайшие обозначения, но опять же, он предоставляет обозначение и не требует дополнительных затрат. Даже для авторов шаблонов, не относящихся к PHP, должно быть проще выучить несколько вызовов методов в PHP, чем (часто странный) язык шаблонов, который по сути заново изобретает подмножество того, что PHP может делать из коробки.

Вы также можете использовать Альтернативный синтаксис PHP и NowDoc или HereDoc в ваших шаблонах, чтобы избавиться от вызовов и echo , чтобы вы могли закончить с чем-то вроде

<?php
// get some partial block done first
foreach($this->books as $book):
$loopdata = << LOOPDATA
<li> {$book->title} -  {$book->author} - {$book->publisher}</li>
LOOPDATA;
endforeach;

// render entire template
echo << HTML
<h1>{$this->title}</h1>
<ul>{$loopdata}</ul>
HTML;

Лично я не считаю это слишком привлекательным, но, как вы можете видеть, есть много способов написать свои шаблоны с помощью PHP. Просто выберите один.

0
ответ дан 18 December 2019 в 11:57
поделиться

Но опять же, это не похоже на хорошую практику MVC.

Полностью согласен, Модель - неподходящее место для таких представлений и хранит как HTML, так и необработанную версию каждого переменная упростит для них рассинхронизацию. Забудьте о решении 2.

Это оставляет вам альтернативные механизмы создания шаблонов или придерживаться PHP и учиться постоянно нести нагрузку вызова htmlspecialchars. Я открыт для идеи альтернативных записей шаблонов, но те, которые я пробовал до сих пор, мне не очень понравились.

(Многие отказываются от синтаксиса PHP и реализуют свои собственные ограниченные языки выражений, что означает, что вы теряете преимущество языка, который вы уже знаете и придерживаетесь нудного языка, что делает невозможным более сложную логику представления, так что вы в конечном итоге делаете это сами на PHP со строками, полными HTML, что абсолютно не победа.)

Итак, на данный момент я бы предложил Решение 0a , чтобы добавить его в кучу: define глобальная функция с коротким именем, чтобы избавиться от проблем с экранированием HTML:

<?php
    function h($s) {
        echo(htmlspecialchars($s, ENT_QUOTES));
    }
?>
...

My lovely variable is <?php h($this->myVariable); ?>.

Я понятия не имею, почему PHP не определяет для этого ярлык, который, как вы говорите, является наиболее распространенным вариантом использования. Теперь они сбросили короткие теги для тегов в стиле XML-PI, почему нет одного с другим именем, чтобы делать правильные вещи, например, скажем ?

Определите для этого ярлык, который, как вы говорите, является наиболее распространенным вариантом использования. Теперь они сбросили короткие теги для тегов в стиле XML-PI, почему нет одного с другим именем, чтобы делать правильные вещи, например, скажем ?

Определите для этого ярлык, который, как вы говорите, является наиболее распространенным вариантом использования. Теперь они сбросили короткие теги для тегов в стиле XML-PI, почему нет одного с другим именем, чтобы делать правильные вещи, например, скажем ?

3
ответ дан 18 December 2019 в 11:57
поделиться
Другие вопросы по тегам:

Похожие вопросы: