我在yii2中输入了一个字符串类型。我想检测发送的字符串以查看它是否包含HTML,然后阻止用户输入HTML标记。 在yii2中是否有验证器包括客户端验证器?
修改
检测脚本标记的高效正则表达式怎么样?
答案 0 :(得分:2)
继续工作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],
];
}
答案 1 :(得分:1)
不是为了检查而是为了正确管理输入在包含不正确的html标记时不能创建damange
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>
另外,您可以尝试使用正则表达式,最简单的方法是测试'<..> ...</..>'
,但嵌套标记和格式不正确的标记始终是个问题。.see this doc for more detail