PDA

توجه ! این یک نسخه آرشیو شده میباشد و در این حالت شما عکسی را مشاهده نمیکنید برای مشاهده کامل متن و عکسها بر روی لینک مقابل کلیک کنید : در خواست تابعی برای ایمن سازی داده های دریافتی از کاربران



iroo
November 23rd, 2017, 15:56
سلام و خسته نباشید
من میخواستم یک تابع داشته باشم که هر داده ای رو از کاربر و یا url دریافت کردم رو از طریق این تابع ایمن سازی بکنم
ممنون میشم یک تابع جامع و مطمئن رو معرفی کنید
تشکر

server95
November 23rd, 2017, 19:03
سلام.
واسه این کار در PHP چندین تابع وجود داره. در ضمن باید مشخص بشه قصدتون دقیقا چه نوع ایمن سازی ای هست.
کلا 3 نوع ایمن سازی داده داریم:



Validating
Sanitizing
Escaping


Validating یا معتبرسازی: مواقعی استفاده میشه که شما قصد داشته باشی نوع خاصی از داده ورودی رو دریافت کنی. مثلا شماره موبایل، جنسیت، لیست شهرها و ...
نوشتن توابع معتبرسازی هم به عهده ی خود کاربره (البته هستند توابع و کلاسهایی که این کارها رو بکنند ولی برخی مواقع پیش میاد که شما میخوایید داده ورودی کاربر یه فرم خاص باشه. مثلا اجازه ثبت نام فقط و فقط با شماره خط رایتل! که چک کردن اینکه آیا داده ورودی مربوط به تلفن همراه، به فرم درست پیش شماره های رایتل دریافت شده یا خیر به عهده شماست و می تونید به فرض از تابع preg_match استفاده کنید.)

Sanitizing یا پاکسازی: در پاکسازی داده، داده ورودی در برابر انواع کدهای مخرب چک میشه. مثلا کابر کد جاوا اسکریپت تا تگهای html رو وارد نکنه و ... چند تا از توابع این کار:




htmlentities
htmlspecialchars
strip_tags


Escaping: اینجا باید حواسمون باشه که داده کاربر رو چطور میخواییم نمایش بدیم و چطور میخواییم ذخیره کنیم!
یعنی چی؟ یعنی ما با استفاده از Validating, Sanitizing مطمئن شدیم که کاربر داده های معتبری وارد کرده و همچنین مثلا تگهایی رو هم که دوست نداشتیم وارد کنه رو از ورودی پاک کردیم. حالا به فرض ممکنه ما اجازه داده باشیم که کاربر از تگهای b, center, video, audio, p, a واسه داده ورودی استفاده کرده باشه. خوب، تا اینجای کار مشکلی نیست و داده درست و طبق چیزی که خواستیم ذخیره شده. حالا واسه نمایش، شاید توی صفحه خاص دوست نداشته باشیم که اون داده کاربر که با تگ b و به صورت بولد ذخیره شده بوده به صورت بولد هم نمایش داده بشه! اینجاست که از escaping استفاده می کنیم. یعنی اجازه نمیدیم کدهای ذخیره شده، کاری رو که قرار بوده بکنند انجام بدند! امیدوارم متوجه شده باشید چی میگم. یا مثلا موقع ثبت داده در پایگاه داده. باید مواظب باشیم که SQL Injection کار دستمون نده!

شما اگه این 3 مفهوم رو خوب متوجه بشید به سادگی میتونید سایتتون رو ایمن کنید. البته اینها ایمن سازی سمت کد هستند و ایمن سازی سمت سرور هم یه بحث جداست!

راستی حواستون به cross site request forgery هم باشه. اگر ما سایت رو در برابر حملات XSS یا cross site scripting مقاوم کنیم باید حواسمون به cross site request forgery هم باشه که مبادا همه چی رو رعایت کرده باشیم ولی از این نقطه که اکثر افراد هم ازش غافل هستند سایتمون آسیب ببینه.

موفق باشید.

iroo
November 23rd, 2017, 19:17
سلام.واسه این کار در PHP چندین تابع وجود داره. در ضمن باید مشخص بشه قصدتون دقیقا چه نوع ایمن سازی ای هست. کلا 3 نوع ایمن سازی داده داریم:

Validating
Sanitizing
Escaping

Validating یا معتبرسازی: مواقعی استفاده میشه که شما قصد داشته باشی نوع خاصی از داده ورودی رو دریافت کنی. مثلا شماره موبایل، جنسیت، لیست شهرها و ...نوشتن توابع معتبرسازی هم به عهده ی خود کاربره (البته هستند توابع و کلاسهایی که این کارها رو بکنند ولی برخی مواقع پیش میاد که شما میخوایید داده ورودی کاربر یه فرم خاص باشه. مثلا اجازه ثبت نام فقط و فقط با شماره خط رایتل! که چک کردن اینکه آیا داده ورودی مربوط به تلفن همراه، به فرم درست پیش شماره های رایتل دریافت شده یا خیر به عهده شماست و می تونید به فرض از تابع preg_match استفاده کنید.)Sanitizing یا پاکسازی: در پاکسازی داده، داده ورودی در برابر انواع کدهای مخرب چک میشه. مثلا کابر کد جاوا اسکریپت تا تگهای html رو وارد نکنه و ... چند تا از توابع این کار:

htmlentities
htmlspecialchars
strip_tags

Escaping: اینجا باید حواسمون باشه که داده کاربر رو چطور میخواییم نمایش بدیم و چطور میخواییم ذخیره کنیم!یعنی چی؟ یعنی ما با استفاده از Validating, Sanitizing مطمئن شدیم که کاربر داده های معتبری وارد کرده و همچنین مثلا تگهایی رو هم که دوست نداشتیم وارد کنه رو از ورودی پاک کردیم. حالا به فرض ممکنه ما اجازه داده باشیم که کاربر از تگهای b, center, video, audio, p, a واسه داده ورودی استفاده کرده باشه. خوب، تا اینجای کار مشکلی نیست و داده درست و طبق چیزی که خواستیم ذخیره شده. حالا واسه نمایش، شاید توی صفحه خاص دوست نداشته باشیم که اون داده کاربر که با تگ b و به صورت بولد ذخیره شده بوده به صورت بولد هم نمایش داده بشه! اینجاست که از escaping استفاده می کنیم. یعنی اجازه نمیدیم کدهای ذخیره شده، کاری رو که قرار بوده بکنند انجام بدند! امیدوارم متوجه شده باشید چی میگم. یا مثلا موقع ثبت داده در پایگاه داده. باید مواظب باشیم که SQL Injection کار دستمون نده! شما اگه این 3 مفهوم رو خوب متوجه بشید به سادگی میتونید سایتتون رو ایمن کنید. البته اینها ایمن سازی سمت کد هستند و ایمن سازی سمت سرور هم یه بحث جداست! راستی حواستون به cross site request forgery هم باشه. اگر ما سایت رو در برابر حملات XSS یا cross site scripting مقاوم کنیم باید حواسمون به cross site request forgery هم باشه که مبادا همه چی رو رعایت کرده باشیم ولی از این نقطه که اکثر افراد هم ازش غافل هستند سایتمون آسیب ببینه.موفق باشید.بسیار ممنون و متشکرم از توضیحات جامعتونراستش داشتم یک ویدئو آموزشی رو میدیدم که هر داده ای رو از کاربر میگرفت یک بار میفرست به اون تابعمیخواستم اون تابع رو داشته باشیم cross site request forgery چیه این؟

server95
November 23rd, 2017, 19:50
بسیار ممنون و متشکرم از توضیحات جامعتونراستش داشتم یک ویدئو آموزشی رو میدیدم که هر داده ای رو از کاربر میگرفت یک بار میفرست به اون تابعمیخواستم اون تابع رو داشته باشیم cross site request forgery چیه این؟
خواهش میکنم.
شما میتونید تمام داده های ورودی رو بدید به یکی از توابع Sanitization و خیال خودتون رو راحت کنید اما نه صد در صد. در ضمن این کار توصیه نمیشه. شما باید بدونید میخوایید با داده چکار کنید و طبق همون سیاست پیش برید. مثلا شاید یه فیلد ورود داده ی ویزی ویگ داشته باشید. به فرض، استفاده از تابع strip_tags باعث میشه که ورودی کابر آسیب ببینه و درست ذخیره نشه!

CSRF هم مواقعی استفاده میشه که قصد داشته باشیم مطمئن باشیم داده ی کاربر از محل درست داره وارد میشه و نه جای دیگه! دقیقا همون کاری که wp nonce field توی وردپرس انجام میده.

AtrafNet
November 23rd, 2017, 20:11
سلام
این تابع پیشنهادی سایت w3schools.com برای ایمن سازی ورودی ها هستش:



function test_input($data) {
$data = trim($data);
$data = stripslashes($data);
$data = htmlspecialchars($data);
return $data;
}


منبع: https://www.w3schools.com/php/php_form_validation.asp

MJmoonwalk
November 24th, 2017, 12:29
خودت یک تابع بنویس بر اساس نوع ورودی ***** کنه:


function clean($input, $type)
{
switch($type)
{
case 'int':
return intval($input);
break;
case 'float':
return floatval($input);
break;
case 'nohtml':
return htmlspecialchars($input);
break;
case 'html':
return floatval($input);
break;
}
}

$input = mysqli_real_escape_string($input);