PHP, jQuery и .post (): mysql_real_escape_string все портит - PullRequest
0 голосов
/ 09 марта 2010

Я порвал свои волосы с этим некоторое время.

index.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;
    });
});

login.php:

include("../../settings.php");
echo $uid;
echo $_POST['uid'];

ни одно из эхо ничего не возвращает.

settings.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 (и некоторые другие сценарии) размещаются вне корневой папки, чтобы сделать их недоступными для веб-пользователя. Они работают хорошо, когда к ним обращаются по сценариям.

Ответы [ 4 ]

6 голосов
/ 09 марта 2010

Как описано в руководстве по PHP , mysql_real_escape_string требует реального подключения к базе данных, установленного с помощью mysql_connect (во втором параметре). Если ничего не существует, он пытается создать его, просто вызывая mysql_connect (). Если это тоже не работает, возвращается false.

Итак, сначала вам нужно будет создать соединение с базой данных. Но прежде чем вы начнете делать это: заметьте, действительно очень плохая идея - просто взять каждую переменную POST и GET и плюнуть ее в глобальное пространство имен.

3 голосов
/ 09 марта 2010

Во-первых, я бы избегал переменных переменных, они на самом деле не нужны в этом контексте, и они создают движущуюся цель, если вы не уверены, какие ключи на самом деле достигают этого скрипта, и это плохая практика из-за проблемы безопасности, которые они создают. Вместо этого я бы поместил экранированные значения в 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, именно то, что вы хотели бы, чтобы javascript вызывал, чтобы вы могли быть уверены, что любые поведенческие проблемы не возникают из самого скрипта 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 (). Я не гуру JavaScript, но

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-only-когда-соединение-было инициировано, я удалил экранирование из приведенного выше кода, потому что на самом деле вам будет лучше избежать экранирования прямо перед тем вы положили его в sql.

Кроме того, имейте в виду, что при использовании javascript для входа в систему WILL вернется, чтобы укусить вас, с функциональностью, такой же базовой и необходимой, как вход в систему, вы не хотите, чтобы ошибка javascript нарушала любые зритель, чтобы войти. Здесь это будет сделано.

1 голос
/ 09 марта 2010

Есть ли действительная ссылка на MySQL?

string mysql_real_escape_string  ( string $unescaped_string
                                [, resource $link_identifier  ] )

Если link identifier не указано, предполагается последняя ссылка, открытая mysql_connect(). Если такая ссылка не найдена, она попытается создать такую, как если бы mysql_connect() был вызван без аргументов. Если соединение не найдено или не установлено, генерируется ошибка уровня E_WARNING.

Может быть, ваш отчет об ошибках игнорирует E_WARNING уровень ошибок.

0 голосов
/ 09 марта 2010

index.php, очевидно, находится в корневом каталоге веб-сайта, но вызываемый вами скрипт находится в каталоге "бэкэнда".

Попробуйте использовать include_once вместо include и используйте абсолютные пути, а не относительные.

Пример:

<?php
    include_once($_SERVER['DOCUMENT_ROOT']."/settings.php"); //absolute path to file
    echo $uid;
    echo $_POST['uid'];
?>

Использование абсолютных путей облегчит вам жизнь, если вы будете перемещать файлы.

...