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
- zend framework
- programowanie
- jquery
- xml
- sieć
- http
- javascript
- mysql
- kodowanie
- postgresql
- bazy danych
- internet
- 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ą?