سلام . بهترین راه برای جلوگیری از xss در yii2 چیه ؟ میخوام اصلا اسکریپت وارد دیتابیس نشه .
از این دستور توی Rule مدلم استفاده کردم ولی هنگامی که اسکریپت وارد میشه به اون فیلد اررور نمیده خودش اسکریپت رو حذف میکنه :
[['shop_tel'],'filter','filter'=>'yiihelpersHtmlPurifier::process'],
راهی هست بشه که اررور هم به اون فیلد بده ؟
فیلتر در اصل یک ویرایشگر هست نه یک ولیدیتور. برای هدفی که شما دارین، باید ولیدیتور دستی بنویسید. برای مثال:
public function rules() {
return [
['shop_tel', 'purify'],
// ...
];
}
public function purify($attribute, $params) {
if ($this->{$attribute} != yiihelpersHtmlPurifier::process($this->{$attribute})) {
$this->addError($attribute, 'Scripts are not allowed.');
}
}
جناب شهرکی متشکرم ازتون . واقعا عالی بود . یه سوال دیگه : آیا امکانش هست این تابع رو یه جای عمومی بنویسم و از مدلام صداش بزنم ؟ که نخوام تو تمام مدلام این تابع رو بنویسم
ممنونم جناب شهرکی . ببخشید من یک سوال دیگه هم داشتم . آیا راهی هست یک چیز مثل middleware رو برای تمام اکشن ها تعریف کرد . مثلا همین تابع purify رو برای تمام اکشن هام تعریف کنم . که دیگه سایت به هیچ عنوان باگ xss نداشته باشه ؟
میتونین یه مدل والد بسازین که توی اون rules تعریف شده باشه و برای تمام اتریبیوتها این ولیدیتور تعریف شده باشه و بعد توی فرزند، با ادغام آرایه موردنظرتون با parent::rules ولیدیتورهای جدید رو معرفی کنین. البته ایمنترین روش برای جلوگیری از باگ XSS اینه که موقع نمایش از Html::encode استفاده کنید.
سلام .
من کلاس ولیدیتورم رو به صورت زیر نوشتم :
<?php
namespace commonComponent;
use yiivalidatorsValidator;
class purifyValidator extends Validator
{
public function purifyValidator($model, $attribute)
{
if ($this->{$attribute} != yiihelpersHtmlPurifier::process($this->{$attribute})) {
$this->addError($model, $attribute, 'Scripts are not allowed.');
}
}
}
بعد به صورت زیر در مدلم ازش استفاده میکنم :
[['name','description','price'],purifyValidator::className()],
با اررور زیر مواجه میشم :
نقل قول:commonComponentpurifyValidator does not support validateValue().
ممنون میشم راهنمایی کنید
خوب و با دقت مستندات رو بخونین. توی ولیدیتور مستقل باید متد validateValue رو پیادهسازی کنید و دیگه اسم متد، مثل سازنده نیست که همنام با کلاس ذکر بشه.
استاد الان ولیدیتورم رو به این شکل نوشتم :
<?php
namespace commonComponent;
use yiivalidatorsValidator;
class purifyValidator extends Validator
{
public function validateAttribute($model, $attribute)
{
if ($this->{$attribute} != yiihelpersHtmlPurifier::process($this->{$attribute})) {
$this->addError($model, $attribute, 'Scripts are not allowed.');
}
}
public function validateValue($value){
}
}
الان این ارور رو میده :
Getting unknown property: commonComponentpurifyValidator::description
خوب دیگه اینجا باید بگین $model->{$attribute} چون $this دیگه به مدل اشاره نمیکنه و شئ خود ولیدیتور شماست. کمی دقت کنید این مشکلات اصلاً پیش نمیاد. برای همینه که میگم توی کار با فریمورکها، تسلط به مفاهیم شئگرایی و الگوهای طراحی لازمه وگرنه بیشتر دچار ابهام میشین.
سلام . استاد من توی سایتم از purify استفاده کردم . روی سیستم خودم کاملا درست جواب میده . توی بعضی از سیستم ها به مشکل برخوردم . مشکلم به این صورت هست که به متن زیر گیر میده :
ترکیبات: آرد گندم ـ روغن بدون ترانس ـ شکر سفید ـ شربت اینورت ـ پودر کامل تخم مرغ ـ لسیتین(E322) ـ بیکربنات سدیم(E500) ـ نمک خوراکی ـ اسانس پرتقال – ژل امولسی فایر – آب آشامیدنی
حداقل چربی : ۱۷ % حداقل قند : ۱۸ %
متوجه نمیشم چرا به رشته بالا گیر میده . به نظرتون مشکل کار میتونه کجا باشه ؟