检测字符串是否包含html yii2


detect an string contains html or not yii2

我在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,最简单的方法是测试'<..> ...</..>',但嵌套标记和格式不正确的标记总是一个问题。。有关的更多详细信息,请参阅此文档