用 PHP header 方式讓瀏覽器下載檔案,結果下載時檔名變成亂碼,原因是因為 FireFox 和其他瀏覽器換辨識 header content-type 的文字編碼,但是 IE 卻不會,所以必須自己將編碼從 UTF-8 轉成 Big5。
$file_name = iconv('utf-8','big5',$file_name);
軟體開發和生活瑣事
用 PHP header 方式讓瀏覽器下載檔案,結果下載時檔名變成亂碼,原因是因為 FireFox 和其他瀏覽器換辨識 header content-type 的文字編碼,但是 IE 卻不會,所以必須自己將編碼從 UTF-8 轉成 Big5。
$file_name = iconv('utf-8','big5',$file_name);
要繪製圖表,PHP 的繪圖函式庫絕對夠用,但是要自己寫程式應付各種不同的圖表,是一件吃力不討好的事情,除了會讓你肝指數增加,還會有頭上冒出光環、背後長出翅膀的風險。然而 Google 提供了一個不錯的選擇,讓你可以使用 Google 的程式和主機幫你完成圖表的繪製。例如:
http://chart.apis.google.com/chart?cht=lc&chd=t:20,40,60,55,65,75,90,99|90,56,77,10,55,0,60&chs=500x250&chls=1,1,0&chls=2,1,0&chm=D,4D89F9,0,0,5,0|D,FF0000,1,0,5,0
用法:
<?php
require("chart.php");
//圖片長寬,Google Chart 圖片最多到 30000 像素
$x = 400;
$y = 200;
//數值資料
$data[] = 97;
$data[] = 100;
$data[] = 81;
$data[] = 95;
$data[] = 86;
//資料註解,不加註解也請輸入空白
$text[] = 1;
$text[] = 8;
$text[] = 15;
$text[] = 22;
$text[] = 29;
$url = show_pic($x,$y,"line",$data,$text); //要使用雷達圖則將 "line" 改成 "radar"
echo "<img src="$url">";
?>
chart.php 下載:http://sites.google.com/a/zeroplex.twbbs.org/zero-lab/Home/project
另外,網路上也有別人寫好的套件叫做「GphpChart」,不過沒有我要的功能,所以就沒拿來測,大家有興趣可以過去玩一下。
自從上次改過別人的 PHP Captcha 以後,這次玩得更瘋了。
今天跟 scwu 聊過以後想出一堆鬼主意來當作 captcha 上面的文字,可以考慮的有注音文、火星文和一堆有的沒的符號。後來想整人所以決定讓大家動動頭腦,出點數學題目讓大家做,如加減乘除:
不過加減乘除對對電腦來說太簡單了,以後要試試看來點方程式求解,有必要來個微積分也行,不過這樣就得大費周章的請 LeTex 出來幫忙了。
上面的 captcha 我改名叫做「mathcha」,程式碼如下:
<?php
$font_face = 'arialbd.ttf'; //font you want to use
$width='80';
$height='25';
$font_size = $height * 0.65;
$image = imagecreate($width, $height) or die('Cannot initialize new GD image stream');
$background_color = imagecolorallocate($image, 0, 0, 0);
$text_color = imagecolorallocate($image, 255, 255, 255);
$noise_color = imagecolorallocate($image, 150, 255, 150);
//create dots
for( $i=0; $i<($width*$height)/3; $i++ ) {
imagefilledellipse($image, mt_rand(0,$width), mt_rand(0,$height), 1, 1, $noise_color);
}
//print text
$n1 = mt_rand(1,20);
$n2 = mt_rand(1,20);
$string = "$n1 + $n2";
$textbox = imagettfbbox($font_size, 0, $font_face, $string) or die('Error in imagettfbbox function');
$x = ($width - $textbox[4])/2;
$y = ($height - $textbox[5])/2;
imagettftext($image, $font_size, 0, $x, $y, $text_color, $font_face , $string) or die('Error in imagettftext function');
/* output captcha image to browser */
header('Content-Type: image/jpeg');
imagejpeg($image);
imagedestroy($image);
$_SESSION['mathcha'] = $n1 + $n2;
?>
記得你把你用的字型和這個程式放在同一個目錄。
SQL Injection 是一個寫 PHP 時大家常常忘掉的問題,但是一忘掉就會讓駭客有機可乘。
用 PHP 做登入時,SQL 語法大概會長這樣:
select * from member where ID = '$USER_ID' and password = '$PASSWORD'
其中錢字號的是 PHP 的變數。登入時使用者填「test」、密碼填「123」,則 SQL 語法會變成下面這樣:
select * from member where ID = 'test' and password = '123'
不過萬一有人要惡作劇,使用者填「test」、密碼填「’ or ”=’」,則 SQL 語法就會變成下面這樣:
select * from member where ID = 'test' and password = '' or ''=''
看出來了嗎?如果把顏色去掉,最後一個判斷式是「or ”=”」,而這個判斷永遠會成立,所以即使前面沒有密碼也有資料會被列出來。這是最簡單的 SQL Injection,如果駭客心狠手辣的話,還能夠將機密資料列出、修改資料,甚至直接將資料庫刪除,所以不小心不行。如果有興趣的話可以參考以下相關網頁:
資安論壇 :: 觀看文章 – SQL Injection之解決建議措施及相關資訊彙整
http://forum.icst.org.tw/phpBB2/viewtopic.php?t=4376
SQL Injection WhitePaper
http://www.spidynamics.com/whitepapers/WhitepaperSQLInjection.pdf
PHP 5 有提供 magic quote 會自動將單引號、雙引號加上反斜線,網路上也有寫好的程式可以使用,像是我之前寫的「PHP avoid SQL Injection 2」,但事實上這樣還是不夠的。
SQL 語法中,欄位的資料型態會有不同的語法,像說 SerialNumber = 123 和 UserName = ‘zero’,就有單引號的差別,如果 PHP 讀取欄位資料後沒有特別去注意資料型態,可能就會發生 SQL 語法中字串沒有使用引號的錯誤,丟出錯誤訊息一樣很危險。所以在開始使用變數時,最好做資料型態的轉換或是辨認,以免發生意想不到的狀況。
想要試試看自己的網頁有沒有上述的漏洞,可以使用 Parosproxy 這套漏洞檢測軟體做測試,他會再抓取所有可以使用的網頁連結以後,對每個網頁進行特定的檢測。
首先要先設定瀏覽器的 proxy 設定,讓瀏覽器透過 Paros 來上網,設定如下:

接下來把 Paros 啟動,然後讓瀏覽器瀏覽你準備要測試的網頁,這樣 Paros 就會抓到網頁位置,抓到以後就可以準備掃瞄。

在上面的清單中,選擇要掃瞄的網站以後,點選功能表的 Analyse -> Spider,抓取整個網站所有的超連結。

抓取後左下方應該會出現網站內的超連結列表,Paros 之後就針對這幾個連結進行漏洞測試。準備好開始測試後,點選 Analyse -> Scan 即可。

待掃瞄結束後,左下角 alert 頁籤中會顯示出你網站有漏洞的網頁,以及漏洞的類型,但是並不是有顯示就表示一定有漏洞,也不表示找不到漏洞就絕對安全,請自行判斷掃瞄結果。

掃瞄結束後,記得把瀏覽器的 proxy 設定改回來,不然 Paros 關掉以後就不能上網了。