检测包含html或不包含hii2的字符串

时间:2016-01-10 12:48:10

标签: php regex validation yii2

我在yii2中输入了一个字符串类型。我想检测发送的字符串以查看它是否包含HTML,然后阻止用户输入HTML标记。 在yii2中是否有验证器包括客户端验证器?

修改

检测脚本标记的高效正则表达式怎么样?

2 个答案:

答案 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