2010-07-29 118 views
25

我目前正在構建一個web應用程序,其中PHP文件使用jQuery的$ .ajax函數加載到主文件中。但是,PHP文件顯然仍然可以在應用程序之外訪問,只需在地址欄中輸入文件名即可。PHP和AJAX安全問題

所以我的問題是什麼纔是最好的方式來使PHP文件'ajaxed'知道它包含在正確的頁面,並將正常工作,但如果它以任何其他方式訪問(即使有人在我的PHP文件中使它們成爲自己的網站和AJAX),那麼文件應該說「拒絕訪問」或其他內容。

在此先感謝

回答

10

從類似discussion

報價Eran Galperin正如其他人所說,Ajax請求可以被 要創建適當的 頭效仿。如果你想有一個基本的 檢查,以查看該請求是否是一個Ajax請求 你可以使用:

if($_SERVER['HTTP_X_REQUESTED_WITH'] == 'XMLHttpRequest') { 
//Request identified as ajax request 
} 

但是你永遠不應該在這個基礎檢查您的 安全。如果您需要, 將消除直接訪問頁面 。

請把此答案由Jeremy Ruten也考慮到:

沒有低保 他們訪問它通過AJAX的方式。 直接訪問和AJAX訪問 都來自客戶端,因此它很容易被僞造成 。

爲什麼你要這樣做呢?

如果這是因爲PHP代碼不是 非常安全,那麼使PHP代碼更安全可靠 。 (例如,如果你的AJAX 通過用戶ID到PHP文件,在PHP文件 寫代碼,以 確保是正確的用戶ID)。

更聰明的想法在上面鏈接的討論。

+0

那麼人們應該如何使用XMLHttpRequest訪問此頁面?你是否知道相同的原產地政策? – rook 2010-07-29 15:16:41

+0

我知道相同的原產地政策。可以檢查XMLHttpRequest以確定腳本是否通過AJAX調用(即您自己的腳本)或是否有人將他的瀏覽器指向此位置。不過,從您自己的站點的Firbug控制檯調用腳本是另一回事。 – middus 2010-07-29 16:32:20

1

這並不簡單,可以說沒有辦法做到這一點。你可以在你的php文件中需要一些POST變量,並在你的AJAX請求中發送它們。這可以讓您免受那些只需在瀏覽器中粘貼URL的用戶的幫助。

沒有人可以從其他域(安全問題)AJAX您的網站,但始終可以連接和drieclty發送http請求,例如通過cURL。

您可以在cookie中創建一些令牌,這也可以從jquery請求中看到,但該解決方案也可能會被黑客入侵。

2

的JavaScript您的域名不能訪問任何頁面,因爲這是一個違反了Same-Origin Policy。攻擊者需要利用XSS漏洞才能解決這個問題。總之,您不必擔心這種特定的攻擊,就像影響每個Web應用程序的舊攻擊一樣。

5

安全連接ajax和php需要一些方法。 可以使用

if(@isset($_SERVER['HTTP_REFERER']) && $_SERVER['HTTP_REFERER']=="http://yourdomain/ajaxurl") 
{ 
//Request identified as ajax request 
} 

不要忘記,以確保PHP文件因爲捲曲會欺騙頭。

53

總結Google搜索後的答案很多!

第1步:生成令牌系統對於所有的網絡服務:

生成令牌:

<?php 
    session_start(); 
    $token = md5(rand(1000,9999)); //you can use any encryption 
    $_SESSION['token'] = $token; //store it as session variable 
?> 

步驟2:

:發送Ajax調用使用它
var form_data = { 
    data: $("#data").val(), //your data being sent with ajax 
    token:'<?php echo $token; ?>', //used token here. 
    is_ajax: 1 
}; 

$.ajax({ 
    type: "POST", 
    url: 'yourajax_url_here', 
    data: form_data, 
    success: function(response) 
    { 
    //do further 
    } 
}); 

Step-3 :現在,讓我們確保與阿賈克斯處理PHP文件,

session_start(); //most of people forget this while copy pasting code ;) 
if($_SERVER['HTTP_X_REQUESTED_WITH'] == 'XMLHttpRequest') { 
    //Request identified as ajax request 

    if(@isset($_SERVER['HTTP_REFERER']) && $_SERVER['HTTP_REFERER']=="http://yourdomain/ajaxurl") 
    { 
    //HTTP_REFERER verification 
    if($_POST['token'] == $_SESSION['token']) { 
     //do your ajax task 
     //don't forget to use sql injection prevention here. 
    } 
    else { 
     header('Location: http://yourdomain.com'); 
    } 
    } 
    else { 
    header('Location: http://yourdomain.com'); 
    } 
} 
else { 
    header('Location: http://yourdomain.com'); 
} 

注:SORRY嵌套的if..else,但會增加可理解性。 你可以簡化所有三個在一個如果其他。 85%安全性增強!

+0

+1爲清晰,簡潔而有效的答案:) – 2013-12-06 12:40:09

+0

@ wardha-Web:非常感謝:) – 2013-12-06 14:12:11

+0

$ token = md5(rand(1000,9999));行使我的本地PHP 20秒重新加載頁面。 – arlg 2014-12-01 18:30:23

0

只需在應用程序中設置一個會話,檢查會話isset

session_start(); 
if(!isset($_SESSION['gebruikersnaam'])) { 
    header('Location: path/to/app/home'); 
} 
//Do stuff 

您也可以使用此:

if(!$_SERVER['HTTP_X_REQUESTED_WITH'] == 'XMLHttpRequest') { 
header('Location: path/to/app/home'); 
} 

,但不是所有的瀏覽器都支持HTTP_X_REQUESTED_WITH

對於某些額外的安全性,您可以檢查ajax調用是否正在從您的應用程序中提取

if(@isset($_SERVER['HTTP_REFERER']) && $_SERVER['HTTP_REFERER']=="http://yourdomain/path/to/ajax/file") { 
    header('Location: path/to/app/home'); 
}