Использование AJAX и PHP для проверки простого пароля

У меня есть, надеюсь, простая проблема, которую нужно решить. Мы пытаемся защитить ссылку внутри защищенной части нашего сайта с помощью простого пароля. По сути, внутри нашего традиционно защищенного сайта у нас есть динамически управляемая таблица записей с маленьким значком в виде замка, который переключается между заблокированным и разблокированным. Этот раздел сайта уже традиционно защищен и доступен только авторизованным пользователям. Поэтому мы просто хотели бы реализовать эту менее безопасную систему аутентификации по статическому паролю PHP, которая позволяет пользователям блокировать и разблокировать записи в этой таблице. По сути, когда они создают запись в таблице, у них есть возможность щелкнуть значок блокировки (что, очевидно, блокирует запись), но только те, у кого есть простой жестко закодированный PIN-код, могут разблокировать запись после ее блокировки (т.е. все пользователи могут заблокировать, но не все пользователи могут разблокировать). Поэтому я попытался написать простую систему выводов PHP + AJAX. Другой мой администратор настаивал на решении на стороне сервера. Он отказывается использовать для этого только базовый javascript, и я согласен. Он по-прежнему нуждается в разумной степени безопасности. Вот что у меня есть до сих пор, но я очень новичок (минуты) в AJAX и, видимо, что-то не работает. Это один файл с именем pin.php (так что в основном страница подчиняется самой себе)

Ссылка РАЗБЛОКИРОВАТЬ имитирует значок замка, который пользователь щелкает, чтобы разблокировать запись.

<html>
<script src="js/jquery.js" type="text/javascript"></script>
<?php
    $static_password = "1234";
    if(isset($_POST['data'])){
        $submit_password = $_POST['data'];
        if($submit_password == $static_password){
            echo "Do the unlock stuff";
        }
        else{
            echo "Sorry try again";
        }
    }
?>
<body>
<h2>Simple AJAX PHP Example</h2>
<a href="javascript:Unlock();">UNLOCK</a>
<script>
function Unlock() {
    var pin=prompt("You must enter pin to unlock");
    $.ajax(
    {
        url: 'pin.php',
        type: 'POST',
        dataType: 'text',
        data: {data : pin},
        success: function(response)
        { 
            console.log(response);
        }
    });
}
</script>
</body>
</html>

Любая помощь приветствуется. Спасибо


person Atomiklan    schedule 18.11.2016    source источник
comment
inb4 пин-код передается, потому что это раздражает, и вы могли бы также добавить кнопку, говорящую, что вы уверены, что хотите разблокировать эту запись.   -  person PeeHaa    schedule 18.11.2016
comment
Извините, можно еще раз, пожалуйста? inb4?   -  person Atomiklan    schedule 18.11.2016
comment
Просто у меня есть предчувствие, что это произойдет, как только вы реализуете выше.   -  person PeeHaa    schedule 18.11.2016
comment
Итак, у вас есть предложение о том, как это исправить?   -  person Atomiklan    schedule 18.11.2016
comment
Вы используете $, но я не вижу <script>, включая jQuery. Кроме того, я считаю, что вам нужно переместить код PHP наверх, иначе весь HTML до него также будет включен в ответ AJAX.   -  person Chris G    schedule 18.11.2016
comment
Хм, хорошо, см. редактирование.   -  person Atomiklan    schedule 18.11.2016
comment
Пока нет изменений. Хм   -  person Atomiklan    schedule 18.11.2016
comment
@Atomiklan, у тебя есть ошибки в консоли?   -  person Mihai Alexandru-Ionut    schedule 18.11.2016
comment
Нет, после всплывающего окна и отправки пин-кода ничего не происходит. Нет ошибок.   -  person Atomiklan    schedule 18.11.2016


Ответы (1)


Это работает для меня, как и ожидалось:

<?php
    $static_password = "1234";
    if(isset($_POST['data'])){
        $submit_password = $_POST['data'];
        if($submit_password == $static_password){
            die("Do the unlock stuff");
        }
        else{
            die("Sorry try again");
        }
    }
?><!DOCTYPE html><html>
<head>
    <script src="jquery-3.1.0.min.js" type="text/javascript"></script>
</head>
<body>
<h2>Simple AJAX PHP Example</h2>
<a href="javascript:Unlock();">UNLOCK</a>
<script>
function Unlock() {
    var pin=prompt("You must enter pin to unlock");
    $.ajax(
    {
        url: 'pin.php',
        type: 'POST',
        dataType: 'text',
        data: {data : pin},
        success: function(response)
        { 
            console.log(response);
        }
    });
}
</script>
</body>
</html>
person Chris G    schedule 18.11.2016
comment
Хм странно. Можете дать временную публичную ссылку? Может это только мой сервер? - person Atomiklan; 18.11.2016
comment
Хм, может быть, я просто что-то упустил или он работал все время. Я тоже ничего не вижу на вашей странице (как и на моей). Можете ли вы изменить PHP, чтобы отображать простые выходные данные об успехе или отказе? - person Atomiklan; 18.11.2016
comment
Да, что-то странное все еще происходит. Я предполагаю, что команды die также будут выводить свое содержимое при выходе. Я не вижу ничего подобного ни на одном из наших серверов. Все еще ничего не происходит. Я пробовал два компьютера и несколько браузеров. - person Atomiklan; 18.11.2016
comment
Кстати, спасибо за помощь в этом! - person Atomiklan; 18.11.2016
comment
На самом деле никогда не использовал консоль браузера. Глядя на это сейчас. Поддерживать - person Atomiklan; 18.11.2016
comment
Я изменил его, чтобы вместо этого он выдавал alert(). - person Chris G; 18.11.2016
comment
Ах ха! Я вижу это сейчас в консоли. Возможно, я упустил всю суть AJAX. Похоже, все хорошо. Позвольте мне попробовать ваш новый код для подтверждения, но я думаю, что мы там. СПАСИБО! - person Atomiklan; 18.11.2016
comment
Ага, поехали. Спасибо! Отметить как ответ. - person Atomiklan; 18.11.2016
comment
Как заставить его предупреждать только о сбое? оповещение (ответ); - person Atomiklan; 18.11.2016
comment
Вы можете отправить любой ответ, который вам нравится, и на стороне клиента что-то с ним сделать. Я обычно отправляю обратно готово или терплю неудачу и просто сравниваю response с ними. if (response == "fail") ... Или вы отправляете обратно строку JSON и анализируете ее на стороне клиента, если вам нужна дополнительная информация. - person Chris G; 19.11.2016