sql injection و تابع intval

Mohammadreza

Well-Known Member
سلام دوستان و اساتيد گرامي !

PHP:
$NewsID = intval( $_GET[ 'ID' ]);
$SQL = "SELECT * FROM `news` WHERE `ID` = $NewsID LIMIT 0,1";

به نظرتون اين راه راه مطمئني براي جلوگيري از تزريق دستور به اس كيو ال هست ؟!
البته به نظر من كه هست ! چون به هيچ عنوان نمي شه دستور رو از اين رد كرد !
چون دستور تبديل به INT مي شه بعد كوئري گرفته مي شه ! پس دستوري تزريق نمي شه !
حالا ممنون مي شم شما دوستان عزيز نظرتون رو بفرماييد !
 

tarhebartar

Member
خوب وقتی جواب معلومه دیگه نمیشه چیزی گفت , غیر از اینه ؟؟!!

بعد اینکه اگر غیر عدد بخوره 0 بر می گردونه !
 

k2-4u

Well-Known Member
فقط یک مشکل داره . اونم طول خروجی intval است
بهتره . با strlen محدودش کنید (از خطر Over Flow کردن احتمالی)
 

k2-4u

Well-Known Member
(از خطر Over Flow کردن احتمالی)
منظور از over flow
در اینجا اینه که . یک حجم زیادی اطلاعات رو مثلا در متغییر $_GET[ 'ID' ]
قرار بدن .
و مثلا باعث Over flow شدن Buffer سرور بشه
و قاصی که . در چنین شرایطی . امکان نفوز به وجود میاد
برای جلو گیری از چنین حملاتی میان طور متغییر های GET و POST
رو میگیرن . که بیشتر از حد مورد نیاز وارد برنامه نشه
البته apache و دیگر سیستم های موجود در php ممکنه از . وقوع چنین اتفاقاتی جلوگیری کنند
ولی باز هم باید مواضب باشید
 

Y.P.Y

Well-Known Member
سلام،
تابع intval خیلی خوبه. ولی بهتره قبل بکمک تابع is_int ورودی GET رو چک کنید. اگر Integer نبود عملیات رو لغو کنه.(مثلاً exit کنه یا به صفحه اصلی برگرده).

گروه آریا/شبگرد... برنامه نویس نیستند و هیچ کمکی نمی تونند بکنن. چراکه هیچ چیزیرو اصولی بلد نیستند(در حد نیاز بلدن)(البته نه فقط اینها).
فقط راه بزارید جلوشون بگید دست بکار بشن...

از این تابع هم می تونید استفاده کنید(براحتی هم تجزیه میشه):
PHP:
function &Clean_String($Str_Input, $Str_Type= 'all', $Str_Charset= 'ISO-8859-1', $Bln_HTMLEntities= false, $Bln_SubStr= false, $Lng_MaximumLength= 0)
{

		switch(strtolower($Str_Type)):
		case 'english':
		case 'eng': $Str_Input= preg_replace('/[^a-zA-Z]/i', '', &$Str_Input);
		break;

		case 'integer':
		case 'int': $Str_Input= preg_replace('/[^0-9+-]/i', '', &$Str_Input);
		break;

		case 'englishinteger':
		case 'engint': $Str_Input= preg_replace('/[^a-zA-Z0-9+-]/i', '', &$Str_Input);
		break;

		case 'num':
		case 'number': $Str_Input= preg_replace('/[^0-9+.\/-]/i', '', &$Str_Input);
		break;

		case 'email': $Str_Input= preg_replace('/[^a-zA-Z0-9@_.-]/i', '', &$Str_Input);
		break;

		case 'file': $Str_Input= preg_replace('/[^a-zA-Z0-9+_.-]/i', '', &$Str_Input);
		break;

		case 'ip': $Str_Input= preg_replace('/[^0-9.]/i', '', &$Str_Input);
		break;
		endswitch;

	if($Bln_SubStr): $Str_Input= mb_substr(&$Str_Input, 0, &$Lng_MaximumLength, &$Str_Charset);
	endif;
	if($Bln_HTMLEntities): $Str_Input= htmlentities(&$Str_Input, ENT_COMPAT, &$Str_Charset);
	endif;
	unset($Bln_HTMLEntities, $Bln_SubStr);
	return($Str_Input); 
}
 
آخرین ویرایش:

Mohammadreza

Well-Known Member
ممنونم از همگي ...
پس با intval كاري مي كنم كه فقط ورودي ها عدد باشه !
و با strlen جلوي ورود حجم زياد رو ميگيرم كه به سرور فشار نياد !
و البته ممنونم از تذكر شما كه اينها فقط مربوط به داده هاي عددي هست !
و من هم براي جاهاي كه متغير عددي هست از اين روش استفاده مي كنم !
باز هم تشكر
 

جدیدترین ارسال ها

بالا