سؤال

لقد ورثت المشروع لأن آخر المطور اليسار.تم بناء المشروع من رمز الشاعل.أنا لم أعمل مع رمز الشاعل قبل.

أخذت نظرة سريعة على الكود و أرى المكالمات قاعدة بيانات في وحدة تحكم مثل هذا:

$dbResult = $this->db->query("SELECT * FROM users WHERE username = '".$_POST['user_name']."'");

أو يدعو مثل هذا:

$dbResult = $this->db->query("SELECT * FROM users WHERE username = '".$this->input->post('username')."'");

لا رمز الشاعل تلقائيا تطهير هذه الاستفسارات لمنع حقن sql?

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

المحلول

وكود إغنيتر تفعله هربا من المتغيرات التي يمر بها عند استخدام الأسلوب $this->db->query. ولكن فقط عند تمرير المتغيرات كما يربط، وهنا مثال:

$dbResult = $this->db->query("SELECT * FROM users WHERE username = '?'", array($this->input->post('username')));

وتذكر أيضا لا ينبغي أن يكون من المفضل أن $_POST على $this->input->post منذ ما تقوم به هو معرفة ما اذا كان المتغيرات موجودة لمنع الأخطاء.

نصائح أخرى

CodeIgniter يوفر عدد قليل من سلسلة الهروب وظائف في طبقة قاعدة البيانات.

مقتطفات من CI دليل:

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

  1. $this->db->الهروب() هذه الوظيفة يحدد نوع البيانات بحيث يمكن الهروب فقط بيانات سلسلة.كما تلقائيا بإضافة علامات الاقتباس المفردة حول البيانات لذلك لم يكن لديك إلى:

    $sql = "INSERT INTO table (title) VALUES(".$this->db->escape($title).")";
    

أريد وظيفة أخرى مثالين ، ولكن لا تريد أن تأخذ كل متعة من قراءة الدليل.

لا، الرمز الذي شارك هو عرضة للحقن SQL. تحتاج إلى استخدام الاستعلام ملزمة لبناء الاستفسارات SQL الخاصة بك. إذا كنت تستخدم مكتبة CI DB، هل رمز شيئا مثل هذا (على سبيل المثال من دليل المستخدم):

$sql = "SELECT * FROM some_table WHERE id = ? AND status = ? AND author = ?";

$this->db->query($sql, array(3, 'live', 'Rick')); 

لا، لن كود إغنيتر لا تطهير سحرية الاستفسارات التي تم بناؤها من هذا القبيل.

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

ولقد استعملت أبدا CI إما باستثناء فقط للعب معها، لذلك لست متأكدا من مدى كنت على ثقة من ذلك.

وهذا لا يهرب أي شيء. كنت أفضل حالا تغييرها إلى بناء الجملة ربط أو سجل نشط في بناء الجملة

ويجب عليك استخدام $ هذا-> الإدخال-> آخر، الاستعلام ملزمة وسجل نشط لجعل البيانات أكثر أمانا وثم لا يزال، واختبار اختبار اختبار للتأكد.

استخدم سجل نشط للسلامة وأسهل الترميز:

وبدلا من:

  $dbResult = $this->db->query("SELECT * FROM users WHERE username'".$_POST['user_name']."'");

والاستخدام (نفس النتيجة):

$this->db->where('username',$this->input->post('user_name');
$dbResult = $this->db->get('users');

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

أنا نسخ من CodeIgniter دليل:"ما وراء البساطة فائدة كبيرة باستخدام السجل النشط الميزات هو أنه يسمح لك لخلق قاعدة بيانات تطبيقات مستقلة منذ بناء جملة الاستعلام يتم إنشاؤها بواسطة قاعدة البيانات لكل محول. فإنه يسمح أيضا أكثر أمانا الاستعلامات, لأن القيم هرب تلقائيا من قبل النظام."

و مثل بعض الناس قلت نعم هذا الرمز هو عرضة للحقن SQL

ومحسن مع وظيفة ثانية المعلمة (TRUE) لتصفية XSS على مستوى المدخلات:

$this->db->where('username',$this->input->post('user_name', TRUE);
$dbResult = $this->db->get('users');

المكتبات / input.html

ومستندات لل(على الأقل) 2.2 الدولة، في مربع أحمر كبير:

<اقتباس فقرة>   

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

ما لهذا مبرمج يعني "لا تعتمد على أحدث سجل على حد تعبير <م> أي شيء ".

وعن طريق وظيفة الهروب إلى حقن CI

<?php $username = $this->input->post('username');
$query = 'SELECT * FROM subscribers_tbl WHERE user_name = '.$this->db->escape($email);
$this->db->query($query);?>
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top