هل هذه قطعة من التعليمات البرمجية آمنة - PHP && MySQL

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

  •  06-09-2019
  •  | 
  •  

سؤال

<?php
class test_class {

        public function __construct() { 

        }
        public function doLogin($username,$password) {

            include("connection.php");

            $query = "SELECT *
                      FROM users
                      WHERE username = '".mysql_escape_string($username)."'
                      AND password = '".mysql_escape_string($password)."'";
            $result = mysql_fetch_array(mysql_query($query));
            if(!$result) {

            return 'no';
            }
            else 
                {
            return 'yes';
                }
            }


}
?>

يعمل الرمز أعلاه، ولكن قلقة قليلا مما إذا كان آمنا أم لا.

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

if (isset($_POST['username']) && isset($_POST['password']))
        {
        $username= $_POST['username'];
        $password= $_POST['password'];
هل كانت مفيدة؟

المحلول

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

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

نصائح أخرى

يبدو الاستعلام نفسه آمنا، ولكن إذا استخدمت واجهة DB التي تدعم ملزمة المعلمة، مثل PDO أو ZEND_DB، فلن تضطر إلى التدقيق في كل عبارة SQL بعصبية.

أيضا، وظائف MySQL- * من إهمالها إلى حد كبير؛ يجب أن تنظر إلى وظائف MySQLI- * بدلا من ذلك.

كملاحظة جانبية أسلوبية، لا توجد نقطة في منشئ فارغ، وأنا أقترح إرجاع Boolean True أو False، بدلا من قيم السلسلة.

أخيرا، كما هو مذكور في مكان آخر، تخزين كلمات المرور الخاصة بكثيا هي فكرة سيئة.

UHH .... أنت تخزن كلمة مرور نصية؟ هذا هو بالتأكيد غير آمن. يجب التغليف كلمة المرور بالملح باستخدام شيء مثل Sha256. تخزين كلمات المرور النصية ليست فكرة جيدة أبدا.

لا، يجب ألا تخفي كلمة المرور الخام في قاعدة البيانات الخاصة بك. تخزينها تجزئة (ويفضل أن تكون مع الملح). علاوة على ذلك، فإن البيانات المعدة هي خيار أفضل من الهروب. انظر الى هذا PHP وثائق PDD.. وبعد كمنفعة إضافية (إلى جانب الأمن)، يمكن أن تكون أكثر كفاءة.

يبدو الكود نفسه موافق، ولكن المشكلة الرئيسية التي أراها هي أنك تمر كلمات المرور حولها في نص عادي.

هو اتصال العميل إلى خادم آمن (أي استخدام SSL) هو اتصال الخادم إلى قاعدة البيانات آمنة

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

إذا كان الأمر كذلك، فستتفق أيضا على اتصال SSL بين العميل والخادم.

كنت أتأكد من أنك تخزن تجزئة كلمة المرور في قاعدة البيانات.

وأقلت رمزك إلى شيء مثل

//Pseduo Code
SELECT * FROM Table where UserName = $username
Get Row Back
if(MD5Hash($password) == DataRow[Password])
   //Valid

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

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