總網頁瀏覽量

2008年7月31日 星期四

★PHP初學注意事項★

1. 請使用全Unicode/utf-8的編碼環境

為什麼不要用big5?原因很簡單
一是因為現在big5陷入亂世之中(事實上在補big5的Unicode補完計畫便是一個範例)
二是big5的許功蓋問題是個多年來難解的衝碼問題

因此,建議您使用全Unicode的編碼環境
Unicode包含各國語言的文字編碼,又不會有衝碼問題!

在網頁、php上編碼全用utf-8,MySQL資料庫方面校訂請設「utf8_general_ci
(網頁標題加上<meta http-equiv="content-type" content="text/html; charset=utf-8" />)
作utf-8網頁不建議用記事本,記事本的utf-8會自動加BOM,引發一些問題
(推薦使用UltraEdit-32,存檔請存utf8無BOM)
精華區中有編輯器推薦文,選一個來用吧
而一個常被遺忘的部份就是MySQL中Connection Character Sets的設定
http://dev.mysql.com/doc/refman/5.0/en/charset-connection.html

最常的作法是在連上資料庫後送query: mysql_query('SET NAMES utf8;');
這些都完成後,你就擁有了一個全utf-8的環境囉!

2. 請務必愛用$_GET、$_POST

我相信不只一本講PHP的書會給這樣的程式碼:
<?php
echo "$doggy";
?>
然後跟你講執行xxx.php?doggy=3 之後會跑出3。
這是一個PHP的安全性遺毒,也就是所謂的register_globals
這個功能為何而危險呢?他把GET、POST或是Cookie裡面的東西全部倒成全域變數
進而增加覆蓋變數的可怕危險性!(範例:
http://tw.php.net/register_globals
所以,也請拜託千萬千萬記得把register_globals設為off
這個功能也會在PHP6拿掉
也建議請不要作extract($_POST)這種事情,結果半斤八兩
處理GET或POST或Cookie用$_GET、$_POST系列才是王道!


3. 請不要依賴Magic Quotes,用心對抗SQL injection

magic_quotes_gpc很好很強大,他會把GET、POST和Cookie的引號都加上「」
讓你可以把東西直接倒進SQL Query而避免SQL injection
...但這只是表面上很方便 囧
當你需要用到$_GET或$_POST的時候
動不動你就得要get_magic_quotes_gpc()來看有沒有被加上「」...
真正預防SQL injection的方法是審慎處理每一個Query
該用int進來的東西就用sprintf或settype等來轉
對於字串可以用addslashes或著不方便一點的mysql_real_escape_string
把產生INSERT或UPDATE查詢的部份寫成一個函式是我很喜歡,安全又方便的作法
一是這個函式可以內建對String的Escape(加上「」),二是可以直接丟Array
這種東西很多人寫過,應該不難找

沒有留言: