سؤال

أولاً ، إذا كانت هناك طريقة حقيقية ورسمية للحصول على فلاش/فليكس NetConnectionاغتصب حالة الجلسة/ملف تعريف الارتباط لصفحة الويب المحيطة ، بحيث إذا قام المستخدم بتسجيل الدخول بالفعل ، فلن يحتاجوا إلى توفير بيانات الاعتماد مرة أخرى فقط لإعداد اتصال AMF ، فيرجى إيقافي الآن ونشر الإجابة الرسمية.

باستثناء ذلك ، أفترض أنه لا يوجد ، كما بحثت ويبدو أنه غير موجود. لقد قمت بإعداد وسيلة للقيام بذلك ، لكنني أريد بعض الملاحظات حول ما إذا كان آمنًا.

  1. سيذهب الوصول إلى صفحة غلاف لكائن فلاش دائمًا إلى تأمين HTTPS بسبب الوسيطة Django
  2. عندما يتم تحميل عرض الصفحة في Django ، فإنه ينشئ كائن "الاسم المستعار للجلسة" مع مفتاح فريد يشير إلى الجلسة الحالية في اللعب (حيث قام شخص بتسجيل الدخول ظاهريًا)
  3. يتم حفظ نموذج الاسم المستعار للجلسة ، ويتم وضع هذا المفتاح في ملف تعريف الارتباط الذي يكون مفتاحه سلسلة عشوائية أخرى ، نسميها عشوائي
  4. يتم تمرير اسم مفتاح RandomCookie هذا كمتغير سياق وكُتب في HTML باعتباره flashvar إلى SWF
  5. يتم تحميل SWF أيضًا فقط عبر HTTPS
  6. يستخدم تطبيق الفلاش ExternalInterface للاتصال بـ Java للاستيلاء على القيمة في موقع RandomCookie هذا ، كما يحذف ملف تعريف الارتباط
  7. ثم يخلق أ NetConnection إلى موقع HTTPS لخادم آمن ، اجتياز هذا العشوائي كوسيطة (البيانات ، وليس في عنوان URL) إلى RPC باستخدام تسجيل الدخول
  8. على جانب البوابة ، يبحث Pyamf إلى الاسم المستعار للجلسة ويحصل على الجلسة التي يشير إليها ، وتسجيلها في المستخدم بناءً على ذلك (ويحذف الاسم المستعار ، لذلك لا يمكن إعادة استخدامه)
  9. (ويمكن أن يضع طلب البوابة أيضًا تعيين ملف تعريف الارتباط وجلسة الجلسة. يحتوي على مفتاح الجلسة الصحيح)
  10. في هذه المرحلة ، يجب أن تلتزم قيم ملفات تعريف الارتباط التي تم إرجاعها على جانب الفلاش NetConnection بحيث تتم مصادقة المكالمات الإضافية (إذا تمت مصادقة الاتصال باستخدام اسم المستخدم وكلمة المرور بالطريقة العادية ، فهذا يعمل بالتأكيد ، لذلك أعتقد أن هذا رهان آمن ، سيؤدي الاختبار قريبًا إلى إثبات ذلك)

إذن ، هل هذا غير آمن أم هل سيعمل هذا بشكل صحيح؟ على حد علمي ، نظرًا لأن صفحة HTML مضمونة لتتمكن من تجاوز SSL ، فيجب تشفير بيانات المفتاح وملف تعريف الارتباط وعدم سرقةها. بعد ذلك ، يجب أن تكون المعلومات الموجودة فيها آمنة لاستخدام لمرة واحدة ككلمة مرور مؤقتة ، يتم إرسالها مرة أخرى عبر SSL لأن البوابة هي أيضًا HTTPS. بعد ذلك ، يستخدم نظام PyAMF العادي عبر HTTPs وعدم القيام بأي شيء خارج عن المألوف.

هل كانت مفيدة؟

المحلول

لا توجد ردود على هذا حتى الآن ، وبالتالي فإن أفضل ما يمكنني فعله هو التأكيد على أنه في الواقع يعمل جسديًا. للحصول على تفاصيل حول كيفية إعداد Flex Builder لكتابة مصارعي HTML الذين يتواصلون مع قوالب صفحات Django ، انظر منشوري الآخر. تم تحقيق ما سبق باستخدام مزيج من المذكورة أعلاه ، بالإضافة إلى:

صنع SessionAlias نموذج:

class SessionAlias(models.Model):
  alias   = models.CharField( max_length=40, primary_key=True )
  session = models.ForeignKey( Session )
  created = models.DateTimeField( auto_now_add=True )

تشير Flex إلى صفحة Django التي يتم تحميلها عبر طريقة عرض تحتوي على:

s = SessionAlias()
s.alias = SessionStore().session_key // generates new 40-char random
s.session = Session.objects.get( session_key=request.session.session_key )
s.save();
randomcookie = SessionStore().session_key // generates new 40-char random
kwargs['extra_context']['randomcookie'] = randomcookie
response = direct_to_template( request, **kwargs )
response.set_cookie( randomcookie, value=alias )

في Flex HTML-Wrapper ، حيث يكون RandomCookie هو الموقع للبحث عن الاسم المستعار:

<param name="flashVars" value="randomcookie={{randomcookie}}" />

في applicationComplete, ، حيث نحصل على عشوائي وتجد الاسم المستعار ، وتسجيل الدخول باستخدام ذلك:

var randomcookie:String = this.parameters["randomcookie"];
// randomcookie is something like "abc123"
var js:String = "function get_cookie(){return document.cookie;}";
var cookies:String = ExternalInterface.call(js).toString();
// cookies looks like "abc123=def456; sessionid=ghi789; ..."
var alias:String = // strip out the "def456"
mynetconnection.call( "loginByAlias", alias, successFunc, failureFunc );

والتي بدورها تصل إلى هذه بوابة Pyamf RPC:

from django.contrib.auth import SESSION_KEY, load_backend
from django.contrib.auth.models import User
from django.contrib import auth
from django.conf import settings
def loginByAlias( request, alias ):
  a = SessionAlias.objects.get( alias=alias )
  session_engine = __import__( settings.SESSION_ENGINE, {}, {}, [''] )
  session_wrapper = session_engine.SessionStore( a.session.session_key )
  user_id = session_wrapper.get( SESSION_KEY )
  user = User.objects.get( id=user_id )
  user.backend='django.contrib.auth.backends.ModelBackend'
  auth.login( request, user )
  a.delete()
  return whateverToFlash

وعند هذه المرحلة ، على الجانب الفلاش/المرن ، هذا خاص mynetconnection يحتفظ بحالة ملف تعريف الارتباط للجلسة التي يمكنها إجراء مكالمات مستقبلية بحيث داخل البوابة ، request.user هو المستخدم المصادق بشكل صحيح والذي قام بتسجيل الدخول إلى صفحة الويب في المقام الأول.

لاحظ مرة أخرى أن إعدادات التشغيل/التصحيح لـ Flex يجب أن تستخدم HTTPS ، وكذلك إعدادات البوابة لـ NetConnection. وعند إطلاق هذا ، يجب أن أتأكد من بقاء المستخدمين المصادقين على HTTPS.

أي معلومات أخرى من الناس سيكون موضع تقدير ، خاصة إذا كانت هناك تعليقات حقيقية حول الجوانب الأمنية لهذا ...

نصائح أخرى

لا تتيح IE الوصول إلى ملفات تعريف الارتباط في التطوير المحلي ، ولكن إذا قمت بنشر SWF ووضعت في مجال ، فيجب أن يلتقط الجلسة تمامًا مثل المتصفح الآخر. استخدم Firefox 3.6 لإنشاء تطبيقات Flex الخاصة بك محليًا.

تم اختباره في IE8 ، Firefox باستخدام بوابة Pyamf على Flex 3 مع NetConnection. تم تزيين وظيفة البوابة مع login_required

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top