سؤال

أفعل شيئًا مثل ما يلي:

SELECT * FROM table WHERE user='$user';
$myrow = fetchRow() // previously I inserted a pass to the db using base64_encode ex: WRM2gt3R=

$somepass = base64_encode($_POST['password']);

if($myrow[1] != $somepass) echo 'error';
else echo 'welcome';

أحصل دائمًا على خطأ، حتى أنني أردد صدى $somepass و $myrow[1] وهما نفس الشيء، لكن لا يزال هناك خطأ.ما الخطأ الذي افعله؟شكرًا

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

المحلول

وحاول استخدام var_dump بدلا من الصدى - ربما واحد منهم لديه مسافة أو سطر جديد في بداية / نهاية

وتحرير:

ويجب تخزينه كما CHAR (40): A fixed-length string that is always right-padded with spaces to the specified length when stored

استخدم VARCHAR أو trim()

نصائح أخرى

إذا $ myrow [1] هو في الواقع كلمة المرور الصحيحة في base64 في ترميز، وأنا لا أرى أية أخطاء.

وهذه محاولة دائرة الهجرة والجنسية النهاية:

echo "<br />$myrow[1] != $somepass";

وماذا أقول؟

وبالمناسبة: أنا لا أرى أي سبب لbase64 في ترميز كلمات السر. ماذا تحاول تحقيقه؟

وأعتقد إلى حد ما إذا أفعل var_dump () أحصل على:

وسلسلة (40) "YWRraM2 =" سلسلة (8) "YWRraM2 ="

ويبدو الى حد ما اذا كنت إدراج البيانات في ديسيبل باستخدام وحدة تحكم في إضافة مساحة إضافية إلى الميدان مرور.

وmyplacedk: لا يوجد أي سبب لماذا لا ينبغي أن تفعل ذلك؟ وأعتقد أنه سيضيف leyer إضافية من الأمن؟

هذا التشفير يفعل شيئين:

  1. فهو يضيف تعليمات برمجية، مما يجعل ارتكاب الأخطاء أكثر تعقيدًا وأسهل
  2. إذا قمت بعرض قاعدة البيانات الخاصة بك على شاشتك، ونظر شخص ما من فوق كتفك، فقد يكون تذكر كلمات المرور أصعب قليلاً.

لذلك لا، فهو لا يضيف أي أمان حقًا.إنه مجرد ترميز، ومن السهل فك تشفيره.

ربما تخلط بينه وبين تجزئة md5 أو شيء من هذا القبيل.

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

بعض القضايا:

  • من تعليقاتك في مكان آخر، أعتقد أن مشكلة الكود الحالي هي أن حقل قاعدة البيانات لديك هو CHAR(40).يكون لحقل CHAR دائمًا حجم ثابت.حاول تغيير نوع حقل قاعدة البيانات إلى VARCHAR بدلاً من CHAR.

  • إن استخدام base64_encode قبل التخزين في قاعدة البيانات ليس آمنًا على الإطلاق.الممارسة الجيدة هي تخزين تجزئة أحادية الاتجاه لكلمة المرور في قاعدة البيانات - عادةً md5 أو (الأفضل) sha1.بعد ذلك، عندما يريد المستخدم تسجيل الدخول، استخدم نفس وظيفة التجزئة في كلمة المرور المقدمة، ثم قارن بين التجزئة.
    وهذا له فائدة إضافية تتمثل في العمل مع كلمات مرور أطول من 40 حرفًا أيضًا.
    تأخذ تجزئة sha1 أو md5 دائمًا مقدارًا ثابتًا من المساحة، لذلك إذا سلكت هذا المسار، فلن تضطر إلى تبديل عمود قاعدة البيانات إلى VARCHAR :)

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