PDA

View Full Version : مشکل فیلتر کردن کاراکتر " ,'



mojtaba_java
یک شنبه 08 اردیبهشت 1387, 12:17 عصر
با سلام
من یک برنامه با jsp نوشتم
که بانک آن اسکیول است در صفحه اول پسورد دارم اما جدیدن دریافتم که اگه کسی در قسمت پسورد متن
'or'1'='1
رو بزنه وارد سایتم می شه
حالا می خواستم بدونم چطوری باید فیلتر بگذارم چون هر کاری می کنم کاراکتر ', "
رو نمی تونم برای شرطم بزارم

و دیگه اگه کسی چنین راه هایی رو برای ورود به سیستم می دونه بگه ممنون می شم.

handinux
یک شنبه 08 اردیبهشت 1387, 12:31 عصر
دوست عزیز اگر قصد دارید از حملات SQL injection جلوگیری کنید عبارت
preventin sql injection in jsp
رو جستجو کنید

unhandled_event
یک شنبه 08 اردیبهشت 1387, 13:31 عصر
سلام

یک راه حل ساده اینه که درست قبل از execute شدن statement ، هرچی ' هست رو در query با '' یعنی دوتا کتیشن بغل هم replace کنید. بعد ممکنه خطا هم اتفاق بیفته و sql exception بگیرید که باید به صفحه خطا redirect کنید اشکال نداره عوضش از هک شدن سایت جلوگیری کردید.

راه حل دوم اینه که username و password رو hash شده ذخیره کنید و هنگام مقایسه هم اول hash کنید بعدا مقایسه کنید.

javaphantom
دوشنبه 09 اردیبهشت 1387, 23:07 عصر
با سلام
من یک برنامه با jsp نوشتم
که بانک آن اسکیول است در صفحه اول پسورد دارم اما جدیدن دریافتم که اگه کسی در قسمت پسورد متن
'or'1'='1
رو بزنه وارد سایتم می شه
حالا می خواستم بدونم چطوری باید فیلتر بگذارم چون هر کاری می کنم کاراکتر ', "
رو نمی تونم برای شرطم بزارم

و دیگه اگه کسی چنین راه هایی رو برای ورود به سیستم می دونه بگه ممنون می شم.
دو تا روش داری برای اینکه بخوای ' ," و یا هر کارکتر دیگرو کنترل کنی.
اولیش از طریق اسکی کد
دومیش ''\' برای چاپ کردن یا کنترل کردن ' است
برای کنترل کردن " این کاراکتر یا چاپ کردنش '"' به همین راحتی
حالا وقتی من خواستم sql injection کنم مثل می زنم '1' عبارت من در قسمت سرور که بصورت یک string هست تبدیل به یک آرایه ای از کاراکتر می شه toCharArray() بعد به اندازه طول آریه حرکت کن و یکی یکی کاراکترای هر آرایه رو چک کن ببین مثلا این کاراکتر ' وجود داره یا نه
برای محکم کاری pattern های دیگری هست که خودت برو بخون

mazdadoost
یک شنبه 15 اردیبهشت 1387, 22:50 عصر
خبر بد sql injector های خبره هر جا که لازم باشه در نهایت inject میکنن.خبر خوب اما در هر حال اگه بتونید Hibrinate یا Cayenne رو یاد بگیرید میتونید کل ماجراهای دردناکتون رو با sql فراموش کنید.البته DB4O هم عالیه.امنیت ,سرعت در توسعه و کارائی ارمغان استفاده از O/R maper هاست.پس تا اون جا که ممکنه برای database پروگرامینک به O/R maper ها روی بیارین.در ضمنا پیشنهاد میکنم تو سورس فورگ دنبال فریم ورکی برای java که کارش مبارزه حرفه ای با انواع حملات sql هست جستجو کنی.

javaphantom
یک شنبه 15 اردیبهشت 1387, 23:49 عصر
خبر بد sql injector های خبره هر جا که لازم باشه در نهایت inject میکنن.خبر خوب اما در هر حال اگه بتونید Hibrinate یا Cayenne رو یاد بگیرید میتونید کل ماجراهای دردناکتون رو با sql فراموش کنید.البته DB4O هم عالیه.امنیت ,سرعت در توسعه و کارائی ارمغان استفاده از O/R maper هاست.پس تا اون جا که ممکنه برای database پروگرامینک به O/R maper ها روی بیارین.در ضمنا پیشنهاد میکنم تو سورس فورگ دنبال فریم ورکی برای java که کارش مبارزه حرفه ای با انواع حملات sql هست جستجو کنی.


در مورد خبر بدتون بگم ما چندین pattern در لایه های مختلف داریم که بتونیم جلوی SQL Injection رو بگیریم.

توی لایه presentation با JavaScript در قسمت Business روشهای بسیاری وجود داره و باید حتما چک بشه.
در لایه JDBC در لایه persistence از طریق EJB-QL
همه جوره راه است برای کنترل این کار
کد خواستید بهتون می دم

mazdadoost
دوشنبه 16 اردیبهشت 1387, 14:12 عصر
در مورد خبر بدتون بگم ما چندین pattern در لایه های مختلف داریم که بتونیم جلوی SQL Injection رو بگیریم.

توی لایه presentation با JavaScript در قسمت Business روشهای بسیاری وجود داره و باید حتما چک بشه.
در لایه JDBC در لایه persistence از طریق EJB-QL
همه جوره راه است برای کنترل این کار
کد خواستید بهتون می دم

با تشکر از توجهتون.
به چند کلمه عرض بنده توجه کنید: دوست عزیز :
چنانچه در زمینه پیاده سازی سیستم های امنیتی در مدل های نرم افزاری اطلاعات و تجربیاتی داشته باشید ,با یک اصل بسیار مهم که شعار همه معماران امنیت در زمینه های مختلف صنعت IT و حتی غیر از اون هست آشنایی دارید و اون اینه : هیچ صد امنیتی ذاتا نفوذ ناپذیر نیست. فهرست طولانی رفع عیوب و حفره های نرم افزار های مختلف و با کاربرد مختلف مبین این مسئله هست که امنیت یک مبارزه دائمی و خستگی ناپذیر. تعداد زیادی از این نرم افزار ها چه Open Source و چه Commercial توسط موسسات و شرکت های بزرگ با بهترین متدلژی های توسعه نرم افزار تهیه میشن.با این وجود ضعف های نرم افزاری فراوانی دارن که به مرور رفع میشن.همین فرومی که در برنامه نویس استفاده شده در Release Notes هاش و سایر سایت های برسی نکات امنیتی تعدادی حفره امنیتی از نوع Sql Injection داره که به مرور پیدا میشن. این نوع حمله خودش طیف گسترده ای از تکنیک ها داره.و این تنها یه نوع از حملات متنوع در دنیای نرم افزار.مثلا همین Sql Injection فقط که استفاده از Comentor (‘)نیست.(اینجکت کردن PL در اراکل Sort Pro در MSSql).این حتمیه که برنامه در Tire های مختلف باید امنیت رو رعایت کنه.اما : امنیت بهایی داره.یکی سرعته.دیگری قابلیت انتقال.و در محیطی مثل jsp به عنوان یک محیط توزیع شده سرعت و کارایی حیاتیه!نکته ای که من در نظر داشتم این بود که : بهتره از تجربیات دیگرانی که به صورت حرفه ای با امنیت درگیر بودن به عنوان Best Practice استفاده بشه.دوستی در آلمان دارم که تزش درباره برسی امنیت در پیاده سازی های مختلف امنیت در javaEE هست.
همه بدون استثنا از IBM ,Oracle و ...نقص های امنیتی فاجعه امیز دارن!خود شون هم قبول دارن!پس در نهایت میشه گفت ما به عنوان برنامه نویس میباسیت :
1-از Best Practice استفاده کنیم.
2-وقتمون رو با استفاده از Framework ها زنده کنیم.
3-در کل برای محیط های وب بهتره به جای استفاده از مدل های Heavy weigh مثل EJB حتی ویرایش 3 در جایی که نیاز به Transaction های سنگین نداریم از مدل های Light weigh مثل Hibernate یا Object Database هایی مثل DB4O برای persistent استفاده کنیم.اینها اصولا تمام اطلاعات شما رو در Database ذخیره میکنه بدون نوشتن یه خط کد.اینطور اصولا لازم نیست Sql String رو برای پیدا کردن Pattern های مخرب جستجو کنیم.خود اینها هم از جمله EJB دارای مکانیزم لازم برای امنیت هستن.
وقتی که بنده اقدام به جواب دادن سوال دوسته عزیزمون رو کردم هدفم ارائه روش کلی بود .کد نویسی کار سختی نیست.منطق پشت کد ها و اینکه Elegant باشنن مهمه.اینکه آدم اصولا با مقوله امنیت آشنایی داشته باشه باعث می شه که ما بتونیم مثلا کلاسی با متد های لازم رو برای مقابله با Pattern های مخرب Sql در رشته Sql به اسم SqlPatterFinder پیاده سازی کنیم.
حتما استفاده از API جاوا درExpression Regular ومتدهای خاص پردازش و پیدا کردن آلگو های جاوا جزعی از مهارت های برنامه نویسی اولیه برای یک برنامه نویس جاواست.اما پاسخ به مسئله امنیت به شکل حرفه ای اصولا فراتر از روشی مثل JavaScript validation میباشد ,که به راحتی میشه با حذف کد java scrip اونو Bypass کرد.
بنده منظورتون رو از Pattern در ای عبارت متوجه نشدم : ما چندین ,pattern در لایه های مختلف داریم که بتونیم جلوی SQL Injection رو بگیریم.این واژه معانی بسیاری در برنامه نویسی داره.اما تا حالا این روش استفاده رو ندیدم.یا احتمالا به شکل نا متعارفی استفاده شده.
همینطور معمولا در presentation Tire از جاوا اسکریپت برای اعتبار سنجی های ابتدایی استفاده میشه.نه Pattern Matching برای پیدا کردن Sql Injection .مثلا به کاربر بگیم : It Seems That Your User Name Is Unsafe Sql String!?
امیدوارم مفید بوده باشه.
با تشکر.