標籤:
話不多說,為了確保web內容的安全,這裡有一些常規的安全標準準則:
1.不相信表單
攻擊表單其實很簡單,如果有人在他們的瀏覽器去關閉了JS功能,你的用戶端驗證就失敗了。
使用者在很大程度上都是通過表單和後台進行互動,因此表單是最大的安全風險,圍繞著表單產生的攻擊很多,像mysql注入攻擊,XSS等,我們一定要在後端去驗證傳遞給指令碼的資料。
2.不相信任何使用者
表單的操縱者,這點無需多言!
3.關閉全域的變數
有時候其實最大的安全性漏洞是啟用了register_globals配置參數,幸運的是PHP4.2版本之後預設是關閉了這個選項,但還是不得不防,如果一個伺服器啟用了全域變數,會自動的為全域變數賦予任何形式的參數。
<input name=‘username‘ type=‘text‘>
假如說運行上述代碼,啟動了register_globals的PHP會將參數賦值到$username中,雖然看起來比$_POST[‘username‘]更為簡單,但是安全問題突出,php會設定該變數的值為通過GET或者POST的參數發送到指令碼的任何值。
1 if(auth()){2 $auth_flag=1; 3 }
正常的情況下是,只有通過了auth函數的檢驗,$auth_flag為1,但是如果register_globals啟用,任何人可以通過GET參數$auth_flag=1去覆蓋它,從而失去驗證的意義。所以我們應該從預定義的$_POST數組去取變數資訊,檔案上傳的資訊儲存在$_FILES數組中,如果不清楚method,可以通過$_REQUEST去擷取。
$_REQUEST是$_GET,$_POST,$_COOKIE數組的結合,預設的順序是cookie,post,get。
4.一些安全的配置選項
明顯的用於生產伺服器上的。
register_globals=off
safe_mode=off
error_reporting=off,生產伺服器使用錯誤記錄檔
停用這些函數:system(),exec(),passthru(),shell_exec()..
expose_php=off 該功能會向Apache頭部添加PHP的版本資訊
5.sql注入攻擊
通過在參數中插入有害的sql程式碼片段,進行伺服器的攻擊
例如:假如我們從表單取一個name變數,去mysql伺服器查詢,構造如下的sql
$sql="select * from table where name=‘$name‘";
對於這樣,我們應該先去轉義一下,trim,addslashes,htmlspecialchars,等,也許有人會把$name變成如下資訊:
tianye‘;drop table;
一般來說,防止sql注入的方法有一下幾種:
(1)密碼比對->通過使用者名稱查詢到密碼,然後將該密碼於使用者輸入的密碼進行匹配。
(2)總是對資料進行addslashes或者mysql_real_escape_string轉義。
(3)使用預先處理的方式進行查詢
6.基本的XSS攻擊
xss表示跨站指令碼攻擊,該漏洞發生在用戶端,最常見的形式是在使用者提交的內容中放入js指令碼以便擷取使用者cookie中的資料,由於大部分網站以cookie或者session來驗證使用者,所以偷取的資訊可使用者類比使用者。
對於此類攻擊最常見的預防方式是便是轉換實體,使用如下函數,trim,utf8_decode,htmlspecialchars,htmlentities,將指令碼裡的htm標籤轉化為實體,不被瀏覽器渲染。雖然這樣會預防大部分的攻擊,但是一些xss攻擊者會用16進位貨值utf編碼來攻擊,他們在url的get參數中發送編碼,讓瀏覽器運行16進位的代碼,瀏覽器一運行將得到類似<script>....</script>等的注入代碼,為了防止,我們需要將16進位中的#,$等轉換為他們對應的實體。
php安全編程