PDA

View Full Version : نظر درباره تابعی برای توابع امنیتی



djsaeedkhan
پنج شنبه 04 خرداد 1391, 13:00 عصر
با سلام
لطفا این تابع رو بررسی کنید و بگید آیا برای جلوگیری از این نوع حمله کافی هست یا نه

<?PHP
FUNCTION anti_injection( $user, $pass ) {
// We'll first get rid of any special characters using a simple regex statement.
// After that, we'll get rid of any SQL command words using a string replacment.
$banlist = ARRAY (
"insert", "select", "update", "delete", "distinct", "having", "truncate", "replace",
"handler", "like", " as ", "or ", "procedure", "limit", "order by", "group by", "asc", "desc"
);
// ---------------------------------------------
IF ( EREGI ( "[a-zA-Z0-9]+", $user ) ) {
$user = TRIM ( STR_REPLACE ( $banlist, '', STRTOLOWER ( $user ) ) );
} ELSE {
$user = NULL;
}
// ---------------------------------------------
// Now to make sure the given password is an alphanumerical string
// devoid of any special characters. strtolower() is being used
// because unfortunately, str_ireplace() only works with PHP5.
IF ( EREGI ( "[a-zA-Z0-9]+", $pass ) ) {
$pass = TRIM ( STR_REPLACE ( $banlist, '', STRTOLOWER ( $pass ) ) );
} ELSE {
$pass = NULL;
}
// ---------------------------------------------
// Now to make an array so we can dump these variables into the SQL query.
// If either user or pass is NULL (because of inclusion of illegal characters),
// the whole script will stop dead in its tracks.
$array = ARRAY ( 'user' => $user, 'pass' => $pass );
// ---------------------------------------------
IF ( IN_ARRAY ( NULL, $array ) ) {
DIE ( 'Invalid use of login and/or password. Please use a normal method.' );
} ELSE {
RETURN $array;
}
}
?>

djsaeedkhan
پنج شنبه 04 خرداد 1391, 13:02 عصر
<?php
// BadWordFilter
// This function does all the work. If $replace is 1 it will replace all bad words
// with the wildcard replacements. If $replace is 0 it will not replace anything.
// In either case, it will return 1 if it found bad words or 0 otherwise.
// Be sure to fill the $bads array with the bad words you want filtered.

FUNCTION BadWordFilter(&$text, $replace){

// fill this array with the bad words you want to filter and their replacements
$bads = ARRAY (
ARRAY("butt","b***"),
ARRAY("poop","p***"),
ARRAY("crap","c***")
);

IF($replace==1) { //we are replacing
$remember = $text;

FOR($i=0;$i<sizeof($bads);$i++) { //go through each bad word
$text = EREGI_REPLACE($bads[$i][0],$bads[$i][1],$text); //replace it
}

IF($remember!=$text) RETURN 1; //if there are any changes, return 1

} ELSE { //we are just checking

FOR($i=0;$i<sizeof($bads);$i++) { //go through each bad word
IF(EREGI($bads[$i][0],$text)) RETURN 1; //if we find any, return 1
}
}
}

// this will replace all bad words with their replacements. $any is 1 if it found any
$any = BadWordFilter($wordsToFilter,1);

// this will not repace any bad words. $any is 1 if it found any
$any = BadWordFilter($wordsToFilter,0);

?>

djsaeedkhan
پنج شنبه 04 خرداد 1391, 13:08 عصر
<?PHP

/* CLEANS AGAINST XSS
*
* NOTE all credits goes to codeigniter.com
* @param string $str - string to check
* @param string $charset - character set (default ISO-8859-1)
* @return string|bool $value sanitized string
*/

FUNCTION ft_xss($str, $charset = 'ISO-8859-1') {
/*
* Remove Null Characters
*
* This prevents sandwiching null characters
* between ASCII characters, like Java\0script.
*
*/
$str = PREG_REPLACE('/\0+/', '', $str);
$str = PREG_REPLACE('/(\\\\0)+/', '', $str);

/*
* Validate standard character entities
*
* Add a semicolon if missing. We do this to enable
* the conversion of entities to ASCII later.
*
*/
$str = PREG_REPLACE('#(&\#*\w+)[\x00-\x20]+;#u',"\\1;",$str);

/*
* Validate UTF16 two byte encoding (x00)
*
* Just as above, adds a semicolon if missing.
*
*/
$str = PREG_REPLACE('#(&\#x*)([0-9A-F]+);*#iu',"\\1\\2;",$str);

/*
* URL Decode
*
* Just in case stuff like this is submitted:
*
* <a href="http://%77%77%77%2E%67%6F%6F%67%6C%65%2E%63%6F%6D">Google</a>
*
* Note: Normally urldecode() would be easier but it removes plus signs
*
*/
$str = PREG_REPLACE("/([a-z0-9]{3})/i", "

eshpilen
پنج شنبه 04 خرداد 1391, 18:18 عصر
اون تابع اولی رو که یه بررسی کردم بنظرم خیلی مسخره است!
از کجا آوردیش؟
برنامه نویسی که چنین تابع مضحکی بنویسه معلومه چیزی بارش نیست. فقط کامنت گذاشتن و سینتاکس خوشگل و مرتب بلد بوده انگار!!

آخه یعنی چی که برداریم یکسری کلمات خیلی متداول رو حذف کنیم.
بعد همینطور برمیداره تمام پسورد رو lowercase میکنه. خب این یعنی چی؟ اولا اون پسورد دیگه پسورد اولیهء کاربر نمیشه و به مشکل میخوره احتمالا، دوما همه جا میگن پسورد متشکل از حروف بزرگ و کوچک باشه تا امنیتش بالا بره، اما این عملا نمیذاره از حروف بزرگ استفاده بشه.

ضمنا روش Black list (لیست سیاه) در مورد فیلتر کردن و موارد امنیتی اغلب صحیح نیست و مشکل داره.
هرکسی که مقدار کافی دانش و بینش اصولی امنیت رو داشته باشه باید این مسئله رو بدونه.
روش لیست سیاه یعنی اینکه فقط یکسری چیزهای غیرمجاز رو مشخص و فیلتر کنیم و بقیه هرچی باشه اجازه بدیم.

حالا بجای این تابع از mysql_real_escape_string استفاده کنیم مگه چه مشکلی داره؟!

بعضیا لقمه رو دور سر خودشون میچرخونن و نصفش رو هم میریزن روی زمین، حکایت این قبیل کارهاست.

djsaeedkhan
پنج شنبه 04 خرداد 1391, 19:09 عصر
حالا بجای این تابع از mysql_real_escape_string استفاده کنیم مگه چه مشکلی داره؟!
من از همین استفاده کردم ولی به راحتی SQL Injection شد. حتی شبیه سازی این تابع رو هم گذاشتم و بازم شد
خوب وقتی جواب نمیده چه کنیم؟

eshpilen
پنج شنبه 04 خرداد 1391, 20:55 عصر
من از همین استفاده کردم ولی به راحتی SQL Injection شد. حتی شبیه سازی این تابع رو هم گذاشتم و بازم شد
خوب وقتی جواب نمیده چه کنیم؟
test case اش رو بذار.
از کجا مطمئنی اشکال درجای دیگه ای نبوده؟
اگر مطمئنی این تابع نتونسته وظیفهء خودش رو انجام بده پس باید بتونی test case بذاری.

همینطوری کشکی نیست عزیز جان این تابع رو برای این کار گذاشتن و این همه مدت این همه ملت دارن استفاده میکنن. اگر نمیتونست جلوی SQL Injection رو بگیره که مسخره بود.
مشکل شما به احتمال زیاد جای دیگه و در جزییات دیگری هست.
انتظار نداشته باش امنیت به این سادگی باشه که یه تابع رو همینطور کورکورانه استفاده کنی و تمام مشکل و حفره های ممکن رفع بشن.
امنیت دانش و بینش و مهارت گسترده خودش رو میخواد. هر کاراکتر کدی رو که تایپ میکنی ممکنه به امنیت ارتباط داشته باشه و باید تمام موارد امنیتی رو بدونی و دائم مد نظر داشته باشی.

یه نمونه کد بذار که نشون میده این تابع جلوی SQL Injection رو نمیگیره.
میگم نمونه کد؛ نیای کل یه برنامه یا یک کد حجیم و پیچ در پیچ بزرگتر رو بذاری که کلی چیزای بی ربط داره؛ چون اونطوری ممکنه کسی وقت و حوصلش رو نداشته باشه که کلی وقت بذاره و تست و تحلیلش کنه.

djsaeedkhan
پنج شنبه 04 خرداد 1391, 21:12 عصر
سلام
من ابتدای یک صفحه یه مقدار رو بصورت GET میگیرم و بعد اون رو در کوری استفاده می کنم. همین. همین تابع mysql_real_escape_string رو گذاشتم و با برنامه تست کردم و به راحتی ازون گذشت. حتی mysql_real_escape_string رو بعد از کانکت به دیتابیس گذاشتم و باز هم نشد. شما بفرمایید

eshpilen
پنج شنبه 04 خرداد 1391, 21:35 عصر
گفتم کد بذار.
حرف زدن مبهم و کلیه.
الان منم بگم نه من تست کردم و همچین چیزی ندیدم.
ضمنا شاید منظورت از رد شدن اینه که چیزهایی که برای تست وارد کردی در دیتابیس درج شدن.
اینکه هر متن و اطلاعات در دیتابیس درج بشه مشکلی نداره و SQL Injection نیست. SQL Injection موقعی هست که هکر بتونه اون متن رو بعنوان فرامین SQL اجرا بکنه.
مثلا اگر عبارت drop table test رو در GET ارسال کردی و از تابع mysql_real_escape_string هم رد شد (که رد هم میشه، چون این تابع چیزی رو فیلتر/حذف نمیکنه، بلکه فقط Escape میکنه) و در دیتابیس ذخیره شد، این SQL Injection محسوب نمیشه و ارتباطی به ضعف تابع mysql_real_escape_string نداره.

djsaeedkhan
پنج شنبه 04 خرداد 1391, 22:14 عصر
گفتم کد بذار.
حرف زدن مبهم و کلیه.
الان منم بگم نه من تست کردم و همچین چیزی ندیدم.
راستش من طراحی سه لایه دارم و واسه همین همه کد ها یه جا نیست
طراحیش هم به این صورته که تو کنترلر آیدیGET رو میگیره و میده به یه کلاس. در کلاس مقدار آیدی اول Escape میشه و بعد به تابع ارسال میشه تا مقادیر دریافت بشه.
من توسط این تابع که اول ارسال کردم مقادیر ورودی رو چک می کنم و بعد مقدار نهایی رو به تابع برای گرفتن اطلاعات می دم
اگر متوجه منظور من شدید می تونم کد ها رو بذارم تاببینید
با تشکر

eshpilen
جمعه 05 خرداد 1391, 00:21 صبح
گفتم یه test case بده.
ببخشیدا، اما اگر نتونی دقیقا مکانیزم اشکال و مکان حفرهء برنامه رو پیدا کنی و یک test case بنویسی که اصلا نباید برنامه نویسی کنی.
ببخشید که رک میگم. ولی این مسئله خیلی واضحه. شما خودت از کدی که نوشتی سردرنمیاری و نمیتونی یک مورد به این گندگی و مهمی رو پیدا و حل کنی، بعد همینطور میای میگی مشکل از فلان تابعه که کارش رو درست انجام نمیده. منم میگم خب اگر این تابع ضعف داره با test case نشون بده. کار سختیه؟! یه برنامه نویس نباید توی این چیزا گیر کنه. اینکه چیزی نیست.
بنده هم که بیکار نیستم بیام با برنامهء شما سر و کله بزنم و کلی وقت و انرژی صرف کنم که درستش کنم. هرچند اگر خواستی کدش رو بذار شاید هم زیاد حجیم و پیچیده نباشه و با بررسی کمی بشه محل اشکال رو پیدا کرد.
اگر نمیتونی چیز به این سادگی و روشنی رو نشون بدی و ثابت کنی باید به قضاوت و ادعای خودت شک کنی.
تست کردن یک تابع که یک عملیات از ساده ترین نوع رو داره انجام میده کاری نیست که. فکر میکنی مثلا mysql_real_escape_string چکار میکنه؟ منطقش خیلی ساده هست و عملیاتی هم که انجام میده ساده است. اگر ضعفی در کارش باشه با چند خط کد ساده باید بشه نشون داد و ثابت کرد.

خلاصه اصولیش بخوام صحبت کنم باید اینطوری بگم که گفتم.
ولی بخوام تعارف کنم و اینکه کسی دلش نشکنه و دعوا نشه باید پشت پرده و با هزار ترفند و ابهام حرف بزنم که نمیدونم به کجا میخواد برسه.
آدم وقتی میره توی یه کار و تخصصی یک تعریف و پیشنیازها و وظایف و مسئولیت هایی داره و آدم باید پای حرفی که میزنه بایسته و به روش استانداردش نشون بده و ثابت کنه یا بگه نه درست نبود یا مطمئن نیستم. غیر از اینه؟

خودت از جزییات جریان کار برنامهء خودت سردرنمیاری و نمیتونی ساده کنی بعد انتظار داری همونطور بدی دیگران تحلیلش کنن.

کلی هم دارم از اول میگم کد بذار باز کد نمیذاری و تازه داری میپرسی که بذارم یا نه. حداقل از اول میذاشتی که دیگران نگاهی بهش بکنن.

ضمنا منم اگر حرف غیراصولی و غیرمنطقی زدم بیاید بگید داری یاوه میگی و خفه شو. البته با ارائه دلیل!
ولی بنده هرچی میگم بر اساس منطق و دانش و بینش و تحلیل کاملا عقلانی هست تاجاییکه میتونم. کاری به این ندارم که کسی ناراحت میشه یا نمیشه و خوشش میاد یا نمیاد و کسی ضایع میشه یا نمیشه، و انتظار هم ندارم که کسی رعایت خود منو بکنه در این مسائل.