2010-10-09 2 views
4

Я новичок в использовании AJAX, и я просто последовал за учебником, чтобы получить некоторую информацию из моей базы данных с помощью AJAX и вывести ее на страницу. Есть строка, где я вызываю php-скрипт, где выполняется запрос базы данных, и результат повторяется. Я немного обеспокоен тем, что, поскольку имя файла видимо во внешнем интерфейсе, и только цель состоит в том, чтобы напрямую выводить результаты базы данных, это может представлять проблему безопасности. Есть ли способ защитить этот файл и убедиться, что он запускает запрос только при вызове через сценарий ajax?как защитить ajaxRequest.open php script

Вот немного Ajax кода в вопросе (обратите внимание на строку "somefile.php"):

ajaxRequest.onreadystatechange = function(){ 
    if(ajaxRequest.readyState == 4){ 
     var ajaxResponse = ajaxRequest.responseText; 
     element.innerHTML = '<h2>' + ajaxResponse + '</h2>'; 
    } 
} 
ajaxRequest.open("GET", "somefile.php", true); 
ajaxRequest.send(null); 

Спасибо за любые ответы.

ответ

1

Нет, нет. Все, что вы доверяете JavaScript на стороне клиента, вы доверяете пользователю.

Если у вас есть аутентификация/авторизация, вы доверяете пользователям, которых вы разрешаете. Если вы этого не сделаете, вы доверяете всем и своим ботам.

+0

вы можете также создать одноразовый маркер безопасности и вставить его в запрос ajax, а затем проверить php на правильный токен. это ни в коем случае не является непревзойденным, но он отфильтрует некоторые из шумов – pxl

+0

Действительно (хотя это относится к заголовку «авторизовать» :) – Quentin

1

Поместите свой PHP код в этой проверки:

if(!empty($_SERVER['HTTP_X_REQUESTED_WITH']) && strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) == 'xmlhttprequest') 
    { 
    /* Your code here */ 
    } 

Все запросы Ajax есть этот набор заголовков. Как и все источники, этот инструмент тоже может быть подделан, чтобы всегда не доверять чему-либо, поступающему от клиента, фильтровать/белить список входящих параметров запроса и заботиться о своей базе данных с помощью подготовленных операторов.

+0

Это неверно, если вы делаете Ajax-вызовы вручную. Mainstream frameworks добавляют какой-то заголовок, подобный этому, но это не всегда так, и если вы делаете это вручную, вам нужно будет установить их самостоятельно. – Dave

+0

Я использовал это; Я знаю, что это не идеально, но каждый бит помогает. Во всяком случае, я просто протестировал в IE9, и он не сработал ... оценил false. – Ecropolis

0

Вам нужно беспокоиться о сохраненных xss в . Вы можете избежать этого, выполнив htmlspeicalchars($var,ENT_QUOTES); по данным, прежде чем вводить их в базу данных или перед тем, как распечатать их в своем ответе ajax.

0

Я решил его следующим образом:

if($_SERVER['HTTP_REFERER'] == 'http://' . $_SERVER['SERVER_NAME'] . '/mydir/myscriptwithajaxcall.php') 
    // do something 
else 
    echo 'Restricted Access'; 

Затем скрипт PHP выполняется только после вызова Ajax, если она исходит от конкретного сценария (там же). Примечание: я тест с сеансами и констант и не работает:/

+0

Обратите внимание, что это может не сработать, в зависимости от браузера пользователя и настроек. Браузеры не обязаны отправлять заголовок REFERER. – lonesomeday

0

я пробовал несколько способов защиты под названием PHP файл прямого доступа, и эта работа:

if($_SERVER['PHP_SELF'] == $_SERVER['REQUEST_URI']) 
    exit('This file can not be accessed directly...'); 
Смежные вопросы