Концепция проверки PHP - PullRequest
       1

Концепция проверки PHP

1 голос
/ 13 февраля 2012

Прежде всего, я не хочу использовать какую-либо инфраструктуру, но я ищу хороший способ использовать проверку белого списка. Я собираюсь применить его ко всем полученным пользовательским данным, мне нужна проверка для защиты XSS, и я также хочу применить различные форматы, например:

Пример 1 XSS.

<input type="text" name="test" value="<script>alert('test');</script" />

Пример 2 Дата.

<input type="text" name="test" value="31-05-2012" />

Пример 3 Время.

<input type="text" name="test" value="15:00" />

Пример 4 Максимальная длина.

<input type="text" name="test" value="short description" />

Пример 5 Минимальная длина.

<input type="text" name="test" value="min description" />

Пример 6 Только буквы и символы по умолчанию

<input type="text" name="test" value="hello world. This is à ö text input :P :) :S :$ =D !! ??" />

Пример 7 Только числовой

<input type="text" name="test" value="1234567890" />

Моя идея состоит в том, чтобы создать проверку сайта клиента и сервера, если пользователь пройдет проверку клиента (jQuery), он будет помечен как хакерский, поскольку пользователи по умолчанию не смогут пройти проверку стороны клиента.

Мой вопрос таков: как лучше всего применить проверку на стороне клиента и сервера для предотвращения XSS и применения регулярных выражений к полям. Существуют ли легковесные библиотеки PHP для проверки?

Я смотрел на:

ctype_alpha
preg_match

Но я не совсем уверен, что было бы лучше использовать, и ctype_alpha не разрешает символы по умолчанию и т. Д.

Любые советы? Примеры? Спасибо за ваше время и чтение, и извините за беспокойный вопрос.

Ответы [ 3 ]

1 голос
/ 13 февраля 2012

У меня была похожая проблема, и я закончил писать свои собственные классы "Input-Datatype". Это может быть немного чрезмерно, если вы используете их только для проверки ввода. Но вы могли бы создать функции проверки, которые используют набор функций PHP, таких как preg_match, is_numeric, strtotime и т. Д. *

Примером проверки даты будет:

public function validate(&$value) {

    $date = strtotime($value);

    if($date === false){
        //Error no valid date
    }else{

    if(isset($this->maxDate)){
        if($date>strtotime($this->maxDate)){ //maxDate being the maximal date allowed
            //Error max date exceeded
        }
    }

    if(isset($this->minDate)){
        if($date<strtotime($this->minDate)){ //minDate being the minimal date allowed
            //Error date too low
        }
    }

    $value = strftime($this->format,$date);  //format being the format in which the date should be saved
}

Другим примером для проверки текста может быть:

public function validate(&$value) {

    if (isset($value) && $value != "") {
        if(isset($this->maxLength)&&$this->maxLength!= ""){ //maxLength being the maximal number of characters
            if (strlen($value) > $this->maxLength) {
                //Error max length exceeded
            }
        }
    } else {
        if (!$this->allowNull) { //allowNull being a boolean: true if text can be empty
            //Error value is empty
        }
    }

    if(isset($this->regex)&&$this->regex!= ""){ //regex can be any regular expression, e.g: /[A-Za-z]/ for letters only
        if(!preg_match($this->regex, $value)){
            //Error value does not match expression
        }
    }
}

Что касается XSS, убедитесь, что вы используете подготовленные операторы при взаимодействии с базой данных и htmlentities при отображении введенных пользователем данных.

Надеюсь, это поможет.

1 голос
/ 13 февраля 2012

Кажется, вам нужна базовая проверка, а не «белый».

идея довольно проста.

  1. Создать проверку на стороне сервера. с ctype_alpha, preg_match и тому подобное. (Я надеюсь, что ваш вопрос не в том, чтобы научить вас этим функциям с нуля).
  2. Создайте проверку на стороне клиента, если хотите, путем вызова AJAX тех же самых процедур проверки, которые вы использовали для (1).
  3. Конечно, вы все равно должны использовать оба.
  4. Маркировка пользователей как хакеров кажется не лучшей идеей. Что ты собираешься делать с отмеченными пользователями?
0 голосов
/ 29 января 2013

Некоторое время назад я написал облегченный класс проверки. Может быть, вы можете использовать его.

Например:

$oValidator = new Validator();
$oValidator->setLanguage('en'); 
$oValidator->isValid('short description', 'max_length[4]');
echo $oValidator->getLastErrorMessage();
//The input can not exceed 4 characters in length.

$oValidator->isValid('min description', 'min_length[5]');
$oValidator->isValid('hello world. This is à ö text input :P :) :S :$ =D !! ??', 'min_length[5]');
$oValidator->isValid('1234567890', 'digits');

Определение правила:

/**
 * @ErrorMessage[lang=de] Die Eingabe muss mindestens %d Zeichen lang sein.
 * @ErrorMessage[lang=en] The input must be at least %d characters in length.
 */
public function check_min_length($mValue, $aParams)
{
    return (strlen($mValue) >= $aParams[0]);
}

Пример: http://sklueh.de/2013/01/lightweight-php-validator-neue-version/

GitHub: https://github.com/sklueh/Lightweight-PHP-Validator

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...