簡體   English   中英

為了使我的Web應用程序安全,我應該注意些什么?

[英]What should I be aware of to make my web application secure?

通過瀏覽網絡上的各種文章和教程,我已經構建了簡單的PHP應用程序。 由於我現在將其提供給一些客戶,因此我擔心它的安全性。 我如何確保它不會被黑客入侵?

如果您只是從確保代碼安全的角度進行討論,則應注意一些事項(這是不完整的清單,但應該可以幫助您入門):

SQL注入

如果您的應用程序中有任何SQL查詢,並且它們中的任何一個都使用用戶的輸入,那么您可能容易受到SQL注入的攻擊。 這是用戶在表單字段處提交惡意內容的時候,當將其插入到查詢中時,攻擊者就可以訪問數據庫的其他部分。

預防方法:從用戶那里獲得的任何輸入都需要先清理,然后才能在查詢中使用。 為此,您可以使用准備 (或參數化 )語句(即mysqli::preparePDO ),或使用在查詢中使用輸入值之前先對其進行正確轉義的函數(即mysql_real_escape_string )。

跨站點腳本(XSS)攻擊

如果您從用戶那里獲取任何輸入並將其輸出到另一個頁面中(例如,您可能會收集用戶數據,然后輸出用戶列表),則您很可能會受到XSS攻擊。 這些工作的方式是將代碼(通常是<script>標記)添加到表單字段中,如果在輸出之前未對它們進行清理,則攻擊者將在頁面中添加自己的Javascript,該Javascript將在頁面的上下文中運行(因此可以訪問Cookie之類的東西)。

預防方法:除非有充分的理由讓用戶輸出HTML,否則每次您輸出來自用戶的內容時,都應使用htmlspecialchars對其進行清理,這會將潛在的危險字符(例如<> )轉換為HTML HTML實體。 如果必須讓用戶輸出HTML,則應具有一組允許的特定標記,並確保僅允許這些標記通過(例如,使用DOM解析器或strip_tags )。

另請參閱: 跨站點腳本(XSS)常見問題解答

跨站點請求偽造(CSRF)攻擊

這是一種攻擊,攻擊者利用用戶瀏覽器中存儲的身份驗證Cookie來誘騙用戶的瀏覽器自行發出請求(例如,通過向您的站點中注入代碼,盡管該攻擊實際上可能來自任何地方)。 例如,假設您已經創建了一個銀行應用程序,那么攻擊者可能導致仍然具有有效身份驗證cookie的合法用戶為您的網站請求http://yourapp.com/transfer_funds.php?to=attacker ,而無需知道。

預防方法: GET請求應該是冪等的 (也就是說,應始終具有相同的效果,否則不應導致應用程序狀態改變)。 這意味着用戶可以執行的任何操作(例如CRUD操作)應通過POST而非GET 同樣,您應該檢查$_POST ,而不是$_REQUEST進行這些操作,因為$_REQUEST將包含來自$_POST$_GET
但是,即使使用POST,您的應用程序仍然可能容易受到CSRF的攻擊。 為了更好地保護,許多人使用質詢令牌系統,其中應用程序生成與用戶會話相關的隨機字符串。 該質詢令牌與應用程序本身發出的任何相關請求一起傳遞(通過將其包含在表單中),然后在允許進行任何操作之前進行驗證。 請注意,如果您的應用程序具有XSS漏洞,則挑戰令牌可能會受到威脅。

另請參閱: 跨站點請求偽造(CSRF / XSRF)常見問題解答

利用eval或系統命令

如果您將eval與用戶輸入一起使用,那么您將使整個應用程序環境(以及除此之外的服務器環境)面臨潛在的攻擊,因為如果您不太謹慎(即使您確實),用戶可以運行所需的任意代碼。 這可能會導致任何事情,包括修改數據庫,更改服務器環境,在服務器上安裝和運行腳本或二進制文件,刪除PHP文件...(這種攻擊適用於進行系統調用的任何PHP函數,包括systemfopen ,訪問文件系統的任何功能...因此在使用用戶輸入時要非常小心!)

如何防止:不要在用戶輸入中使用eval 如果您認為需要在用戶輸入中使用eval ,則可能有更好(更安全)的方法來解決該問題。

開發Web應用程序時,最重要的事情是像對待瘟疫一樣對待用戶輸入。 這是邪惡的,不能被信任!

每當您使用客戶端/用戶可以修改的變量(例如POST,GET或其他變量)時,都需要對其進行清理。 除去不屬於您期望的輸入的任何多余碎屑。

例如,如果您具有以下代碼:

$var = $_POST['myNumber'];
echo 'You entered the number ' . $var . '!';

此代碼容易受到攻擊-您需要在此處清理POST變量:

$cleanVar = sanitize($_POST['myNumber']);
echo 'You entered the number ' . $cleanVar. '!';

其中sanitize(string)是用於刪除多余引號和類似內容的函數。 可以想象,您可以傳入第二個參數,以正確過濾所需內容的類型。 例如,告訴您的sanitize函數以某種方式剝離廢話以獲取數字,並以另一種方式剝離字符串。

對於Web應用程序安全性,您確實不能錯過OWASP。 它由一組專注於Web應用程序安全性的安全專家組成,並定期更新相關資源。

最著名的是OWASP Top 10 (最新版本2010),它概述了Web應用程序通常遇到的十大安全風險。 當人們試圖在滲透測試或代碼審查期間評估Web應用程序的安全級別時,這已成為事實上的參考。

對於開發人員,您的開發指南中可能還會增加您的內容,其中包含編寫代碼時應注意的事項。

此外,{ISC} ^ 2在此主題中也有一些參考 我將推薦一種有關如何將安全性集成到軟件開發生命周期(SDLC)中的方法。 您可能還想閱讀Web應用程序安全性101演示幻燈片。

我選擇的清理用戶輸入的功能是

$input = mysql_real_escape_string($input);<br>
$input = trim($input);<br>
$input = strip_tags($input);<br>
$input = htmlspecialchars($input);

然后,如果我要禁止某些字符,則只需執行以下操作。

$nono = array("=", "{", "}", ";", "[", "]","$","&");<br>
$input = str_replace($nono, "", $input);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM