首先,我不想使用任何框架,但我正在寻找一种使用白名单验证的好方法。我将把它应用于我收到的所有用户输入,我需要验证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不允许使用默认符号等。
有什么建议吗?例子?感谢您的时间和阅读,并为这个忙碌的问题感到抱歉。
答案 0 :(得分:1)
看来你只需要一些基本的验证,而不是“白名单”验证。
这个想法非常简单。
答案 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