Статьи

Обзор Zend_Filter, черный / белый список фильтров

Мне нравится класс Zend Framework Zend_Filter . В основном это набор методов для проверки ненадежных данных. Хотя две, пожалуй, наиболее важные функции isEmail () и isUri () (последняя может работать с Zend_Uri) по-прежнему отсутствуют, все это уже выглядит многообещающе. Вот несколько мыслей на упаковке:

  • Удалите isGreaterThan () и isLessThan (). Для этого у нас есть операторы «<» и «>». Я могу понять намерение дизайнера предоставить полный набор тестов, но они просто раздувают как Zend_Filter, так и код пользователя. IsEqualTo () также не существует.
  • isDate () выглядит как заглушка. Это должно быть заменено чем-то более сложным.
  • Очистите код isHostname ().
  • Имя метода isRegex() заставляет меня думать, что он проверяет, является ли аргумент допустимым регулярным выражением. Так как сопоставление с образцом в любом случае является особым способом фильтрации, я бы просто отказался от префикса «is» и назвал его match ().
  • Я не знаю, работает ли isName () абсолютно точно на любых экзотических именах. Кроме того, это может быть легко оставлено, поскольку это — работа для фильтрации белого списка. См. ниже.
  • Международная поддержка isPhone (). Я могу предложить швейцарскую реализацию, просто дайте мне знать. Кстати, примените self :: getDigits () к входу вместо проверки ctype_digit.
  • Давайте добавим еще три метода класса в Zend_Filter. Первый экранирует строку для безопасного использования в регулярных выражениях:
public static function getRegexEscaped($input) { $output = ''; for($i = 0; $i < strlen($input); $i++) { $output .= 'x'.bin2hex($input{$i}); } return $output; }
public static function getRegexEscaped($input) { $output = ''; for($i = 0; $i < strlen($input); $i++) { $output .= 'x'.bin2hex($input{$i}); } return $output; } 
  • Следующий проверяет строку по белому списку символов:
public static function getWhitelisted($input, $allowed_chars = '', $allow_alpha = true, $allow_numeric = true) { $regex = '%[^'.($allow_alpha ? '[:alpha:]' : '').($allow_numeric ? 'd' : '').self::getRegexEscaped($allowed_chars).']%'; return preg_replace($regex, '', $input); }
public static function getWhitelisted($input, $allowed_chars = '', $allow_alpha = true, $allow_numeric = true) { $regex = '%[^'.($allow_alpha ? '[:alpha:]' : '').($allow_numeric ? 'd' : '').self::getRegexEscaped($allowed_chars).']%'; return preg_replace($regex, '', $input); } 
  • Когда есть белый список, там тоже должен быть черный список. Во-вторых, это должно быть реализовано с помощью str_replace ().
public function getBlacklisted($input, $forbidden_chars) { $regex = '%['.self::getRegexEscaped($forbidden_chars).']%'; return preg_replace($regex, '', $input); }
public function getBlacklisted($input, $forbidden_chars) { $regex = '%['.self::getRegexEscaped($forbidden_chars).']%'; return preg_replace($regex, '', $input); } 

Например, мы можем использовать более гибкий метод белых списков вместо Zend_Filter :: isName.

/* We only allow letters, spaces and dashes in names */ $name = Zend_Filter::getWhitelisted($name, " -", true, false);
/* We only allow letters, spaces and dashes in names */ $name = Zend_Filter::getWhitelisted($name, " -", true, false);