顯示具有 網站 標籤的文章。 顯示所有文章
顯示具有 網站 標籤的文章。 顯示所有文章

2014/09/14

Post/Redirect/Get Pattern

Post/Redirect/Get (PRG) pattern 是一種處理表單資料的流程,可以防止使用者回上一頁、或是使用重新整理的方式重複送出表單資料。

再拿留言板舉例 (萬年題材 XD),假設在 form.html 填寫完表單,送出到資料到 post.php,而 post.php 處理資料後直接將結果顯示出來 (傳回 HTML),這個時候再瀏覽器按下「重新整理」按鈕,變會看到提示訊息,詢問是否要重送表單內容。


此時若重送表單資料,則會重新送出一模一樣的內容,若 post.php 沒有特別檢查,就會重複處理。很久以前開心農場就是用這種方法洗禮物的。

為了避免瀏覽器可以重新整理頁面,將資料處理的流程稍微做個調整:
  1. form.html 設定 submit 後,表單資料送給 post.php 處理
  2. post.php 處理資料後,不直接顯示 HTML,只送出 HTTP 3xx 做重新導向,跳到 done.php 顯示處理結果
  3. done.php 透過 URL 參數,顯示相對應的訊息

post.php 寫法大致如下:
if(saveData($_POST)){
   $status = 'ok';
}else{
   $status = 'error';
}

header('Location: done.php?status=' . $status);

由於使用 HTTP 3xx 重新導向,瀏覽器不會將 post.php 紀錄到瀏覽紀錄中,按下「上一頁」按鈕也是回到 form.html 而非 post.php,且 done.php 使用 HTTP GET 方式取得內容,所以重新整理頁面也不會重新送出表單內容。此流程按照三個步驟的 HTTP request 方式稱為 Post/Redirect/Get pattern。

PRG pattern 寫起來至少會有三個頁面要實作,也是挺麻煩的。若還要簡單一點的方式,那大概就是改用 AJAX 處理表單了吧。


Reference:
Post/Redirect/Get - Wikipedia, the free encyclopedia
http://en.wikipedia.org/wiki/Post/Redirect/Get

2014/05/04

不錯的 ping service:Uptime Robot

無意間發現了一個 ping service:UptimeRobot,操作、設定都很簡單,介面的視覺設計也很棒,主機況狀一目了然。





UptimeRobot 可以使用下列方法偵測主機狀況:

  • ping
  • HTTP/HTTPS
  • port
  • keyword

2014/04/23

瀏覽器與 HTTP Referer 之間的特性

無限期鬼打牆以後,才發現 HTTP Referer 不一定真的代表參考位址。

假設有三個頁面:

  1. form.html:填資料
  2. proccess.php:處理表單內容
  3. showError.php:表單內容有誤時,重新導向到這一頁

一般情況下 process.php 的 referer 會是 form.html、showError.php 的 referer 會是 process.php,但若 proccess.php 跳轉頁面是這樣寫:

if( ERROR ){
   header('Location: showError.php');
}

執行後 HTTP server 的回應會是 HTTP 302 而非 HTTP 200,瀏覽器不會將 302 視為正常的瀏覽行為,所以 proccess.php 不會被列入正式瀏覽記錄,當重新導向到 showError.php 時,Refer 仍然會是最後一個正式的瀏覽記錄,也就是 form.html。

若希望讓 showError.php 可以正確知道是哪一頁連過來的,就得靠其他方法了。

在這裡建議不要使用 HTTP Referer 來做判斷的依據。現有瀏覽器開發工具、外掛都可以讓人任意修改 Referer,也聽說有些防毒軟體會固定將 Referer 從 HTTP request 中刪除,再者,各家瀏覽器送 Referer 的情況也不同 (IE MUST DIE),用 Referer 判斷流程等方法會遇到不少例外情況要處理,別讓自己那麼累。



Reference:
php - HTTP_REFERRER and Location redirect - Stack Overflow

2013/11/01

Interesting XSS Sample

比較常見的 XSS 多安插 javascript 程式在 HTML 元素中:
<img src="javascript:alert('XSS')">

最近發現有趣的攻擊方式:
<img/src=x oooooo/oooooooooo/onerror="top.location='http://zeroplex.blogspot.com'" >

這對程式碼本身並不具危險性,但瀏覽器開啟上面那一段 HTML 時,卻會自動重新導向到 zeroplex.blogspot.com

主要原因是,瀏覽器都有提供語法自動補齊、修正功能。眼尖的人應該會發現,上面那一段語法,使用 Chrome 的開發者工具 (非檢視原始碼) 開啟時,會被自動修成 (top.location 改掉以便 debug):




恐怖的是,瀏覽器將最後面的語法修道可以執行,因此 %lt;img src="x"> 時,瀏覽器無法擷取圖片,造成 error,而觸發了後半部 onError 事件,執行 top.localtion="http://zeroplex.blogspot.com" 而跳到我的部落格頁面

2013/06/15

隱藏 HTTP Server 資訊

Apache 和 Nginx 預設頁尾都會加上伺服器資訊,像是:


有些環境或許很忌諱出輸出這類的資料,可以修改設定將他隱藏起來。

Apache conf 中調整 ServerTokens 參數,將頁尾伺服器資訊作不同的調整。設定檔路徑可能會不一樣,可以 grep ServerTokens,以下是 Ubuntu 的路徑。

/etc/apache/conf.d/security:
#ServerTokens OS
ServerTokens Prod


Nginx conf 裡面則是用 server_tokens 參數,將其設定為 off 則不會輸出伺服器版本號。
server {
   server_tokens off;

   ...
}