|
UDF - User Defined Function 用戶自定義函數(shù) 。
mysql中支持UDF擴(kuò)展 ,使得我們可以調(diào)用DLL里面的函數(shù)來(lái)實(shí)現(xiàn)一些特殊的功能。
但是對(duì)于UDF的具體限制,MYSQL的各個(gè)版本各有不同。 下面記錄一下:
聽(tīng)說(shuō)(只是聽(tīng)說(shuō),沒(méi)做測(cè)試),在MYSQL 4.1以前的版本中,可以將所有的DLL文件里面的任何函數(shù)都注冊(cè)到MYSQL里面以供MYSQL調(diào)用。
無(wú)論這個(gè)DLL在什么位置,函數(shù)的聲明是什么樣的。
在MYSQL 4.1及以后的版本中,對(duì)UDF函數(shù)進(jìn)行了限制,只有實(shí)現(xiàn)了一個(gè)特定接口的函數(shù)才可以被成功注冊(cè)到MYSQL中,這樣就防止了通過(guò)MYSQL非法調(diào)用系統(tǒng)的DLL。
在MYSQL5以后,對(duì)注冊(cè)的DLL的位置有了限制,創(chuàng)建函數(shù)的時(shí)候,所對(duì)應(yīng)的DLL不能包含/或者\(yùn),簡(jiǎn)單的理解就是不能是絕對(duì)路徑。
所以我們將DLL釋放到system32目錄,來(lái)跳過(guò)這個(gè)限制。。或者放到盤符的根目錄下通過(guò)c:udf.dll這種形式的寫法來(lái)跳過(guò)限制。
再說(shuō)MYSQL5.1,這里有個(gè)問(wèn)題相信大家會(huì)經(jīng)常遇到的。。
大家有的時(shí)候在創(chuàng)建函數(shù)的時(shí)候,常常會(huì)遇到Can't open shared library 'udf.dll' (errno: 2) 這個(gè)錯(cuò)誤。
可是我們的語(yǔ)句沒(méi)有寫錯(cuò),DLL也是免殺的或者服務(wù)器上根本沒(méi)裝殺軟。。
好多人這里就不明白了。。
這是因?yàn)镸YSQL 5.1及以后的版本中,又多了一個(gè)限制。
創(chuàng)建函數(shù)時(shí)所用的DLL只能放在mysql的plugin目錄里面。。
而且這個(gè)plugin目錄默認(rèn)是不存在的。。挺YD吧,,可能就是為了防止通過(guò)into dumpfile將DLL來(lái)寫到這個(gè)文件夾。。
MYSQL是無(wú)法創(chuàng)建目錄的哦, 如果into dumpfile的目標(biāo)目錄不存在是會(huì)報(bào)錯(cuò)的。
需要手動(dòng)創(chuàng)建 ,但是它卻是一個(gè)系統(tǒng)變量。我在虛擬機(jī)上裝了MYSQL 5.1.3進(jìn)行了測(cè)試,
安裝目錄是:C:\Program Files\MySQL\MySQL Server 5.1
通過(guò):show variables like '%plugin%';
可以看到:
+---------------+------------------------------------------------------------------------
| Variable_name | Value
+---------------+------------------------------------------------------------------------
| plugin_dir | C:\Program Files\MySQL\MySQL Server 5.1\lib/plugin
+---------------+------------------------------------------------------------------------
plugin目錄位置是mysql安裝目錄下的lib/plugin ,需要我們手動(dòng)創(chuàng)建 。
然后將udf.dll傳到這個(gè)位置,再創(chuàng)建函數(shù) ,這時(shí)就會(huì)成功了。
但是這個(gè)變量的值是只讀的,嘗試用
set @@plugin_dir = 'd:\\';
去更改它的值會(huì)發(fā)生錯(cuò)誤。
只能通過(guò)修改php.ini ,在里面添加一個(gè)
plugin_dir=d:/
才可以修改這個(gè)值 。。
無(wú)奈。。
所以在導(dǎo)出UDF提權(quán)之前 ,先確定一下MYSQL的版本是有必要的。
如果是5.1以后的,那就不行了,如果是5.1以前的版本創(chuàng)建函數(shù)的時(shí)候還報(bào)Can't open shared library這個(gè)錯(cuò)誤。
那就要看看DLL是不是真的被導(dǎo)出了,還是被殺軟隔離或者干掉了。
|