目錄
#跨站請求偽造" >#跨站請求偽造
首頁 後端開發 php教程 PHP安全-跨站請求偽造

PHP安全-跨站請求偽造

Feb 22, 2017 am 09:22 AM



#跨站請求偽造

#  跨站請求偽造(CSRF)是一種允許攻擊者透過受害者發送任意HTTP請求的一類攻擊方法。這裡所指的受害者是一個不知情的同謀,所有的偽造請求都由他發起,而不是攻擊者。這樣,很你就很難確定哪些請求是屬於跨站請求偽造攻擊。事實上,如果沒有對跨站請求偽造攻擊進行刻意防範的話,你的應用程式很有可能是有漏洞的。

 

  請看下面一個簡單的應用,它允許使用者購買鋼筆或鉛筆。介面上包含下面的表單:

CODE:

<form action="buy.php" method="POST">
  <p>
  Item:
  <select name="item">
    <option name="pen">pen</option>
    <option
name="pencil">pencil</option>
  </select><br />
  Quantity: <input type="text" name="quantity"
/><br />
  <input type="submit" value="Buy" />
  </p>
  </form>
登入後複製


一個攻擊者會先使用你的應用程式來收集一些基本資訊。例如,攻擊者首先訪問表單並發現兩個表單元素item及quantity,他也同時知道了item的值會是鉛筆或是鋼筆。

 

下面的buy.php程式處理表單的提交資料:

CODE:

 

 <?php
 
  session_start();
  $clean = array();
 
  if (isset($_REQUEST[&#39;item&#39;] &&
isset($_REQUEST[&#39;quantity&#39;]))
  {
    /* Filter Input ($_REQUEST[&#39;item&#39;],
$_REQUEST[&#39;quantity&#39;]) */
 
    if (buy_item($clean[&#39;item&#39;],
$clean[&#39;quantity&#39;]))
    {
      echo &#39;<p>Thanks for your
purchase.</p>&#39;;
    }
    else
    {
      echo &#39;<p>There was a problem with your
order.</p>&#39;;
    }
  }
 
  ?>
登入後複製


#攻擊者會先使用這個表單來觀察它的動作。例如,在購買了一支鉛筆後,攻擊者知道了在購買成功後會出現感謝訊息。注意到這一點後,攻擊者會嘗試透過存取下面的URL以用GET方式提交資料是否能達到同樣的目的:

 

  http://www.php.cn/

 

#  如果能成功的話,攻擊者現在就取得了當合法用戶訪問時,可以引發購買的URL格式。在這種情況下,進行跨站請求偽造攻擊非常容易,因為攻擊者只要引發受害者訪問該URL即可。

  雖然有多種發動跨站請求偽造攻擊的方式,但是使用嵌入資源如圖片的方式是最普遍的。為了理解這個攻擊的過程,首先有必要了解瀏覽器請求這些資源的方式。

  當你造訪 http://www.php.cn/ (圖 2-1),你的瀏覽器首先會請求這個URL所識別的資源。你可以透過查看該頁的來源檔案(HTML)的方式來看到該請求的回傳內容。在瀏覽器解析了返回內容後發現了Google的標誌圖片。這張圖片是以HTML的img標籤表示的,該標籤的src屬性表示了圖片的URL。瀏覽器於是再發出對該圖片的請求,以上這兩次請求間的不同點只是URL的不同。

 

圖2-1. Google的首頁

 

A CSRF attack can use an img tag to leverage this behavior. Consider visiting a web site with the following image identified in the source:

  根據上面的原理,跨站請求偽造攻擊可以透過img標籤來實現。考慮一下如果訪問包括 下面的原始程式碼的網頁會發生什麼事:

  <img
src="http://store.example.org/buy.php?item=pencil&quantity=50" />
登入後複製

 

  由於buy.php腳本使用$_REQUEST而不是$_POST,這樣每一個只要是登入在store.example.org商店上的使用者就會透過請求該URL購買50支鉛筆。

 

  跨站請求偽造攻擊的存在是不建議使用$_REQUEST的原因之一。

 

完整的攻擊過程如圖2-2。

 

圖2-2. 透過圖片引發的跨站請求偽造攻擊

  當請求圖片時,某些瀏覽器會改變請求頭部的Accept值以給圖片類型一個更高的優先權。需要採用保護措施以防止這種情況的發生。

你需要用几个步骤来减轻跨站请求伪造攻击的风险。一般的步骤包括使用POST方式而不是使用GET来提交表单,在处理表单提交时使用$_POST而不是$_REQUEST,同时需要在重要操作时进行验证(越是方便,风险越大,你需要求得方便与风险之间的平衡)。

任何需要进行操作的表单都要使用POST方式。在RFC 2616(HTTP/1.1传送协议,译注)的9.1.1小节中有一段描述:

“特别需要指出的是,习惯上GET与HEAD方式不应该用于引发一个操作,而只是用于获取信息。这些方式应该被认为是‘安全’的。客户浏览器应以特殊的方式,如POST,PUT或DELETE方式来使用户意识到正在请求进行的操作可能是不安全的。”

最重要的一点是你要做到能强制使用你自己的表单进行提交。尽管用户提交的数据看起来象是你表单的提交结果,但如果用户并不是在最近调用的表单,这就比较可疑了。请看下面对前例应用更改后的代码:

CODE:

 <?php
 
  session_start();
  $token = md5(uniqid(rand(), TRUE));
  $_SESSION[&#39;token&#39;] = $token;
  $_SESSION[&#39;token_time&#39;] = time();
 
  ?>
 
  <form action="buy.php" method="POST">
  <input type="hidden" name="token"
value="<?php echo $token; ?>" />
  <p>
  Item:
  <select name="item">
    <option name="pen">pen</option>
    <option
name="pencil">pencil</option>
  </select><br />
  Quantity: <input type="text" name="quantity"
/><br />
  <input type="submit" value="Buy" />
  </p>
  </form>
登入後複製


通过这些简单的修改,一个跨站请求伪造攻击就必须包括一个合法的验证码以完全模仿表单提交。由于验证码的保存在用户的session中的,攻击者必须对每个受害者使用不同的验证码。这样就有效的限制了对一个用户的任何攻击,它要求攻击者获取另外一个用户的合法验证码。使用你自己的验证码来伪造另外一个用户的请求是无效的。

该验证码可以简单地通过一个条件表达式来进行检查:

CODE:

 <?php
 
  if (isset($_SESSION[&#39;token&#39;]) &&
      $_POST[&#39;token&#39;] == $_SESSION[&#39;token&#39;])
  {
    /* Valid Token */
  }
 
  ?>
登入後複製


你还能对验证码加上一个有效时间限制,如5分钟:

CODE:

<?php
 
  $token_age = time() - $_SESSION[&#39;token_time&#39;];
 
  if ($token_age <= 300)
  {
    /* Less than five minutes has passed. */
  }
 
  ?>
登入後複製


通过在你的表单中包括验证码,你事实上已经消除了跨站请求伪造攻击的风险。可以在任何需要执行操作的任何表单中使用这个流程。

  尽管我使用img标签描述了攻击方法,但跨站请求伪造攻击只是一个总称,它是指所有攻击者通过伪造他人的HTTP请求进行攻击的类型。已知的攻击方法同时包括对GET和POST的攻击,所以不要认为只要严格地只使用POST方式就行了。


以上就是PHP安全-跨站请求伪造的内容,更多相关内容请关注PHP中文网(www.php.cn)!


本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

<🎜>:泡泡膠模擬器無窮大 - 如何獲取和使用皇家鑰匙
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
北端:融合系統,解釋
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
Mandragora:巫婆樹的耳語 - 如何解鎖抓鉤
3 週前 By 尊渡假赌尊渡假赌尊渡假赌

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

熱門話題

Java教學
1666
14
CakePHP 教程
1425
52
Laravel 教程
1325
25
PHP教程
1272
29
C# 教程
1252
24
PHP和Python:比較兩種流行的編程語言 PHP和Python:比較兩種流行的編程語言 Apr 14, 2025 am 12:13 AM

PHP和Python各有優勢,選擇依據項目需求。 1.PHP適合web開發,尤其快速開發和維護網站。 2.Python適用於數據科學、機器學習和人工智能,語法簡潔,適合初學者。

PHP行動:現實世界中的示例和應用程序 PHP行動:現實世界中的示例和應用程序 Apr 14, 2025 am 12:19 AM

PHP在電子商務、內容管理系統和API開發中廣泛應用。 1)電子商務:用於購物車功能和支付處理。 2)內容管理系統:用於動態內容生成和用戶管理。 3)API開發:用於RESTfulAPI開發和API安全性。通過性能優化和最佳實踐,PHP應用的效率和可維護性得以提升。

PHP:網絡開發的關鍵語言 PHP:網絡開發的關鍵語言 Apr 13, 2025 am 12:08 AM

PHP是一種廣泛應用於服務器端的腳本語言,特別適合web開發。 1.PHP可以嵌入HTML,處理HTTP請求和響應,支持多種數據庫。 2.PHP用於生成動態網頁內容,處理表單數據,訪問數據庫等,具有強大的社區支持和開源資源。 3.PHP是解釋型語言,執行過程包括詞法分析、語法分析、編譯和執行。 4.PHP可以與MySQL結合用於用戶註冊系統等高級應用。 5.調試PHP時,可使用error_reporting()和var_dump()等函數。 6.優化PHP代碼可通過緩存機制、優化數據庫查詢和使用內置函數。 7

PHP與Python:了解差異 PHP與Python:了解差異 Apr 11, 2025 am 12:15 AM

PHP和Python各有優勢,選擇應基於項目需求。 1.PHP適合web開發,語法簡單,執行效率高。 2.Python適用於數據科學和機器學習,語法簡潔,庫豐富。

PHP的持久相關性:它還活著嗎? PHP的持久相關性:它還活著嗎? Apr 14, 2025 am 12:12 AM

PHP仍然具有活力,其在現代編程領域中依然佔據重要地位。 1)PHP的簡單易學和強大社區支持使其在Web開發中廣泛應用;2)其靈活性和穩定性使其在處理Web表單、數據庫操作和文件處理等方面表現出色;3)PHP不斷進化和優化,適用於初學者和經驗豐富的開發者。

PHP與其他語言:比較 PHP與其他語言:比較 Apr 13, 2025 am 12:19 AM

PHP適合web開發,特別是在快速開發和處理動態內容方面表現出色,但不擅長數據科學和企業級應用。與Python相比,PHP在web開發中更具優勢,但在數據科學領域不如Python;與Java相比,PHP在企業級應用中表現較差,但在web開發中更靈活;與JavaScript相比,PHP在後端開發中更簡潔,但在前端開發中不如JavaScript。

PHP和Python:代碼示例和比較 PHP和Python:代碼示例和比較 Apr 15, 2025 am 12:07 AM

PHP和Python各有優劣,選擇取決於項目需求和個人偏好。 1.PHP適合快速開發和維護大型Web應用。 2.Python在數據科學和機器學習領域佔據主導地位。

PHP和Python:解釋了不同的範例 PHP和Python:解釋了不同的範例 Apr 18, 2025 am 12:26 AM

PHP主要是過程式編程,但也支持面向對象編程(OOP);Python支持多種範式,包括OOP、函數式和過程式編程。 PHP適合web開發,Python適用於多種應用,如數據分析和機器學習。

See all articles