Intereting Posts
Поиск в Twitter по hashtag example API v1.1 Анализ XML-CDATA с PHP Как искать сингулярные / множественные числа в php mysql Обратный вызов из API не происходит после публикации параметров URL-адреса API со стороны сервера Могу ли я получить доступ к / dev / urandom с помощью open_basedir? Указание переменной типа в Netbeans (PHP) php explode: разделите строку на слова, используя пробел разделитель Неустранимая ошибка: неподдерживаемые типы операндов Сессии PHP: Объяснение, пожалуйста? Как загрузить файл при нажатии на путь к файлу с помощью PHP-Symfony? Символьная печать конфликтует при использовании разных кодировок для статического и динамического содержимого отключить смарт-уведомление Перенос с сервера> Сервер> Клиент без загрузки на сервер Как передать массив строк в PDO для их вставки? Каков наилучший способ / практика получения расширения загруженного файла в PHP

Как предотвратить атаку SQL Injection в приложениях, запрограммированных в Zend Framework?

У меня нет понятия о безопасности ZF. Должен ли я использовать фильтр при работе в базе данных? Может быть, связывание достаточно? Как насчет этого:

$users->update($data, 'id=1'); 

Следует ли каким-то образом отфильтровать массив данных? Не стесняйтесь писать все, что вы знаете о проблеме.

Не могли бы вы дать некоторые ссылки на хорошие статьи о безопасности в ZF (в основном, о SQL Injection и XSS)?

Короткий ответ
В то время как ZF берет и предоставляет некоторые меры для защиты вашего приложения, вы все равно должны применять те же меры предосторожности, которые будете использовать без Zend Framework.


Что касается фрагмента кода, ознакомьтесь с Главой в Zend_Db в Справочном руководстве :

По умолчанию значения в вашем массиве данных вставляются с использованием параметров. Это снижает риск возникновения некоторых проблем безопасности. Вам не нужно применять экранирование или цитирование значений в массиве данных.

Это не значит, что вам не нужно беспокоиться о безопасности. Например, для метода Update выше

Третий аргумент – это строка, содержащая выражение SQL, которое используется в качестве критериев для строк, которые нужно изменить. Значения и идентификаторы в этом аргументе не цитируются и не экранируются. Вы несете ответственность за то, чтобы любой динамический контент был интерполирован в эту строку безопасно. См. Раздел « Ценности и идентификаторы» для методов, которые помогут вам в этом.

Обратите внимание, поскольку вы используете Zend_Db_Table очевидно, третий аргумент является вторым аргументом. Внутренне экземпляр таблицы делегирует вызов адаптеру db, причем первым параметром является табло-имя экземпляра таблицы.


Что касается векторов атаки Zend_View и XSS:

Zend_View поставляется с исходным набором вспомогательных классов, большинство из которых связаны с формированием элемента элемента и автоматически выполняют соответствующее выходное экранирование.

Опять же, большинство из них не означает все. Zend_View предоставляет Zend_View :: escape (), чтобы помочь вам дезинфицировать вывод, но это ничего особенного.

Эта же концепция применима для Zend Framework и для любого другого веб-приложения / библиотеки / любого, что управляет данными пользователя:

Всегда проверяйте ввод пользователя. Не доверять никому.

Если вы ожидаете строку, убедитесь, что вы получили строку. Это может быть выполнено с использованием библиотек фреймворков (например, в этом случае вы используете фреймворк Zend) или вручную реализуете функции проверки.

Валидация должна ВСЕГДА выполняться на стороне сервера. Также должна присутствовать проверка на стороне клиента, чтобы обеспечить лучший пользовательский интерфейс.

В случае Zend обратитесь к странице «Проверка» из руководства.

Связывание должно предотвращать SQL-инъекцию, но оно ничего не делает для предотвращения XSS. Вы должны всегда отфильтровывать свои данные по мере необходимости и при эхо-выходе в представлении вы должны избегать всего, что может быть опасно.

 echo $this->escape($this->foo); 

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

Параметр запроса

 $alpha = new Zend_Filter_Alpha(); $name = $alpha -> filter($this -> _request -> getParam('name')); //while processing url parameters 

База данных

 $int = new Zend_Filter_Int(); $select -> where("id = ?", $int -> filter($id)); //during db processing also 

Также в Элементах Форм. Я пропущу это, так как пример этого можно найти ненавязчиво.