لقد لاحظت أن الرموز التعبيرية تتعطل في موقع عام أقوم بتشغيله، وتم تعيين التحكم في الوصول إلى خاص وتم تمييزه على أنه آمن بالسبب access control post dictates security | source: post creator.
يقوم تشغيل مهمة uploads:secure_upload_analyse_and_update بإصلاح المشكلة ولكنها تحدث مرة أخرى بعد بضعة أيام. حدث هذا أيضًا مع شعار الموقع مرة واحدة ولكنه لم يحدث مرة أخرى أبدًا.
مرحباً @Wolftallemo، هذه مشكلة صعبة بعض الشيء عندما يتم دمج الرموز التعبيرية المخصصة (أو أي تحميل متاح للعامة قد يُستخدم في منشور) مع التحميلات الآمنة. منذ فترة، بدأنا في استخدام جدول UploadReference لمعرفة ما هو مرتبط بأي تحميل، ولكن عند الانتقال إلى هذا الجدول، قمنا بتعيين جميع أوقات created_at لتكون متماثلة. نتيجة لذلك، عندما نتحقق مما إذا كان الاستخدام الأول للتحميل عامًا أم لا لأغراض أمنية، يكون الترتيب خاطئًا في بعض الأحيان ونستخدم شيئًا خاطئًا، لأنه إذا كان كلا العنصرين لهما نفس created_at بالضبط، فإن PostgreSQL يقوم بعمله الخاص:
ذكرك لهذا جعلني أعيد فحص هذا الأمر مرة أخرى، وأعتقد أنه يمكننا التعامل مع هذا بشكل أفضل من خلال الترتيب حسب created_at ASCثمid ASC، لذلك إذا كانت هناك أي من هذه التعارضات، فيجب استخدام السجل الأول الحقيقي.
إذا استمرت المشاكل بعد دمج هذا (سأحاول دمجه اليوم) وقمت بتحميل موقعك، فيمكننا مناقشة خيارات أخرى، ولكن لدي شك في أن هذه هي المشكلة بالنسبة لك. يمكنك تأكيد ذلك عن طريق القيام بذلك ومقارنة النتائج على موقعك:
CustomEmoji.find_by(name: "success").upload.upload_references.order("created_at ASC")
CustomEmoji.find_by(name: "success").upload.upload_references.order("created_at ASC, id ASC")
يجب أن يحتوي الأول على Post كـ target_type، ويجب أن يحتوي الثاني على CustomEmoji كنوع الهدف.
من المثير للاهتمام، أنه يعيد الشيء الصحيح إذن. بالنسبة للتحميل المرتبط، هل يمكنك نشر قيم security_last_changed_reason و security_last_changed_at ومعرفة ما إذا كان access_control_post_id ممتلئًا؟ لا ينبغي أن يميز هذا التحميل بأنه آمن عندما يكون المرجع الأول هو الرموز التعبيرية المخصصة. جرب هذا أيضًا:
Upload.find(ID)
.upload_references
.joins(<<~SQL)
LEFT JOIN posts ON upload_references.target_type = 'Post' AND upload_references.target_id = posts.id
SQL
.where("posts.deleted_at IS NULL")
.order("upload_references.created_at ASC, upload_references.id ASC")
.first
مثير للاهتمام، وهل تم استخدام الرمز التعبيري المخصص في هذا المنشور؟ ماذا يتم إرجاعه عند تشغيل رمز مرجع التحميل أعلاه مع معرف التحميل هذا؟ سيكون تشغيل هذا مع سجل التحميل ونشر النتيجة مفيدًا أيضًا:
upload
.upload_references
.joins(<<~SQL)
LEFT JOIN posts ON upload_references.target_type = 'Post' AND upload_references.target_id = posts.id
SQL
.where("posts.deleted_at IS NULL")
.order("upload_references.created_at ASC, upload_references.id ASC")
.first
إذا احتجنا حقًا إلى ذلك، يمكنك ببساطة تعيين تاريخ ووقت سجل UploadReference الخاص بـ CustomEmoji ليكون أقدم من أي سجل UploadReference آخر لهذا التحميل، ولكن لا ينبغي عليك القيام بذلك.
كان يجب أن أوضح. معرف التحميل كان صحيحًا، ولكن معرف المنشور لم يكن كذلك (وهذه هي الطريقة التي انتهى بي الأمر بها مع المنشور الذي لا يحتوي على الرموز التعبيرية - الرمز الذي لصقته هنا كان صحيحًا، لكنني أخطأت في كتابته عند محاولة العثور عليه)
ويجب حل المشكلة… أعتقد حقًا أن هذه ستكون مشكلة في الغالب مع التحميلات القديمة منذ هذا الترحيل. شيء آخر قد تتمكن من القيام به هو حذف الرموز التعبيرية المخصصة، وإعادة تحميلها، ثم تشغيل: