PDA

View Full Version : سوال: کمک برای نوشتن یه function ( بعد از POST )



mamali-mohammad
جمعه 15 دی 1391, 20:20 عصر
سلام
بعد از POST کردن یه مقدار رو میخوام فیلتر کنم و از سه stripslashes و mysql_real_escape_string و htmlspecialchars بگذرونم
اگه قرار باشه هر مقدار رو دونه دونه انجام بدم سخت میشه
من اومدم این تابع رو نوشتم :

function filterpost($value)
{
$value = stripslashes($value);
$value = mysql_real_escape_string($value);
$value = htmlspecialchars($value);
return $value;
}

if(isset($_POST['name'])) {
$name=filterpost($_POST['name']);
}

این کار صحیح و منطقی هست ؟

siavashsay
جمعه 15 دی 1391, 20:30 عصر
بله !
روش درستی هست :)

colors
جمعه 15 دی 1391, 21:39 عصر
سلام

تابع stripslashes رو اشتباه به کار گرفتین. حتما قبل از اجرای این تابع چک کنید که get_magic_quotes_gpc فعال باشه.


<?php
function filterpost($value)
{
if(get_magic_quotes_gpc()){$value = stripslashes($value);}
$value = mysql_real_escape_string($value);
$value = htmlspecialchars($value);
return $value;
}
?>

siavashsay
جمعه 15 دی 1391, 21:51 عصر
سلام

تابع stripslashes رو اشتباه به کار گرفتین. حتما قبل از اجرای این تابع چک کنید که get_magic_quotes_gpc فعال باشه.


<?php
function filterpost($value)
{
if(get_magic_quotes_gpc()){$value = stripslashes($value);}
$value = mysql_real_escape_string($value);
$value = htmlspecialchars($value);
return $value;
}
?>
دوست عزیز فک نمیکنم نیازی به اینکار باشه !
به 2 علت !
1- الان بروی بیشتر هاست ها get_magic_quotes_gpc() فعال هست !
2- در صورتی که باز هم فعال نباشه در هر صورت بهتره این تابع stripslashes استفاده بشه ! چون اگر حتی کاربر هم بخواد slash رو وارد کنه باز هم اون رو فیلتر میکنه ! پس نباید حتما متکی به این باشیم که اگر get_magic_quotes_gpc() فعال بود از stripslashes استفاده کنیم !
اومدیم و یک هاست get_magic_quotes_gpc() رو فعال نکرده بود و هکر یا کاربر به صورت دستی slash وارد کرد ! اونجاس که دیگه ما stripslashes رو کار نکردیم و باعث بروز مشکل میشه !
در نتیجه بهتره در هر صورت از stripslashes استفاده شه ! :)
بازم نظر منه ! شاید بقیه اساتید نظر بهتری دارن :)
------
ضمنا دوست عزیز mamali-mohammad
شما بازم بهتره که از توابع دیگه برای فیلتر کردن ورودی هات استفاده کنی !
مثلا برای USERNAME خودتون اگر میخواید فقط شامل ( حروف - اعداد ) باشه از تابع ctype_alnum و اگر میخواید شامل ( حروف - اعداد - _ ) underline هم استفاده شه مثلا از این تابع :

function lnFilter($var){
$chk=preg_match('/^[a-zA-Z0-9_]+$/',$var);
if($chk==false){
return false;
}else{
return true;
}
}
--
برای ایمیل از :

function mailValid($var){
$chk=filter_var($var, FILTER_VALIDATE_EMAIL);
if($chk==false){
return false;
}else{
return true;
}
}

برای URL از :

function urlValid($var){
$chk=filter_var($var, FILTER_VALIDATE_URL);
if($chk==false){
return false;
}else{
return true;
}
}
و ... هم استفاده کنید ! فقط متکی به چند تابع نباشید ! :)
موفق باشید

colors
جمعه 15 دی 1391, 21:58 عصر
دوست عزیز فک نمیکنم نیازی به اینکار باشه !
به 2 علت !
1- الان بروی بیشتر هاست ها get_magic_quotes_gpc() فعال هست !
2- در صورتی که باز هم فعال نباشه در هر صورت بهتره این تابع stripslashes استفاده بشه ! چون اگر حتی کاربر هم بخواد slash رو وارد کنه باز هم اون رو فیلتر میکنه ! پس نباید حتما متکی به این باشیم که اگر get_magic_quotes_gpc() فعال بود از stripslashes استفاده کنیم !
اومدیم و یک هاست get_magic_quotes_gpc() رو فعال نکرده بود و هکر یا کاربر به صورت دستی slash وارد کرد ! اونجاس که دیگه ما stripslashes رو کار نکردیم و باعث بروز مشکل میشه !
در نتیجه بهتره در هر صورت از stripslashes استفاده شه ! :)
بازم نظر منه ! شاید بقیه اساتید نظر بهتری دارن :)

بله حق با شماست.
شاید بهتر باشه کد زیر رو تو صفحات common بزاریم. راحت...

if(get_magic_quotes_gpc()) {
$_GET=array_map('stripslashes', $_GET);
$_POST=array_map('stripslashes', $_POST);
$_COOKIE=array_map('stripslashes', $_COOKIE);
}

ravand
شنبه 16 دی 1391, 11:39 صبح
من این تاپیک رو دیدم یاد یه چیزی افتادم. به نظر من این اعتبارسنجی ایمیل فقط به این درد نمیخوره که به طرف بگیم که حتما ایمیلت رو درست بنویس. میتونه برای امنیت هم خوب باشه که کسی غیر از ایمیل مثلا دستوراتی برای هک ننویسه؟ درسته؟ البته میدونم که میتونه از تکست های دیگه هم کارش رو انجام بده.
میخواستم نظر شما رو بدونم.
متشکرم

mamali-mohammad
شنبه 16 دی 1391, 13:22 عصر
من این تاپیک رو دیدم یاد یه چیزی افتادم. به نظر من این اعتبارسنجی ایمیل فقط به این درد نمیخوره که به طرف بگیم که حتما ایمیلت رو درست بنویس. میتونه برای امنیت هم خوب باشه که کسی غیر از ایمیل مثلا دستوراتی برای هک ننویسه؟ درسته؟ البته میدونم که میتونه از تکست های دیگه هم کارش رو انجام بده.
میخواستم نظر شما رو بدونم.
متشکرم
نوشتن صحیح ایمیل برای اینه که بیشتر از اسپم جلوگیری بشه و برای امنیت همین 3 تا دستور به نظرم کافیه

eshpilen
شنبه 16 دی 1391, 14:25 عصر
2- در صورتی که باز هم فعال نباشه در هر صورت بهتره این تابع stripslashes استفاده بشه ! چون اگر حتی کاربر هم بخواد slash رو وارد کنه باز هم اون رو فیلتر میکنه ! پس نباید حتما متکی به این باشیم که اگر get_magic_quotes_gpc() فعال بود از stripslashes استفاده کنیم !
اومدیم و یک هاست get_magic_quotes_gpc() رو فعال نکرده بود و هکر یا کاربر به صورت دستی slash وارد کرد ! اونجاس که دیگه ما stripslashes رو کار نکردیم و باعث بروز مشکل میشه!

شما اصلا نمیدونید stripslashes برای چی استفاده میشه!
magic_quotes_gpc اگر روشن باشه میاد و یکسری کاراکترهای خاص (بقول بعضیا خطرناک!) رو با بک اسلش اسکیپ میکنه. درواقع اون بک اسلش هایی رو که stripslashes حذف میکنه اونایی هست که magic_quotes_gpc بخاطر مقاصد امنیتی اضافه کرده، نه اونایی که خود کاربر تایپ کرده.
حالا ما چرا عمل امنیتی magic_quotes_gpc رو اینطوری خنثی میکنیم؟ چون بعدش میخوایم از تابع mysql_real_escape_string استفاده کنیم که دوباره مشابه همین کار رو تکرار میکنه و نمیخوایم بک اسلش ها دوبل بشن! یعنی یک بار که magic_quotes_gpc بک اسلش هایی رو اضافه کرده، اونوقت یک بار دیگر هم mysql_real_escape_string بک اسلش هایی رو اضافه میکنه که عبارت ورودی در نتیجه خراب میشه، و برای امنیت هم هیچ فایدهء بیشتری نداره.
اگر magic_quotes_gpc خاموش باشه و شما stripslashes رو بکار ببرید البته خطر امنیتی نداره، ولی مثلا فرضا در پست کاربر اگر یک نمونه کد برنامه نویسی یا هرچیز دیگه وجود داشته که توش طبیعتا ممکنه کاراکتر اسلش (درواقع بک اسلش) وجود داشته باشه، اون بک اسلش ها حذف میشن و نمونه کد برنامه نویسی کاربر که فرضا میخواسته توی یک فروم یا بخش کامنت یک وبلاگ پست کنه خراب میشه.
یا مثلا ممکنه یکی بخواد توی پسوردش از اسلش استفاده کنه. خب چه عیبی داره؟ خیلی هم خوبه اتفاقا. نباید در کاراکترهای پسورد دست کاربر رو بیخودی بست.

شما اگر از mysql_real_escape_string موقع درج در دیتابیس استفاده کنید، هیچ خطری نداره، حالا میخواد صدتا اسلش و بک اسلش هم در ورودی کاربر باشه.
واسه موقعی هم که میخواید ورودی کاربر رو در صفحه/HTML درج کنید از این استفاده کنید:

htmlspecialchars($value, ENT_QUOTES, 'UTF-8');
حتی اگر اون دیتا قبلا از mysql_real_escape_string گذشته و شما اون رو مجددا از دیتابیس بیرون کشیدید.

الان چطوری مثلا در همین فرومها این همه کد و هر کاراکتر از این نوع کاراکترها درج میشه خطر بوجود نمیاره پس؟
بیا: //// // \\\\\\\ ' """ < > insert into delete <script>alert(1)</script> onclick="alert(1)"
الان من این همه کاراکتر و عبارت خطرناک فرستادم به برنامه نویس و در دیتابیس درج شد و در صفحه هم برای همه نمایش داده شد اما هیچی هم نشد :بامزه:

ravand
شنبه 16 دی 1391, 14:27 عصر
نوشتن صحیح ایمیل برای اینه که بیشتر از اسپم جلوگیری بشه و برای امنیت همین 3 تا دستور به نظرم کافیه
چجوری باعث جلوگیری از ارسال اسپم میشه؟ خب طرفی که بخواد مدام اسپم ارسال کنه میتونه یه ایمیل بی خودی بنویسه.
این حرفی که من زدم دلیلش این بود که کاربر مجبور جمله ای بنویسه که حتما توش @ باشه . و اگر هکر دستورات خودش رو تنها بنویسه مجبوره @ هم بذاره پس دستوراتش عمل نمیکنه. من این منطورم بود . آیا درست فکر میکنم؟

eshpilen
شنبه 16 دی 1391, 14:42 عصر
من این تاپیک رو دیدم یاد یه چیزی افتادم. به نظر من این اعتبارسنجی ایمیل فقط به این درد نمیخوره که به طرف بگیم که حتما ایمیلت رو درست بنویس. میتونه برای امنیت هم خوب باشه که کسی غیر از ایمیل مثلا دستوراتی برای هک ننویسه؟ درسته؟ البته میدونم که میتونه از تکست های دیگه هم کارش رو انجام بده.
میخواستم نظر شما رو بدونم.
متشکرم
واسه امنیت mysql_real_escape_string و htmlspecialchars کافی هستن.
ولی رگولار اکسپرشن های ایمیل هم معمولا طوری هستن که نمیشه درش کد و عبارت خطرناکی درج کرد. ولی بازم روی این نباید حساب کرد و بهتره باوجودی که الگوی ورودی ایمیل چک میشه، بازم از mysql_real_escape_string و htmlspecialchars استفاده کرد. اینطوری روش استانداردتریه و ریسک امنیتی به حداقل میرسه.
و البته فرضا برای امنیت هم که باشه، چک کردن وجود @ به تنهایی کافی نیست. باید از یک رگولار اکسپرشن کامل مثل این استفاده کنید:

/^[a-z0-9_\-+\.]+@([a-z0-9\-+]+\.)+[a-z]{2,5}$/i

mamali-mohammad
شنبه 16 دی 1391, 14:57 عصر
جناب eshpilen
اون تابع که دوستمون نوشت خوبه برای درج اطلاعات در دیتابیس ؟

<?php
function filterpost($value)
{
if(get_magic_quotes_gpc()){$value = stripslashes($value);}
$value = mysql_real_escape_string($value);
$value = htmlspecialchars($value);
return $value;
}
?>

eshpilen
شنبه 16 دی 1391, 15:17 عصر
آره خوبه.
فقط اون پارامترهای ENT_QUOTES, 'UTF-8' رو هم به htmlspecialchars اضافه کنید. توی نمونه کدی که بالاتر گذاشتم هست.
ضمنا اصلا میشه htmlspecialchars رو موقع درج در دیتابیس حذف کرد، و فقط موقعی که از دیتابیس بیرون میکشیم و میخوایم در صفحه نمایش بدیم از htmlspecialchars استفاده کرد. چون htmlspecialchars به دیتابیس و SQL Injection مربوط نیست و به امنیت در HTML مربوط میشه. ولی حالا اینجا گذاشتید هم بنظرم مشکلی نداره و موقع واکشی و درج اطلاعات در صفحه هم طبیعتا نیازی نیست چون قبلا انجام شده.

darkface
یک شنبه 17 دی 1391, 09:52 صبح
چجوری باعث جلوگیری از ارسال اسپم میشه؟ خب طرفی که بخواد مدام اسپم ارسال کنه میتونه یه ایمیل بی خودی بنویسه.
این حرفی که من زدم دلیلش این بود که کاربر مجبور جمله ای بنویسه که حتما توش @ باشه . و اگر هکر دستورات خودش رو تنها بنویسه مجبوره @ هم بذاره پس دستوراتش عمل نمیکنه. من این منطورم بود . آیا درست فکر میکنم؟
به من نظر من اعتبار سنجی خالی کافی نیست .
برای جلوگیری از اسپم باید یه ایمیل تاییده براش بفرستی و طرف هم بره توی ایمیل روی یه لینک کلیک کنه تا تایید بشه این میشه درستش