Andy_wish
@Andy_wish

Фильтрация данных, покритикуйте мою реализацию?

Пишу свою cms. Данные будут поступать как от не зарегистрированных пользователей (login, password, email, комментарии к статьям, номера телефонов), так и от модераторов через админ панель (html код статей после CKEditor). html прогоняю через HTMLPurifier.
Так-же данные поступают через jsonRPC запросы, которые легко подделать или, например, прислать массив вместо числа.

Потом доверяю этим данным и работаю с ними в своих классах, без каких-либо проверок, вывожу в html-шаблонах.
Насколько правильно реализовал проверку данных? Может, код гуру пишут более красиво и лаконично?

Занесение в БД реализует другой класс, со своей отдельной фильтрацией.

public static function valid_int($val, $min=DEFAULT_INT_MIN, $max=DEFAULT_INT_MAX){
		if(is_array($val)) return false;
		$val=intval($val);
		if($val<$min OR $val>$max) return false;
		return $val;
}

public static function valid_string($val, $min=self::DEFAULT_STRING_MIN, $max=self::DEFAULT_STRING_MAX){
		if(is_array($val)) return false;
		$val=trim(htmlspecialchars(strip_tags($val), ENT_QUOTES));
		if(mb_strlen($val, 'utf-8')<$min OR mb_strlen($val, 'utf-8')>$max) return false;
		return $val;
}

public static function valid_html($val, $min=self::DEFAULT_HTML_MIN, $max=self::DEFAULT_HTML_MAX){
		if(is_array($val)) return false;
		$val=trim(self::$html_purifier->purify($val));
		if(mb_strlen($val, 'utf-8')<$min OR mb_strlen($val, 'utf-8')>$max) return false;
		return $val;
}

public static function valid_email($val, $min=self::DEFAULT_EMAIL_MIN, $max=self::DEFAULT_EMAIL_MAX){
		if(is_array($val)) return false;
		$val=trim($val);
		if(mb_strlen($val, 'utf-8')<$min OR mb_strlen($val, 'utf-8')>$max) return false;
		$p=strpos($val, '@');
		if($p===false) return false;
		return $val;
}

public static function valid_phone($val, $min=self::DEFAULT_PHONE_MIN, $max=self::DEFAULT_PHONE_MAX){
		if(is_array($val)) return false;
		$val=trim(htmlspecialchars(strip_tags($val), ENT_QUOTES));
		if(mb_strlen($val, 'utf-8')<$min OR mb_strlen($val, 'utf-8')>$max) return false;
		return $val;
}

public static function valid_login($val, $min=self::DEFAULT_LOGIN_MIN, $max=self::DEFAULT_LOGIN_MAX){
		if(is_array($val)) return false;
		$val=trim(htmlspecialchars(strip_tags($val), ENT_QUOTES));
		if(mb_strlen($val, 'utf-8')<$min OR mb_strlen($val, 'utf-8')>$max) return false;
		if (!preg_match("/^[a-z0-9][a-z0-9-_]+[a-z0-9]$/is", $s)) return false;
		return $val;
}

public static function valid_password($val, $min=self::DEFAULT_PASSWORD_MIN, $max=self::DEFAULT_PASSWORD_MAX){
		if(is_array($val)) return false;
		$val=trim($val);
		if(mb_strlen($val, 'utf-8')<$min OR mb_strlen($val, 'utf-8')>$max) return false;
		return $val;
}
  • Вопрос задан
  • 163 просмотра
Решения вопроса 1
index0h
@index0h
PHP, Golang. https://github.com/index0h
1. PSR-1, PSR-2, PSR-4 прочитай и используй.
2. Если что-то идет не так - не возвращай false, бросай исключение.
3. Для возврата множества типов значений должна быть реальная причина, то что вы в valid_password возвращаете либо пароль оттримленный (это вообще не задача валидации), либо false - это не правильно.
4. Требуйте конкретные типы входящих данных. Например для того же пароля - надо проверять что на входе строка. Иначе: https://3v4l.org/TjOJV

Посмотрите как надо https://github.com/ko-ko-ko/php-assert ))
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
Adamos
@Adamos
В PHP можно не плодить функции на каждый чих просто из-за того, что у них разные аргументы. Например, так:
$input = SmartInput::parsePost([
  'id' => SmartInput::INPUT_INT,
  'sex' => ['type' => SmartInput::INPUT_ENUM, 'enum' => ['male', 'female', 'none'], 'default' => 'none'],
  'birthday' => SmartInput::INPUT_DATE_OPTIONAL,
  'phone' => ['type' => SmartInput::TYPE_PHONE, 'multiple' => true]
]);

Внутри функции - цикл и case.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы