PDA

View Full Version : چک کردن متغیر id در url



saeidejafari
یک شنبه 18 فروردین 1387, 11:25 صبح
من می خوام یه تابع بنویسم که url سایت رو گرفته و متغیر هایی که توسط متد get فرستاده شده اند را چک کند تا کسی نتونه سایت رو از این طریق هک کنه یعنی تمام متغیرها با تمام مقداراشون.
یه متغیر id دارم که فقط می تونه عدد باشه . تو این تابع چک کردم که اگر مقدار id چیزی به غیر از عدد بود error بده اگه عدد بدم که مشکلی نداره و برنامه اجرا می شه ولی وقتی تو نوار آدرس مقدار اشتباه بهش می دم این پیغام خطا رو میده :

Unknown column 'e3' in 'where clause'

برای بقیه متغیر ها این مشکل رو نداشت ولی به id که می رسه اصلا به اون تابع نمی رسه که چک کنه :عصبانی:
یه مشکل دیگه هم که داره اینه که من توی این تابع چک می کنم که اگه توی url یکی از این حروف بود error بده :

' " * / >

ولی اگه به متغیر id مثلا مقدار ' بدم این خطا رو میده

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''''' at line 1

فکر کنم که قبل از اینکه این تابع اجرا بشه یا بهتر بگم برنامه اجرا بشه url به دیتا بیس فرستاده می شه و وقتی می خواد که اونو اجرا کنه این پیغام ها رو میده
اگه کسی می دونه مشکل چیه به من کمک کنه

tabib_m
یک شنبه 18 فروردین 1387, 20:08 عصر
مادامی که کدتو نذاری، نمیشه کاری کرد...

در ضمن، اگر برنامه ت دارای منطق درستی باشه، هیچ کس نمیتونه با صرف استفاده از متغیرهای GET، به سایتت کوچکترین لطمه ای وارد کنه... بیخودی خودتو درگیر این مسائل نکن... :)

موفق باشید

saeidejafari
دوشنبه 19 فروردین 1387, 08:59 صبح
منظورت از کد همون تابعیه که url رو چک می کنه؟
در ضمن من باچک کردن متغیرهای get در واقع می خوام کاری کنم که کسی نتونه به صورت دستی کدی رو اون بالا بنویسه

tabib_m
دوشنبه 19 فروردین 1387, 17:42 عصر
منظورت از کد همون تابعیه که url رو چک می کنه؟
بله


در ضمن من باچک کردن متغیرهای get در واقع می خوام کاری کنم که کسی نتونه به صورت دستی کدی رو اون بالا بنویسه
تونستنش که میتونه بنویسه. مسئله اینجاس که اگر منطق برنامه ت درست باشه، نوشتنش هیچ تأثیری در برنامه ت نداره...

saeidejafari
سه شنبه 20 فروردین 1387, 08:27 صبح
اینم کدی که گفته بودی در ضمن برنامه رو خودم ننوشتم فقط می خوام این تابع رو توش run کنم

function check_url($url)
{
$ref=array("lang","id");
$url=strtolower($url);
$i=strpos($url,"<");
if ($i>0)
return false;
if (in_array($url,array("'","*","-")))
return false;
$pos=strpos($url,"?");
if($pos)
{
$arr1=substr($url,$pos+1,strlen($url)-$pos);
if (strlen($arr1)>0){
$arrsplit=explode("&",$arr1);
foreach ($arrsplit as $single){
$piece=explode("=",$single);
if (!(in_array($piece[0],$ref))){
return false;
break;
}
switch ($piece[0]){
case 'lang':
if (!(in_array($piece[1],array("farsi","english")))){
return false;
}
break;
case 'id':
if ((gettype($piece[1])==integer))
return false;
if (($piece[1]<0) && ($piece[1]>1000))
return false;
break;

}
}
}
}
return true;
}

tabib_m
سه شنبه 20 فروردین 1387, 18:23 عصر
شرمنده م، ولی میتونم بگم تابع به درد نخوریه :)
1- خیلی راحتتر بود اگر از $_GET استفاده میکرد!
2- نیازی به فیلتر کردن عباراتی مثل > نداشت. بهترین راه اینه که از addslashes یا strip_tags استفاده کنی.
3- چرا id حتما باید عدد باشه؟ اگر عدد نباشه، چه اتفاقی ممکنه بیافته؟
4- اگر زبان خارج از اون دو مقدار باشه، چه اتفاقی میافته؟ فقط کافیه یک مقدار پیشفرض در نظر گرفته بشه!
و...
در کل نمیخوام بگم که چک کردن موارد ورودی، کار درستی نیست، بلکه میخوام بگم طوری نیست که آدم بخوات براش تابع بسازه و از طرفی هم دخلی در امنیت نداره!
نهایتش مثلا یه همچین کدی لازمه:


$lang=$_GET['lang'];
if($lang!='farsi' and $lang!='english') $lang='farsi';


که این موارد هم به امنیت مربوط نمیشه، بلکه به این مربوط میشه که برنامه به صورت مطلوب عمل کنه...

موفق باشید.

saeidejafari
پنج شنبه 22 فروردین 1387, 08:28 صبح
شما درست می گید .ممنون