php mysql_real_escape_string () -> stripslashes () ترك حالات خطوط متعددة

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

سؤال

أواجه قضايا الهروب من / تجريد السلاسل مع PHP / MySQL - يبدو أن هناك دائما مائلة زائدة عن الزائدة.


دعونا نأخذ السلسلة التالية كمثال:

<span style="text-decoration:underline;">underline</span>


عند إضافة سلسلة إلى قاعدة البيانات، أهربها mysql_real_escape_string() ويتم تخزين ما يلي في قاعدة البيانات (تعديل: فحص هذا عن طريق الاستعلام عن قاعدة البيانات مباشرة مع تطبيق MySQL):

<span style=\\\"text-decoration:underline;\\\">underline</span>


عند القراءة مرة أخرى من قاعدة البيانات، أقوم بتمرير السلسلة stripslashes() ويتم إرجاع ما يلي:

<span style=\"text-decoration:underline;\">underline</span>


نظرا لأن الاقتباسات لا تزال هرب، فهي تنفصل HTML ولم يتم تسطير النص.


  1. لماذا mysql_real_escape_string() مضيفا ثلاثة خطوط مائلة، و stripslashes() إزالة خطين؟ أتوقع منهم إضافة / إزالة مائل واحد.
  2. كيف يمكنني منع هذا من يحدث؟
  3. هل اقتربت هذه الطريقة الصحيحة؟
هل كانت مفيدة؟

المحلول

أفضل حل

في ملف php.ini الخاص بك، احتمالات أن magic_quotes_gpc تم تعيين التوجيه على. يجب تعطيل ذلك لأسباب أمنية. إذا لم يكن لديك حق الوصول إلى ملف PHP.INI (على سبيل المثال. على مضيف مشترك)، يمكنك دائما تحقيق نفس باستخدام توجيه .htaccess (على افتراض أن هذا خادم Apache).

في php.ini الخاص بك

magic_quotes_gpc Off

في ملف .htaccess:

php_flag magic_quotes_gpc Off

لماذا يحدث هذا؟

والسبب في حدوث هذا بسبب المسار التالي من المنطق.

  1. يتم إرسال سلسلة تحتاج إلى الهروب إلى الخادم.
    • This is my string. It's awesome.
  2. يقتبس السحر يهرب من النقاشية قبل أن يصل إلى التعليمات البرمجية الخاصة بك.
    • This is my string. It\'s awesome
  3. mysql_real_escape_string الآن لديه حرفين للهروب، والعين \\ وكذلك الباسورة \'.
    • This is my string. It\\\'s awesome
  4. يتم تخزين هذه السلسلة الجديدة الفائقة المتفجرة في قاعدة البيانات.
  5. عند استرداد السلسلة من قاعدة البيانات، احصل على مر stripslashes. وبعد هذا يزيل اثنين من الهربون المضافة في الخطوة 3، ولكن منذ أن هربت واحدة من الباكسات الخلفية stripslashes يعتقد أنه ينتمي.
    • This is my string. It\'s awesome

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

حل بديل

بديل سريع وسهل سيكون ببساطة إزالة القطابق المضافة من قبل magic_quotes قبل اجتياز السلسلة إلى mysql_real_escape_string.

$str = stripslashes($_POST['str']);
$str = mysql_real_escape_string($str);

نصائح أخرى

عند إضافة سلسلة إلى قاعدة البيانات، أهربها mysql_real_escape_string() ويتم تخزين ما يلي في قاعدة البيانات:

<span style=\\\"text-decoration:underline;\\\">underline</span>

لا ليس كذلك. عند الهروب من السلاسل في استعلام SQL، فهي فقط لنقل البيانات في الاستعلام. تقوم قاعدة البيانات بتوزيع الاستعلام وتخزين البيانات الموجودة في قاعدة البيانات، دون أي مخطوط إضافية. وبالتالي، عند استرداد البيانات من قاعدة البيانات، يجب عليك ليس إلغاء أي شيء. انها فكرة خاطئة شائعة.

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

يحرر:

mysql> create table foo (bar text) ;
Query OK, 0 rows affected (0.01 sec)

mysql> INSERT INTO foo (bar) VALUES ("<span style=\\\"text-decoration:underline;\\\">underline</span>");
Query OK, 1 row affected (0.00 sec)

mysql> SELECT * FROM foo;
+-------------------------------------------------------------+
| bar                                                         |
+-------------------------------------------------------------+
| <span style=\"text-decoration:underline;\">underline</span> | 
+-------------------------------------------------------------+
1 row in set (0.00 sec)

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

إذا get_magic_quotes_gpc() هو خارج في الخادم، لذلك فقط يمكننا استخدام

$data= mysql_real_escape_string($_POST['data']);

إذا get_magic_quotes_gpc() في الخادم، علينا أن نستخدم

$data= mysql_real_escape_string(stripslashes($_POST['data']));

وإلا تضيف اثنين من الخلفية مع البيانات الخاصة بك.

أيضا حل آخر هو أننا نستطيع استخدامها stripslashes($data) بينما جلب من Datadase إذا نستخدمنا فقط استخدام mysql_real_escape_string($_POST['data']);

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