HTTP攻擊與防範--PHP安全配置
1什麼是安全性
所謂安全性就是保護web應用程式與網頁不會受到黑客的攻擊。有些黑客純粹是為了好玩而入侵他人的電腦,但有更多的黑客費勁心思要竊取他人電腦中的機密檔案,甚至使整臺電腦癱瘓來達到他的目的。現象在網上有很多可以讓黑客使用的軟體,這些軟體多半是免費的而且簡單好用,所以一般人要攻擊您的電腦,並不是一件非常困難的事情。關鍵是您對電腦進行了什麼樣的保護?如果只是安裝了查毒軟體或者防火牆以為平安無事了,那麼您對安全性的真正意義可以說是完全不瞭解。
2 register global
從PHP4.2.0開始,php.ini的register_global選項的預設值預設為Off。當register_globals設定為On時,您的程式將可以接收來自伺服器中的各種環境變數,包括表單提交的變數,而且由於PHP不必事先初始化變數的值,從而導致很大的安全隱患.例如HTML表單的請求變數。由於PHP不需要事先初始化變數的值,這就會更容易寫出不安全的程式碼。這是個很艱難的抉擇,但PHP社群還是決定預設關閉此選項。當開啟時,人們使用變數時確實不知道變數是哪裡來的,只能想當然。但是register_globals的關閉改變了這種程式碼內部變數和客戶端傳送的變數混雜在一起的糟糕情況。
3 安全模式
安全模式( safe_mode)是PHP用來限制文件的存取、限制環境變數的存取,以及控制外部程式的執行。
由於網站伺服器是以單一系統使用者的模式在執行,因此這個系統的使用者賬號必須能夠讀取每個使用者的文件。這表示在網站伺服器上執行的任何程式碼文件都能夠存取每個使用者的文件。PHP的安全模式在多使用者的系統上設定一些限制選項來保障程式的安全執行。安全模式只能限制PHP的文件,但是不能限制PHP執行的外部應用程式。因此將可執行的應用程式放置在一個安全的資料夾內,不要讓外部使用者執行。 啟動PHP的安全模式,將php.ini檔案的safe_mode選項(directive)設定為On:
safe_mode = On
事例1:
test.php內容如下:
<?php
if($authorized){
echo "變數賦值";
}else{
echo "變數沒有賦值";
}
當php.ini中的register_globals=Off時
訪問網址:http://localhost/test.php?authorized=1
輸出結果為:
變數沒有賦值。
當php.ini中的register_globals=On時
攻擊:
變數未初始化,可以通過url對變數賦值
輸出結果為
變數賦值
防護:
變數初始化,阻止通過url對變數賦值進行攻擊。
需將程式碼改為:
<?php
$authorized=false;
if($authorized){
echo "變數賦值";
}else{
echo "變數沒有賦值";
}
事例2:
例如:test.php內容如下:
<?php
if(isset($_SESSION['username'])){
echo "訪問者:".$_SESSION['username'];
}else{
echo "訪問者尚未登陸";
}
當訪問http://localhost/test.php時,
輸出:訪問者尚未登陸
攻擊:
在網址後面追加?_SESSION[username]=admin
即:http://localhost/test.php?_SESSION[username]=admin
輸出:訪問者:admin
防護:
session_start()開啟session,獲取session中的值,阻止通過url對session變數進行注入攻擊。
程式碼改為<?php
session_start();
if(isset($_SESSION['username'])){
echo "訪問者:".$_SESSION['username'];
}else{
echo "訪問者尚未登陸";
}
事例3:
當php.ini中的allow_url_fopen = On時
demo.php中的內容如下:
<?php
@include "$path";
if(!isset($path)){
echo "檔案沒有被呼叫";
}
test.php中的內容為:
<?php
echo "this is test.php。檔案被呼叫。";
當訪問網址:
http://localhost/demo.php時
輸出:檔案沒有被呼叫。
攻擊:
在連結後面拼接?path=test.php
即:訪問http://localhost/demo.php?path=test.php
輸出:this is test.php。檔案被呼叫。
保護:
同上對path變數初始化。
注:
可以呼叫ini_get_all函式來顯示 PHP的設定值。
例如:
<?php
echo "<pre>";
print_r(ini_get_all());
echo "</pre>";
執行結果部分如下:
可以通過
<?php
ini_set("allow_url_fopen",1);
在php檔案中修改配置