我目前正在構建一個web應用程序,其中PHP文件使用jQuery的$ .ajax函數加載到主文件中。但是,PHP文件顯然仍然可以在應用程序之外訪問,只需在地址欄中輸入文件名即可。PHP和AJAX安全問題
所以我的問題是什麼纔是最好的方式來使PHP文件'ajaxed'知道它包含在正確的頁面,並將正常工作,但如果它以任何其他方式訪問(即使有人在我的PHP文件中使它們成爲自己的網站和AJAX),那麼文件應該說「拒絕訪問」或其他內容。
在此先感謝
我目前正在構建一個web應用程序,其中PHP文件使用jQuery的$ .ajax函數加載到主文件中。但是,PHP文件顯然仍然可以在應用程序之外訪問,只需在地址欄中輸入文件名即可。PHP和AJAX安全問題
所以我的問題是什麼纔是最好的方式來使PHP文件'ajaxed'知道它包含在正確的頁面,並將正常工作,但如果它以任何其他方式訪問(即使有人在我的PHP文件中使它們成爲自己的網站和AJAX),那麼文件應該說「拒絕訪問」或其他內容。
在此先感謝
從類似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)。
更聰明的想法在上面鏈接的討論。
這並不簡單,可以說沒有辦法做到這一點。你可以在你的php文件中需要一些POST變量,並在你的AJAX請求中發送它們。這可以讓您免受那些只需在瀏覽器中粘貼URL的用戶的幫助。
沒有人可以從其他域(安全問題)AJAX您的網站,但始終可以連接和drieclty發送http請求,例如通過cURL。
您可以在cookie中創建一些令牌,這也可以從jquery請求中看到,但該解決方案也可能會被黑客入侵。
你還可以阻止盜鏈,如果你擔心別人可能未經您的許可訪問您的內容
請參閱:運行在另一個域 http://www.htmlbasix.com/disablehotlinking.shtml
的JavaScript您的域名不能訪問任何頁面,因爲這是一個違反了Same-Origin Policy。攻擊者需要利用XSS漏洞才能解決這個問題。總之,您不必擔心這種特定的攻擊,就像影響每個Web應用程序的舊攻擊一樣。
安全連接ajax和php需要一些方法。 可以使用
if(@isset($_SERVER['HTTP_REFERER']) && $_SERVER['HTTP_REFERER']=="http://yourdomain/ajaxurl")
{
//Request identified as ajax request
}
不要忘記,以確保PHP文件因爲捲曲會欺騙頭。
總結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%安全性增強!
+1爲清晰,簡潔而有效的答案:) – 2013-12-06 12:40:09
@ wardha-Web:非常感謝:) – 2013-12-06 14:12:11
$ token = md5(rand(1000,9999));行使我的本地PHP 20秒重新加載頁面。 – arlg 2014-12-01 18:30:23
只需在應用程序中設置一個會話,檢查會話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');
}
那麼人們應該如何使用XMLHttpRequest訪問此頁面?你是否知道相同的原產地政策? – rook 2010-07-29 15:16:41
我知道相同的原產地政策。可以檢查XMLHttpRequest以確定腳本是否通過AJAX調用(即您自己的腳本)或是否有人將他的瀏覽器指向此位置。不過,從您自己的站點的Firbug控制檯調用腳本是另一回事。 – middus 2010-07-29 16:32:20