PHP وjQuery و.post():mysql_real_escape_string يفسد الأمور
-
18-09-2019 - |
سؤال
لقد تم تمزيق شعري مع هذا لفترة من الوقت.
الفهرس.php:
$(document).ready(function(){
$(".index_login_subm").click(function(){
uid = $("input:username").val();
pwd = $("input:password").val();
$.post("backend/login.php",{
uid:uid,
pwd:pwd
},function(data){
alert("Returned data: " + data);
});
return false;
});
});
تسجيل الدخول.php:
include("../../settings.php");
echo $uid;
echo $_POST['uid'];
لا شيء من الأصداء يُرجع أي شيء.
الإعدادات.php:
foreach ($_POST as $key => $value) {
$$key = mysql_real_escape_string($value);
}
foreach ($_GET as $key => $value) {
$$key = mysql_real_escape_string($value);
}
يعمل الكود بشكل جيد إذا قمت بالتعليق على settings.php-include (حسنًا، بالطبع لن يعمل echo $uid)، لذلك يجب أن يكون شيئًا يفعله mysql_real_escape_string.هل لدى أي شخص أي فكرة عما أفعله خطأ؟
يتضمن ملف Index.php أيضًا settings.php إذا كان ذلك يُحدث أي فرق.
يحرر:المشاركات أدناه جعلتني أرغب في التوضيح؛المسارات كلها صحيحة.يتم وضع settings.php (وبعض البرامج النصية الأخرى) خارج المجلد الجذر لجعلها غير قابلة للوصول لمستخدم الويب.أنها تعمل بشكل جيد عند الوصول إليها عن طريق البرامج النصية.
المحلول
كما وصفت في دليل PHP, ، يتطلب mysql_real_escape_string اتصالاً حقيقيًا بقاعدة البيانات تم إنشاؤه باستخدام mysql_connect (في المعلمة الثانية).إذا لم يكن هناك أي شيء، فإنه يحاول إنشاء واحد ببساطة عن طريق استدعاء mysql_connect().إذا لم ينجح هذا أيضًا، فإنه يُرجع false.
لذا، يجب عليك إنشاء اتصال بقاعدة البيانات أولاً.ولكن قبل البدء في القيام بذلك:لاحظ أنه أ حقا فكرة سيئة حقا ببساطة أخذ كل متغير POST وGET ووضعه في مساحة الاسم العالمية.
نصائح أخرى
أولاً، أود أن أتجنب المتغيرات المتغيرة، فهي ليست ضرورية حقًا في هذا السياق، كما أنها تشكل هدفًا متحركًا إذا لم تكن متأكدًا من المفاتيح التي تصل فعليًا إلى هذا البرنامج النصي، وهي ممارسة سيئة بسبب مشكلات الأمان التي يقومون بإنشائها.بدلاً من ذلك، أود أن أضع القيم التي تم تجاوزها ضمن settings.php في مصفوفة.ثم يمكنك ببساطة var_dump() المصفوفة بعد تضمين settings.php، ومعرفة ما هو متاح.
function extract_requests(){
$res = array();
foreach ($_REQUEST as $key => $value) {
if($key){
$res[$key] = $value;
}
}
return $res;
}
ثانيًا، اتصل يدويًا بـlogin.php باستخدام سلسلة عنوان url الصحيحة، وهو بالضبط ما تريد أن يستدعيه جافا سكريبت، بحيث يمكنك التأكد من أن أي مشاكل سلوكية لا تأتي من البرنامج النصي login.php نفسه.
http://localhost/somewhere/login.php?uid=50
include("../../settings.php");
$input = extract_requests();
var_dump($input);
echo $input['uid'];
echo $_POST['uid'];
أخيرًا، أود التحقق من بياناتك التي ترسلها في post().أنا لست معلم جافا سكريبت، ولكن
uid:uid,
pwd:pwd
يبدو أن ذلك سيسبب مشكلات بالنسبة لي، لذا سيكون من الجيد التأكد من إرسال بياناتك بالطريقة التي تتوقعها.
$(document).ready(function(){
$(".index_login_subm").click(function(){
uid = $("input:username").val();
pwd = $("input:password").val();
var inputData = {uid:uid, pwd:pwd};
alert(uid+" "+pwd);
// If you have a console.log() available, just use it on inputData here instead.
$.post("backend/login.php",inputData
,function(data){
alert("Returned data: " + data);
});
return false;
});
});
يحرر:استنادًا إلى الأمر mysql_real_escape_string-only-when-a-connection-has-initiated، فقد قمت بإزالة الهروب من الكود أعلاه، لأنه حقًا، سيكون من الأفضل لك الهروب من الأشياء مباشرة قبل وضعها في SQL.
وبالإضافة إلى ذلك، ضع في اعتبارك أن استخدام جافا سكريبت لتسجيل الدخول سوف أعود إليك، مع وظائف أساسية وضرورية مثل تسجيل الدخول، فأنت لا تريد أن يؤدي خطأ جافا سكريبت إلى تعطيل أي قدرة للمشاهد على تسجيل الدخول.هنا سوف تفعل ذلك.
هل هناك رابط MySQL صالح؟
string mysql_real_escape_string ( string $unescaped_string
[, resource $link_identifier ] )
إذا
link identifier
لم يتم تحديد الرابط الأخير الذي فتحهmysql_connect()
يفترض.إذا لم يتم العثور على مثل هذا الرابط، فسيحاول إنشاء واحد كما لو كانmysql_connect()
تم استدعاؤه بدون أي حجج.إذا لم يتم العثور على اتصال أو تأسيسه، فإنE_WARNING
يتم إنشاء خطأ في المستوى.
ربما يتم تجاهل إعداد الإبلاغ عن الأخطاء E_WARNING
أخطاء المستوى.
من الواضح أن ملف Index.php موجود في الدليل الجذر لموقع الويب، ولكن البرنامج النصي الذي تتصل به موجود في كتالوج "الواجهة الخلفية".
جرب استخدام include_once
بدلاً من include
واستخدام المسارات المطلقة، وليس النسبية.
مثال:
<?php
include_once($_SERVER['DOCUMENT_ROOT']."/settings.php"); //absolute path to file
echo $uid;
echo $_POST['uid'];
?>
إن استخدام المسارات المطلقة سيجعل الحياة أسهل بالنسبة لك إذا قمت بنقل الملفات.