【问题标题】:detect an string contains html or not yii2检测字符串是否包含 html yii2
【发布时间】:2016-01-10 12:48:09
【问题描述】:

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

编辑

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

【问题讨论】:

    标签: php regex validation yii2


    【解决方案1】:

    继续工作 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],
            ];
        }
    

    【讨论】:

      【解决方案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);
      

      您会看到编码字符串 &lt;script&gt;alert('just a test for malicius code')&lt;/script&gt;

      您可以尝试使用正则表达式的其他方法,最简单的方法是测试'&lt;..&gt; ...&lt;/..&gt;',但嵌套标签和格式不正确的标签始终是一个问题。.see this doc for more detail

      【讨论】:

      • 感谢您的回复,有没有一种有效的方法来使用正则表达式来控制它?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-09-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-07-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多