2013-04-23 4 views
2

Я пытаюсь запретить прямой доступ к PHP-файлу, который вызывается для ajax для проверки формы. Код, который у меня есть, работает до тех пор, пока форма не будет проверена, и тогда это не сработает. Я НЕ хочу использовать .htaccess.Запретить прямой доступ к php-файлу, который вызывается в ajax

Текущий код:

<?php 

$url = strtolower(basename($_SERVER['PHP_SELF'])); // Gets url (parent that uses the include) 
$fil = strtolower(basename(__FILE__)); // gets filename (the included file) 
if ($url == $fil){ 
    // if they are the same (file is accessed through url 
    // redirect to forbidden page 
    header("HTTP/1.0 403 Forbidden"); 
    exit; 
} 
// require my configuration 
require_once("config.php"); 
// code to be executed for ajax validation 
$username = $_POST['username']; 
$conn = mysql_connect(DB_HOST,DB_USER,DB_PASS) or die(mysql_error()); 
mysql_select_db(DB_NAME,$conn) or die(mysql_error()); 

$query = mysql_query("SELECT * FROM " . TB_USER . " WHERE username = '{$username}'",$conn) or die(mysql_error()); 
$result = mysql_num_rows($query); 

mysql_close($conn); 

if ($result == 0){ 
    echo "true"; 
}else{ 
    echo "false"; 
} 
?> 

Если я получить доступ к файлу непосредственно из URL, он перенаправляет как планировалось, но когда форма проверяемого через AJAX, это ничего не делать, если имя пользователя отсутствует. Вывод первых двух строк кода ($ url, $ fil), а также оператор if делает работу проверки ajax, но страница не запрещена при доступе по URL. Любое предложение о том, что делать дальше?

+0

Это было задано много раз: «Связанное» поле справа от экрана указывало мне на http://stackoverflow.com/questions/1756591/prevent-direct-access-to-file-called-by -ajax-function http://stackoverflow.com/questions/10637951/how-to-block-external-http-requests-securing-ajax-calls?lq=1 http://stackoverflow.com/questions/8278865/prevent -jax-cheating-on-a-web-game? lq = 1 http://stackoverflow.com/questions/7127686/blocking-non-ajax-requests-to-php?lq=1 http://stackoverflow.com/questions/8842053/allow-access-through-ajax-only-not-direct? lq = 1 – IMSoP

ответ

6

Используйте это:

if(!$_SERVER['HTTP_X_REQUESTED_WITH']) 
{ 
    header("HTTP/1.0 403 Forbidden"); 
    exit; 
} 

Во всех современных браузерах, если доступ к странице с помощью AJAX, PHP добавляет этот заголовок запроса. Если ваша страница вызывается и этот заголовок отсутствует, есть хороший шанс, что он вызывается напрямую (или другой страницей перенаправляется на него через гиперссылку или иначе). В основном это всегда показывает запретную страницу, если эта страница не была вызвана с использованием AJAX.

+1

Удивительно. Я не знал об этой функциональности. Непосредственно держа это в моих заметках. – Vince

+0

@Vince Помните, что заголовки могут быть подделаны. Однако в настоящее время это один из методов изучения заголовка, чтобы проверить, является ли он (потенциальным) ajax-запросом. – raidenace

2

Нет смысла делать это. Он не добавляет никакой реальной безопасности.

Все заголовки, указывающие, что запрос выполняется через Ajax (например, HTTP_X_REQUESTED_WITH), могут быть скреплены на стороне клиента.

Если ваш Ajax обслуживает конфиденциальные данные или разрешает доступ к конфиденциальным операциям, вам необходимо добавить надлежащую безопасность, например, систему входа в систему.

+0

Я действительно не ищу безопасности, я просто не хочу, чтобы страница была видимой, поскольку все, что она делает, это написать на страницу: true или false, в зависимости от того, существует ли пользователь или нет. Это просто забавный проект, над которым я работаю, что, если я думаю, что это действительно хорошо, тогда я изменю свой код для обеспечения безопасности. Прямо сейчас, он просто размещается на моем локальном сервере :) – Vince

+1

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

+0

Я знаю, если я действительно хочу что-то безопасное, я буду убедитесь, что, например, при хранении паролей, я выбрал случайное число, и он циклически проходит через md5 и sha1 несколько раз, пока не достигнет этого числа. – Vince

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