AJAX tarafından gönderilen formu için PHP onay http referer, güvenli?

1 Cevap php

Bu AJAX istekleri için sunucu tarafında kimlik doğrulaması gerektiren bir ön uç bir proje için çalışıyorum ilk kez. Bu bana bir PHP Uyarı alacağı cuz, "hedef sayfanın" başlangıcı hattı olarak session_start bir arama yapamazsınız gibi sorunlarla karşılaştı:

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

Ben bu ben bu PHP script "arayan" kimlik doğrulaması için PHP oturum değişkenleri kontrol etmekten başka bir yol bulmamız demektir saymak, ve bu benim yaklaşımdır:

JQuery ile formunu gönderdiğinde benim javascript "kapsayıcı" $.ajax(); yöntemi olarak kullanılması gereken bir "korumalı" PHP sayfası var

Benim "alıcı" PHP script olarak, ne var olduğunu:

<?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()
    ));
?>

Benim kod çalışır, ancak bu yaklaşımda herhangi bir güvenlik riskleri var acaba? O arayan javascript "korumalı" sayfasından olduğunu iddia böylece birisi sonrası isteği işleyebilirsiniz?

UPDATE:

just realized I can let javascript from the secured page generate a unique token per ajax request, and use the passed token value to authenticate whether it is a "genuine ajax call" from the secured page

Bu çok daha iyi olacak? Veya sadece sonrası isteğinin içeriğini şifrelemek gerekir?

UPDATE AGAIN :

After two hours of looping through the included pages, I finally noticed that this weird situation was caused by my PHP page encoding...

I gave Notepad++ a try and carelessly chose the page encoding as UTF-8 with Byte Order Marker, so I kept getting the warning message due to the "weird" interpretation of this line:

<?php

A good lesson for me...

Herhangi bir ipucu ya da önerileri çok teşekkürler.

1 Cevap

Teknik olarak görülen, birileri size yönlendirme olmak 127.0.0.1, 0.0.0.0 ya da hiç siteyi dokunmadan istedikleri ne olursa olsun hemen hemen bir istek gönderebilir; bu yüzden evet, güvenerek iyi yaklaşım olmayabilir.

Ayrıca: Sen ve php_session ÖNERİ CAN - sadece session_start () aramak zorunda; Başka bir şey (: başlıklar zaten gönderildi hata açıkça belirttiği gibi) ŞEY gönderir ÖNCE. Hata bakılırsa

(output started at C:\xampp\htdocs\comic\app\ajaxInsert Book.php:1)

Bu sadece dosya ie başında bir satır olabilir

//empty line
<?php
//code

Ad. Update: It'll probably make things more secure; given the page which creates the token can only be accessed by people with the required permissions; it seems ok. Though even after reading your comment I believe you have some unneccessary whitespace somewhere, as sessions seem a perfectly fine way to authenticate the AJAX request.