All pastes #2077520 Raw Edit

Unnamed

public php v1 · immutable
#2077520 ·published 2011-08-21 03:28 UTC
rendered paste body
<?		### Класс для экранирования опасных символов 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);		}	}	?>