Запрос к БД без перезагрузки страницы

max74max

Новичок
Здравствуйте.
У меня есть код, который с периодичностью в 1 секунду подгружает файл php.php
Результатом является радномный вывод логина пользователя из БД без перезагрузки страницы.
Меня всё устраивает, но!
1. В файле php.php нужно заново подключать db_config.php чтобы соединится с бд
2. Файл php.php также открывается по прямому адресу в браузере. А это плохо, т.к. нужно чтобы он работал только в определенном месте.

Это можно было бы решить, например если в index.php задать переменную, а в php.php её проверять. Но как я понял, ajax не позволяет так сделать.

Посоветуйте, пожалуйста, как решить эту проблему?

index.php
PHP:
        <script>
        setInterval(function () { autoloadpage(); }, 1000);
        function autoloadpage() {
            $.ajax({
                url: "php.php",
                type: "POST",
                success: function(data) {
                    $("div#wrapper").html(data);
                }
            });
        }
        </script>

    <div id="wrapper">
    contents will be changed automatically.
    </div>
php.php
PHP:
include "db_config.php";

$rnd = rand (1,10);
$stmt = $mysqli->prepare("SELECT * FROM `users` WHERE id=?");
$stmt->bind_param("s", $rnd);
$stmt->execute();
$result7 = $stmt->get_result();
while ($row7 = mysqli_fetch_assoc($result7)) {
    $login = $row7["login"];
}
    echo "Login is: ".$login;
 

WMix

герр M:)ller
Партнер клуба
1. В файле php.php нужно заново подключать db_config.php чтобы соединится с бд
2. Файл php.php также открывается по прямому адресу в браузере. А это плохо, т.к. нужно чтобы он работал только в определенном месте.
1 да, так это всегда и происходит

2. максимум что можно сделать так это передавать токен (который может создаваться на сессию)

php.php?token=asdfghjkl4679

и после его проверять.
PHP:
if($_GET['token'] !== 'asdfghjkl4679'){
    exit;
}
// остальная часть
но от этого с точки зрения защиты ничего не изменится
 

DIG

Новичок
Партнер клуба
Насчёт файла конфигурации не вижу проблем, но если так смущает именно инклюд- скопипасть код подключения в файл php.php
Что бы файл php.php не открывался из браузера - нужно просто в нем проверять заголовки, например HTTP_X_REQUESTED_WITH или что там сейчас за ajax отвечает. Или можно попробовать в файле index.php отправлять какой ни будь нестандартный заголовок и в php.php проверять его наличие.
 

Тугай

Новичок
Это можно было бы решить, например если в index.php задать переменную, а в php.php её проверять. Но как я понял, ajax не позволяет так сделать.
Все позволяет, передавай параметры в php.php и проверяй
Код:
$.ajax({
...
    data: {"call_from": "index_php"},
...
});
или прям в url: "php.php?call_from=index_php",
 

ksnk

прохожий
Не, непонятно, что конкретно не устраивает.
У меня есть код, который с периодичностью в 1 секунду подгружает файл php.php
Код периодически, раз в секунду выводит случайный логин пользователей с ID 1..10. А если нет пользователей с такими Id? К примеру, поудалялись аккаунты ? Однако
Меня всё устраивает
Ну, Ok.
В файле php.php нужно заново подключать db_config.php чтобы соединится с бд
Это вопрос? В принципе, так , обычно, все и устроено, файлы конфигурации где-то отдельно от кода валяются на сервере и их инклудят, чтобы получить содержимое.
Файл php.php также открывается по прямому адресу в браузере. А это плохо
Нужно чтобы файл, открытый в строке броузера, выводил что-то другое ?
PHP:
if ($_SERVER['REQUEST_METHOD'] == 'POST') {
    //  нас вызвали из формы, отправленной методом POST
} else {
    //  нас вызвали более тривиальным способом
}
 

max74max

Новичок
1 да, так это всегда и происходит

2. максимум что можно сделать так это передавать токен (который может создаваться на сессию)

php.php?token=asdfghjkl4679

и после его проверять.

Код:
if($_GET['token'] !== 'asdfghjkl4679'){
    exit;
}
// остальная часть
но от этого с точки зрения защиты ничего не изменится
Понравилась ваша идея с передачей и проверкой токена. Взял её за основу и сделал дополнительную проверку, чтобы с точки зрения защиты всё было ок.
Как вы считаете, такой защиты будет достаточно?

index.php
PHP:
$key = "q2f4";
$token = md5($key.date("H:i"));
.......
            $.ajax({
                url: "php.php?token=<?=$token;?>",
.......
php.php

PHP:
$key = "q2f4";

if($_GET['token'] != md5($key.date("H:i"))){
    echo "Токен не подходит!";
    exit;
}
// ниже код выполнения при правильном токене
 

max74max

Новичок
Достаточно для чего ? Чтобы скрип (он без перезагрузки же работает, ведь правда же?) отработал свою минуту и загнулся от несовпадения токена ?
Ага, проверил. Так и произошло. Нужно придумать что-то другое.
Может быть можно как-то запретить просмотр файла php.php через браузер, но при этом чтобы через Ajax он выполнялся?
Пробовал запретить через htaccess, но тогда он и через ajax тоже не выполняется
 
Последнее редактирование:

ksnk

прохожий
вот это сообщение удалось увидеть? Там в конце предлагается способ, как можно определить запуск из адресной строки браузера и опрос страницы формой
 

max74max

Новичок
вот это сообщение удалось увидеть? Там в конце предлагается способ, как можно определить запуск из адресной строки браузера и опрос страницы формой
Да, этот метод тоже рабочий, но к сожалению, как с проверкой по токену, не защищает файл php.php
REQUEST POST, также как и токен, можно передать откуда угодно из вне. А значит получить данные из файла php.php
 

ksnk

прохожий
То есть, мы защищаемся от злонамеренного юзера, который не погнушается залезть в код страницы, сможет увидеть и понять перегенерируемый токен на странице, не поленится смастерить curl запрос с таким же токеном, и тем самым скачает всю секретную инфу, доверчиво предлагаемую скриптом? Тем самым скриптом, который и так доверчиво, раз в секунду эту информацию сам светит ?

В принципе - идея с токеном достаточно рабочая, однако в момент, когда токен заканчивается - страница должна перезагрузится. Ну или часть страницы, чтобы клиент не сильно напрягался при моргании странички. Таким образом на странице всегда останется работоспособный токен, воровать его будет достаточно проблематично. При этом, кроме нагрузки раз в секунду появится нагрузка раз в минуту по перезагрузке токена, но это уже детали...
 

WMix

герр M:)ller
Партнер клуба
Как вы считаете, такой защиты будет достаточно?
нет, правильно было бы
PHP:
// это происходит 1 раз, или на заранее известное событие.
$_SESSION['token'] = md5(blabla);

// передача клиенту
url: "php.php?token=<?=$_SESSION['token'];?>",

// проверка
if($_GET['token'] !== $_SESSION['token']){
    echo "Токен не подходит!";
    exit;
}

страница должна перезагрузится.
не обязательно, можно возвращать на каждую без ошибок отработанную команду (POST Запрос), новый токен. если фронт правильно написан, то все получится

и да, это не защита, (если только CSRF) а усложнение
 
Последнее редактирование:

ksnk

прохожий
не обязательно, можно возвращать на каждую без ошибок отработанную команду (POST Запрос), новый токен. если фронт правильно написан, то все получится
Непрерывное обновление токена, в зависимости от предыдущего? О! Сразу вижу как я еду в метро и между станциями теряется связь... Каким образом можно правильно написать фронт ?
 

ksnk

прохожий
Впрочем, ладно. Почему бы не остановиться на классике - авторизация юзера и хранение токена в сессии?
 

Valick

Новичок
Ёжики плакали, кололись, но продолжали [ж]рать кактус...
100% очередная проблема молотка, вызванная нежеланием ТС учиться правильно ставить задачу перед собой.
 
Сверху