我在yii2中有一个字符串类型的输入。我想检测发送的字符串,看看它是否包含HTML,然后阻止用户输入HTML标记。yii2中是否有包含客户端验证器的验证器?
编辑
如何一个有效的正则表达式来检测脚本标记?
经过2个小时的持续工作,我找到了一个带有自定义验证器的解决方案。这是我解决这个问题的方法:
<?php
/**
* User: Behzad
* Date: 1/10/2016
* Time: 6:31 PM
*/
namespace app'components;
use yii'validators'Validator;
class NoScriptValidator extends Validator
{
public function init()
{
parent::init();
$this->message = 'لطفا رشته صحیح وارد نمایید';
}
public function validateAttribute($model, $attribute)
{
$value = $model->$attribute;
if (strpos($value, '<script') !== false) {
$model->addError($attribute, $this->message);
}
}
public function clientValidateAttribute($model, $attribute, $view)
{
$message = json_encode($this->message, JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE);
return <<<JS
if(value.indexOf("<script") >= 0){
messages.push($message);
}
JS;
}
}
?>
这是我的模型的规则函数:
public function rules()
{
return [
[['title', 'language_id', 'project_type_id', 'text_type_id', 'description', 'deadline_day', 'deadline_time', 'doing_way_id', 'pawn_money', 'project_status', 'offerer_id', 'creation_date'], 'required'],
[['language_id', 'project_type_id', 'text_type_id', 'pages', 'deadline_day', 'deadline_time', 'doing_way_id', 'user_id', 'pawn_money', 'project_status', 'offerer_id', 'creation_date'], 'integer'],
[['is_group'], 'boolean'],
[['title'], 'string', 'max' => 128],
[['description'], 'string', 'max' => 1024],
[['file', 'template'], 'string', 'max' => 32],
['title', NoScriptValidator::className()],
['proj_file', 'file', 'extensions' => ['zip', 'rar', 'doc', 'docx', 'pdf', 'jpg', 'png'], 'maxSize' => 1024 * 1024 * 2],
['doc_template', 'file', 'extensions' => ['zip', 'rar', 'doc', 'docx', 'pdf', 'jpg', 'png', 'xls', 'xlsx'], 'maxSize' => 1024 * 1024 * 2],
];
}
不是为了检查,而是为了正确管理输入,当包含不正确的html标记时,不会创建损坏,您可以使用
Html::encode(...)
例如:
use yii'helpers'Html;
Html::encode($your_input);
这样可以防止像这样的恶意输入
$myString= "<script>alert('just a test for malicius code')</script>";
在简单的情况下
echo $myString;
您会看到来自javascript的警报。。。
带有
echo Html::encode($myString);
您可以看到编码字符串<script>alert('just a test for malicius code')</script>
其他方法可以尝试使用regex,最简单的方法是测试'<..> ...</..>'
,但嵌套标记和格式不正确的标记总是一个问题。。有关的更多详细信息,请参阅此文档