2016-04-26 3 views
0

Хорошо, у меня есть PHP код:Ajax обеспечивая другой результат, чем PHP ServerSide делает

$_you = $_GET['you']; 
$_answer = $_GET['answer']; 
$_pass = md5($_GET['pass']); 
$sql = "select password from users where username='$_you'"; 
$query = mysqli_query($db_conx, $sql); 
while ($row = mysqli_fetch_array($query)) { 
    $_oldpass = $row['password']; 
} 
if ($_pass !== $_oldpass) { 
    $_passresult = "not ok"; 
} else { 
    $_passresult = "ok"; 
} 
$sql2 = "select answer from useroptions where username='$_you'"; 
$query2 = mysqli_query($db_conx, $sql2); 
while ($row2 = mysqli_fetch_array($query2)) { 
    $_veranswer = $row2['answer']; 
} 
if ($_answer !== $_veranswer) { 
    $_answerresult = "not ok"; 
} else { 
    $_answerresult = "ok"; 
} 
$_result = array("Password" =>$_passresult, "Answer" =>$_answerresult); 
header("Content-Type: application/json"); 
echo json_encode($_result); 

?> 

И этот кусок (фрагмент) из JQuery, который вызывает выше PHP:

$.get("verifydp.php?u="+you+"&pass="+pass+"&answer="+answer, function(result) { 
    if (result.Password === "not ok") { 
     $('#requiredp').html('<i class="fa fa-exclamation-triangle" aria-hidden="true"></i> Password is not correct'); 
     $('#cpassword').css("border", "solid 1px #f60"); 
     $('#cpassword').focus(); 
     $('#cpassword').val(''); 
     return false; 
    } else { 
     $('#requiredp').html(''); 
     $('#cpassword').css("border", "solid 1px #ccc"); 
    } 
    if (result.Answer === "not ok") { 
     $('#requireda').html('<i class="fa fa-exclamation-triangle" aria-hidden="true"></i> This is not the correct answer.'); 
     $('#answer').css("border", "solid 1px #f60"); 
     $('#answer').focus(); 
     $('#answer').val(''); 
     return false; 
    } else { 
     $('#requireda').html(''); 
     $('#answer').css("border", "solid 1px #ccc"); 
    } 
}); 

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

Это проверяет правильные или неправильные пароли и ответы, однако, когда я ввожу правильный пароль, он ударяет меня назад говоря, что пароль неверен. Самое смешное, однако, что когда я запускаю часть php самостоятельно, с теми же данными, это говорит мне, что пароль правильный. Таким образом, php передает «OK» в Ajax, и Ajax каким-то образом превращает его в «НЕ ОК», что затем приводит к следующему хаосу в остальных действиях скрипта. Кто-нибудь понял, почему это происходит? Любая помощь очень ценится, поскольку она делает мою голову в: -/ Если вам нужна дополнительная информация, просто дайте мне знать.

Спасибо, миллион!

+0

Спасибо за ваш комментарий - однако, даже если часть ответа неисправна, она все равно будет обрабатывать раздел пароля, а затем просто перестать приходить к ответу? Или вообще остановить? Изменить: php дает правильные ответы - например: если я запускаю его непосредственно, он говорит {Пароль: ok, Answer: ok}, но я предупредил об ответе Ajax, и предупреждение сообщает «Не в порядке» по паролю. –

+0

[Little Bobby] (http://bobby-tables.com/) говорит, что [ваш скрипт подвержен риску инъекций SQL.] (Http://stackoverflow.com/questions/60174/how-can-i-prevent -SQL-инъекция-в-РНР). Даже [избегая строки] (http://stackoverflow.com/questions/5741187/sql-injection-that-gets-around-mysql-real-escape-string) небезопасно! –

+0

Вы действительно не должны использовать [хэши паролей MD5] (http://security.stackexchange.com/questions/19906/is-md5-considered-insecure), и вам действительно нужно использовать встроенные функции PHP (http: //jayblanchard.net/proper_password_hashing_with_PHP.html) для защиты паролей. Убедитесь, что вы [не избегаете паролей] (http://stackoverflow.com/q/36628418/1011527) или используйте какой-либо другой механизм очистки для них перед хэшированием. Выполнение этого * изменяет * пароль и вызывает ненужное дополнительное кодирование. –

ответ

4

Я просто проигнорирую, как это небезопасно, просто потому, что вы сказали.

Итак, двигаемся дальше. Ajax никак не манипулирует данными. Ajax - это просто «способ» для вашей веб-страницы асинхронно обращаться к веб-серверу и получать некоторые данные.

Причина этого не работает и пароль всегда «не в порядке», потому что ваш PHP ожидает имя пользователя, чтобы быть в параметре GET вам, но вы отправляете его в параметре GET у.

+1

Вы должны шутить - я должен полностью забыть, что, как глупо от меня, просто показывает, что это маленькие вещи, которые убивают, а не большие :) Во всяком случае, что касается безопасности - конечно, это все мы будем дезинфицированы и все, но поскольку это еще не закончено, я просто хотел оставить это из уравнения. Спасибо миллион за это! –

Смежные вопросы