PHP 安全性

一、apache server安全性設(shè)置

  1. 以Nobody用戶運行
    一般情況下,Apache是由Root 來安裝和運行的。如果Apache Server進程具有Root用戶特權(quán),那么它將給系統(tǒng)的安全構(gòu)成很大的威脅,應(yīng)確保Apache Server進程以最可能低的權(quán)限用戶來運行。通過修改httpd.conf文件中的下列選項,以Nobody用戶運行Apache 達到相對安全的目的。
User nobody
Group# -1

2.ServerRoot目錄的權(quán)限
為了確保所有的配置是適當?shù)暮桶踩模枰獓栏窨刂艫pache 主目錄的訪問權(quán)限,使非超級用戶不能修改該目錄中的內(nèi)容。Apache 的主目錄對應(yīng)于Apache Server配置文件httpd.conf的Server Root控制項中,應(yīng)為:

Server Root /usr/local/apache

3.SSI的配置
在配置文件access.conf 或httpd.conf中的確Options指令處加入Includes NO EXEC選項,用以禁用Apache Server 中的執(zhí)行功能。避免用戶直接執(zhí)行Apache 服務(wù)器中的執(zhí)行程序,而造成服務(wù)器系統(tǒng)的公開化。

Options Includes Noexec

4.阻止用戶修改系統(tǒng)設(shè)置
在Apache 服務(wù)器的配置文件中進行以下的設(shè)置,阻止用戶建立、修改 .htaccess文件,防止用戶超越能定義的系統(tǒng)安全特性。

AllowOveride None
Options None
Allow from all

5.改變Apache 服務(wù)器的缺省訪問特性
Apache 的默認設(shè)置只能保障一定程度的安全,如果服務(wù)器能夠通過正常的映射規(guī)則找到文件,那么客戶端便會獲取該文件,如http://local host/~ root/ 將允許用戶訪問整個文件系統(tǒng)。在服務(wù)器文件中加入如下內(nèi)容:

order deny,ellow
Deny from all

6.CGI腳本的安全考慮
CGI腳本是一系列可以通過Web服務(wù)器來運行的程序。為了保證系統(tǒng)的安全性,應(yīng)確保CGI的作者是可信的。對CGI而言,最好將其限制在一個特定的目 錄下,如cgi-bin之下,便于管理;另外應(yīng)該保證CGI目錄下的文件是不可寫的,避免一些欺騙性的程序駐留或混跡其中;如果能夠給用戶提供一個安全性 良好的CGI程序的模塊作為參考,也許會減少許多不必要的麻煩和安全隱患;除去CGI目錄下的所有非業(yè)務(wù)應(yīng)用的腳本,以防異常的信息泄漏。

二、PHP安全性設(shè)置

1、程序代碼漏洞問題
很多 PHP 程序所存在的重大弱點并不是 PHP 語言本身的問題,而是編程者的安全意識不高而導致的。因此,必須時時注意每一段代碼可能存在的問題,去發(fā)現(xiàn)非正確數(shù)據(jù)提交時可能造成的影響。

<?php 
    unlink ($evil_var); 
    fwrite ($fp, $evil_var); 
    system ($evil_var); 
    exec ($evil_var); 
?> 

2、用戶輸入表單問題
驗證用戶輸入的任何數(shù)據(jù),保證PHP代碼的安全。
注意1:JS只是為了提高來訪用戶的體驗而產(chǎn)生的,而不是驗證的工具。因為任何一個來訪的用戶都可能會,也有可能無意間就禁用了客戶端腳本的執(zhí)行,從而跳過這層驗證。所以我們必須在PHP的服務(wù)器端程序上檢驗這些數(shù)據(jù)。
注意2:不要使用$_SERVER[‘HTTP_REFERER’]這個超級變量來檢查數(shù)據(jù)的來源地址,一個很小的菜鳥黑客都會利用工具來偽造這個變量的數(shù)據(jù),盡可能利用Md5,或者rand等函數(shù)來產(chǎn)生一個令牌,驗證來源的時候,驗證這個令牌是否匹配。
3、PHP文件權(quán)限問題
PHP 被設(shè)計為以用戶級別來訪問文件系統(tǒng),所以完全有可能通過編寫一段 PHP 代碼來讀取系統(tǒng)文件如 /etc/passwd,更改網(wǎng)絡(luò)連接以及發(fā)送大量打印任務(wù)等等。因此必須確保 PHP 代碼讀取和寫入的是合適的文件。
4、隱藏PHP擴展名
一般而言,通過隱藏的手段提高安全性被認為是作用不大的做法。但某些情況下,盡可能的多增加一份安全性都是值得的。
一些簡單的方法可以幫助隱藏 PHP,這樣做可以提高攻擊者發(fā)現(xiàn)系統(tǒng)弱點的難度。在 php.ini 文件里設(shè)置 expose_php = off ,可以減少他們能獲得的有用信息。
另一個策略就是讓 web 服務(wù)器用 PHP 解析不同擴展名。無論是通過 .htaccess 文件還是 Apache 的配置文件,都可以設(shè)置能誤導攻擊者的文件擴展名:
1、使PHP看上去像其它的編程語言
AddType application/x-httpd-php .asp .py .pl
2、使 PHP 看上去像未知的文件類型
AddType application/x-httpd-php .bop .foo .133t
3、使 PHP 代碼看上去像HTML頁面
AddType application/x-httpd-php .htm .html

三、Mysql數(shù)據(jù)庫安全性設(shè)置

1、數(shù)據(jù)庫設(shè)計問題
應(yīng)用程序永遠不要使用數(shù)據(jù)庫所有者或超級用戶帳號來連接數(shù)據(jù)庫,因為這些帳號可以執(zhí)行任意的操作,比如說修改數(shù)據(jù)庫結(jié)構(gòu)(例如刪除一個表)或者清空整個數(shù)據(jù)庫的內(nèi)容。
2.數(shù)據(jù)庫連接問題
把連接建立在 SSL 加密技術(shù)上可以增加客戶端和服務(wù)器端通信的安全性,或者 SSH 也可以用于加密客戶端和數(shù)據(jù)庫之間的連接。如果使用了這些技術(shù)的話,攻擊者要監(jiān)視服務(wù)器的通信或者得到數(shù)據(jù)庫的信息是很困難的。
3.數(shù)據(jù)庫數(shù)據(jù)的加密
SSL/SSH 能保護客戶端和服務(wù)器端交換的數(shù)據(jù),但 SSL/SSH 并不能保護數(shù)據(jù)庫中已有的數(shù)據(jù)。SSL 只是一個加密網(wǎng)絡(luò)數(shù)據(jù)流的協(xié)議。
如果攻擊者取得了直接訪問數(shù)據(jù)庫的許可(繞過 web 服務(wù)器),敏感數(shù)據(jù)就可能暴露或者被濫用,除非數(shù)據(jù)庫自己保護了這些信息。對數(shù)據(jù)庫內(nèi)的數(shù)據(jù)加密是減少這類風險的有效途徑,但是只有很少的數(shù)據(jù)庫提供這些加密功能。
對于這個問題,有一個簡單的解決辦法,就是創(chuàng)建自己的加密機制,然后把它用在 PHP 程序內(nèi),最常見的例子就是把密碼經(jīng)過 MD5 加密后的散列存進數(shù)據(jù)庫來代替原來的明文密碼。

<?php 
$query = sprintf("INSERT INTO users(name,pwd) VALUES('%s','%s');", 
addslashes($username), md5($password)); 
$result = pg_query($connection, $query); 
$query = sprintf("SELECT 1 FROM users WHERE name='%s' AND pwd='%s';", 
addslashes($username), md5($password)); 
$result = pg_query($connection, $query); 
if (pg_num_rows($result) > 0) { 
echo 'Welcome, $username!'; 
} else { 
echo 'Authentication failed for $username.'; 
} 
?>

4、SQL注入問題
直接 SQL 命令注入就是攻擊者常用的一種創(chuàng)建或修改已有 SQL 語句的技術(shù),從而達到取得隱藏數(shù)據(jù),或覆蓋關(guān)鍵的值,甚至執(zhí)行數(shù)據(jù)庫主機操作系統(tǒng)命令的目的。這是通過應(yīng)用程序取得用戶輸入并與靜態(tài)參數(shù)組合成 SQL 查詢來實現(xiàn)的。

<?php 
$query = "SELECT id, name, inserted, size FROM products 
WHERE size = '$size' 
ORDER BY $order LIMIT $limit, $offset;"; 
$result = odbc_exec($conn, $query); 
?>

可以在原來的查詢的基礎(chǔ)上添加另一個 SELECT 查詢來獲得密碼: union select ‘1’, concat(uname||’-‘||passwd) as name, ‘1971-01-01’, ‘0’ from usertable; 假如上述語句(使用 ‘ 和 –)被加入到 $query 中的任意一個變量的話,那么就麻煩了。
這些攻擊總是建立在發(fā)掘安全意識不強的代碼上的。所以,永遠不要信任外界輸入的數(shù)據(jù),特別是來自于客戶端的,包括選擇框、表單隱藏域和 cookie。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容