رتبه موضوع:
  • 0 رای - 0 میانگین
  • 1
  • 2
  • 3
  • 4
  • 5
جلوگیری از Xss با مدل
#1
سلام . بهترین راه برای جلوگیری از xss در yii2 چیه ؟ میخوام اصلا اسکریپت وارد دیتابیس نشه . 
از این دستور توی Rule مدلم استفاده کردم ولی هنگامی که اسکریپت وارد میشه به اون فیلد اررور نمیده خودش اسکریپت رو حذف میکنه :
[['shop_tel'],'filter','filter'=>'\yii\helpers\HtmlPurifier::process'],
راهی هست بشه که اررور هم به اون فیلد بده ؟
پاسخ
تشکر شده توسط:
#2
فیلتر در اصل یک ویرایشگر هست نه یک ولیدیتور. برای هدفی که شما دارین، باید ولیدیتور دستی بنویسید. برای مثال:
public function rules() {
    return [
        ['shop_tel', 'purify'],
        // ...
    ];
}

public function purify($attribute, $params) {
    if ($this->{$attribute} != \yii\helpers\HtmlPurifier::process($this->{$attribute})) {
        $this->addError($attribute, 'Scripts are not allowed.');
    }
}
پاسخ
تشکر شده توسط: hossein73
#3
جناب شهرکی متشکرم ازتون . واقعا عالی بود . یه سوال دیگه : آیا امکانش هست این تابع رو یه جای عمومی بنویسم و از مدلام صداش بزنم ؟ که نخوام تو تمام مدلام این تابع رو بنویسم
پاسخ
تشکر شده توسط:
#4
بله. درمورد Standalone Validators تحقیق کنید. این لینک میتونه به شما کمک کنه:

http://www.yiiframework.com/doc-2.0/guid...validators
پاسخ
تشکر شده توسط: hossein73
#5
ممنونم جناب شهرکی . ببخشید من یک سوال دیگه هم داشتم . آیا راهی هست یک چیز مثل middleware رو برای تمام اکشن ها تعریف کرد . مثلا همین تابع purify رو برای تمام اکشن هام تعریف کنم . که دیگه سایت به هیچ عنوان باگ xss نداشته باشه ؟
پاسخ
تشکر شده توسط:
#6
میتونین یه مدل والد بسازین که توی اون rules تعریف شده باشه و برای تمام اتریبیوت‌ها این ولیدیتور تعریف شده باشه و بعد توی فرزند، با ادغام آرایه موردنظرتون با parent::rules ولیدیتورهای جدید رو معرفی کنین. البته ایمن‌ترین روش برای جلوگیری از باگ XSS اینه که موقع نمایش از Html::encode استفاده کنید.
پاسخ
تشکر شده توسط: hossein73
#7
سلام .

من کلاس ولیدیتورم رو به صورت زیر نوشتم :

<?php
namespace common\Component;

use yii\validators\Validator;

class purifyValidator extends Validator
{
  public function purifyValidator($model, $attribute)
  {
      if ($this->{$attribute} != \yii\helpers\HtmlPurifier::process($this->{$attribute})) {
          $this->addError($model, $attribute, 'Scripts are not allowed.');
      }
  }
}
بعد به صورت زیر در مدلم ازش استفاده میکنم :
[['name','description','price'],purifyValidator::className()],

با اررور زیر مواجه میشم :
نقل قول:
common\Component\purifyValidator does not support validateValue().

ممنون میشم راهنمایی کنید
پاسخ
تشکر شده توسط:
#8
خوب و با دقت مستندات رو بخونین. توی ولیدیتور مستقل باید متد validateValue رو پیاده‌سازی کنید و دیگه اسم متد، مثل سازنده نیست که همنام با کلاس ذکر بشه.
پاسخ
تشکر شده توسط: hossein73
#9
استاد الان ولیدیتورم رو به این شکل نوشتم :
<?php
namespace common\Component;

use yii\validators\Validator;

class purifyValidator extends Validator
{
  
  public function validateAttribute($model, $attribute)
  {
      if ($this->{$attribute} != \yii\helpers\HtmlPurifier::process($this->{$attribute})) {
          $this->addError($model, $attribute, 'Scripts are not allowed.');
      }
  }

  public function validateValue($value){

  }
  
}

الان این ارور رو میده :
Getting unknown property: common\Component\purifyValidator::description
پاسخ
تشکر شده توسط:
#10
خوب دیگه اینجا باید بگین $model->{$attribute} چون $this دیگه به مدل اشاره نمیکنه و شئ خود ولیدیتور شماست. کمی دقت کنید این مشکلات اصلاً پیش نمیاد. برای همینه که میگم توی کار با فریمورکها، تسلط به مفاهیم شئ‌گرایی و الگوهای طراحی لازمه وگرنه بیشتر دچار ابهام میشین.
پاسخ
تشکر شده توسط: hossein73
#11
سلام . استاد من توی سایتم از purify استفاده کردم . روی سیستم خودم کاملا درست جواب میده . توی بعضی از سیستم ها به مشکل برخوردم . مشکلم به این صورت هست که به متن زیر گیر میده :

ترکیبات: آرد گندم ـ روغن بدون ترانس ـ شکر سفید ـ شربت اینورت ـ پودر کامل تخم مرغ ـ لسیتین(E322) ـ بیکربنات سدیم(E500) ـ نمک خوراکی ـ اسانس پرتقال – ژل امولسی فایر – آب آشامیدنی

حداقل چربی : ۱۷ % حداقل قند : ۱۸ %

متوجه نمیشم چرا به رشته بالا گیر میده . به نظرتون مشکل کار میتونه کجا باشه ؟
پاسخ
تشکر شده توسط:




کاربران در حال بازدید این موضوع: 1 مهمان