php验证概念

时间:2012-02-13 15:10:37

标签: php validation

首先,我不想使用任何框架,但我正在寻找一种使用白名单验证的好方法。我将把它应用于我收到的所有用户输入,我需要验证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 个答案:

答案 0 :(得分:1)

看来你只需要一些基本的验证,而不是“白名单”验证。

这个想法非常简单。

  1. 创建服务器端验证。用ctype_alpha,preg_match等。 (我希望你的问题不是从头开始教你这些功能)。
  2. 如果需要,可以通过对用于(1)的完全相同的验证例程进行AJAX调用来创建cleint端验证。
  3. 当然,你必须同时使用它们。
  4. 将用户标记为黑客似乎不是最好的主意。您将如何处理标记用户?

答案 1 :(得分:1)

我遇到了类似的问题,最后编写了自己的“输入数据类型”类。如果你只使用它们验证输入,这可能有点过分。但您可以构建使用混合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而言,请确保在与数据库交互时使用prepared statements,并在显示用户输入的数据时使用htmlentities

希望这有帮助。

答案 2 :(得分:0)

前段时间,我编写了一个轻量级验证类。也许你可以使用它。

例如:

$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