PDA

View Full Version : امنیت ajax



olampiad
جمعه 17 مهر 1394, 11:50 صبح
سلام و خسته نباشید به دوستان عزیز
سوالاتی در مورد امنیت jaax داشتم.
خودمون میدونیم که هرچیزی که سمت کاربر باشه امنیت پایینی داره:
حالا ajax هم از کد های javascript هستش و سمت کاربر محسوب میشه.
در این صورت چ طوری میتونیم امنیت رو تامین کنم.
منظورم اینه که یکی بیاد کدهای جاوااسکریپت رو دستکاری کنه و پشت سر هم به سرور درخواست بفرسته و باعث اختلال بشه.
در این مورد پیشنهاد و یا راه حلی دارید.
خیلی ممنون

Unique
جمعه 17 مهر 1394, 12:36 عصر
منظورم اینه که یکی بیاد کدهای جاوااسکریپت رو دستکاری کنه و پشت سر هم به سرور درخواست بفرسته و باعث اختلال بشه.
این کار را بدون ajax هم میشه انجام داد ،‌در مورد DDOS Attack بیشتر تحقیق کنید.

به طور کلی استفاده از ajax‌ با روش های مرسوم گذسته هیچ فرقی نداره و شما همون اطلاعات را سمت سرور به صورت GET یا POST ارسال میکنید و همون شکل قبلی میتونید ارزیابی کنید مقادیر ارسالی کاربر را. نمیدونم منظورتون از اینکه کاربر کد های جاوا اسکریپت را میبینه چیه !؟ مگه غیر از اینکه شما اطلاعات را سمت سرور ارسال میکنید و بعدش دریافت میکنید و توی DOM نمایش میدین چه کار دیگه ای انجام میدین که با روش های قبلی متفاوته ؟

حملات SQL Injection با توجه به همگانی شدن استفاده از PDO و Prepared Statment ها و بالا رفتن سطح آگاهی از escape کردن رشته ها جلوگیری میشه و ربطی به ajax یا form و url نداره.
حملات XSS هم کلا باید روی محتوا ارسالی کاربر بررسی بشه که با همون روش های قبلی قابل جلوگیریه.

saeedvir
جمعه 17 مهر 1394, 16:25 عصر
بله همین طور که جناب Unique (http://barnamenevis.org/member.php?11933-Unique) فرمودند ، امنیت باید سمت سرور فوق العاده رعایت بشه ، چون سمت کاربر کاملا قابل تغییر است.

شما فقط به یک دستورات منظم و ایمن سمت سرور نیاز دارید که خروجی امن و پایداری بده.

ravand
شنبه 18 مهر 1394, 07:32 صبح
یه سری چیزا هم باید برای کدهای جاوا اسکریپت رعایت بشه.
مثلا یکی توی یه شبکه ی اجتماعی میاد یه آدرسی براتون ارسال میکنه. شما تا اون ادرس رو باز میکنی یهو یکی از پست هات حذف میشه. خب پس باید با جاوا اسکریپت دستوری بذاری که یه پنجره باز بشه و بگه آیا از حذف این مطلب اطمینان دارید؟

us1234
شنبه 18 مهر 1394, 08:52 صبح
یه سری چیزا هم باید برای کدهای جاوا اسکریپت رعایت بشه.
مثلا یکی توی یه شبکه ی اجتماعی میاد یه آدرسی براتون ارسال میکنه. شما تا اون ادرس رو باز میکنی یهو یکی از پست هات حذف میشه. خب پس باید با جاوا اسکریپت دستوری بذاری که یه پنجره باز بشه و بگه آیا از حذف این مطلب اطمینان دارید؟

این یکی از روش های هک XSS است .
با کانفریم هم چیزی حل نمیشود چون میشه کاری کرد که عملیات بعد از کانفریم انجام شود .

باید هر لینک توکن داشته باشد بخصوص لینک هایی مثل حذف یا ویرایش و همچنین در قسمت هایی که کاربر می تواند کد html وارد کند ( مثل ادیتور ها و ... ) باید کدهای جاوا اسکریپت در خروجی دیفرم شود و قابلیت اجرا نداشته باشد .

H:Shojaei
شنبه 18 مهر 1394, 09:23 صبح
این یکی از روش های هک XSS است .
با کانفریم هم چیزی حل نمیشود چون میشه کاری کرد که عملیات بعد از کانفریم انجام شود .

باید هر لینک توکن داشته باشد بخصوص لینک هایی مثل حذف یا ویرایش و همچنین در قسمت هایی که کاربر می تواند کد html وارد کند ( مثل ادیتور ها و ... ) باید کدهای جاوا اسکریپت در خروجی دیفرم شود و قابلیت اجرا نداشته باشد .
منظور از این که لینک توکن داشته باشه رو میشه توضیح بدین یکم مساله رو بازتر کنید ممنون...

us1234
شنبه 18 مهر 1394, 16:52 عصر
منظور از این که لینک توکن داشته باشه رو میشه توضیح بدین یکم مساله رو بازتر کنید ممنون...

دقیقا کاری که با Csrf داخل فرم ها انجام میدهید ولی داخل پارامتر های get شده در لینک بذارید ...

H:Shojaei
شنبه 18 مهر 1394, 22:48 عصر
دقیقا کاری که با Csrf داخل فرم ها انجام میدهید ولی داخل پارامتر های get شده در لینک بذارید ...
خوب من از این مورد میخواستم استفاده کنم تو یه پروژه که نشد این کار به این صورته اگه اشتباه نکنم که یه مقدار رندوم ساخته میشه و هم داخل یک input قرار میگیره و هم داخل یه سشن درسته!؟ اگر اینطور باشه...
دلیلش این که من نتونستم از این مورد استفاده کنم میگم شاید راهی داره یا من اشتباه میکنم...
فرض کنید تو یه فروم کاربر یه مطالبی که خودش ایجاد کرده رو رو یکیش کلیک میکنه حالا ما مقدار رندوم رو تو اینپوت و سشن اون صفحه میذاریم تا اینجا مشکلی نیست اگر مثلا کاربر بخواد مطلب رو حذف کنه و با ایجکس این کار انجام بشه همه اطلاعات ارسال میشه مقدار اینپوت هم برابر سشن هست و اکی...
جالا فرض کنید کاربر این صفحه رو باز کرده و تو یه تب هست و میره یه مطلب دیگه رو روی یه تب دیگه باز میکنه اتفاقی که اینجا میافته اینه که سشن ما که تو تب قبلی شماره ۱ مقدار دهی شد و باید برابر با همون اینپوت همون صفحه باشه اینجا تغییر کرده اگر کاربر بخواد مطلبی که اول باز کرده رو حذف کنه نمیتونه چون مقدار سشن با اینپوتش یکی نیست و سشن تو تب جدید مقدار جدید گرفته!
این طبیعیه آیا!؟ واسه حلش من اومدم مقدار رندوم رو کلا برداشتم یه مقدار ثابت گذاشتم که این مشکل رفع بشه...
یه چیزی این که اون اینپوت که گفتم منظور همون متغیری هست که با ایجکس ارسال میشه به سرور و اولین بار هم تو لود صفحه مقدار میگیره...
اینجا چکار میشه کرد واسه این مورد!؟

us1234
یک شنبه 19 مهر 1394, 09:44 صبح
خوب من از این مورد میخواستم استفاده کنم تو یه پروژه که نشد این کار به این صورته اگه اشتباه نکنم که یه مقدار رندوم ساخته میشه و هم داخل یک input قرار میگیره و هم داخل یه سشن درسته!؟ اگر اینطور باشه...
دلیلش این که من نتونستم از این مورد استفاده کنم میگم شاید راهی داره یا من اشتباه میکنم...
فرض کنید تو یه فروم کاربر یه مطالبی که خودش ایجاد کرده رو رو یکیش کلیک میکنه حالا ما مقدار رندوم رو تو اینپوت و سشن اون صفحه میذاریم تا اینجا مشکلی نیست اگر مثلا کاربر بخواد مطلب رو حذف کنه و با ایجکس این کار انجام بشه همه اطلاعات ارسال میشه مقدار اینپوت هم برابر سشن هست و اکی...
جالا فرض کنید کاربر این صفحه رو باز کرده و تو یه تب هست و میره یه مطلب دیگه رو روی یه تب دیگه باز میکنه اتفاقی که اینجا میافته اینه که سشن ما که تو تب قبلی شماره ۱ مقدار دهی شد و باید برابر با همون اینپوت همون صفحه باشه اینجا تغییر کرده اگر کاربر بخواد مطلبی که اول باز کرده رو حذف کنه نمیتونه چون مقدار سشن با اینپوتش یکی نیست و سشن تو تب جدید مقدار جدید گرفته!
این طبیعیه آیا!؟ واسه حلش من اومدم مقدار رندوم رو کلا برداشتم یه مقدار ثابت گذاشتم که این مشکل رفع بشه...
یه چیزی این که اون اینپوت که گفتم منظور همون متغیری هست که با ایجکس ارسال میشه به سرور و اولین بار هم تو لود صفحه مقدار میگیره...
اینجا چکار میشه کرد واسه این مورد!؟

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

متغییر که با ایجکس ارسال میشود یا پست شود یا گت شود تفاوتی ندارد .
برای فرم ها ما داخل یک input مخفی قرار میدهیم ، برای لینک ها هم به صورت یک پارامتر به آخر لینک اضافه کنید

site.com?del.php?id=1&token=23423sdfesfgetgs

H:Shojaei
یک شنبه 19 مهر 1394, 12:13 عصر
از سشن استفاده نکنید .
برای هر کاربر لاگین کرده یک توکن منحصر به فرد درست کنید و داخل تیبل خود کاربر در یک فیلد ذخیره کنید .
وقتی کاربر از سایت خارج شد یا بعد از یک مدت که کاربر هیچ فعالیتی نداشت توکن را حذف کنید . ( نیاز به ست کردن کرون جاب هم نیست ، فقط کافیه وقتی کاربر خواست عملیات انجام دهد تاریخ آخرین عملیاتش را بررسی کنید ... )

متغییر که با ایجکس ارسال میشود یا پست شود یا گت شود تفاوتی ندارد .
برای فرم ها ما داخل یک input مخفی قرار میدهیم ، برای لینک ها هم به صورت یک پارامتر به آخر لینک اضافه کنید

site.com?del.php?id=1&token=23423sdfesfgetgs
آهان اکی ممنون...
۲تا سوال همیشه تو این مساله تو ذهنم بود این که الآن ما میایم یه توکن میذاریم واسه کاربر مدت زمانی که باید حذف بشه اگر کاربر کاری نکرد چقدر باید باشه روز دقیقه سال؟! اگر مثلا بگیم بعد ۱۰ دقیقه و وقتی کاربر گزینه به خاطر سپردن هنگام ورود رو زده باشه چی میشه باید اینجا دوباره لاگین کنه؟
و همچنین هر کاری که کاربر انجام میده یعنی باید این توکن رو بخونیم از دیتابیس یا همون اول که لاگین کرد بذاریمش داخل یه سشن کفایت میکنه؟!

us1234
یک شنبه 19 مهر 1394, 17:50 عصر
آهان اکی ممنون...
۲تا سوال همیشه تو این مساله تو ذهنم بود این که الآن ما میایم یه توکن میذاریم واسه کاربر مدت زمانی که باید حذف بشه اگر کاربر کاری نکرد چقدر باید باشه روز دقیقه سال؟! اگر مثلا بگیم بعد ۱۰ دقیقه و وقتی کاربر گزینه به خاطر سپردن هنگام ورود رو زده باشه چی میشه باید اینجا دوباره لاگین کنه؟
و همچنین هر کاری که کاربر انجام میده یعنی باید این توکن رو بخونیم از دیتابیس یا همون اول که لاگین کرد بذاریمش داخل یه سشن کفایت میکنه؟!

حذف توکن کاربر را لاگ اوت نمیکنه و البته از لفظ حذف نباید استفاده میکردم ، شما بعد از یک مدت توکن را تغییر دهید ... ( به نظر من 30 دقیقه )
توکن هم مثل بقیه مشخصات کاربر است . ( مگر شما مثلا نام کاربر را در سشن ذخیره میکنید ؟ oop کار نمیکنید ؟ )

H:Shojaei
یک شنبه 19 مهر 1394, 18:18 عصر
مگه شما اطلاعات کاربر رو چطور نگه میدارید!؟
من معملولا داخل سشن id کاربر رو نگه میدارم و وقتی نیاز باشه باقیه اطلاعات رو با کوئری میگیرم..

us1234
یک شنبه 19 مهر 1394, 20:04 عصر
مگه شما اطلاعات کاربر رو چطور نگه میدارید!؟
من معملولا داخل سشن id کاربر رو نگه میدارم و وقتی نیاز باشه باقیه اطلاعات رو با کوئری میگیرم..

اصول کار من هم دقیقا بهمین شکل است با تفاوت های زیادتر در خصوص چک کردن لاگین بودن کاربر .
مختصر بگم یک کلاس برای کاربر دارم که در سازنده کلاس همیشه یکسری متغییر عمومی داخل کلاس مقدار میگیرند .
مثلا یکی از متغییر ها نام کاربر یا هر اطلاعات دیگری می تواند باشد .

در خصوص دسترسی هم :

$user->uname;

به سادگی قابل دسترسی است .

$user در یکی از فایل های عمومی new instant شده است .

H:Shojaei
یک شنبه 19 مهر 1394, 20:30 عصر
اصول کار من هم دقیقا بهمین شکل است با تفاوت های زیادتر در خصوص چک کردن لاگین بودن کاربر .
مختصر بگم یک کلاس برای کاربر دارم که در سازنده کلاس همیشه یکسری متغییر عمومی داخل کلاس مقدار میگیرند .
مثلا یکی از متغییر ها نام کاربر یا هر اطلاعات دیگری می تواند باشد .

در خصوص دسترسی هم :

$user->uname;

به سادگی قابل دسترسی است .

$user در یکی از فایل های عمومی new instant شده است .
یعنی عملا هروقت نیاز به اطلاعات دیگه کاربر داشته باشید کلاس رو صدا میزنید و مثلا id رو بهش ارسال میکنید و متغیر های کلاس مقدار میگیرن درسته!؟
و تو صفحات بعد از لاگین هم همون چک کردن سشن کفایت میکنه دیگه درسته!؟ یا تو هر صفحه باید کوئری وجود کاربر رو ایجاد کنیم و حتما از دیتابیس وجود کاربر رو بررسی کنیم!؟
ببخشید سوال زیاد پرسیدم گاهی به روش کار خودم شک میکنم و گیج میشم توش...

us1234
یک شنبه 19 مهر 1394, 22:01 عصر
یعنی عملا هروقت نیاز به اطلاعات دیگه کاربر داشته باشید کلاس رو صدا میزنید و مثلا id رو بهش ارسال میکنید و متغیر های کلاس مقدار میگیرن درسته!؟
و تو صفحات بعد از لاگین هم همون چک کردن سشن کفایت میکنه دیگه درسته!؟ یا تو هر صفحه باید کوئری وجود کاربر رو ایجاد کنیم و حتما از دیتابیس وجود کاربر رو بررسی کنیم!؟
ببخشید سوال زیاد پرسیدم گاهی به روش کار خودم شک میکنم و گیج میشم توش...

کاش در این خصوص تاپیک مجزا باز میکردید و بحث ارتباطی با موضوع تاپیک نداره و داره جلو میره ...

نیاز به صدا زدن در مواقع لوزم نیست ، new instant کلاس در یک فایل قرار دارد که وقتی کسی داخل سایت عملیات انجام میدهد کلاس لود میشود و در سازنده اول با کمک سشن و کوکی کاربر پیدا میشود و متغییر ها مقدار میگرند ، اگر کاربر لاگین نکرده باشد به صورت دیفالت کاربر مهمان در نظر گرفته میشود و متغییر های مقدار نال میگیرند .

H:Shojaei
دوشنبه 20 مهر 1394, 08:43 صبح
کاش در این خصوص تاپیک مجزا باز میکردید و بحث ارتباطی با موضوع تاپیک نداره و داره جلو میره ...

نیاز به صدا زدن در مواقع لوزم نیست ، new instant کلاس در یک فایل قرار دارد که وقتی کسی داخل سایت عملیات انجام میدهد کلاس لود میشود و در سازنده اول با کمک سشن و کوکی کاربر پیدا میشود و متغییر ها مقدار میگرند ، اگر کاربر لاگین نکرده باشد به صورت دیفالت کاربر مهمان در نظر گرفته میشود و متغییر های مقدار نال میگیرند .
درست میگید تاپیک خوبی میشد ولی دیگه تقریبا سوالی واسم نمونده به جز یکی دیگه اگه سوال دیگه داشتم تاپیک ایجاد میکنم...
یه کمکی گیج کننده جواب میدین یا شاید در سطح من (سطح پایینتری) جواب نمیدین که من تو هر جواب یه چیزی واسم نامفهومه...
این که کاربر پیدا میشود یعنی همین که کوئری میزنید دیگه که کاربر رو از دیتابیس بخونید و این کوئری رو هر جایی که نیاز مثلا به اسم کاربر که توی سشن ها نیست داشته باشیم باید بزنیم درسته؟
یعنی عملا شی که از کلاس ساخته میشه تو مواقعی که از صفحه ای که ساخته شده به صفحه دیگه میریم از بین میره دیگه درسته!؟ و اگر دوباره نیاز باشه باید اون کوئری صدا زده بشه دیگه؟
باز هم متشکر...

us1234
دوشنبه 20 مهر 1394, 13:58 عصر
درست میگید تاپیک خوبی میشد ولی دیگه تقریبا سوالی واسم نمونده به جز یکی دیگه اگه سوال دیگه داشتم تاپیک ایجاد میکنم...
یه کمکی گیج کننده جواب میدین یا شاید در سطح من (سطح پایینتری) جواب نمیدین که من تو هر جواب یه چیزی واسم نامفهومه...
این که کاربر پیدا میشود یعنی همین که کوئری میزنید دیگه که کاربر رو از دیتابیس بخونید و این کوئری رو هر جایی که نیاز مثلا به اسم کاربر که توی سشن ها نیست داشته باشیم باید بزنیم درسته؟
یعنی عملا شی که از کلاس ساخته میشه تو مواقعی که از صفحه ای که ساخته شده به صفحه دیگه میریم از بین میره دیگه درسته!؟ و اگر دوباره نیاز باشه باید اون کوئری صدا زده بشه دیگه؟
باز هم متشکر...

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

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

چیزهایی که در سشن یا کوکی ذخیره میشود cookie_id و username است .
cookie_id برای هر مرورگر تعریف میشود و اگر کوکی های کاربر دزده شد قابل استفاده در جای دیگر نخواهد بود ...