سؤال

ما مدى خطورة كود PHP هذا؟ما الذي يمكن عمله حيال ذلك؟

$name = $_POST["user"];
$pwd = $_POST["pwd"];
$query = "SELECT name,pwd FROM users WHERE name = '$name' AND pwd = '$pwd'";
هل كانت مفيدة؟

المحلول

المشاكل المحتملة:

  1. حقن SQL
  2. حقن XSS (إذا كان هذا الرمز عبارة عن استعلام إدراج، فستكون مشكلة مؤكدة)
  3. كلمة مرور نصية عادية

يمكن أن تكون عبارة SQL الخاصة بك مشكلة.من الممارسات السيئة أن تترك نفسك مفتوحًا لحقن SQL.

حقن SQL سيء.ثق بي.

إذا كنت تريد عرض $user على صفحة HTML، فقد لا ترغب في تضمين قدرة الأشخاص على "اختراق" تخطيطك عن طريق كتابة أوامر مثل

<H1>HI MOM</H1>

أو حفنة من جافا سكريبت.

أيضًا، لا تقم أبدًا بتخزين كلمة المرور الخاصة بك في نص عادي (حسنًا، cagcowboy!).إنه يمنح الكثير من القوة للأشخاص الذين يديرون (أو يخترقون) قاعدة بياناتك.يجب ألا تحتاج أبدًا إلى معرفة كلمة المرور الخاصة بشخص ما.

جرب تكتيكات مثل هذه:

// mostly pulled from http://snippets.dzone.com/posts/show/2738
function MakeSafe($unsafestring) 
{
    $unsafestring= htmlentities($unsafestring, ENT_QUOTES);

    if (get_magic_quotes_gpc()) 
    { 
        $unsafestring= stripslashes($unsafestring); 
    }

    $unsafestring= mysql_real_escape_string(trim($unsafestring));
    $unsafestring= strip_tags($unsafestring);
    $unsafestring= str_replace("\r\n", "", $unsafestring);

    return $unsafestring;
} 

// Call a function to make sure the variables you are 
// pulling in are not able to inject sql into your 
// sql statement causing massive doom and destruction.

$name = MakeSafe( $_POST["user"] );
$pwd = MakeSafe( $_POST["pwd"] );

// As suggested by cagcowboy: 
// You should NEVER store passwords decrypted.
// Ever.  
// sha1 creates a hash of your password
// pack helps to shrink your hash
// base64_encode turns it into base64
$pwd = base64_encode(pack("H*",sha1($pwd)))

نصائح أخرى

فمن هذا خطير:

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

وهذا الكود هو آمن جدا لو كنت أبدا تمرير $ الاستعلام إلى قاعدة بيانات SQL.

إذا كان للمرء أن إضافة 0';drop table users;-- عن اسم

وسيكون الأمر الخاص بك في نهاية الأمر

select name, pwd form users where name='0'; 
drop table users; --'and pwd = '[VALUE OF PWD]'

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

سوف

والأوامر الخلية معينة متداولة في فب تنفيذ استعلامات متعددة عندما مرر SQL، فإن أفضل طريقة لتجنب هذه هي الأسئلة parametrized.

وأنا استخدم PDO لكل ما عندي من الوصول DB، ونوصي بشدة. ليس لدي أي علاقة من على قمة رأسي ولكن أتذكر الدروس اعتدت تصدرت جوجل.

وانها ليست فقط عرضة لحقن SQL، وسوف تفشل أيضا في الحالات التي يتم فيها حتى لا يقصد حقنة:

وعلى سبيل المثال كان المستخدم يريد اسم "غيوم فرانسوا أنطوان، ماركيز L'مستشفى دي". منذ المستخدم يحتوي على الاقتباس وأنت لا مفر منه، ستفشل الاستعلام الخاص بك، على الرغم من أن المستخدم لم يكن يريد لكسر النظام!

PDO أو تفعل ذلك بهذه الطريقة:

$query = sprintf(
                   "SELECT 1 FROM users WHERE name = '%s' AND password = '%s'",
                   mysql_real_escape_string($_POST['name']),
                   mysql_real_escape_string(md5($_POST['password']))
                 );

وصدق أو لا تصدق، وهذا هو آمن ... إذا تم تشغيل magic_quotes_gpc جرا. التي لن تكون في PHP6، لذلك تحديد ذلك قبل ثم هو فكرة جيدة.

  1. $_POST['user'] = "' or 1=1; --";يمكن لأي شخص الوصول الفوري إلى تطبيقك

  2. $_POST['user'] = "'; DROP TABLE user; --";قبل وداعًا لقائمة المستخدمين (المدفوعة؟).

  3. إذا قمت لاحقًا بتكرار $name في مخرجاتك، فقد يؤدي ذلك إلى هجوم حقن XSS

: o لا تفعل ذلك أبدًا ، هذا يمكن أن يسبب هجوم sqlinjection.إذا كان على سبيل المثال إدخال المستخدم بطريقة أو بأخرى: 'إسقاط مستخدمي الجدول -- كمدخل في اسم المستخدم $؛سوف يتسلسل هذا الرمز مع الكود الأصلي الخاص بك وسيقوم بإسقاط الجدول الخاص بك.يمكن للمتسللين فعل المزيد ويمكنهم اختراق موقع الويب الخاص بك.

وهذا هو عادة خطيرة جدا. ويمكن التخفيف من ذلك عن طريق أذونات قاعدة البيانات في بعض الحالات.

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

وجدا خطير جدا. فكرة جيدة لكلمات السر لتحويل كلمة المرور إلى تجزئة MD5 وتخزين بأنه المستخدم 'كلمة السر'.
1) يحمي المستخدمين من الحاجة كلمات المرور الخاصة بهم سرقت 2) إذا كان المستخدم يكتب سلسلة الخبيثة التي يمكن أن تمحو بك دخول / الجدول / قاعدة البيانات

وأيضا يجب عليك القيام ببعض الأساسي التعبير المباراة التعابير المنطقية على اسم للتأكد من أنه يستخدم فقط A-ي0-9 وربما بضعة أحرف معلمة (أي أحرف خاصة، * الصورة، <الصورة،> الصورة على وجه الخصوص).

وعندما يتم إينفوليد بيانات المستخدم في استعلام SQL، دائما sanatize البيانات مع mysql_real_escape_string .

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

function saltedHash($data, $hash=null)
{
    if (is_null($hash)) {
        $salt = substr(md5(uniqid(rand())), 0, 8);
    } else {
        $salt = substr($hash, 0, 8);
    }
    $h = $salt.md5($salt.$data);
    if (!is_null($hash)) {
        return $h === $hash;
    }
    return $h;
}

وكل ذلك معا:

$query = 'SELECT pwd FROM users WHERE name = "'.mysql_real_escape_string($_POST['user']).'"';
$res = mysql_query($query);
if (mysql_num_rows($res)) {
   $row = mysql_fetch_assoc($res);
   if (saltedHash($_POST["pwd"], $row['pwd'])) {
       // authentic
   } else {
       // incorrect password
   }
} else {
   // incorrect username
}

وانها ليست آمنة، قد ترغب في النظر في شيء من هذا القبيل شركة تنمية نفط عمان. PHP شركة تنمية نفط عمان

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