PDA

View Full Version : سوال: بهترین راه فیلتر کردن ورودی ها در PHP



siavashsay
سه شنبه 21 آذر 1391, 11:50 صبح
با سلام خدمت دوستان !
میخواست بدونم بهترین راه فیلتر کردن ورودی ها چیه ؟!
راستش خیلی جاها برای اینکه از ورود کاراکترهایی مثل : / * & <> و غیره جلوگیری کنن از تابع mysql_real_escape_string() یا توابعی شبیه به اون استفاده میکنن !
اما میخوام بدونم این روشی من صحیح و بدرد بخور هست یا نه ! به این صورت که ورودی رو با تابع str_replace() فیلتر کنیم :


$username=str_replace("/","",$username) ;

و یا اگر خواستیم جایی دوباره از / استفاده کنیم مثلا در بخش کامنت ها که کاربران بتونن ببینن اون رو اینطوری کد گذاری کنیم :
برای ریختن دو دیتابیس :


$username=str_replace("/","[slash]",$username) ;

و برای فراخونی مجدد :


$username=str_replace("[slash]","/",$username) ;

حالا بجای اون[slash] هر کدی که مد نظر خودتونو بذارین !
میخوام بدونم این روش موثر هست یا نه ؟!
ممنونم !

mtchabok
سه شنبه 21 آذر 1391, 12:30 عصر
سلام
اگه فقط منظورتون استفاده در دیتابیس هست همون تابع mysql_real_escape_string کافیه .

siavashsay
سه شنبه 21 آذر 1391, 12:39 عصر
استفاده در دیتابیس و فراخوانی مجدد ! هر 2 باهم !
چون اگه از mysql_raeal_escape_string استفاده شه ظاهرا \ به ورودی اضافه میکنه و موقع فراخوانی با همون \ فراخوانی میشه ! اما من نمیخوام این اتفاق بیفته !
آیا میشه کاری کرد ؟!

mtchabok
سه شنبه 21 آذر 1391, 12:57 عصر
بله استفاده از این تابع یک کاراکتر به برخی کاراکترها اضافه میشه ولی در هنگام فراخوانی همان ورودی که به دیتابیس دادید بر میگردونه و بدون کاراکتر اضافی .

2undercover
سه شنبه 21 آذر 1391, 14:06 عصر
شما همینطور می تونید از تابع perg_match() استفاده کنید به این صورت می تونید یک pattern خاص ایجاد کنید که اگر کاراکتر های مورد نظرتون توی رشته بود مقدار true برگردونه!یا اگر می خواهید کاراکتر خاصی جایگزین *,%,$,... بشه از تابع preg_replace استفاده کنید!

Unique
سه شنبه 21 آذر 1391, 14:41 عصر
دوست عزیز اگه کمی جستجو میکردین خیلی نطلب توی همین سایت پیدا میکردین ، ورودی ها را به دو منظور اصلی بررسی میکنند :

1 - بحث mysql injection هست که بهترین راه استفاده از parametrized queries هست و pdo و mysqli ازش پشتیبانی میکنند مورد بعدی هم استفاده از stripslashes در صورتی که get_magic_quotes_runtime برابر با true باشه و در نهایت استفاده از mysql_real_escape_string i هستش

2 - جلوگیری از حملات XSS که در این حالت شما باید مانع از کد های مخربی بشین که در قالب javascript و html بشین که بهترین راهش استفاده از کلاس موجود در http://htmlpurifier.org هست گرچه میشه با توابع htmlspecialchars و htmlentities هم تا حد زیادی جلوگیری کرد ! در این موارد دنبال white list ها باشین و نه blacklist ها !

siavashsay
سه شنبه 21 آذر 1391, 17:51 عصر
با تشکر از همه دوستانی که راهنمایی کردن !
اما میخواستم بدونم این راه بنده هم مفید و کار راه انداز هست یا باید 100 در 100 از این راههایی که شما دوستان معرفی کردید استفاده کرد ! :)

Unique
چهارشنبه 22 آذر 1391, 02:08 صبح
متاسفانه روش شما در مقابله با sql injection و XSS ناکارآمد هستش!

siavashsay
چهارشنبه 22 آذر 1391, 16:58 عصر
بنده یه جورایی قانع شدم ! اما فقط میخوام بدونم دلیلش چی هست ؟!
وقتی ورودی رو با اون تابع بده فیلتر میکنین و اون کاراکترها از ورودی حذف میشن چطوری میشه دوباره sql injection کرد ؟!

Unique
چهارشنبه 22 آذر 1391, 18:21 عصر
نمیخوام بشینم واستون مثال بزنم و آموزش inject بدم ! ولی به نظر شما وقتی میشه با دو تا تابع ناقابل مشکل sql injection را حل کرد چرا باید هی str_replace کنیم و خودمون را اذیت کنیم ؟ تازه به این فکرنیم که ایا همه چیز را فیلتر کردیم ؟

تازه پیشنهاد من استفاده از parametrized query ها هستش !

رضا قربانی
پنج شنبه 23 آذر 1391, 21:45 عصر
اینجا هم یک سری صحبت ها رد و بدل شده : http://barnamenevis.org/showthread.php?338730-%D8%A7%D9%85%D9%86%DB%8C%D8%AA-%DA%A9%D8%A7%D9%85%D9%84-%D8%AF%D8%B1-php&p=1496233&viewfull=1#post1496233