بديل لـ mysql_real_escape_string دون الاتصال بقاعدة البيانات

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

سؤال

أرغب في الحصول على وظيفة تتصرف كـ mysql_real_escape_string دون الاتصال بقاعدة البيانات حيث أحتاج في بعض الأحيان إلى إجراء اختبار جاف دون اتصال بقاعدة البيانات.تم إهمال mysql_escape_string وبالتالي فهو غير مرغوب فيه.بعض النتائج التي توصلت إليها:

http://www.gamedev.net/community/forums/topic.asp?topic_id=448909

http://w3schools.invisionzone.com/index.php?showtopic=20064

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

المحلول

من المستحيل الهروب بأمان سلسلة دون اتصال DB. mysql_real_escape_string() والبيانات المعدة تحتاج إلى اتصال بقاعدة البيانات حتى يتمكنوا من الهروب من السلسلة باستخدام مجموعة الأحرف المناسبة - وإلا فإن هجمات حقن SQL لا تزال ممكنة باستخدام أحرف البايت متعددة.

إذا كنت فقط اختبارات, ، ثم قد تستخدم كذلك mysql_escape_string(), ، ليس مضمونة 100٪ ضد هجمات حقن SQL، ولكن من المستحيل بناء أي شيء أكثر أمانا دون اتصال DB.

نصائح أخرى

حسنا، وفقا ل mysql_real_escape_string. صفحة مرجعية الدالة: "mysql_real_escape_string () يستدعي وظيفة مكتبة mysql mysql_real_escape_string، مما يهرب من الأحرف التالية: x00، n، r، ''،" و x1a ".

مع مراعاة ذلك، يجب أن تفعل الوظيفة المقدمة في الرابط الثاني الذي قمت بنشره بالضبط ما تحتاجه:

function mres($value)
{
    $search = array("\\",  "\x00", "\n",  "\r",  "'",  '"', "\x1a");
    $replace = array("\\\\","\\0","\\n", "\\r", "\'", '\"', "\\Z");

    return str_replace($search, $replace, $value);
}

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

// replace any non-ascii character with its hex code.
function escape($value) {
    $return = '';
    for($i = 0; $i < strlen($value); ++$i) {
        $char = $value[$i];
        $ord = ord($char);
        if($char !== "'" && $char !== "\"" && $char !== '\\' && $ord >= 32 && $ord <= 126)
            $return .= $char;
        else
            $return .= '\\x' . dechex($ord);
    }
    return $return;
}

آمل أن يخبرني شخص أكثر دراية بنفسي لماذا لن يعمل الكود أعلاه ...

ومن خلال مزيد من البحث، وجدت:

http://dev.mysql.com/doc/refman/5.1/en/news-5-1-11.html

إصلاح الأمان:

تم العثور على ثغرة أمنية لحقن SQL في معالجة الترميز متعدد البايت.كان الخطأ في الخادم، وتم تحليل السلسلة التي تم الهروب منها بشكل غير صحيح باستخدام وظيفة mysql_real_escape_string() C API.

تم اكتشاف هذه الثغرة الأمنية والإبلاغ عنها بواسطة Josh Berkus وTom Lane كجزء من التعاون الأمني ​​بين المشاريع لاتحاد OSDB.لمزيد من المعلومات حول حقن SQL، الرجاء مراجعة النص التالي.

مناقشة.تم العثور على ثغرة أمنية لحقن SQL في معالجة الترميز متعدد البايت.يمكن أن تتضمن الثغرة الأمنية لحقن SQL موقفًا حيث عندما يقوم المستخدم بتوفير بيانات لإدراجها في قاعدة بيانات، قد يقوم المستخدم بإدخال عبارات SQL في البيانات التي سينفذها الخادم.فيما يتعلق بهذه الثغرة الأمنية، عند استخدام الهروب غير المدرك لمجموعة الأحرف (على سبيل المثال، addlashes() في PHP)، فمن الممكن تجاوز الهروب في بعض مجموعات الأحرف متعددة البايت (على سبيل المثال، SJIS وBIG5 وGBK).ونتيجة لذلك، فإن وظيفة مثل addlashes() غير قادرة على منع هجمات حقن SQL.من المستحيل إصلاح هذا من جانب الخادم.الحل الأفضل هو أن تستخدم التطبيقات ميزة الهروب من مجموعة الأحرف التي توفرها وظيفة مثل mysql_real_escape_string().

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

الحلول.إذا لم تتمكن من ترقية MySQL إلى إصدار يتضمن إصلاح الخطأ في تحليل mysql_real_escape_string()، ولكنك قمت بتشغيل MySQL 5.0.1 أو أعلى، فيمكنك استخدام وضع SQL NO_BACKSLASH_ESCAPES كحل بديل.(تم تقديم هذا الوضع في MySQL 5.0.1.) NO_BACKSLASH_ESCAPES يمكّن وضع التوافق القياسي لـ SQL، حيث لا تعتبر الشرطة المائلة العكسية حرفًا خاصًا.وستكون النتيجة أن الاستعلامات سوف تفشل.

لتعيين هذا الوضع للاتصال الحالي، أدخل عبارة SQL التالية:

SET sql_mode='NO_BACKSLASH_ESCAPES';

يمكنك أيضًا ضبط الوضع عالميًا لجميع العملاء:

SET GLOBAL sql_mode='NO_BACKSLASH_ESCAPES';

يمكن أيضًا تمكين وضع SQL هذا تلقائيًا عند بدء تشغيل الخادم باستخدام خيار سطر الأوامر --sql-mode=NO_BACKSLASH_ESCAPES أو عن طريق تعيين sql-mode=NO_BACKSLASH_ESCAPES في ملف خيار الخادم (على سبيل المثال، my.cnf أو my.ini ، حسب نظامك).(الأخطاء رقم 8378، CVE-2006-2753)

انظر أيضًا الخطأ رقم 8303.

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