This page looks plain and unstyled because you're using a non-standard compliant browser. To see it in its best form, please visit upgrade to a browser that supports web standards. It's free and painless.

Fillano's Learning Notes 會員登入 會員註冊

前一陣子找到的資料,使用VeriWord類別來做文字圖片驗證(Captcha)可以讓圖片驗證具有較高的安全性。所以就來試試看了。

VeriWord(官方網站在phpclasses上)看起來已經很久沒有人維護了(最後的日期是2004年,有一點久了).....手冊也找不到,不過使用起來很簡單。主要的功能包括:

  1. WordArt Creation:隨機選取提供的truetype字型來製作captcha,並且隨機改變每個字的水平/垂直位置、角度,並提供多種方法讓文字變形(預設有Wavy(波浪扭曲)、Bubbly(隨機產生的小泡泡干擾文字顯示)、BreakType(把文字的部份pixel拿掉),也可以自己撰寫filter來處理文字變形
  2. Noise Generation:根據提供的一些圖片隨機選取背景,或是自己產生隨機背景雜訊
  3. Word Generation:根據提供的字典檔案隨機選字、或是自己產生隨機的字母組合
  4. output:支援多種輸出圖檔格式(要看使用的GD Library版本)、可隨意指定長寬
  5. 簡單的驗證程式叫做VeriFicator
  6. 可以輸出成Flash格式,支援動畫flash背景(我看了一下原始碼,flash功能還沒寫完的樣子,有一些參數理論上要可以設定的,但是他寫死在程式裡)
  7. 使用設定檔來設定

大概介紹到這裡,先來試試吧。

先來看看怎麼安裝設定:

  1. 全部的東西都壓在一起,先把他解到一個目錄下
  2. veriword設定檔內容與你解壓縮出來的環境有一些不一樣,所以要做幾件事情:
    1. 建立fonts目錄,把你要隨機抽換的ttf檔案放進去
    2. 建立words目錄,然後把字典檔words放到目錄下(或是更改設定,把設定中的"words/words.txt"改成"words.txt"
    3. 建立noises目錄,用來放設計好的Background Noise圖檔(如果設定成RandomNoise就不會用到)
    4. 視環境調整veriword.ini
  3. 用瀏覽器開啟sample.php看看是否正常執行
  4. 根據自己的需求,繼承或改寫相關的類別

大概就這樣吧,用起來很簡單的,程式碼也不多,很容易了解,要整合到不同的程式裡面不會花很大功夫。

以下是sample.php跑出來的畫面:

這一張的captcha比較清楚,套用他的RandomNoise,有時候字會看不清楚....如果不是搭配BackgroundNoise的話,我想使用的字型最好挑選過,效果比較好。

這個程式已經沒人在維護,官方的manual連結也找不到了,但是我有google到還有別的網站有,檔名叫做manualveriword.pdf,參考一下。

xoops2定義了XoopsObject這個核心類別,用陣列來儲存一系列的值,並用XoopsObjectHandler類別來與資料表做映射。XoopsObject定義好了初始化、存取值的方法,讓我們很方便地使用。更方便的是,由於在XoopsObject類別內,只使用了TextSanitizer物件來做字串檢查,而XoopsObjectHandler類別只是一個抽象類別,並沒有定義好實作,所以只要把XoopsObject(放在/kernel/opject.php檔案內)以及TextSanitizer(放在/class/module.textsanitizer.php檔案內)從Xoops2中取出,就可以當作自己開發的核心。

使用XoopsObject如何達到快速開發呢?因為XoopsObject裡面定義好了資料型別與處理方法,利用他定義好的型別,可以設計好一些類別,輸入XoopsObject即可產生相對應的網頁。舉例來說,製作表單是一件相當煩瑣的工作,可以設計一個表單類別,輸入XoopsObject後,可以針對相對應的xoops資料型別產生表單。

另外使用XoopsObject搭配Smarty(或其他樣板引擎)來做MVC模式開發,就可以看到快速開發的效果。由XoopsObject以及XoopsObjectHandler負責Model,Smarty負責View,程式開發只要專注在Controller上就可以。

由於XoopsObjectHandler其實並沒有實作他定義的方法,所以在應用的時候還需要自己撰寫他的create、get、insert、delete方法,如果要偷懶,更好的方法是寫一個類別產生器,類似PDO。這樣在開發上,只要設計出data schemas,就可以自動產生箱對應的物件。(也許有一天可以跟phpMyAdmin結合)目前Xoops有設計好的database類別可用,但是只有支援mysql。如果要抽換資料庫,或是改成用pear的db套件等,類別產生器都需要修改,這是比較麻煩的地方。

另外一個問題是,XoopsObject並沒有比較好的處理關聯性的方法,如果資料關係複雜,處理起來會花費比較大的功夫。如何讓XoopsObject能自動處理類別之間的關係(1:n、n:m等等),而不用花費controller的功夫,是類別產生器需要下的另一個功夫。

如果XoopsObjectHandler的方法是一致的(例如,僅限於create、get、insert、delete),還有另一個好處,就是容易做權限控管。可以利用類似Static Proxy的方式,控制這些方法的使用。

會有這些想法,其實是自己懶的緣故(已經熟悉xoops2,但是懶得學cake),另外一個原因是希望不會因為使用一個framework讓程式大幅增加,並留給自己一些Mashup的空間。

開始抱怨:

今天攔下了11個spam comment,回頭檢視了一下trackback紀錄,發現了一個好玩的線索:有人在大陸的google上以「發表迴響」關鍵字來查詢www.ithome.com.tw網站。發表迴響這個字是在允許發表迴響後會在網頁中出現,所以看起來這些spam comment的發送機制是在用google掃描過可發表迴響的網址後,再用程式來發送。

ithome的blog用戶不少,也聚集了許多it專業的blog,因為群聚作用帶來的瀏覽率,讓人不太願意放棄這裡。但是這個blog管理上實在不是很專業,使用的plog版本也未更新....(不...已經改朝換代叫做LifeType了0rz),假日資料庫伺服器還會掛點.....

今天在站上看了一些文章,看起來已經有人被spam comment轟到關閉迴響了,而且authImage外掛似乎沒效???不過圖形太簡單,很容易用OCR工具配合來破解(google有喔,辨識率還不錯,參數調得好時一般網路銀行的圖形密碼也認得出來。更常見的是TWNtcha。)。也許是該更新一下的時候了?管理員們。

今天在http://www.gudlyf.com/index.php?p=376看到他修改的wordpress的authimage外掛,plog用的authimage外掛就是從這來的。在迴響中看到不少人用他的想法來修改plog的authImage外掛,效果不錯的樣子。請參考一下。(他使用了一個免費的php class叫做VeriWord來隨機變化文數字外觀,目前PWNtcha還無法破解。我想目前這些comment spammers都是用這套工具吧,據說對plog authimage外掛的破解率百分之百....)

抱怨結束。

一般要動態增加或刪除表格中的一個列,可以用表格物件的insertRow以及deleteRow方法。增加一列比較好操作,但是在要刪除一列時,傳入的參數是代表要刪除的列是第幾列,而從dom提供的屬性與方法中,無法直接獲得目前這一列是第幾列的資訊。尤其在不依照順序任意刪除列時,會變得不容易操作。

理論上透過簡單的遞迴其實就可以取得相關的資訊,所以就試了一下:

function rmRow(obj) {
	var a = traceUp(obj, "TR");
	var b = a.previousSibling;
	var c = 0;
	while (null != b) {
		c++;
		b = b.previousSibling;
	}
	d = traceUp(obj, "TABLE");
	d.deleteRow(c);
}
function traceUp(obj, tag) {
	if (obj.tagName.toUpperCase() == tag.toUpperCase()) {
		return obj;
	} else {
		return traceUp(obj.parentNode, tag);
	}
}

traceUp函數的作用是,傳入一個dom物件,然後傳回tagName符合的第一個上層物件。rmRow函數的作用則是刪除傳入的dom物件目前所在的列。這樣寫是為了方便,看看下面的例子:

<input type='button' value='delete' onclick='rmRow(this);'>

只要把這個按鈕放在任何表格的一列中,就可以把這一列刪除,很方便。

因為不確定是不是可行,所以自己做了一下簡單的測試,用xmlhttp向伺服器直接request圖檔,然後看看瀏覽器的cache有沒有變化。結果:

IE7可以,在cacahe目錄裡面會出現cache的圖檔。

firefox2.0.....沒辦法直接看到cache的檔案,所以另外透過觀察disk cache使用量變化的方式來測試....果然也可以(用一個叫做Cache Status的附加元件)。

另外測試了一下執行xmlhttp取得檔案所花費得時間,發現一件事情很有意思:在IE7,第一次用xmlhttp要求圖檔跟第二次以後比較起來,時間大約慢了七倍,所以瀏覽器的cache不只對瀏覽器有效,對於用ajax來request的資源似乎也有效(至少在IE7裡面的圖檔是這樣,我用firefox測試,差距不那麼明顯,大概從375ms->260ms)。

所以用ajax做image preload應該是沒問題,但是在firefox效果有可能會稍微差一點,因為如果每次都做preload,firefox花的時間會比較多。

不過另一個問題是:如果我們用ajax的方式來獲取html或是xml檔案,同樣也會經過瀏覽器的cache機制,是否會有問題?像是取得的內容有可能不是最新的等等....