سؤال

عادةً ما أستخدم هذه الوظيفة لتطهير مدخلات النموذج الخاصة بي قبل تخزينها في قاعدة البيانات الخاصة بي:

//Function to sanitize values received from the form. Prevents SQL injection
function clean($str) {
    $str = @trim($str);
    if(get_magic_quotes_gpc()) {
        $str = stripslashes($str);
    }
    return mysql_real_escape_string($str);
}

حتى اليوم لم أدرك ذلك mysql_real_escape_string طلب اتصال قاعدة البيانات كما استخدمته فقط عندما كنت أقوم بتنظيف البيانات قبل تخزينها في قاعدة البيانات.

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

ما هي أفضل طريقة لتطهير البيانات التي لا يتم تخزينها في قاعدة بيانات MySQL وهل لا تزال هذه البيانات بحاجة إلى تطهير؟

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

المحلول

استعمال filter_var()

http://php.net/manual/en/function.filter-var.php

كما لو كنت ترغب في تعقيم بريد إلكتروني:

$_POST['email'] =    filter_var($_POST['email'], FILTER_SANITIZE_EMAIL); 

ليرسل رسالة

$_POST['message'] = filter_var($_POST['message'], FILTER_SANITIZE_STRING);

هو enogth

نصائح أخرى

الغرض من تطهير البيانات مع mysql_real_escape_string هو تجنب حقن SQL. إذا كنت لا تستخدم SQL ، فأنت محصن بالفعل.

الرجال لا يصابون بسرطان عنق الرحم.

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

المفهوم كله خاطئ. هذه الوظيفة لا تساعد في البريد الإلكتروني ولا حتى بالنسبة لقاعدة البيانات.

mysql_real_escape_string لا "تطهير" أي شيء. إنه مجرد هروب المحددات ولا شيء آخر. فقط لمنع أخطاء بناء الجملة إذا كان لديك محدد في بياناتك:

SELECT * FROM table WHERE name = 'it's me' # error!

بعد الهروب من البيانات ، تصبح بياناتك 'it\'s me' وليس هناك خطأ.
لذلك ، تعمل هذه الوظيفة فقط مع استعلام SQL وللبيانات ، محاط في اقتباسات فقط.

وبالتالي ، لا يوجد أي معنى في القيام فقط mysql_real_escape_string دون وجود اقتباسات حولها. يجب استخدام mysql_real_escape_string
أ) وحده. أشياء مثل trim أو stripslashes ليس لديها ما تفعله هنا
ب) مباشرة قبل تأليف سلسلة الاستعلام وليس في مكان آخر
ج) فقط مع البيانات التي سيتم إرفاقها في اقتباسات.
د) تحتاج جميع البيانات الأخرى إلى طرق أخرى لتعقيمها

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

(أنا جديد على Stackoverflow ، لذا فإنني سأذهب إلى هذا الطريق الخاطئ/القيام بعمل سيء مع تصميم إجابتي لا تتردد في إخباري.)

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

مثال: "& #66 ؛ & #99 ؛ & #99 ؛ & #58 ؛" (تم إضافة المساحات بحيث يعرضها Stackoverflow بشكل صحيح)

لن يتم إزالة هذا من السلسلة ، وسيتم استبداله لاحقًا بـ "BCC:".

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

    $string = str_replace("&", "(and)", $string);
    $string = str_replace("#", "(num)", $string);
    $string = str_replace(";", "(semi-colon)", $string);
    $string = str_replace(":", "(colon)", $string);
    $string = str_replace("@", "(at)", $string);
    $string = str_replace("\\", "(backslash)", $string);
    $string = filter_var($string, FILTER_SANITIZE_STRING);
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top