CryptographicException:الحشو هو غير صالح ولا يمكن إزالة التحقق من viewstate ماك فشل

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

سؤال

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

ملاحظات حول البيئة:

IIS 6.0 .NET FRAMEWORK 3.5 SP1 ملقم واحد ASP.NET

خطوات اتخذت بالفعل:

  <system.web>
    <machineKey validationKey="big encryption key"
      decryptionKey="big decryption key"
      validation="SHA1" decryption="AES" />

في صفحتي قاعدة كل صفحاتي

  protected override void OnInit(EventArgs e)
  {
    const string viewStateKey = "big key value";

    Page.ViewStateUserKey = viewStateKey;
  }

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

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

المحلول

أولا لنبدأ من الواقع ، هذا خطأ من وجهة نظر الدولة يحدث على إعادة النشر.

أيضا يجب أن أقول أنني فعلت كل الأشياء التي كل واحد يقترح القيام به لتجنب هذه المشكلة.ولدي جهاز واحد ، ولكن 2 من حمامات السباحة التي تعمل في نفس الصفحات.

لذلك شخص ما فعل هذا العمل, ، الأثير رجل ، الأثير أخرى بحث في الجهاز عن طريق 'الضغط' على الصفحات الخاصة بك ، أو بعض القراصنة في محاولة للتحقق من النظام الخاص بك عن المشاكل...

لدي مشاكل مماثلة (نادرة ولكن القائمة) ، وأخيرا وجدت أن الناس في محاولة الإختراق-اختبار صفحاتي.(من نفس IP لدي و هجمات حجب الخدمة)

لقد تعديل وظيفة LoadPageStateFromPersistenceMedium() أن ترجمة viewstate ، انظر عن طريق الدخول بالضبط ما كان الإدخال و من ما IPs...ثم بدأت في رصد هذه النتائج نرى أن عرض الدولة تم تغيير باليد - أو كانت فارغة تماما.

على خطأ أنا فقط إعادة توجيه له إلى نفس الصفحة...

هنا هو ما فعلته...

public abstract class BasePage : System.Web.UI.Page
{
    protected override object LoadPageStateFromPersistenceMedium()
    {
        try
        {
            .. return the base, or make here your decompress, or what ever...
            return base.LoadPageStateFromPersistenceMedium();            
        }
        catch (Exception x)
        {
            string vsString = Request.Form[__VIEWSTATE];
            string cThePage = Request.RawUrl;

            ...log the x.ToString() error...
            ...log the vsString...
            ...log the ip coming from...
            ...log the cThePage...

        // check by your self for local errors
            Debug.Fail("Fail to load view state ! Reason:" + x.ToString());
        }

        // if reach here, then have fail, so I reload the page - maybe here you
        // can place somthing like ?rnd=RandomNumber&ErrorId=1 and show a message
        Responce.Redirect(Request.RawUrl, true);        

        // the return is not used after the redirect
        return string.Empty;
    }    
}

السبب الثاني

الآن هناك أكثر من سبب لماذا يمكن أن يحدث هذا و السبب هو لأن بعض نقرة واحدة على الصفحة الخاصة بك قبل __EVENTVALIDATION يتم تحميلها.

هذا eventValidation يتم وضعها على زر آخر-حتى أن asp.net وجدت, وإذا كان لديك بعض منهم على العديد من مكان على الصفحة ، أو بالقرب من الزر ، ثم انتقل إلى نهاية الصفحة.

حتى إذا كنت ترى viewstate على الجزء العلوي من الصفحة حيث يتم التحقق ???ربما لم يتم تحميل صفحة الفاسدين؟, سريع جدا المستخدم انقر على الصفحة ؟

<input type="hidden" name="__EVENTVALIDATION" id="__EVENTVALIDATION" ... >

لتجنب هذا النوع من المشاكل جعلت جافا سكريبت بسيط أنني لا تدع ذلك اضغط على الزر إلا إذا كان هذا الإدخال تم تحميلها !!!.

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

هنا هو بلدي الحل النهائي مع مسج:(علما بأنني تحقق على PageLoad إذا eventvalidation موجود !).لدي هذا وضعت على بلدي MasterPages.

<script language="javascript" type="text/javascript">
    function AllowFormToRun()
    {
        var MyEventValidation = $("#__EVENTVALIDATION");

        if(MyEventValidation.length == 0 || MyEventValidation.val() == ""){
            alert("Please wait for the page to fully loaded.");
            return false;
        }

        return true; 
    }       
</script>

protected void Page_Load(object sender, EventArgs e)
{
    // I do not know if Page can be null - just in case I place it.
    if (Page != null && Page.EnableEventValidation)
    {
        Form.Attributes["onsubmit"] = "return AllowFormToRun();";
    }
}

يمكنك اختبار عن طريق وضع بالقرب من زر الصفحة الخاصة بك تأخير.

<% System.Threading.Thread.Sleep(5000); %>

التحديث

اليوم أرى في سجل هذه الرسالة مرة أخرى WebResource و ما اكتشفت أن بوت الحصول على الصفحات جعل كل حرف على الروابط في حالة انخفاض, بما في ذلك المعلمات ، لذلك كان هذا أحد أكثر من سبب لعدم الحصول على تصحيح ترميز السلسلة ، ورمي رسالة مثل الحشو هو غير صالح ولا يمكن إزالتها.

نأمل أن يكون هذا مساعدة أكثر.

نصائح أخرى

مسح صفحات الويب وجدت مع العديد من الكلمات من رسالة الخطأ تشير إلى أن هذا نوع من الخطأ الشائع نسبيا ، عادة ما تكون عشوائية (على الأقل في المظهر) و للأسف نادرا ما تشمل صريح العمل-حول أو تفسير...

وجود العديد من مماثلة ولكن في حالات مختلفة على الأرجح مرتبطة جدا العديد من أبنية مختلفة و التكوينات الأساسية التي يمكن أن يؤدي بطريقة أو بأخرى إلى عجز تشفير طبقة لتأكيد صحة ماك (رسالة رموز المصادقة) في طلب صفحة:

  • مزرعة الخادم الإعداد
  • عبر النطاقات / مشترك الصفحات
  • طرف ثالث القطعة المكتبات مثل هذه
  • الفعلية ASP منطق البرنامج (طبعا)

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

باختصار, وإليك بعض الأفكار و الأشياء للبحث عن:

  • بدء تسجيل *.axd الطلبات
  • محاولة co-تتعلق هذه axd الطلبات مع الأحداث خطأ في سجل استثناء
  • ابحث عن صفحات مع الموارد المراجع
  • إذا كان في مزرعة الإعداد ، التأكد من أن جميع الحالات استخدام نفس المفتاح (على ما يبدو مقتطف المقدمة في تلميح السؤال في عدة ملقمات IIS)
  • تكون مشبوهة من الصفحات مع 3rd الطرف التعادل الإضافية (خدمات البحث, البرامج التابعة لها...)

ويساعد هذا الأمل ;-)

هل أنت متأكد من مشكلتك هو التشفير ذات الصلة ، وليس بسبب المتضخم ViewState?إذا ViewState هو المشكلة ، يمكنك قطعة منه - تغيير قيمة الصفحات / MaxPageStateFieldLength في شبكة الإنترنت.التكوين

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