2010-05-09 2 views
1

Это первый раз, когда я работаю над интерфейсным проектом, для которого требуется аутентификация на стороне сервера для запросов AJAX. Я столкнулся с проблемами, как я не могу сделать вызов session_start как начало линии «целевой страницы», Потому что бы получить меня PHP Warning:PHP проверить HTTP-референт на форму, представленную AJAX, безопасно?

Warning: session_start() [function.session-start]: 
Cannot send session cache limiter - 
headers already sent (output started at C:\xampp\htdocs\comic\app\ajaxInsert 
    Book.php:1) 
in C:\xampp\htdocs\comic\app\common.php on line 10 

Я считаю, это означает, что я должен выяснить иначе, чем проверка переменных сеанса PHP для аутентификации «вызывающего» этого скрипта PHP, и это мой подход:

У меня есть «защищенная» страница PHP, которая должна использоваться как «контейнер» моего javascript, который публикует форму через jQuery $.ajax(); метод

В моем «приемном» скрипте PHP у меня есть:

<?php 
define(BOOKS_TABLE, "books"); 
define(APPROOT, "/comic/"); 
define(CORRECT_REFERER, "/protected/staff/addBook.php"); 

function isRefererCorrect() 
{ 
    // the following line evaluates the relative path for the referer uri, 
    // Say, $_SERVER['HTTP_REFERER'] returns "http://localhost/comic/protected/staff/addBook.php" 
    // Then the part we concern is just this "/protected/staff/addBook.php" 
    $referer = substr($_SERVER['HTTP_REFERER'], 6 + strrpos($_SERVER['HTTP_REFERER'], APPROOT)); 
    return (strnatcmp(CORRECT_REFERER, $referer) == 0) ? true : false; 
} 

//http://stackoverflow.com/questions/267546/correct-http-header-for-json-file 
header('Content-type: application/json charset=UTF-8'); 
header('Cache-Control: no-cache, must-revalidate'); 

echo json_encode(array 
    (
     "feedback"=>"ok", 
     "info"=>isRefererCorrect() 
    )); 
?> 

Мой код работает, но мне интересно, существуют ли какие-либо риски безопасности при таком подходе? Может ли кто-нибудь манипулировать почтовым запросом, чтобы он мог притворяться, что JavaScript-адрес вызывающего абонента находится с «защищенной» страницы?

UPDATE:

просто понял, что я могу позволить JavaScript с защищенной страницы генерирует уникальный маркер для каждого запроса AJAX, и использовать переданное значение маркеров аутентификации, является ли это «подлинным Аяксом вызова» из защищенная страница

Будет ли это намного лучше? Или я должен просто зашифровать содержимое почтового запроса?

UPDATE РАЗ:

После двух часов циклически включенных страниц, я наконец-то заметил, что эта странная ситуация была вызвана моей PHP страницы кодирования ...

Я дал Notepad ++ попробуйте и небрежно выбрали кодировку страницы как UTF-8 с маркером байтового порядка, поэтому я продолжал получать предупреждающее сообщение из-за «странной» интерпретации этой строки:

<?php 

Хороший урок для меня ...

Большое спасибо любые намеки или предложения.

+0

может быть, есть подпись Юникода (BOM):> Знак байтового заказа. Символ Юникода U + FEFF при использовании для указания > порядка байтов текста. [Источник] (http://unicode.org/glossary/#byte_order_mark) Проверьте это. –

ответ

3

С технической точки зрения, кто-то может отправить вам запрос с рефералом, являющимся 127.0.0.1, 0.0.0.0, или в значительной степени независимо от того, что они хотят, даже не касаясь сайта; так что да, полагаясь на это, возможно, не лучший подход.

Также: ВЫ МОЖЕТЕ И СЛЕДУЕТ использовать php_session - вам просто нужно вызвать session_start(); Прежде чем что-либо еще отправит НИЧЕГО (поскольку в сообщении явно указано: уже отправленные заголовки). Судя по ошибке

(выход начался в C: \ XAMPP \ HTDOCS \ комические \ App \ ajaxInsert книги.PHP: 1)

это может быть просто перевод строки в начало файла

т.е.
//empty line 
<?php 
//code 

объявлений. Обновление: Это, вероятно, сделает вещи более безопасными; при условии, что страница, на которой создается токен, может быть доступна только людям с требуемыми разрешениями; это нормально. Хотя даже после прочтения вашего комментария я считаю, что у вас есть некоторые ненужные пробелы где-то, поскольку сеансы кажутся совершенно прекрасным способом аутентификации запроса AJAX.

+0

Да, я проверял исходный код много раз, и я уверен, что причина проблемы в том, что: мой javasript загружается с защищенной страницы, которая уже использует session_start(), чтобы убедиться, что только аутентифицированный сотрудник может получить доступ к этой защищенной странице , На самом деле, «целевая страница» отлично работает, чтобы вставить книгу в БД, просто на этой странице она не может использовать session_start() ... –

+0

Жаль, что я не смог бы это сделать. Я завышен на сегодняшний день :( –

+0

@Michael Mao Вы должны вызывать session_start(); каждый раз, когда загружается новая страница, таким образом, даже если предыдущая страница уже использовала его, она не должна создавать проблемы. – Robus

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