Zend Framework - Zend_Filter_Input - HTMLEntities a sprawa polskich znaków
Artykuł dodany: 09 marca 2009. Ostatnia modyfikacja: 12 sierpnia 2009.
Stopień trudności (1 - dla początkujących, 5 - dla ekspertów): 2
Domyślnie wszystkie otrzymane od użytkownika wartości przepuszczane są przez htmlentities(). Problem w tym że niepoprawnie przekształca ona polskie znaki. Aby uniknąć takiej sytuacji mamy kilka możliwych rozwiązań.
- Zamienić domyślną funkcję na jedną z przedstawionych w komentarzach dokumentacji php
- Napisać własny filtr korzystający np. z wyrażeń regularnych
- Wykorzystać domyślną funkcję htmlspecialchars() która konwertuje wyłącznie znaki specjalne. Do podstawowych zastosowań w zupełności wystarczy.
Oto kod 3 rozwiązania:
Filter/HtmlSpecialchars.php
<?php require_once 'Zend/Filter/Interface.php'; /** * @category Zend * @package Zend_Filter * @copyright Copyright (c) 2005-2008 Zend Technologies USA Inc. (http://www.zend.com) * @license http://framework.zend.com/license/new-bsd New BSD License */ class NaszeKlasy_Filter_HtmlSpecialchars implements Zend_Filter_Interface { /** * Corresponds to second htmlspecialchars() argument * * @var integer */ protected $_quoteStyle; /** * Corresponds to third htmlspecialchars() argument * * @var string */ protected $_charSet; /** * Corresponds to fourth htmlspecialchars() argument * * @var string */ protected $_doubleEncode; /** * Sets filter options * * @param integer $quoteStyle * @param string $charSet * @return void */ public function __construct($quoteStyle = ENT_COMPAT, $charSet = 'UTF-8', $doubleEncode = true) { $this->_quoteStyle = $quoteStyle; $this->_charSet = $charSet; $this->_doubleEncode = $doubleEncode; } /** * Returns the quoteStyle option * * @return integer */ public function getQuoteStyle() { return $this->_quoteStyle; } /** * Sets the quoteStyle option * * @param integer $quoteStyle * @return Zend_Filter_HtmlEntities Provides a fluent interface */ public function setQuoteStyle($quoteStyle) { $this->_quoteStyle = $quoteStyle; } /** * Returns the charSet option * * @return string */ public function getCharSet() { return $this->_charSet; } /** * Sets the charSet option * * @param string $charSet * @return Zend_Filter_HtmlEntities Provides a fluent interface */ public function setCharSet($charSet) { $this->_charSet = $charSet; return $this; } /** * Defined by Zend_Filter_Interface * * Returns the string $value, converting characters to their corresponding HTML entity * equivalents where they exist * * @param string $value * @return string */ public function filter($value) { return htmlspecialchars((string) $value, $this->_quoteStyle, $this->_charSet, $this->_doubleEncode); } }
Następnie zmieniamy w kodzie domyślnie wykonywany filtr:
$filterInput = new Zend_Filter_Input(...); $filterInput->setDefaultEscapeFilter(new NaszeKlasy_Filter_HtmlSpecialchars(ENT_QUOTES, 'UTF-8'));
Pamiętaj aby zawsze filtrować dane otrzymywane od użytkownika! W celu pełniejszego zabezpieczenia przed atakami wykorzystaj chociażby projekt http://htmlpurifier.org.
Dodaj komentarz
- css
- xhtml
- html
- php
- javascript
- jquery
- mysql
- programowanie
- bazy danych
- kodowanie
- xml
- postgresql
- http
- sieć
- internet
- zend framework
- zend framework 3
- apache
- sqlite
- phptal
Komentarze
Nie ma jeszcze żadnych komentarzy do wyświetlenia. Może chcesz zostać pierwszą osobą która podzieli się swoją opinią?