يجب أن mysql_real_escape_string جميع ملفات تعريف الارتباط من المستخدم إلى تجنب الخلية الحقن في php?

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

  •  01-07-2019
  •  | 
  •  

سؤال

عندما يذهب المستخدم إلى موقع بلدي, بلدي النصي يتحقق 2 الكوكيز لتخزين معرف المستخدم + جزء من كلمة المرور لتسجيل الدخول تلقائيا في.

فمن الممكن أن تحرير محتويات ملفات تعريف الارتباط عن طريق ملف تعريف الارتباط محرر, لذا أعتقد أنه من الممكن إضافة بعض المحتويات الضارة إلى كتب كوكي ؟

يجب إضافة mysql_real_escape_string (أو شيء آخر) إلى كوكي المكالمات أو هل هناك نوع من المدمج في الإجراءات التي لن تسمح لهذا أن يحدث ؟

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

المحلول

ما كنت حقا تحتاج إلى القيام به هو إرسال هذه الكعكة القيم hackable في المقام الأول.بدلا من ذلك, لماذا لا تجزئة اسم المستخدم وكلمة السر (سر) ملح و مجموعة أن مثل كوكي قيمة ؟ أي:

define('COOKIE_SALT', 'secretblahblahlkdsfklj');
$cookie_value = sha1($username.$password.COOKIE_SALT);

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

if ($user_cookie_value == sha1($username_from_db.$password_drom_db.COOKIE_SALT)) {
  # valid
} else {
  #not valid
}

mysql_real_escape_string يجعل إضافية تصل إلى قاعدة البيانات, راجع للشغل (الكثير من الناس لا يدركون ذلك يتطلب اتصال DB و الاستفسارات الخلية).

أفضل طريقة لفعل ما تريد إذا كنت لا تستطيع تغيير إعدادات التطبيق و يصرون على استخدام hackable كوكي القيم هو استخدام إعداد البيانات مع الالتزام المعلمات.

نصائح أخرى

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

يجب أن, ومع ذلك ، أيضا يمكن استخدام استعلامات بمعلمات (عبر mysqli أو PDO) لحماية نفسك من حقن SQL.وإلا هل خطر تنتهي مثل الصغير بوبي الجداول المدرسية.

أنا فقط استخدام mysql_real_escape_string قبل إدخال المتغيرات في عبارة SQL.عليك فقط الحصول على نفسك الخلط إذا كان بعض المتغيرات بالفعل هرب ثم الهروب منها مرة أخرى.انها الكلاسيكية علة ترى في نوبي' بلوق webapps:

عندما يكتب شخص ما علامة اقتباس أحادية أنها تحافظ على إضافة مائلة تخريب بلوق\\\\\\\'s صفحات.

قيمة متغير ليس خطيرا في حد ذاته:فقط عند وضعه في سلسلة أو شيئا من هذا القبيل أن تبدأ الشرود في المياه الخطرة.

بالطبع الرغم من ذلك ، لا تثق في أي شيء يأتي من جانب العميل.

إعداد بيانات المعلمة ملزمة دائما وسيلة جيدة للذهاب.

الكمثرى::MDB2 يدعم إعداد البيانات ، على سبيل المثال:

$db = MDB2::factory( $dsn );

$types = array( 'integer', 'text' );
$sth = $db->prepare( "INSERT INTO table (ID,Text) (?,?)", $types );
if( PEAR::isError( $sth ) ) die( $sth->getMessage() );

$data = array( 5, 'some text' );
$result = $sth->execute( $data );
$sth->free();
if( PEAR::isError( $result ) ) die( $result->getMessage() );

هذا سوف تسمح البيانات المناسبة و مبلغ محدد مسبقا من المتغيرات للحصول على في قاعدة البيانات الخاصة بنا.

كنت بطبيعة الحال يجب التحقق من صحة البيانات قبل الحصول على هذا الآن ، ولكن إعداد البيانات هو المصادقة النهائية التي ينبغي القيام به.

يجب أن mysql_real_escape_string أي شيء التي يمكن أن تكون ضارة.لا تثق في أي نوع من المدخلات التي يمكن تعديلها من قبل المستخدم.

وأنا أتفق معك.فمن الممكن لتعديل الكوكيز و إرسال البيانات الخبيثة.

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

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

(من أعلى رأسي في فضفاضة php - علاج كما البرمجية الزائفة):

$usernameFromPostDbsafe = LimitToAlphaNumUnderscore($usernameFromPost);
$result = Query("SELECT hash FROM userTable WHERE username='$usernameFromPostDbsafe' LIMIT 1;");
$hashFromDb = $result['hash'];
if( (sha1($usernameFromPost.$passwordFromPost.SALT)) == $hashFromDb ){
    //Auth Success
}else{
   //Auth Failure
}

بعد نجاح المصادقة يمكنك متجر تجزئة في $_SESSION أو في جدول قاعدة البيانات المخزنة مؤقتا مصادقة المستخدم/التجزئة.ثم ترسل تجزئة إلى المتصفح (في ملف تعريف الارتباط على سبيل المثال) حتى تحميل الصفحة اللاحقة وإرسال تجزئة مرة أخرى إلى الخادم أن تكون مقارنة تجزئة عقد في اختيار الدورة التخزين.

mysql_real_escape_string هو موديل قديم جدا...في هذه الأيام كنت حقا ينبغي أن تستخدم المعلمة ملزمة بدلا من ذلك.

سوف تفصيلا من قبل mentionning أن كنت في اشارة الى أعدت البيانات وتوفير رابط مقال يوضح أنه في بعض الأحيان mysl_real_escape_string ليست كافية بما فيه الكفاية: http://www.webappsec.org/projects/articles/091007.txt

أود أن أوصي باستخدام htmlentities($المدخلات ، ENT_QUOTES) بدلا من mysql_real_escape_string أيضا منع أي عرضي إخراج الفعلية التعليمات البرمجية HTML.بالطبع يمكنك استخدام mysql_real_escape_string و htmlentities, لكن لماذا ؟

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