Все технические форумы на одном сайте Удобный поиск информации с популярных форумов в одном месте
Вопрос: Проверка источника AJAX запроса внутри вызываемого скрипта

Проблема следующая

Со страницы сайта с помощью AJAX запроса вызывается скрипт execute_query.php который выполняет sql запрос в базу данных.
Скрипту передается параметр query - который содержит запрос к базе данных.

Можно ли достоверно убедиться что AJAX запрос пришел от внутреннего скрипта сайта, а не от стороннего скрипта?

Для простоты понимания проблемы
Если AJAX запрос с методом GET то зарегистрированному пользователю для выполнения своего собственного запроса достаточно лишь виполнить следующий HTTP запрос запрос пользователя.
Если запрос с методом POST то надо написать простенький HTML документ в котором будет послан AJAX запрос.
Единственное что этому припятствует это знание структуры базы данных.
Ответ: Да всё так, только вдумчиво. Чтобы не получилось, что ты стоишь в защитной каске и при этом голый.

Добавлено спустя 9 минут 9 секунд:
Re: Проверка источника AJAX запроса внутри вызываемого скрипта


Вопрос: Проблема с XMLHttpRequest слишком много запросов.

Здраствуйте,

возникла следующая проблема..

function blablabla(str) {
        if (window.XMLHttpRequest) {
            // code for IE7+, Firefox, Chrome, Opera, Safari
            xmlhttp_move = new XMLHttpRequest();
        } else {
            // code for IE6, IE5
            xmlhttp_move = new ActiveXObject("Microsoft.XMLHTTP");
        }
        xmlhttp_move.onreadystatechange = function() {
            if (xmlhttp_move.readyState == 4 && xmlhttp_move.status == 200) {
		document.getElementById("inventory").innerHTML = xmlhttp_move.responseText;
            }
        }
        xmlhttp_move.open("GET","/m/inventory.php?id="+str,true);
        xmlhttp_move.send();  
}

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

Есть некоторые идеи, но хотелось бы услышать оптимальный вариант решения данной проблемы.

Спасибо заранее за помощь

P.S забыл добавить.. хотелось бы услышать решения при котором запросы оставались бы асинхронными.
Ответ: Alex116,
Типично допустимо 5-6 незавершенных;
Кладём запросы в массив очереди.
Отслеживать кол-во незавершенных запросов(на каждый новый запрос ставим инкремент счетчика, при завершении очередного запроса, счетчик декрементируем(и тестировать на меньше < 6).
Если условие не выполняется - ставим таймер setInterval и тестируем колво незавершенных, как выполнилось - исполняем очередной запрос из очереди.
Вопрос: Асинхронный ajax запрос

Доброго времени суток.
Имеется функция для выполнения ajax запроса.
function ajax(url, callback, async, method, params, header)
    {
        var xmlHttp = getXmlHttpRequest();
        async = async || false;
        params = params || '';
        method = method || 'GET';
        if (method == 'GET') url += '?'+'searchParams=' +params;
        if (header != null) xmlHttp.setRequestHeader('Content-Type', header)
        xmlHttp.open(method, url, async);
        if (!async)
        {
            if (params == '') {
                xmlHttp.send(null);
            }else {
                xmlHttp.send(params);
            }
            callback(xmlHttp.responseText);
        }
        else
        {
            xmlHttp.onreadystatechange = function() {
                if (xmlHttp.readyState == 4) {
                    callback(xmlHttp);
                }
            };
            xmlHttp.send(null);
        }
    }


Так вот, если я делаю синхронный запрос, т.е:
ajax('...',
           function(data){console.log(data)},
                false,
                'POST',
                ...);

а когда делаю асинхронный запрос т.е:
ajax('...',
            function(data){console.log(data)},
                true,
                'POST',
                ...);

то получаю undefined.
Я подозреваю что проблема в моей функции для ajax запроса, гляньте своим опытным глазом и скажите что не так?
Заранее спасибо.
Ответ: Кому интересно, проблема была в том что я забыл передавать заголовки(header).
Вопрос: Собственные логи Ajax запросов

Как бы реализовать такое. Все работает без проблем, но иногда пользователи жалуются на то и это. А понять, что у них там не так не получается. Как бы сделать собственное логирование с результатом ответа Ajax запроса, что там, почему и когда у них произошло. И стоит стоит также учесть повисшие запросы. Нажал он к примеру кнопочку, ну и к примеру загрузил себе файл с запросами во время данного соединения и отправил мне.
Заранее благодарен
Ответ:
Сообщение от mmotor
Нет мне надо узнать, что клиент отправляет и что получает в ответ, или не получает, и сколько на это времени у него уходит. Чтобы узнать, то ли у него мускул упал, то ли это ошибка сервера, и если да то какая и когда произошла, то ли ответа вообще не поступило, то ли интернет оборвался, то ли php вывел ошибку, то ли еще что-нибудь о чем я не подумал.
Для таких вещей обычно ведут журналирование запросов в базе: пришел запрос, записали дату, тело запроса, откуда пришел, входящий /исходящий и тд и тп. Отправили запрос записали в журнал.
но уж точно не пытаться сохранить где то у пользователя эти данные и уж точно не надеяться на то что он будет искать кнопочку для отправки.
Вопрос: Аномальное явление: запрос изображения "image/webp" при наличии в HTML встроенного скрипта

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

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

Далее полез в отладчик Chrom'а и столкнулся с непонятным явлением. Среди всех подзапросов, выполняемых в ходе загрузки страницы, имеется запрос главной страницы сайта:
автор
Accept:image/webp,*/*;q=0.8
Accept-Encoding:gzip, deflate, sdch
Accept-Language:ru-RU,ru;q=0.8,en-US;q=0.6,en;q=0.4
Cache-Control:no-cache
Connection:keep-alive
Cookie: ...
Host:www.site.ru
Pragma:no-cache
Referer:
User-Agent: ...

Как видно, запрашивает "image/webp". Ответ, естественно, получает в "text/html".
При этом в исходном html-коде Chrome указывает на строку, где прописывается javasript:

<script type="text/javascript" charset="UTF-8">  // вот на эту строку указывает Chrome, что якобы здесь запрашивается www.site.ru
    javasript-код, меняющий классы у двух элементов
</script>

Одновременно с этим, в консоли выводит сообщение:
автор
Resource interpreted as Image but transferred with MIME type text/html

-------------------
Здесь всё логично (запрашивает "image/webp", получает "text/html"), кроме главного: с какого перепугу объявление скрипта "text/javascript" в html-коде приводит к попытке загрузке хрен знает какого изображения типа "image/webp" по адресу www.site.ru ?

Ещё одно наблюдение. Если этот проблемный скрипт вообще убрать из кода страницы, то то же самое поведение наблюдается уже на другом (следующем) скрипте. Т.е. проблема не в каком-то конкретном встроенном скрипте, а в присутствии в html любого объявления скрипта.

Загрузка главной страницы в фоне наблюдается в FF и в Chome. В других браузерах не проверял.
Ответ:
автор
А почему думаете, что это глюк? Может процедура рендеринга страницы у него именно такова, что изображение ему требуется именно в момент обработки встроенного скрипта.
Маловероятно, поскольку встроенный скрипт меняет 2 класса у элементов страницы. "background-image: URL()" прописан изображению, которое никак не связано с этими элементами (у которых меняются классы). Они в разных частях страницы находятся и в разных блоках (и эти блоки имеют один уровень, т.е. один в другой не вложены). При этом часть изображений загружаются до выполнения этого скрипта, часть - после.

Хотя, этим можно было бы объяснить вот это:
автор
Ещё одно наблюдение. Если этот проблемный скрипт вообще убрать из кода страницы, то то же самое поведение наблюдается уже на другом (следующем) скрипте. Т.е. проблема не в каком-то конкретном встроенном скрипте, а в присутствии в html любого объявления скрипта.
Впрочем, в последний раз Chrome в качестве строки-инициатора для фоновой загрузки главной страницы сайта указал не строку скрипта, а строку с левой ссылкой (не имеющей отношения в изображению с "background-image: URL()").
Плюс, для некоторых других изображений Chrome тоже некорректно строку-источник определяет (указывает на строку с левой ссылкой)

Так что, 8:2 в пользу глюка.
Вопрос: Gm_xmlhttprequest - несколько запросов,дождаться ответа и перейти к следуещему

В общем пишу скрипт на Grease Monkey (расширение для Mozila FireFox)
Столкнулся с такой проблемой : нужно дождаться ответа 1 запроса,взять необходимые данные,изменить переменные, далее перейти к следующему запросу (и таких несколько запросов,но для примера хотя-бы 2 возьмём) .
В общем перепробовал многое,вот некоторые мои попытки реализовать это :
1) попытка :
GM_xmlhttpRequest({
        method: "GET",
        headers: {
            "Accept": "text/html"
        },
        url: "http://web.archive.org/web/20140306220001/http://m.megafonpro.ru/home?from_404=1",
    onload: function(r) {
        var lol=r.responseText.match(/\http:\/\/m\.megafonpro\.ru\/mailru\/proxy\/[0-9a-f]{32}/g);
        alert(lol);
}});
GM_xmlhttpRequest({
         method: "GET",
            url: lol,
         onload: function (e) {
         alert(e.responseText)
         }})

2) попытка :
GM_xmlhttpRequest({
        method: "GET",
        headers: {
            "Accept": "text/html"
        },
        url: "http://web.archive.org/web/20140306220001/http://m.megafonpro.ru/home?from_404=1",
    onload: function (m) {{
        GM_xmlhttpRequest({
         method: "GET",
            url: m.responseText.match(/\http:\/\/m\.megafonpro\.ru\/mailru\/proxy\/[0-9a-f]{32}/g),
         onload: function (e) {
         alert(e.responseText)
        })}}}});

3) попытка :
пробовал поставить
Код:
synchronous: true
Остальные попытки не сохранились,но голову ломаю над этим уже третий день .
Перечитал много форумов,статей,документаци я по GM_xmlhttprequest .
Но всё в основном все на english и мне трудно поддаётся понимание их .
Последний вариант это просить помощи у вас,многоуважаемые форумчане,заранее спасибо за ответы !
Ответ: проблему решил следующем образом :
GM_xmlhttpRequest({
        method: "GET",
        url: "http://web.archive.org/web/20140306220001/http://m.megafonpro.ru/home?from_404=1",
    onload: function (m) { 
        GM_xmlhttpRequest({
         method: "GET",
            url: m.responseText.match(/(\http:\/\/m\.megafonpro\.ru\/mailru\/proxy\/[0-9a-f]{32})/g)[0],
         onload: function (e) {
         alert(e.responseText)
         }
})
    }
});
Вопрос: Вывод числа месяца, дни недели + запрос sql

Приветствую. Возникла проблема, которая никак не хочет решаться.
 
И так имеется таблица, в таблице столбцы "число", "день недели", "название". Число и день недели заполняются автоматически в зависимости от выбранного месяца короткой функцией:
$count_day = cal_days_in_month(0, $getmonth, $getyear);
$j=1;
for($i=1;$i<=$count_day;$i++)
{
$string.="<tr><td>".$i."</td><td>".$date."</td><td></td><td>123</td><td></td><td></td></tr>
}
String получается это одна строка в которой должны быть все данные. Но вот проблема, необходим выпадающий список, который подгружается из sql в этом же запросе в месте где написано "123". При этом в запросе sql присутствуют несколько результатов, а не один, т.е. выпадающий список с возможностью выбора. Так вот как подружить for и while или какой аналог использовать в данном случае? Все результаты sql одинаковы, как то возможно изначально вывести форму с заполненными полями и вставить в for. Только я не знаю как.
 
Заранее благодарен.
Ответ: во первых, что это за функция? cal_days_in_month?

 
во вторых, объедините свои даты в один столбец, и назначьте ему int(11) и пишите туда количество секунд прошедших с начала эпохи.
 
затем преобразуйте входные данные в секунды и делайте выборки между целыми числами. быстро и эффективно.
 
Добавлено:
забыл... входные данные преобразуются функцией

 
запрос необходимо генерировать функцией AJAX она есть в двух вариантах
 

 

 
Добавлено:
ну а если вы мастер изврата, тогда Вам дорога в SQL CONCAT
Вопрос: Как поймать запрос к сайту и узнать параметры запроса?

Пишу в эту тему т.к. запрос скорее всего отправляется с использованием JavaScript (Ajax?)

А теперь в чем проблема.
Код страницы состоит из 25500 строк. Это 1 мегабайт.
На странице более 20 встроенных скриптов (код в странице) и 10-20 ссылок на js скрипты. Никаких сабмитов. Код input type="hidden" встречается 2350 раз.
Скрипты абсолютно непонятные, хотя я впринципе немного работал с js.
При сохранении этой страницы, в папке сохраняются 70 скриптов.

Вот пример кода кнопок, выполняющих разные действия
Javascript
1
2
3
<a  class="lsd-widgets-action-link lsd-widgets-action-text" href="javascript:void(0);" >Сохранить для текущего сеанса</a>
<a class="lsd-widgets-action-link lsd-widgets-action-text" href="javascript:void(0);">Сохранить</a>
<a  class="lsd-widgets-action-link lsd-widgets-action-text" href="javascript:void(0);" >Закрыть</a>
А вот весь файл. Размер 1 МБ


Пробовал снифферы - но ничего в запросах не нашел. Инструменты, разработчика гугл хром-сеть, фаербаг огнелиса, много чего.
Я не вижу какие параметры отправляет эта страница. И не могу это узнать из js html кода.
(Не могу для этого сайта. Для других - легко. Этот сайт нестандартный)

Сможете помочь или хотя бы подсказать что вообще там (в файле, js коде) происходит?
Или как поймать запрос к сайту и узнать параметры запроса (login=111 и т.д.)?
Ответ:
Сообщение от Balanaar
Вы хотите, чтобы мы прокомментировали все 25500 строк кода?
Нет я хочу понять "куда смотреть". Я хочу понять что вообще происходит. Где отлавливать запрос.
Мне даже не надо коментарии - мне надо понять где идет отправка данных и какие это данные.

Обычно все решается использованием сниффера/инструментами разработчика.
Но тут это не вышло.
Вопрос: Проблема с парсером из-за подгружающегося фильтра

Возникла проблема с парсером.

var request = require('request');
var cheerio = require ('cheerio');
url='https://www.premierleague.com/players/3170/Fraser-Forster/stats?se=54'
request ({url, method: 'GET', encoding: 'binary'},	
function (err,res,body) {
if (err) throw err; 
setTimeout ( function () {
var $=cheerio.load(body);
var name=$("div.name").text();
var team=$("div.info").first().text();
var position=$("div.info").last().text();
var games=$("div.topStatList").text();
console.log(name);
console.log(team);
console.log(position);
console.log(games);
},100)});

Изначально, заходя на страницу со статистикой игрока отображается общая статистика за все годы карьеры, если в выпадающем списке выбрать последний сезон, то к ссылке добавляется ?se=54, с которой я граблю. Но если пройти по ссылке, то видно что изначально подгружается общая статистика и только потом за последний сезон, который мне и нужен.
Так и мой код загружает первоначальную ОБЩУЮ статистику за все сезоны, а не за последний.
Пробовал таймер ставить- не помогает.
Хотел перед загрузкой данных передать атрибуту data-option-id значение 54. Но ничего не происходит. Помогите решить проблему.
Ответ: Сама по себе статистика подгружается аяксовым запросом , который возвращает json.

но к нему надо прилепить дополнительные заголовки, чтобы сервер не заругался. Собственно твоя задача в том, чтобы выяснить, откуда эти заголовки брать.

Запрос можно увидеть в тех же дебажных тулзах, на вкладке Network (тип запроса - XHR).
Вопрос: Переход по ссылке с передачей POST запроса

Смысл в следующем. Есть форма на которой вводиться "Логин+Пароль" при нажатии кнопки AJax производит отправку запроса к скрипту на perle который далее запрашивает данные у "сервера" все это происходит POST запросами. Если пользователь и пароль верны то нужно произвести переход по "некоторой" ссылке (url тот же там будет рассматриваться что в POST запросе и в зависимости от этого уже действовать) с передачей ей возвращенного от perl скрипта ответа. При неправильных пользователях-паролях страница не перегружается, а только выводит сообщения.
Проблема в том что не могу сообразить как передать, при открытии "некоторой" ссылки, эти самые возвращенные данные.
И вообще мне кажется что я как то не правильно вызываю эту "некоторую" ссылку.
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
jQuery.ajax({
        url:     url,
        type:     "POST",
        contentType: "application/json; charset=utf-8",
        dataType: "html",
        data: jQuery("#"+login_form).serialize(),
        success: function(response) {
            result = jQuery.parseJSON(response);
            if(result.Status=="BadPassword"){
                document.getElementById(result_form).innerHTML = "Неверный пароль.";}
            else if(result.Status=="BadUser"){
                document.getElementById(result_form).innerHTML = "Пользователь не найден.";}
            else if(result.Status=="BlockUser"){
                document.getElementById(result_form).innerHTML = "Пользователь заблокирован.";}
            else if(result.Status=="Succes"){
                document.getElementById(result_form).innerHTML = "JSON: "+response+"<br>Ответ: "+result.Answer;
                $.ajax({
                url:     url,
                type: "POST",
                contentType: "application/json; charset=utf-8",
                dataType: "html", //формат данных
                data: response,
                }).done(function(data) {
                console.log(data);
                })}
        },
        error: function(response) { // Данные не отправлены
            document.getElementById(result_form).innerHTML = "Ошибка. Нет ответа от сервера.";}
    });
Данные передаются в JSON, как я это понимаю. Отсюда еще вопрос. А можно как то дописать данные к полученному ответу?
Например вернулись (login, password, answer), а к ним добавить, при отправке на "некоторую" ссылку ещё например (date, nomer).

Добавлено через 5 часов 29 минут
Неужели никто не знает? Мне кажется это должно быть очень просто. Я уже второй день бьюсь над этим, но так как мои познания в Jave очень маленькие то ничего не могу придумать. Подскажите пожалуйста, или хоть покажите куда копать.
Ответ: Заголовок Location непременно нужен, только в случае, если это не аякс запрос. Иначе перенаправится сам аякс запрос и в ответе вы получите конечный результат.

Добавлено через 2 минуты
zhukovia, передать параметры методом POST можно только через форму, либо аяксом. Для того, что бы гонять данные при каждом запросе есть куки.