ورود

نسخه کامل مشاهده نسخه کامل : encode و decode در php



arash_black
06-04-2008, 23:26
دوستان سلام،

ميدونيد كه يكي از نكات امنيتي در php استفاده از encode,decode هست كه براي تطبيق اطلاعات با پايگاه داده از اين تكنيك استفاده ميشه ، مي خواستم بدونم كدوم يك از دوستان اطلاعات بيشتري در اين زمينه داره و مي تونه اين تكنيك رو با مثال آموزش بده ؟؟؟

neopersia
07-04-2008, 09:37
encode و decode برای تطبیق با پایگاه داده ها!؟
میشه بیشتر توضیح بدی

dogtag
07-04-2008, 12:06
با اجازه ي اساتيد، من يه مختصري مي گم. شايد مفيد باشه.
ببينيد مثلاً شما يه پسورد رو مي گيري و مي ذاري توي ديتابيس
خب اگر encode نكني هر كس كه به DB دسترسي داره مي تونه بياد و پسورد رو بخونه
ولي ميان encode مي كنند كه به دو صورته:
1- برگشت پذير مثل ------
2- برگشت نا پذير مثل md5

كه البته امنيت md5 خيلي بيشتره و مياد هر چي كه بهش مي دي با به الگوريتم خاص تبديل مي كنه به يه كد 32 حرفي مثل اين "HFEUSSIEHFSI4E7HTE87THTJ4E8 U87T"
و حر وقت كه بخواي ببيتي پسورد وارد شده همين هست يا نه اول md5ش رو مي گيري و با اين مقايسه مي كني

اون ------ هم قابل برگشته. من اين رو بيشتر براي تبديل كاراكتر هاي بي خود به حروف از اين استفاده مي كنم
براي كاراكتر هايي مثل : يا در تر از اون كاراكتر 0 (منظورم chr(0) ه نه 0)
مثلاً "http : // wefwef . con" رو مي كنه "ahhkfkwk+fk043/fko349"

حالا اين هم يه مثال:

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید

arash_black
07-04-2008, 12:38
دوست عزيز از بابت توضيحاتت خيلي ممنونم،
حالا به نظر تو استفاده از اين روش مي تونه بهترين روش براي تامين امنيت صفحات login باشه ، منظورم اينه كه چون خطرات SQL Enjection وجود داره اين روش مي تونه بهترين روش باشه ؟

dogtag
07-04-2008, 13:11
نه اين جلوي injection رو نمي تونه بگيره
براي اون بايد از scape (الان دقيقاً جلوم نيست. شك دارم) استفاده كني

arash_black
07-04-2008, 15:23
نه اين جلوي injection رو نمي تونه بگيره
براي اون بايد از scape (الان دقيقاً جلوم نيست. شك دارم) استفاده كني


فرض كن در يك ديتا بيس username و password كاربران رو به صورت encode يا md5 وارد كرديم ، حالا در صفحه login يك user و pass از كاربر مي گيريم و پس از encode يا md5 كردن اون با پايگاه داده تطبيق ميديم ،‌ در اينصورت اگر كاربر حملات SQL ENJECTION وارد كنه ، دستوراتش به شكل md5 در مياد ، بنابراين از اين حملا ت جلوگيري ميشه ، اگر نظرت خلاف اين هست لطف ميكني بيشتر توضيح بدي ؟

MAXXX
07-04-2008, 18:07
بین شما یه سو تفاهم شده
عمل اینجکشن کشف پسورد هایه کاربران نیست !!! که با هش شدن پسورد ها ازش جلوگیری بشه
شما فرض کن پسورد هارو هم هش کردی
در دیتابیس یه فروشگاه هکری نفوذ میکنه و شماره و پسورد هایه کارت هایه اعتباری رو میدزده ولی چون پسورد یوزر ها هش شده بوده نمیتونه از پسورد و یوزرنیم کاربرا استفاده کنه حالا به نظر شما از حملش جلو گیری شده؟ وقتی که رمز کارت اعتباری رو داره دیگه پسورد و یوزر کاربری میخواد چیکار

dogtag
07-04-2008, 18:20
آرش جان تازه فهميدم چي ميگي
آره عزيز اگه شما هر چيزي كه از كاربر مي گيري رو encode كني ديگه عملاً SQL Injection انجام نميشه
ولي ايني كه MAXXX هم ميگه درسته يعني اگر يه جور ديگه وارد بشه مي تونه همه كار بكنه

ولي من توصيه مي كنم كه انجامش بدي. خوبه!

neopersia
07-04-2008, 18:55
درسته شاید بشه با انکود کردن همه داده ها جلوی حملات رو گرفت ولی منابع سیستم رو هدر میده چون هم سیستم باید انرژی بزاره اطلاعات رو انکود و دکود کنه و هم اینکه معمولاً حجم داده های انکود شده بیشتر از داده های معمولی هست و فضا و انرژی بیشتری از سرور دیتابیس میگیره
هر داده ای رو لازم نیست انکود کنیم و تو دیتابیس ذخیره کنم بهتره از این کار برای مواقع خاص استفاده بشه مثلاً همون کلمه عبور رو هش کنیم کافیه با md5 یا sha1 و روشهای مشابه اینها که قابل برگشت نباشه
برای داده های معمولی روشهای ساده تری هست مثلاً stripslashes که البته باید با دقت استفاده بشه چون ممکنه اگه داده های escape شده رو دوباره escape کنیم خطر اینجکشن هنوز هم وجود داره و فقط کار خودمونو خنثی کردیم
برای موتورهای دیتابیس مختلف هم توابع مختلفی وجود داره که داده ها رو اسکیپ میکنه مثلاً mysql_real_escape برای mysql یا sqlite_escape_string برای SQLite که بهتره از اونا برای آماده سازی اطلاعات برای قرار گرفتم تو کوئری ها استفاده کنیم
برای اطلاعات بیشتر در مورد این توابع میتونید به manual خود php مراجعه کنید که توضیحات خوبی داده

arash_black
08-04-2008, 01:32
دوستان عزيز از جواب هاي خيلي كاملتون ممنونم
خوب اين بحث از اهميت خيلي زيادي برخورداره چون ممكنه حاصل همه تلاش هاي برنامه نويس در عرض چند لحظه به باد بره و اصلا كل ديتابيس در يك چشم به هم زدن از بين بره ، خوب ايده من اين بود كه تمام درگاههاي ورود به يك سيستم ، كه با كاربر تعامل دارند و با دريافت مقادير از كاربر اون رو به صفحات شخصي هدايت مي كنند بايد از امنيت زيادي برخوردار باشند و به نظر من ، اگر بشه راه SQL INJECTION رو بست اونوقت ديكه ميشه ادعا كرد كه سيستم از امنيت خوبي برخورداره.
با توجه به اينكه در اين حملات از دستورات مشخصي استفاده ميشه و اينكه اين دستورات رو جناب هكر عموما در text box ها تايپ ميكنه ، راه هاي خيلي زيادي براي اين حملات گفته شده مثل : محدود كردن سايز text box يا استفاده از توابعي كه كاراكترهاي خطرناك مثل " يا / رو حذف ميكنند يا encode كردن مقاديري از ديتا بيس كه قراره مورد تطبيق قرار بگيرن و ... كه البته همشون مطلق نيستند .
با توجه به اطلاعات محدود خودم ، به نظر ميزسه كه استفاده از رمز گذاري روش مناسبيه ، اما حالا كه بحث داره به جاي خوبي ميرسه ، مي خوام از شما خواهش كنم كه ايده هاتون رو براي ايمن كردن سيستم و جلوگيري از حملات احتمالي بيان كنيد تا بيشتر بحث كنيم . ممنون

dogtag
08-04-2008, 07:42
فكر كنم توي سايت irphp يا يه همچين چيز هايي يه سري مقاله راجع بهش بود
وقت كنم پيدا مي كنم برات