سؤال

لقد أنشأت نظامًا إخباريًا بسيطًا يحتوي على تعليقات باستخدام PHP وMySQL، وعمل بشكل رائع على خادم Apache المحلي الخاص بي، سواء على جهازي الذي يعمل بنظام Fedora 10 أو جهازي الذي يعمل بنظام Windows 7.الآن أواجه مشكلة، لقد قمت بتحميله إلى مضيف ويب ويستمر في إرجاع كافة "" و" باسم \" و \".

أعتقد أن هذا إما مضيف الويب الذي يضيفها تلقائيًا لأسباب أمنية أو أن MySQL هو ترتيب خاطئ، لكنني لم أتمكن من حل المشكلة بعد، باختبار عمليات ترتيب MySQL متعددة.

فيما يلي مثال للاستعلام:

mysql_query("INSERT INTO news (title, poster, text, time) VALUES ('$newstitle', '1', '$newstext', '$time')") or die(mysql_error());

$time يكون time(); $newstitle و $newstext يتم تحليلها من $_POST ويتم تشغيل كلاهما من خلال mysql_real_escape_string() قبل أن أقوم بتشغيل الاستعلام (أعتقد أن هذه قد تكون هي المشكلة، ولكن بما أنها جزء من الأمان فلا أريد إزالتها، وبما أنها لم تسبب مشاكل على خوادمي المحلية)

كملاحظة أخيرة:على خوادم أباتشي المحلية الخاصة بي كان لدي latin1_swedish_ci والتي لم تعمل على خادم مضيفي الويب.

يحرر:

تبدو هكذا في قاعدة البيانات:

\'\'\'\"\"\"

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

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

المحلول

من المحتمل أن تكون هذه الخطوط المائلة العكسية الإضافية اقتباسات سحرية.حاول تعطيلها أو إزالتها قبل معالجة البيانات.

نصائح أخرى

لا، أنت لا تريد تشغيل stripslashes().بدلاً من ذلك، قم بإعداد الخادم الخاص بك بشكل صحيح.

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

ثم قم بتشغيل mysql_real_escape_string() على البيانات، والذي سيضيف الخطوط المائلة للاستعلام فقط، وسيقوم بتخزين البيانات في قاعدة البيانات بدون الخطوط المائلة.

عندما تقوم بتحميل البيانات مرة أخرى، سيكون بإمكانك البدء ولن يكون هناك أي خطوط مائلة عكسية حول علامات الاقتباس.

يحرر:كما هو مذكور عدة مرات أدناه، وفي التعليقات، فإن الطريقة الصحيحة للقيام بذلك هي تعطيل علامات الاقتباس السحرية.لو قرأت السؤال جيدا وفهمته قبل الرد لكان أفضل ;)


mysql_real_escape_string() سوف يفعل ما يقوله، ويهرب من الأحرف ذات الصلة داخل السلسلة.يتم الهروب من علامات الاقتباس عن طريق وضع علامة بادئة عليها بحرف الهروب (شرطة مائلة للخلف في PHP والعديد من اللغات الأخرى). عند سحب البيانات مرة أخرى من قاعدة البيانات, ، افعل شيئًا مثل الجري stripslashes() (انظر وثيقة PHP) على المحتوى، لإزالة الخطوط المائلة من أشياء مثل علامات الاقتباس.

يحرر:كما ذكر Gumbo، قد يكون ذلك أيضًا بسبب تمكين Magic Quotes على الخادم.يجب عليك تعطيل هذه حسب إجابته.

نلقي نظرة على الخاص بك magic_quotes الإعدادات، ومقارنتها على الخوادم الخاصة بك.من المحتمل أن تكون خوادم منزلك كذلك magic_quotes معاقين (كما ينبغي أن يكونوا، منذ ذلك الحين تم إهمال الاقتباسات السحرية في الإصدارات الحالية من PHP)، ومن المحتمل أن يكون مضيف الويب الخاص بك قد قام بتمكينها (وهو أمر شائع للأسف).يمكنك استخدام:

<?php echo phpinfo(); ?>

للمقارنة السريعة.

إذا كان برنامج "magic_quotes" جديدًا بالنسبة لك، فقد ترغب في النظر في أمان PHP أكثر قليلاً قبل نشر أي شيء يهمك.

الأسئلة التي تحتوي على "اقتباسات_سحرية"

قد يكون لدى مضيفك اقتباسات سحرية ممكّن.

ينظر الى Magic_quotes_gpc.يمكنك إيقاف هذا عبر .htaccess واستخدام mysql_real_escape_string().

الحل الحقيقي هو استخدام البيانات المعدة في استعلامات الإدراج الخاصة بك.

إليك موقع يحتوي على مثال إدراج في الأعلى مباشرةً.

البيانات المعدة في PHP

الفائدة هي أنها أفضل الممارسات، والأثر الجانبي هو أنك لم تعد بحاجة إلى القلق بشأن تنظيف المدخلات ضد هجمات حقن SQL.

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