لماذا يجب أن تحذف باستخدام وظيفة HTTP أو حذف، بدلا من الحصول عليها؟

StackOverflow https://stackoverflow.com/questions/786070

  •  16-09-2019
  •  | 
  •  

سؤال

لقد كنت أعمل من خلال دروس Microsoft ASP.NET MVC، حيث تنتهي في هذه الصفحة

http://www.asp.net/learn/mvc/tutorial-32-cs.aspx.

يتم إجراء البيان التالي نحو أسفل هذه الصفحة:

بشكل عام، لا تريد إجراء تشغيل HTTP عند إجراء عملية عند استدعاء إجراء يعدل حالة تطبيق الويب الخاص بك. عند إجراء حذف، تريد إجراء وظيفة HTTP، أو أفضل بعد، عملية حذف HTTP.

هل هذا صحيح؟ هل يمكن لأي شخص أن يقدم شرحا أكثر تفصيلا للأسترجة وراء هذا البيان؟

تعديل

ويكيبيديا تنص على ما يلي:

يتم تعريف بعض الطرق (على سبيل المثال، الرأس والحصول على الخيارات والتتبع) بأنها آمنة، مما يعني أنها مخصصة لاسترجاع المعلومات فقط ويجب عدم تغيير حالة الخادم.

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

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

المحلول

إجابة جون Skeet هي الإجابة الكنسية. ولكن: افترض أن لديك رابط:

href = "\myApp\DeleteImportantData.aspx?UserID=27"

ويأتي Google-Bot جنبا إلى جنب وفهرست صفحتك؟ ما يحدث بعد ذلك؟

نصائح أخرى

الحصول على خالية تقليدية من الآثار الجانبية - بمعنى آخر، لا يغير الحالة. هذا يعني أن النتائج يمكن تخزينها مؤقتا، يمكن إجراء الإشارات المرجعية بأمان إلخ.

من عند HTTP 1.1 RFC 2616

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

على وجه الخصوص، أنشئت الاتفاقية بأنه يجب ألا يكون لطرق Get and Heat أهمية اتخاذ إجراء آخر غير الاسترجاع. يجب أن تعتبر هذه الطرق "آمنة". هذا يتيح لوكلاء المستخدمين تمثيل طرق أخرى، مثل النشر، وضع وحذف، بطريقة خاصة، بحيث يدرك المستخدم حقيقة أنه يتم طلب إجراء غير آمن ربما.

بشكل طبيعي، لا يمكن التأكد من أن الخادم لا يولد آثارا جانبية نتيجة لأداء طلب الحصول عليها؛ في الواقع، بعض الموارد الديناميكية تنظر في ذلك ميزة. التمييز الهام هنا هو أن المستخدم لم يطلب الآثار الجانبية، لذلك لا يمكن مسؤولية مسؤولية ذلك.

بصرف النظر عن المشكلات السيدة حول كونه idempotent، هناك جانب عملي: العناكب / الروبوتات / الزواحف وغيرها ستتبع الارتباطات التشعبية. إذا كانت لديك إجراء "حذف" كعمل ارتباط تشعبي يقوم بالحصول على ذلك، فيمكنك جوجل حذف جميع بياناتك بشكل مريح. يرى "العنكبوت من الموت".

مع المشاركات، هذا ليس مخاطرة.

مثال آخر..

http://example.com/admin/articles/delete/2

سيؤدي ذلك إلى حذف المقالة إذا قمت بتسجيل الدخول والحصول على الامتيازات الصحيحة. إذا قبل موقعك التعليقات على سبيل المثال، يقدم المستخدم الرابط كصورة؛ مثل ذلك:

<img src="http://example.com/admin/articles/delete/2" alt="This will delete your article."/>

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

قد لا تلاحظ حتى دون النظر في التعليمات البرمجية المصدر لأن معظم المتصفحات لن تظهر أي شيء إذا لم تتمكن من العثور على صورة.

نأمل أن تكون المنطقية.

يرجى الاطلاع على جوابي هنا. وبعد ينطبق بنفس القدر على هذا السؤال.

  • pregetch: سوف تستخدم الكثير من متصفحات الويب. مما يعني أنه سيتم تحميل صفحة قبل النقر فوق الرابط. توقع أن تقوم بالنقر فوق هذا الرابط لاحقا.
  • البوتات: هناك العديد من الروبوتات التي تفحص وفهرسة الإنترنت للحصول على معلومات. سوف يصدرون فقط الحصول على طلبات. لا تريد حذف شيء من طلب الحصول على هذا السبب.
  • التخزين المؤقت: احصل على طلبات HTTP من المفترض أن تتغير الحالة ويجب أن تكون idempotent. idempotent يعني أن إصدار طلب مرة واحدة، أو إصداره عدة مرات يعطي نفس النتيجة. أي لا توجد آثار جانبية. لهذا السبب، احصل على طلبات HTTP مرتبطة بإحكام للتخزين المؤقت.
  • HTTP Standard يقول ذلك: تقول معيار HTTP ما هي طريقة HTTP ل. تم تصميم العديد من البرامج لاستخدام معيار HTTP، ويفترضون أنك ستستخدمها بالطريقة التي يفترض بها. لذلك سيكون لديك سلوك غير محدد من مجموعة من البرامج العشوائية إذا لم تتبع.

بالإضافة إلى العناكب وطلبات الاضطرار إلى أن تكون idempotent هناك أيضا مشكلة أمنية مع طلبات الحصول عليها. يمكن لشخص ما إرسال مستخدمي عبر البريد الإلكتروني بسهولة

<img src="http://yoursite/Delete/Me" />

في النص، سوف يتقدم المستعرض بسعادة وحاول الوصول إلى المورد والوصول إليه. باستخدام POST ليس علاجا لهذه الأشياء (كما يمكنك تجميع مشاركة نموذج في JavaScript بسهولة كبيرة) ولكنها بداية جيدة.

حول هذا الموضوع (طرق استخدام HTTP)، أوصي بقراءة هذا المدونة وظيفة: http://blog.codevader.com/2008/11/02/Why-learning-http-ds-matter/

هذا هو في الواقع المشكلة المعاكسة: لماذا لا تستخدم المنشور عند عدم تغيير أي بيانات.

دعنا نقول أن لدينا تطبيق مصرفي عبر الإنترنت ونزور صفحة النقل. يختار المستخدم المسجل نقل 10 دولارات إلى حساب آخر.

النقر فوق إعادة توجيه زر إرسال (كطلب الحصول) إلى https://my.bank.com/users/transfer؟amount=10&destination=23LK3J2KJ31LK2J3K2J.

لكن اتصال الإنترنت بطيئا و / أو خادم (خوادم) مشغول بهذا بعد ضرب زر إرسال، يتم تحميل الصفحة الجديدة بطيئة.

يحصل المستخدم على الإحباط ويبدأ ضرب F5 (تحديث صفحة) بشراسة. خمن ماذا سيحدث؟ سيحدث أكثر من نقل واحد ربما إفراغ حساب المستخدم.


الآن إذا تم تقديم الطلب كمشافس (أو أي شيء آخر غير GET) أول F5 (تحديث الصفحة) سيجعل المستعرض سيسأل بلطف "هل أنت متأكد أنك تريد أن تفعل ذلك؟ يمكن أن يكون لها آثار جانبية [Bla Bla Bla ] ... "

بصرف النظر عن جميع الأسباب الممتازة المذكورة هنا، يمكن تسجيل الطلبات من قبل خادم المستلم، كما هو الحال في access.log. وبعد إذا أرسلت عبر بيانات حساسة مثل كلمات المرور في الطلب، فسيتم تسجيل الدخول كصامعي.

حتى لو تم التغليفين / المملح لتخزين DB الآمن، فإن خرق (أو شخص يبحث عن كتف الرجل) قد تكشف عنها. يجب أن تذهب هذه البيانات في جسم البريد.

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

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