<? ### Класс для экранирования опасных символов v1.1 ### Автор Семенов Игорь (aka Goshik) ### ICQ#: 368636783 class SafeData implements Iterator, ArrayAccess, Countable{ // Типы экранирования const NONE = 1; // Без экранирования (пригодится для выпиливания кавычек из входных данных) const MYSQL = 2; // Для БД const HTML = 3; // Для вывода на страницу const INT = 4; // Приведение к целому типу // Тип экранироавания для текущего обЪекта protected $escapeType; // Массив с данными для экранирования protected $source; // Иногда нужно отключить обрезку слешей в функции escape этого класса, // даже если включены магические кавычки. Для этого и нужно данное поле. // Например когда экранируем не входной (_POST, _GET или _COOKIE) массив, // а какой-нибудь левый, из базы допустим, или ещё откуда. // Ведь там могут находится годные слеши, а мы их возьмём и выпилим. protected $isStripSlashes = true; ### Конструктор класса. ### Принимает на вход массив для экранирования (например $_POST или $_GET) ### Тип экранирования (см. типы чуть выше) ### Флаг управляющий обрезкой слешей (про это было выше) public function __construct(&$source, $escapeType = self::NONE, $isStripSlashes = true){ // Сохраняем аргументы в поля $this->isStripSlashes = $isStripSlashes; $this->escapeType = $escapeType; $this->source = &$source; } ### Метод для экранирования строк ### Может экранировать сразу массив строк, для этого используется рекурсия protected function escape($index){ // Если данные на входе являются массивом, то заменяем его обЪектом if (is_array($this->source[$index])) return new self($this->source[$index], $this->escapeType, $this->isStripSlashes); // Если нет то экранируем входящие данные else{ // Копируем нужный элемент $element = $this->source[$index]; // Если включены магические кавычки, то сносим их нафик if (get_magic_quotes_gpc() && $this->isStripSlashes) $element = stripslashes($element); // Если $escapeType является функцией, то применяем её к элементам массива $escapeType = $this->escapeType; if (is_callable($escapeType)) $element = $escapeType($element); // Иначе выбираем режим экранирования из существующих else switch($escapeType){ // Для БД case self::MYSQL: $element = self::MySQLEscapeString($element); break; // Для вывода в браузер case self::HTML: $element = htmlspecialchars($element, ENT_QUOTES); break; // Приведение к целому типу case self::INT: $element = (int)$element; break; } } // Возвращаем обработанные данные return $element; } ### Метод - аналог mysql_real_escape_string ### Понадобилась, т.к. стандартная требует подключение к бд, ### а класс иногда предполагается использовать до подключения protected static function MySQLEscapeString($str){ // Заменяем опасные символы $str = str_replace("\\", "\\\\", $str); $str = str_replace("'", "\'", $str); $str = str_replace('"', '\"', $str); $str = str_replace("\x00", "\\x00", $str); $str = str_replace("\x1a", "\\x1a", $str); $str = str_replace("\r", "\\r", $str); $str = str_replace("\n", "\\n", $str); // Возвращаем обработанную строку return $str; } ### Метод для преобразования обЪекта в строку ### Нужна для того, чтобы обЪект вёл себя как массив public function __toString(){ return "Array"; } ### Методы для реализации интерфейса Iterator ### См. описанние итерфейса тут http://ru.php.net/manual/en/class.iterator.php public function rewind(){ reset($this->source); } public function current(){ return $this->escape($this->key()); } public function key(){ return key($this->source); } public function next(){ return next($this->source); } public function valid(){ return array_key_exists($this->key(), $this->source); } ### Методы для реализации интерфейса ArrayAccess ### См. описанние итерфейса тут http://ru.php.net/manual/en/class.arrayaccess.php public function offsetExists($offset){ return isset($this->source[$offset]); } public function offsetGet($offset){ return $this->escape($offset); } public function offsetSet($offset, $value){ $this->source[$offset] = $value; } public function offsetUnset($offset){ unset($this->source[$offset]); } ### Метод для реализации интерфейса Countable ### См. описанние итерфейса тут http://ru.php.net/manual/en/class.countable.php public function count(){ return count($this->source); } }?>