سؤال

هل يمكن أن تعطيني تقديم المشورة؟ لقد بحثت عن أسئلة ولكن لم أجد شيئا ما التشفير في الألغام.

كيف يمكنني جعل مدخلات المستخدم الخاصة بي تلقائيا عندما تهدف إلى استخدامها في استعلامات SQL؟ أنا لا أحب في التعليمات البرمجية مليئة بشيء مثل

$var_x = $DB->Escape($_POST['var_x']);
$another_var = $DB->Escape($_POST['another_var']);
$some_string = $DB->Escape($_POST['some_string']);
...

على افتراض أن لدي فئة قاعدة بيانات مع طريقة الهروب التي تنفذ mysql_real_escape_string

ولكن لا يمكنني تعيين الهروب التلقائي على استعلام SQL أيضا، لأنه يكسر استفسارات إدراج:

function Exec($sql){
   $result = mysql_query($this->Escape($sql));
}

$q = $DB->Exec("SELECT * FROM table WHERE id = 'xxx'");

يجعلها 'xxx '. وهو غير صحيح

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

باختصار - كيفية جعل الهروب التلقائي الذكي الذي يعمل مع الاستعلام الكامل والتلف القيم فقط؟

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

المحلول

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

نصائح أخرى

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

اذا فعلت:

$a= "a'b";
$query= "SELECT * FROM things WHERE name='$a'";

ثم تحتوي سلسلة الاستعلام الخاصة بك على كلا من النقاطيات ذات القيمة العالية الحقيقية في حرفي السلسلة، والفاتونات التي هي محددات String:

SELECT * FROM things WHERE name='a'b'

يحتاج المرء أن يتم هربها؛ الآخر لا يجب. كيف يمكنك معرفة ما هو؟ لا يمكنك، أن هذه المعلومات تضيع إلى الأبد. يجب أن تقول بدلا من ذلك:

$query= "SELECT * FROM things WHERE name='".mysql_real_escape_string($a)."'";

(أو أيهما وظيفة الهروب الأخرى أكثر ملاءمة لقاعدة البيانات التي تستخدمها.)

البشع؟ إي نعم. لهذا السبب نستخدم الاستفسارات المعلمة بدلا من ذلك. هذا يفلت من سلسلة سلسلة مع كل مشاكلها.

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

يمكنني استخدام هذه الطريقة:

$db->set('name',$name);
$db->set('title',$title);
$db->insert('users');

هنا $db->set() تهرب الطريقة تلقائيا من القيمة (أي الوسيطة الثانية).

مع PHP 5، يمكنك أيضا القيام بذلك:

$db->set('name',$name)->set('title',$title)->insert('users');

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

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

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