歡迎來到小豬圈!

2007-06-22

刪除檔案所花時間變久

當你刪除檔案時所花費時間變久(反應變慢),可以試著先把資源回收桶清掉試試。

ftp.adsl.hinet.net

由 Hinet 提供的 FTP 站,可以暱名上、下載大檔以測試速度。

上個月底家裡換成光纖(10M/2M)所以再試了一下,似乎有對下載檔案做限速,下載 test001m.zip 至 test040m.zip 速度只能至 180 kB/s,而 tset100m.zip 與 test200m.zip 可以到800 kB/s 。上載的部份都可以到160 kB/s 。

2007-06-19

腳尾米 關於台灣新聞媒體

這是一部有關台灣電視新聞的紀錄片,內容是我們設計了一些假新聞事件然後誘發電視新聞媒體採訪,成果方面讓我們非常震撼,因為總共有4家電視台分別採訪了我們的假事件,而且在製作過程我們也發現了很多電視台的弊端,希望各位能做最有力的見證者!

影片連結:腳尾米完整版腳尾米30分鍾版

不過可惜的是,在看完影片之後,我最想知道的問題:「既然很多人都知道台灣的新聞媒體不夠好,還是能每天“看新聞、配飯吃”呢?」依然沒有答案…

Update 20070623

最離譜的是當他問我覺得有什麼電視聞覺得不像是新聞的時候,我想了比較久的時間才回答他,但他最後播出來的版本卻只有我在想的畫面,居然把我回答的畫面刪掉,然後就說我"對新聞的認知回答不出來"。

相關連結

2007-06-16

日記 牙痛與飯局

流水帳模式啟動…

昨天吃完晚飯後,下門牙痛到不行,可是家附近的牙醫診所又沒開,只好先買止痛藥(Prophenatin HD-252)吃、並在基隆長庚的網站上掛號。

今天是ET那屆的畢典所以HS有上來台北,便約了晚上跟HS、GD、FN到衣蝶S館的鬥牛士吃飯。HS跟GD真是一對活寶,好久沒有笑這麼開心了。中途一段小插曲:不修邊幅的HS竟然叫一個看起來不到二十歲的服務生為“大姐”,而之後那位大姐有好一陣子沒來本桌服務…

吃完到附近走走,沒想到中山地下街的行政廣場竟然沒什麼人…

20070616-4659 (by 蟲仔)攝於光點電影院

20070616-4670 (by 蟲仔)回家時路過中山地下街的藝廊,看到許多不錯的作品,以下是幾幅讓我想拍下來留念的。

20070616-4661 (by 蟲仔)熊貓。

2007616-4664情感隔閡。

20070616-4673都市情感。

20070616-4669to be insatiably avaricious (無法滿足地貪婪)。

還有許多不錯作品在中山地下街的藝廊展出。

2007-06-12

相機小歐本年度第一次下水

今天遇到漲潮,水裡漂了不少垃圾,拍出來的效果也如預期的差…,不過小魚們還是很捧場,快把我手毛也吃光了!

因為拍的不好,所以就不在這裡貼出來了。我在flickr開一個Set專門放浮潛攝影的作品:UnderSurface

玉米的裝備還真是不賴啊,不愧是砸了錢的啊!

2007-06-10

在資料庫裡儲存密碼

在儲存密碼時,可以用Hash函式(如MD5, SHA1)計算出來的值取代明文,來存入資料庫裡,這是我從MySQL的架構裡偷學來的。

我個人認為,這樣可以減少一點使用者資料被有管理權限的人濫用的風險。而且當真的不小心密碼洩露出去,也不能直接拿來用。

缺點是需要耗費CPU Time。額外的好處是,不用去管使用者輸入的密碼格式(特殊字元、大小寫或長度),反正Hash過後都是唯一的鍵值(理論上)。

  • 這也是建議使用者在每個站使用不同密碼的原因,如果你註冊在某個站的資料被管理者盜用,不只是在該站的資料會有損失,也有可能帳號密碼被拿去其它網站嘗試登入。

2007-06-09

檢查表單 <form> 的 referer

檢查表單資料是不是“來自它應該來的地方”,有心人士可以在本地端建立一個表單,可以藉此略過一些檢查來送出資料。

PHP 可以用 $_SERVER['HTTP_REFERER'] 取得referer,但就如同PHP Manual寫的,這個值是不可靠的,所以只能當做基本的檢查。比較好的方法,可以用hidden欄位插入特定的值…(秘)。

'HTTP_REFERER'
The address of the page (if any) which referred the user agent to the current page. This is set by the user agent. Not all user agents will set this, and some provide the ability to modify HTTP_REFERER as a feature. In short, it cannot really be trusted.

2007-06-08

Blogger Timezone 裡沒有 Taipei Time …

剛剛在修改文章時間的時候,發現日期差了一天,直覺告訴我是時區錯誤的問題。到Setting > Formatting裡看到時區是[UTC -08:00]Pacific Daylight Time整個傻掉了,就是設錯也會不錯的這麼離譜,沒想到選單一拉下來竟然找不到Taipei Time(+08:00)…?

不過話說回來,我對時區設定並沒有什麼印像,也許是原本就沒有…吧。

2007-06-07

PHP 輸出靜態網頁的方法

最近在思考架站的問題,有考慮過以自已的電腦做為主機,不過這樣就得一直開著,而且也許會影嚮到我一般的使用(上網)。而虛擬主機需要花費,問題似乎也不少(CPU Time、頻寬、合約期限等)。

所以我在考慮一種方式,就是利用自已的主機執行動態網頁,輸出成靜態網頁(類似像Blogger)後,放在網路上的免費空間。這樣我的主機就可以正常使用,而網站也可以一直在線上,也不用煩腦太多主機的問題。

所以到網路上找到幾個PHP輸出靜態網頁的方法:

Apache mod_rewrite
  • 用伺服器模組去改寫網址,外表看起來是靜態網址(web_123_456.html),實際是動態網頁在運作(web.php?a=123&b=456)。
  • 對現有的程式架構影嚮較小。
Apache AddType
  • 我從前述方式想到的,就是修改Apache組態(httpd.conf),把PHP副檔名改掉。參見Hiding PHP
  • 需要變動的地方應該算是最少的吧。
  • PHP Smarty
    • 以 $smarty->fetch() 取得輸出內容後,再輸出成網頁檔。
    • 需要使用 Smarty 並改寫程式。
    • 需考慮是否適合輸出成靜態網頁。
    PHP Output Control Functions
    • 利用 Output Control Functions 的 ob_get_contents()取得輸出內容後,再輸出成網頁檔。
    • Output Control Functions 為 PHP 內建函式,且程式變動較少。
    • 一樣要考慮是否適合輸出成靜態網頁。

    就我的情況而言,我需要的是將動態網頁輸出的結果另存到靜態網頁的檔案,所以後兩者比較適合,正在學的Smarty,剛好派上用場。另外,改成靜態網頁似乎有助於SEO咧。

    資料來源

    2007-06-06

    Gecko DOM 的 selection 與 range

    • Gecko DOM 的 selection 與 range 只能作用在網頁上而且不包括 textarea

    2007-06-05

    Cluesheet.com

    在找 PDO 在 SQL injection 方面的資料時找到的網站Cluesheet.com,裡面有許多關於PHP的tips。

    以下為摘錄資安與效能部份,完全內容請至Cluesheet.com。雖然 PHP開發人員必須知道的一些技巧 裡有翻譯一些,但第一句好像就翻錯了(也許是原站有改過也說不定)?所以我想試著翻譯看看。

    Security

    • 使用 PDO parameters 來傳遞 SQL 值以避免 SQL injection 。
    • 使用 htmlspecialchars/htmlentities and/or strip_tags to escape html and JavaScript 以避免 XSS 攻擊。
    • 使用 sessions 與 secure sockets to 避免 session hijacking. Use md5 檢查碼去檢證 session ids. Store a special token md5(uniqueid(rand(),time)) in the session and bump it against a hidden field in the post form. eg. $_SESSION["token"]===$FORM["token"].
    • 使用 escapeshellarg/escapeshellcmd 在你呼叫 exec 函式前以避免command injection。
    • Do remove linebreaks from incoming headers to prevent early header termination and injection. Fixed >PHP5.1
    • 使用 md5 檢查 serialized (序列化)的值與 sessionid 是否完整。
    • === 來確認輸入的值是否連型態都正確。[譯註:由於PHP不是強制型別的語言,如使用==來比較的話,就不能確定使用者輸入的是ture、1、-1還是"1"?請參考the type comparison tables。]
    • Do use security through obsurity:
      • ini_set("display_errors",false);
      • ini_set("log_errors",true);
      • ini_set("error_log","path/to/php.log");
      • ini_set("session.save_path","path/above/www"); or "mm" session module or store in a sqllite db
      • php.ini expose_php=off
      • php.ini register_globals=off
      • Apache servertokens=prod
    • Use session_regenerate for any user privledge escalation in application.
    • Use secure sockets SSL for commerce transactions.

    Performance

    • 使用單引號取代雙引號。[譯註:雙引號要檢查裡面是否有變數如 "He drank some $beers."。]
    • 使用switch 取代大量的 if 句法。[譯註:可以配常數來使用。]
    • 避免在每次都重覆的情況下,使用函式來測試迴圈條件 for($i=0;i<=count($x);$i++){...[譯註:可以先決定值的話,就移到迴圈外吧,$cntX = count($x); for($i=0;i<=$cntX;$i++){...]
    • Do use foreach for looping collections/arrays.
      • PHP4 items are byval
      • >PHP5 items are byref
    • 當你在建立複雜的 PHP classes時,考慮一下使用 Singleton Method
    • Do use POST over GET for all values that will wind up in the database for TCP/IP packet performance reasons. 基於效能的理由,使用 POST 取代 GET 傳遞所有的值對於資料庫傳遞 TCP/IP 封包有顯助的提升。
    • 基於效能的理由,使用 ctype_alnum,ctype_alphactype_digit 取代 regular expression 來測試表單數值的類型。
    • Do use full file paths in production environment over basename/fileexists/open_basedir to avoid performance hits for the filesystem having to hunt through the file path. Once determined, serialize and/or cache path values in a $_SETTINGS array. $_SETTINGS["cwd"]=cwd(./);
    • Do use require/include over require_once/include_once to ensure proper opcode caching.
    • Do use tmpfile or tempnam for creating temp files/filenames
    • Do use a proxy to access web services (XML or JSOM) on foreign domains using XMLHTTP to avoid cross-domain errors. eg. foo.com<-->XMLHTTP<-->bar.com
    • Do use error_reporting (E_ALL); during debug.
    • Do set Apache allowoverride to "none" to improve Apache performance in accessing files/directories.
    • Do use a fast fileserver for serving static content (thttpd). static.mydomain.com, dynamic.mydomain.com
    • Do serialize application settings like paths into an associative array and cache or serialize that array after first execution.
    • Do use PHP output control buffering for page caching of heavilty accessed pages
    • Do use PDO prepare over native db prepare for statements. mysql_attr_direct_query=>1
    • Do NOT use SQL wildcard select. eg. SELECT *
    • Do use database logic (queries, joins, views, procedures) over loopy PHP.
    • Do use shortcut syntax for SQL insers if not using PDO parameters parameters. eg. INSERT INTO MYTABLE (FIELD1,FIELD2) VALUES (("x","y"),("p","q"));

    使用 PDO parameters 來避免 SQL injection

    • 在找 PDO 在 SQL injection 方面的資料時找到的網站 Cluesheet.com,開宗明義,第一句就講了:Do use PDO parameters over SQL values to avoid SQL injection.,可是沒說HOW and WHY…(汗)。
    • 所以小實驗了一下,發現 bindParam() 有像 mysql_real_escape_string() 的效果。
    • $dbh = new PDO(DB_DSN, DB_USER, DB_PASSWORD);
      $sql_find_repeat = 'SELECT COUNT(*) FROM `table_name` WHERE `col_name` = ?;';
      $sth = $dbh->prepare($sql_find_repeat);
      $sth->bindParam(1, $value, PDO::PARAM_STR);
      $sth->execute();
      

    2007-06-01

    Smarty 學習筆記初篇

    只要include到Smarty.class.php就好,不需增加目錄到 include_path 也可以使用。

    將定界符改掉(預設是大括號{}),建議用兩個字元以上,這樣可以減少跳脫(escape)的麻煩。前後加上HTML的註解符號,可以讓模版獨立預覽(除了嵌入檔案、<title>與屬性值之外,對網頁影嚮較少),對於設計者也比較方便。

    require_once('x:/realpath/Smarty-2.6.17/libs/Smarty.class.php');
    $smarty = new Smarty();
    $smarty->left_delimiter = '<!--{';
    $smarty->right_delimiter = '}-->';
    $a = 'This is a title';
    $smarty->assign('title', $a);
    $smarty->display('index.tpl.html');
    
    PHP Strict: Timezone = Asia/Taipei

    由於我在php.ini有設定error_reporting = E_ALL | E_STRICT。所以安裝Smarty 的時候出現 strict 錯誤訊息:

    Strict Standards: strftime(): It is not safe to rely on the system's timezone settings. Please use the date.timezone setting, the TZ environment variable or the date_default_timezone_set() function. In case you used any of those methods and you are still getting this warning, you most likely misspelled the timezone identifier. We selected 'UTC' for '8.0/no DST' instead in XXX\Smarty-2.6.17\libs\Smarty_Compiler.class.php on line XXX

    到 php.ini 設定 date.timezone = Asia/Taipei 就好。

    標籤分類

    Blog Archive

    Labels

    Google Analytics Tracking Code

    About Me

    My photo
    Keelung, R.O.C, Taiwan
    一個不學無術、混吃等死的傢伙…