插件制作的基本思路是:(初學(xué)者適用) 1.形成插件思路 2.制作插件界面 3.構(gòu)架程序模塊 4.搭建存儲數(shù)據(jù) 5.填充功能語句 6.檢查應(yīng)用錯誤 7.完善插件功能
前言:為方便互聯(lián)網(wǎng)數(shù)萬Discuz!愛好者,更加深入了解Discuz!軟件,本人在熟悉Discuz!過程中,順便將個人經(jīng)驗(yàn)寫給大家。本貼內(nèi)容由本人定期更新。本貼只介紹Discuz!中部分技術(shù)點(diǎn),本貼緊屬個人觀點(diǎn),不足之處,請各位多多指教,在下先此謝過!。“Discuz!”在下文中簡稱“DZ”。要弄DZ二次開發(fā),必須至少具備如下技能: 1) 能夠理很好理解MVC構(gòu)架的原理(雖然DZ不是MVC架構(gòu)的) 2) 扎實(shí)的PHP基礎(chǔ),熟悉結(jié)構(gòu)化程序,OOP程序的寫法及應(yīng)用 3) 熟悉MYSQL就用,掌握SQL語言,懂SQL優(yōu)化者更佳 4) 熟悉使用Discuz!的各項(xiàng)功能
一) Discuz!的文件系統(tǒng)目錄 注:想搞DZ開發(fā),就得弄懂DZ中每個文件的功能。 a) Admin:后臺管理功能模塊 b) Api:DZ系統(tǒng)與其它系統(tǒng)之間接口程序 c) Archiver:DZ中,用以搜索引擎優(yōu)化的無圖版 d) Attachments:DZ中 ,用戶上傳附件的存放目錄 e) Customavatars:DZ中,用戶自定義頭像的目錄 f) Forumdata:DZ緩存數(shù)據(jù)的存放目錄 g) Images:DZ模板中的圖片存放目錄 h) Include:DZ常用函數(shù)庫,基本功能模塊目錄 i) Ipdata:DZ統(tǒng)計(jì)IP來路用的數(shù)據(jù) j) Plugins:DZ插件信息的存放目錄 k) Templates:DZ模板文件的存放目錄 l) Wap:DZ無線,Wap程序處理目錄
二) 必須記熟Discuz!數(shù)據(jù)庫設(shè)計(jì)的每個表的功能,每個表中每個字段的功能。 關(guān)于DZ數(shù)據(jù)庫設(shè)計(jì)文檔,請參閱DZ相關(guān)的項(xiàng)目文檔(請從本貼附件中下載)
三) Discuz!的流程控制 a) 后臺流程控:DZ后臺所有的功能,均需要注冊到admincp.php文件,每個功能都至少有一個或一個以上的Action(動作),在admincp.php中,可以定義Action的執(zhí)行權(quán)限,分別為:“admin==1”管理員,或“admin==2 || admin==3”超級版主和版主,每個Action對應(yīng)一個腳本文件,腳本文件的命名為action.inc.php(*.inc.php),并存放在admin目錄下,如執(zhí)行:admincp.php?action=dodo,相當(dāng)于執(zhí)行admin目錄下的dodo.inc.php文件 b) 前臺流程控制:前臺的流程控制比較簡單:流程是自由的,如: 首頁:index.php 會員注冊:register.php; 會員登錄:logging.php 發(fā)貼程序:post.php 會員信息:member.php 論壇內(nèi)容:forumdisplay.php 查看貼子:viewthread.php …大部分功能,此處不一一列出… c) DZ根目下的config.inc.php屬于整個DZ系統(tǒng)的配置文件?
四) Discuz!的數(shù)據(jù)處理過程 a) DZ對mysql的數(shù)據(jù)庫操作處理全部封裝在dbstuff(db_mysql.class.php)類中 b) 所在的外部數(shù)據(jù)均通過“daddslashes()”初步過濾,然后再過濾,再根據(jù)需要處理
五) Discuz!的顯示控制(網(wǎng)站多樣式風(fēng)格輸出) a) 顯示層就是大家通常所看到的網(wǎng)站風(fēng)格了。DZ中每套風(fēng)絡(luò)分別在templates及images下對應(yīng)一個風(fēng)格文件的存放目錄。網(wǎng)站風(fēng)格的制作,請參閱詳細(xì)的DZ風(fēng)格制作文檔 b) DZ網(wǎng)站風(fēng)格文件處理的原理:其實(shí)很簡單,DZ使用template.func.php中的parse_template()以PHP正則運(yùn)算把htm模文件中的模板標(biāo)簽,轉(zhuǎn)換成了PHP代碼,并根據(jù)styleid保存在forumdata/templates下,這個有點(diǎn)像Smarty中的技術(shù)。
六) DZ中的語言處理 a) DZ前臺及后臺中、英語言的實(shí)現(xiàn),均是把語句定義成了語變量,然后在模板輸入,語句變量的賦值,均放在模板目錄中的*.lang.php文件中,DZ在生成網(wǎng)站風(fēng)格時就加載了這相應(yīng)的語言包。
七) DZ如何處理用戶信息(存取、計(jì)算、更新過程) 新手要做二次開發(fā),都必須掌握這數(shù)組中,每個數(shù)組元素的意義。 a) DZ的基本信息,如用戶信息,Session信息存在如下變量中: a). $_DCACHE b). $_COOKIE c). $_DCOOKIE d). $_DSESSION e). $_DPLUGIN b) 可以通過print_r($GLOBALS),打印全部變量 八) DZ中緩存處理機(jī)制 a) DZ中緩存處理過程都放在“cache.func.php”中,DZ的緩存處理比較簡單,其原理是把一個數(shù)組轉(zhuǎn)換成了PHP代碼,并保存在緩存目錄下,大家可打開緩存文件查看便知。 b) 使用方法:如果在新開的功能中,需要緩存某部分?jǐn)?shù)據(jù),基本上就是: 1)定義并注冊緩存名字。 2)從數(shù)據(jù)讀取相應(yīng)的數(shù)據(jù)。 3)數(shù)據(jù)在寫入緩存前作相應(yīng)處理。 4)最后寫入緩存。 具體操作,可以看文件中的代碼,做相應(yīng)的修改即可 九) DZ中模板處理機(jī)制 a) DZ獨(dú)創(chuàng)的模板處理技術(shù),類似于Smarty中的模板處理,只是具體算法,過程不同,Smarty是一種重型模板引擎方案。其原理都是把模板中的變量轉(zhuǎn)換成相應(yīng)的PHP代碼,這個過程實(shí)際是模訪JAVA中的一次編譯,多處運(yùn)行。 十) DZ中權(quán)限處理機(jī)制 a) 對于DZ中前臺的每相action都有$discuz_action定義,DZ根據(jù)用戶所在的用戶組來判定用戶是否具有相應(yīng)操作$discuz_action的權(quán)限。至于后臺的權(quán)限權(quán)驗(yàn)證,則更簡單了,依據(jù)“admin==1”來確定的 十一) DZ中如何實(shí)現(xiàn)URL靜態(tài)化 a) DZ中的靜態(tài)有兩法,只要懂ReWrite規(guī)劃的朋友,一看就知。 十二) DZ獨(dú)創(chuàng)的HTML編輯器,如何截取并使用,如果進(jìn)行Discuz!代和Html代碼的轉(zhuǎn)換 a) 這也算是DZ比較牛的一項(xiàng)技術(shù)了,在早期版中,因DZ編輯器的不足,使得很多用戶放棄了DZ。實(shí)現(xiàn)原理:通過JS把用的一些操作轉(zhuǎn)換成了DZ的bbcode代碼。這樣子提交了安全性,將帶有bbcode代碼的內(nèi)容存入數(shù)據(jù),在用戶打開頁頁時,又把bbcode代碼轉(zhuǎn)換成html代碼
本貼聲明:由于時間有限,本貼只有關(guān)于DZ部分功能的簡短分析。若各位網(wǎng)友,對本文感興趣并想更為深入了解DZ,請?jiān)诒举N后回貼!我將盡可能多的DZ技術(shù)分析寫在本文,不斷更新本貼內(nèi)容。
部分文件說明:
admincp.php 管理 ajax.php ajax功能 announcement.php 公告 attachment 附件 board.php 真正的首頁 config.inc.php 這個是配置文件 corpus.php 論壇文集 digest.php 精華帖子 discuz_version.php 論壇版本號 faq.php 問題列表 forumdisplay.php 論壇列表 index.php 跳轉(zhuǎn)頁面 loggin.php 認(rèn)證頁面(登錄退出) mail_config.inc.php 郵件配置 member.php 用戶操作 memcp.php 個人控制面版 misc.php 零碎功能 my.php 我的帖子 plugin.php 插件 pm.php 短信 post.php 發(fā)送帖子 redirect.php 頁面重定向 register.php 注冊 robots.txt 限制搜索 rss.php rss信息發(fā)布 search.php 論壇查詢 secode.php 驗(yàn)證碼 stats.php 統(tǒng)計(jì) topic.php 首頁論壇專題 topicadmin 主題管理 viewpro.php 顯示個人信息 viewthread.php 主題顯示
文件夾? admin 管理 api 接口 archiver 文檔 attachments 附件 customavatars 自定義表情 forumdata 論壇數(shù)據(jù)包含緩沖數(shù)據(jù) images 圖片 include 公共文件 install 安裝包 ipdata ip地址 plugins 插件 readme 幫助文檔 templates 模板 utilities 工具包 wap 手機(jī)網(wǎng)站
文件夾include? advertisements.inc.php 廣告管理 ajax.js ajax相關(guān) attachment.func.php 附件函數(shù)集 bbscode.js 論壇表情 cache.fun.php 緩存函數(shù)集 category.inc.php 欄目 chinese.class.php? common.inc.php 最主要的頭文件 common.js 最主要的js文件 corpus.func.php 論壇文集函數(shù) counter.inc.php 論壇計(jì)數(shù) cron.func.php 計(jì)劃任務(wù) db_mysql.class.php 數(shù)據(jù)庫 db_mysql_error.inc.php 數(shù)據(jù)庫錯誤 debug.php 調(diào)試信息 discuzcode.func.php 論壇代碼 editor.func.php 編輯器 editor.js 編輯器 editpost.inc.php 編輯帖子 floatadv.js 浮動廣告 forum.func.php 論壇函數(shù)集 global.func.php 全局函數(shù) menu.js 菜單 misc.func.php 其它 newreply.inc.php 新回復(fù) newthread.inc.php 新主題 *pmprompt.inc.php? post.fun.php 發(fā)表主題 printable.inc.php 論壇打印 qihoo.js qihoo relatethreads.inc.php 相關(guān)主題 security.inc.php 安全 sendmail.inc.php 郵件 serverbusy.htm 系統(tǒng)繁忙 template.func.php 模板 threadpay.inc.php 購買帖子
為什么文件的命名有inc呢? 文件命名規(guī)范
Discuz! 按照如下的規(guī)范對程序和模板進(jìn)行命名,請?jiān)谠O(shè)計(jì)插件時盡量遵循此命名規(guī)范:?
1.可以直接通過瀏覽器訪問的普通程序文件,以 .php 后綴命名。? 2.被普通程序文件引用的程序文件,以 .inc.php 后綴命名。? 3.被普通程序文件,或引用程序文件引用的函數(shù)庫或類庫,以 .func.php(函數(shù)庫) 或 .class.php(類庫) 后綴命名。? 4.模板文件,以 .htm 后綴命名,模板文件只存在于 ./templates 目錄中。? 5.模板語言包文件,以 .lang.php 后綴命名,語言包文件只存放于 ./templates 目錄中,與模板文件同級目錄。? 6.被編譯后的模板文件,以 .tpl.php 后綴命名,前面的數(shù)字是模板套系的 ID,下劃線后面的是模板原名,編譯模板文件只存在于 ./forumdata/templates 目錄中。? 7.動態(tài)緩存文件,存放于 ./forumdata/cache 目錄中,依據(jù)不同的功用進(jìn)行獨(dú)立的命名。? 8.使用后臺數(shù)據(jù)備份功能生成的備份文件,通常以 .sql 為后綴,存放于 ./forumdata/ 目錄中。? 9.有些目錄中存在內(nèi)容為空白的 index.htm 文件,此類文件是為了避免 Web 服務(wù)器打開 Directory Index 時可能產(chǎn)生的安全問題。
模塊類型: 插件模塊和自定義菜單: 插件接口默認(rèn)提供四種可選的模塊方式:
1.直接鏈接(前臺菜單):可在前臺右上角加入一個菜單項(xiàng),可自主指派菜單鏈接的 URL。注意:由于引用外部程序,因此即便設(shè)置了模塊的使用等級,您的程序如需權(quán)限判斷,仍需要引用 common.inc.php 和插件相關(guān)的緩存文件(將在后面的《參數(shù)讀取與緩存控制》中詳細(xì)說明),并自行判斷使用等級是否合法;?
2.前臺調(diào)用(前臺菜單):與直接鏈接類似,但其調(diào)用的是插件的一個模塊,模塊文件名指派為“./plugins/插件目錄/插件模塊名.inc.php”,由 plugin.php 調(diào)用此模塊,調(diào)用 URL 將在后面的《編寫插件的原則與注意事項(xiàng)》中詳細(xì)說明;?
3.后臺調(diào)用(后臺菜單):可在后臺插件設(shè)置中為此插件增添一個管理模塊,模塊文件名指派為“./plugins/插件目錄/插件模塊名.inc.php”,由 admincp.php 調(diào)用此模塊,調(diào)用 URL 將在后面的《編寫插件的原則與注意事項(xiàng)》中詳細(xì)說明;?
4.包含運(yùn)行(無菜單):可設(shè)置一個在論壇所有頁面均包含運(yùn)行的腳本,此腳本在 ./include/common.inc.php 中加載,腳本文件名指派為“./plugins/插件目錄/插件模塊名.inc.php”。請注意,為了不導(dǎo)致錯誤的插件影響論壇運(yùn)行,在 common.inc.php 加載此模塊時,屏蔽了錯誤信息,因此請務(wù)必仔細(xì)檢查是否存在語法錯誤,任何微小的語法錯誤都將不被提示出來,并且導(dǎo)致此模塊不被正常加載。如果您配置了不正確的包含腳本而導(dǎo)致論壇系統(tǒng)設(shè)置無法使用,刪除服務(wù)器上相應(yīng)的腳本文件即可解決。?
您可以為每個模塊設(shè)置不同的使用等級,例如設(shè)置為“超級版主”,則超級版主及更高的管理者(例如論壇管理員)可以使用此模塊。? 看到了應(yīng)該很簡單前臺文件、后臺文件、調(diào)用外部文件、初始化文件!就這四種!那么一般的插件文件當(dāng)然是前臺調(diào)用
這里要說明一個調(diào)用問題,文中多次說到./include/common.inc.php是否加載,也就是說加載了這個文件,你就可以輕松的得到會員名、會員uid、會員的積分信息、論壇的分類、各級會員組用戶組信息,簡單說就是汽車加了汽油你可以開了,前后臺調(diào)用都加載了這個文件;包含運(yùn)行是把程序?qū)懭脒@個文件;前臺鏈接沒有加是需要你另外添加的!
第四章 Discuz!中常用文件說明
? ?? ?? ?第一節(jié) 常用文件說明 DZ程序文件目錄含義整理表 http://www.discuz.net/thread-329948-1-1.html
請看以上,感謝作者sw08 以下內(nèi)容版權(quán)歸原作者sw08哦 最近看見很多人熱衷于功能增強(qiáng)型HACK的修改。這種功能增強(qiáng)型HACK和平時所說的插件不一樣,插件是單獨(dú)的文件,一般在后臺導(dǎo)入即可使用。但是功能增強(qiáng)型HACK更多是修改程序源代碼來實(shí)現(xiàn)自己需要的功能,本人做得最多就是這類??梢哉f功能增強(qiáng)型HACK是插件的前身,想做插件就一定要做熟功能增強(qiáng)型HACK。 功能增強(qiáng)型HACK挺簡單,因?yàn)榇a修改量不多,而且一般以改代碼為主;說難,因?yàn)橐话悴缓谜椅募?#xff0c;而且一旦對程序結(jié)構(gòu)不熟悉,馬上陷入迷坑。
這里先簡單說下Discuz!的所有文件,目前所代表的含義,方便大家修改時候避免找不到改哪個文件。這是個基本功,一定要熟練~熟悉了文件的話,隨便做個功能增強(qiáng)型HACK根本就是不費(fèi)吹灰之力的事情。
先說根文件: admincp.php——后臺系統(tǒng)設(shè)置程序文件,一般只處理菜單的顯示的訪問權(quán)限,不處理管理控制。 attachment——附件文件,僅僅處理附件下載的功能。 announcement.php——論壇公告的顯示,一般很少改 blog.php——瀏覽BLOG文章時候會用的,非常容易理解 config.inc.php——配置論壇數(shù)據(jù)庫、密碼等信息,這個大家最熟悉了 digest.php——論壇精華區(qū)的信息顯示,不用多說了吧? discuz_version.php——論壇版本信息,用來更新用的,沒有官方說明絕對不要修改 faq.php——論壇幫助系統(tǒng),不過我看絕對沒人用 forumdisplay.php——很簡單,論壇主題列表的顯示 index.php——控制首頁元素顯示 logging.php——登陸系統(tǒng),判斷用戶名、密碼。 mail_config.inc.php——配置論壇EMAIL功能 member.php——控制會員列表顯示,積分策略等等信息顯示 memcp.php——會員控制面板 misc.php——控制評分功能、BLOG、論壇界面顯示功能等等 plugin.php——論壇插件,這個主要控制論壇插件的菜單的顯示,一般極少修改 pm.php——論壇短信息程序,控制短信息發(fā)表與瀏覽 post.php——與viewthread.php相似,但是更多是管理帖子發(fā)表、編輯等等信息,也會有權(quán)限的控制提示 redirect.php——控制顯示論壇的最后發(fā)表的主題訪問 register.php——注冊文件,同時也會控制注冊的信息的合法性 rss.php——RSS快速訂閱,不用多說了吧? search.php——處理論壇搜索功能中的信息篩選 seccode.php——論壇注冊,生成驗(yàn)證碼的程序 stats.php——處理統(tǒng)計(jì)中的統(tǒng)計(jì)信息 topic.php——一般無法直接訪問,控制頁面顯示,顯示主題條數(shù) topicadmin.php——控制的是管理人員的前臺管理操作,如精華、置頂、高亮等等 viewpro.php——處理瀏覽會員信息的內(nèi)容顯示 viewthread.php——處理瀏覽帖子時候的帖子信息顯示,例如信息、標(biāo)題等等,同時也處理訪問帖子的權(quán)限,如閱讀權(quán)限是否足夠等等。
接著開始說文件夾里面的文件了,一個個開始: 有人會問,那個空index.htm是干什么用的,我可以回復(fù),那是防止列目錄查看文件用的,避免安全問題。 admin=== (管理后臺的程序文件,全部在這里,僅能通過admincp.php來訪問) 標(biāo)記紅色的文件最好別動,畢竟主程序被加密,而且也是違背官方授權(quán)協(xié)議的。? ?? ??? home.inc.php——后臺首頁內(nèi)容 settings.inc.php——Discuz!選項(xiàng)下的所有小分類 passport.inc.php——一堆通行證的東西 avatarshow.inc.php——天下秀 qihoo.inc.php——奇虎搜索 forums.inc.php——論壇編輯下面所有子分類 members.inc.php——添加用戶、編輯用戶、合并用戶、用戶欄目定制? groups.inc.php——分組與級別下所有子分類 announcements.inc.php——只有論壇公告發(fā)布的管理 styles.inc.php——風(fēng)格管理 templates.inc.php——模板在線編輯 moderate.inc.php——一堆審核,審核新用戶、審核新主題、審核新回復(fù)? recyclebin.inc.php——單獨(dú)的回收站程序 ecommerce.inc.php——支付寶,不過最好別動 misc.inc.php——勛章編輯、在線列表定制、聯(lián)盟論壇、計(jì)劃任務(wù)、Discuz! 代碼、詞語過濾、Smilies 編輯、附件類型尺寸、積分交易記錄,管理得真多,甚至連后臺的退出功能也歸這個文件管。 advertisements.inc.php——廣告管理 database.inc.php——資料備份、資料恢復(fù)、數(shù)據(jù)庫升級、數(shù)據(jù)表優(yōu)化? attachments.inc.php——編輯附件,只有一個 counter.inc.php——更新論壇統(tǒng)計(jì) threads.inc.php——批量主題管理 prune.inc.php——批量刪帖、清理短消息? plugins.inc.php——插件設(shè)置、插件管理? logs.inc.php——運(yùn)行記錄,除了積分交易記錄以外的所有記錄 tools.inc.php——管理更新緩存、JS 調(diào)用向?qū)?、文件?quán)限檢查 menu.inc.php——后臺左邊那個好長的導(dǎo)航菜單就是了
Api目錄的文件是全部被加密過的,無法修改也不能修改,詳情見官方授權(quán)協(xié)議。
archiver==(特別說明下,因?yàn)閍rchiver中的目錄的文件沒有調(diào)用commom.inc.php,所以所有變量、函數(shù)都不能直接使用,必須要搜索數(shù)據(jù)庫來進(jìn)行判斷) ? ? index.php archiver首頁 ? ? include== ? ?? ???thread.inc.php archiver主題顯示 ? ?? ???index.inc.php 這個是過濾論壇權(quán)限和界面顯示用的 ? ?? ???header.inc.php archiver風(fēng)格控制 ? ?? ???forum.inc.php archiver論壇顯示
attachments是論壇附件的存放目錄
customavatars是論壇頭像的存放目錄
forumdata是論壇記錄和緩存文件的存放目錄,一般這些文件都是自動生成的,所以不要修改。至于有什么用途也說下吧。 ? ? cache==(很好用的功能,調(diào)用的這里的文件變量是非??斓?#xff09; ? ?? ? admingroup_X.php 管理組權(quán)限 ? ?? ? cache_bbcodes.php BBCODE和SMILES ? ?? ? cache_blog.php 所有用戶組的權(quán)限變量和smilies、bbcode,還有發(fā)帖數(shù)等級的信息 ? ?? ? cache_censor.php 屏蔽信息 ? ?? ? cache_crons.php 計(jì)劃任務(wù) ? ?? ? cache_forumdisplay.php 論壇信息與公告 ? ?? ? cache_forums.php 同上 ? ?? ? cache_index.php 在線列表、聯(lián)盟論壇、公告 ? ?? ? cache_ipbanned.php 封IP段記錄 ? ?? ? cache_medals.php 勛章信息 ? ?? ? cache_post.php smilies、bbcode、icons ? ?? ? cache_profilefields.php 暫時不清楚 ? ?? ? cache_settings.php setting表設(shè)置的參數(shù)變量 ? ?? ? cache_viewthread.php 論壇,用戶組,smilies、bbcode、icons ? ?? ? plugin_XX.php 插件表 ? ?? ? style_XX.php 風(fēng)格緩存 ? ?? ? usergroup_XX.php 用戶組緩存 ? ? templates==(升成的模板PHP,比較少做插件會用到,忽略) 根部的一些LOG文件就是后臺記錄文件了。
images是圖片目錄,忽略過~
include是論壇核心程序目錄,非常有必要去了解。 ? ? crons==(這里是計(jì)劃任務(wù)文件,你可以增加自己的計(jì)劃任務(wù),而且可以調(diào)用系統(tǒng)變量) ? ? tables==(幾個語言文件,很少改,跳過) serverbusy.htm 系統(tǒng)錯誤信息 bbcode.js Discuz!代碼JS效果文件 common.js 主要是DZ常用的模板函數(shù)文件,可以直接用 floatadv.js 廣告用的 qihoo.js 奇虎的文件,不改 threadpay.inc.php 出售帖 template.func.php 控制模板緩存生成的文件 sendmail.inc.php 發(fā)送EMAIL的程序 security.inc.php 好像是代理一類的,不管 relatethreads.inc.php 應(yīng)該說是生成相關(guān)主題的程序 promotion.inc.php 記錄當(dāng)前用戶的IP等信息 printable.inc.php 打印主題用的程序 post.func.php 不錯的函數(shù)文件,主要是記錄信息、更新帖子的函數(shù) pmprompt.inc.php 短信息內(nèi)容處理 newthread.inc.php 發(fā)新話題的信息處理 newreply.inc.php 發(fā)回復(fù)的信息處理 misc.func.php 又是函數(shù)文件,控制管理PM,評分PM,評分記錄,附件高亮顯示,IP轉(zhuǎn)換為地理位置 global.func.php 豐富的函數(shù)庫,都是前臺用的,如除去HTML、發(fā)PM、發(fā)EMAIL等等,建議大家研究下。 forum.func.php 處理論壇信息用的函數(shù),如論壇菜單下拉等等 editpost.inc.php 編輯帖子的信息處理 discuzcode.func.php Discuz!代碼轉(zhuǎn)換處理程序 db_mysql_error.inc.php 數(shù)據(jù)庫錯誤匯報(bào) db_mysql.class.php 數(shù)據(jù)庫中心操作程序 cron.func.php 控制計(jì)劃任務(wù)執(zhí)行的程序 counter.inc.php 記錄操作系統(tǒng)與瀏覽器的統(tǒng)計(jì) common.inc.php 最重要的核心程序,讀取COOKIES信息,定義全局系統(tǒng)函數(shù)變量 chinese.class.php 處理亂碼和字符集用的 category.inc.php 控制帖數(shù),今日發(fā)帖數(shù)的統(tǒng)計(jì) cache.func.php 控制生成緩存文件的程序 blog.func.php 在BLOG發(fā)帖時信息處理會用到 attachment.func.php 識別附件拓展名,控制附件前面顯示類別圖片的程序, 還有附件大小的記錄判斷 advertisements.inc.php 處理廣告顯示用的
ipdata==(IP庫文件目錄,下面那個wry.dat就是IP庫,這個我不會改)
plugins==(插件存放目錄)
templates==(模板目錄,一般做HACK也要改模板,因此說明下) ??default==(默認(rèn)模板,從這個開始,其它風(fēng)格以此類推) announcement.htm 公告 blog.htm BLOG首頁 blog_addremove.htm 移除添加BLOG blog_list.htm BLOG列表? blog_topic.htm BLOG中主題顯示 credits.htm 積分策略 css.htm 做風(fēng)格用的,不過我不懂 customtopics.htm 首頁那個用戶專題 digest.htm 精華區(qū)主題 emailfriend.htm EMAIL推薦主題 faq.htm FAQ幫助手冊,下面都是,只不過顯示部分不一樣,省略。 footer.htm 論壇底部信息 forumdisplay.htm 論壇主題列表 forumdisplay_subforum.htm 二級論壇列表 getpasswd.htm 取回密碼 groupexpiry.htm 公眾用戶組 header.htm 頭部連接 index.htm 首頁 login.htm 登錄頁面 login_secques.htm 登錄時安全提問 lostpasswd.htm 取回密碼 memberlist.htm 會員列表,上面那個 memcp_credits.htm 控制面板——積分交易 memcp_home.htm 控制面板——首頁 memcp_misc.htm 控制面板——好友列表、訂閱列表、收藏夾 memcp_navbar.htm 控制面板——上面那個菜單條 memcp_profile.htm 控制面板——編輯個人資料 memcp_usergroups.htm 控制面板——公眾用戶組 nopermission.htm 關(guān)閉論壇顯示的提示頁 pay.htm 買帖子 pay_view.htm 看帖子被誰買了 pm.htm 短信息左邊菜單條 pm_archive.htm 導(dǎo)出短消息 pm_archive_html.htm 導(dǎo)出短消息HTML pm_folder.htm 好像就是列表而已 pm_ignore.htm 忽略列表 pm_search.htm 搜索短消息 pm_search_result.htm??搜索短消息結(jié)果 pm_send.htm??發(fā)送短消息? pm_view.htm 瀏覽短信息,內(nèi)容更詳細(xì) pmprompt.htm 首頁新短信提示 post_attachments.htm 發(fā)帖子的附件模塊 post_bbinsert.htm 一堆BBCODE post_editpost.htm 編輯帖子 post_newreply.htm 回復(fù)主題 post_newthread.htm 發(fā)新話題 post_preview.htm 主題回顧 post_seccode.htm 驗(yàn)證碼 post_smilies.htm SMILES post_sminsert.htm 快速發(fā)帖欄 rate.htm 評分 rate_view.htm 評分記錄瀏覽 register.htm 注冊 reportpost.htm 主題報(bào)告 search.htm 搜索主頁 search_blog.htm 搜索BLOG列表 search_threads.htm 搜索后的帖子列表 showmessage.htm 系統(tǒng)返回錯誤信息那個 stats_main.htm 統(tǒng)計(jì)首頁 stats_misc.htm 管理統(tǒng)計(jì)、時間、積分等等一堆 stats_navbar.htm 統(tǒng)計(jì)上面那個菜單條 stats_onlinetime.htm 時間統(tǒng)計(jì) stats_team.htm 管理團(tuán)隊(duì) topic.htm 又是QIHOO的隨機(jī)廣告 topicadmin_bump.htm 提升主題 topicadmin_delpost.htm 刪除主題 topicadmin_getip.htm 查看IP topicadmin_merge.htm 合并主題 topicadmin_moderate.htm 高亮、置頂、精華一堆~ topicadmin_move.htm 移動主題 topicadmin_reason.htm 管理理由填寫 topicadmin_refund.htm 強(qiáng)制退款 topicadmin_split.htm 分割主題 topicadmin_stick.htm 置頂 viewpro.htm 會員詳細(xì)信息查看 viewthread.htm 瀏覽帖子 viewthread_mod.htm 帖子管理記錄 viewthread_pay.htm 帖子支付頁面 viewthread_poll.htm 投票框 viewthread_printable.htm 打印主題 whosonline.htm 詳細(xì)的在線動作 actions.lang.php??動作語言包 admincp.lang.php 后臺語言包 archiver.lang.php archiver語言包 customfaq.lang.php FAQ手冊的語言包 emails.lang.php 一堆EMAIL信息 messages.lang.php 錯誤信息語言包 misc.lang.php 像最后編輯,由誰管理等等 modactions.lang.php 管理代號 pms.lang.php PM,都是管理理由 templates.lang.php 前臺模板的語言包 wap.lang.php wap用的語言包?
wap==(WAP支持程序,一般很少改,忽略)
相信看了上面的表來熟悉文件作用,找相應(yīng)的文件進(jìn)行修改,做一個功能增強(qiáng)型HACK不是難事。:)?
緒論 本文檔的說明 伴隨著Discuz!的成長,在Discuz!快速發(fā)展的同時,Discuz!的插件也日益豐富,在這些插件中存在的不規(guī)范問題也是確實(shí)存在的,為了插件的規(guī)范化標(biāo)準(zhǔn)化進(jìn)程的進(jìn)行,也為了方便各位優(yōu)秀的插件開發(fā)人員,更為了Discuz!程序插件的傳承,我們特從現(xiàn)在開始進(jìn)行插件開發(fā)標(biāo)準(zhǔn)化手冊的編寫,促進(jìn)Discuz!論壇程序的插件開發(fā)! 目前手冊正在緊張的制作中,歡迎大家對其中不對的地方進(jìn)行指正,個人感覺這個手冊更新的速度那會是相當(dāng)?shù)目彀?br />第一章 插件代碼書寫規(guī)范
? ?? ???第一節(jié) 注釋標(biāo)準(zhǔn) 在Discuz!插件中我們建議開發(fā)人員盡量添加簡潔明了的注釋語言,以方便后繼的插件修改者 以下的幾種注釋都是支持的,我們建議使用第一種<?php
??echo "這是第一種例子。\n"; // 本例是 C++ 語法的注釋
??/* 本例采用多行的
? ???注釋方式? ?? ?*/
??echo "這是第兩種例子。\n";
??echo "這是第三種例子。\n"; # 本例使用 UNIX Shell 語法注釋
?> 復(fù)制代碼 第二節(jié) 縮進(jìn)標(biāo)準(zhǔn) 在Discuz!插件中我們建議開發(fā)人員盡量使用縮進(jìn)來完成整個程序,雖然對于程序沒有影響,但是縮進(jìn)會使代碼易于閱讀,并且強(qiáng)烈建議使用Tab鍵來控制縮進(jìn)的程度,并強(qiáng)制定義其距離是8個空白字符寬度<?php
??if($loadctrl && (!defined('CURSCRIPT') || CURSCRIPT != 'wap') && substr(PHP_OS, 0, 3) != 'WIN') {
? ?? ???if($fp = @fopen('/proc/loadavg', 'r')) {
? ?? ?? ?? ?? ? list($loadaverage) = explode(' ', fread($fp, 6));//請注意縮進(jìn)
? ?? ?? ?? ?? ? fclose($fp);
? ?? ?? ?? ?? ? if($loadaverage > $loadctrl) {
? ?? ?? ?? ?? ?? ?? ?? ?header("HTTP/1.0 503 Service Unavailable");//請注意縮進(jìn)
? ?? ?? ?? ?? ?? ?? ?? ?include DISCUZ_ROOT.'./include/serverbusy.htm';
? ?? ?? ?? ?? ?? ?? ?? ?exit();
? ?? ?? ?? ?? ? }//請注意縮進(jìn)
? ?? ???}//請注意縮進(jìn)
}
?> 復(fù)制代碼 第三節(jié) 命名標(biāo)準(zhǔn) 良好的命名方式會給程序的開放帶來很大的便利,同時不良的命名習(xí)慣也會給程序開發(fā)帶來麻煩,所以在Discuz!插件中我們建議開發(fā)人員盡量使用規(guī)范的命名方式來完成整個程序,仍然以上例為演示,請注意其中變量名稱,由于篇幅和時間的關(guān)系這里就不再展開敘述,這里給出一個PHP程序開發(fā)比較通用的命名習(xí)慣(這是一個編程標(biāo)準(zhǔn)文檔)PHP 編程標(biāo)準(zhǔn).總的來說,只有了解系統(tǒng)的程序員才能為系統(tǒng)取出最合適的名字,如果所有的命名都與其自然相適合,則關(guān)系清晰,含義可以推導(dǎo)得出,一般人的推想也能在意料之中,如果你發(fā)覺你的命名只有少量能和其對應(yīng)事物相匹配的話, 最好還是重新設(shè)計(jì)吧<?php
??if($loadctrl && (!defined('CURSCRIPT') || CURSCRIPT != 'wap') && substr(PHP_OS, 0, 3) != 'WIN') {
? ?? ???if($fp = @fopen('/proc/loadavg', 'r')) {
? ?? ?? ?? ?? ? list($loadaverage) = explode(' ', fread($fp, 6));
? ?? ?? ?? ?? ? fclose($fp);
? ?? ?? ?? ?? ? if($loadaverage > $loadctrl) {
? ?? ?? ?? ?? ?? ?? ?? ?header("HTTP/1.0 503 Service Unavailable");
? ?? ?? ?? ?? ?? ?? ?? ?include DISCUZ_ROOT.'./include/serverbusy.htm';
? ?? ?? ?? ?? ?? ?? ?? ?exit();
? ?? ?? ?? ?? ? }
? ?? ???}
}
?> 復(fù)制代碼 第四節(jié) 數(shù)據(jù)庫設(shè)計(jì)標(biāo)準(zhǔn) 對于數(shù)據(jù)庫的設(shè)計(jì)我們同樣由于篇幅和時間的關(guān)系我們不再多說,請仔細(xì)查看Discuz!中的論壇版塊表的設(shè)計(jì)和命名標(biāo)準(zhǔn),同樣的我們提供給您一份手冊給您查看MySQL參考手冊 cdb_forums 論壇表? fid smallint 論壇ID? fup smallint 上級論壇ID? type enum 類型? name char 名稱? status tinyint 顯示狀態(tài)? displayorder tinyint 顯示順序? styleid smallint 風(fēng)格ID? threads mediumint 主題數(shù)量? posts mediumint 帖子數(shù)量? todayposts mediumint 今日發(fā)帖數(shù)量? lastpost char 最后發(fā)表? allowsmilies tinyint 允許使用表情? allowhtml tinyint 允許使用html? allowbbcode tinyint 允許bbcode? allowimgcode tinyint 允許img? allowanonymous tinyint 允許匿名? allowshare tinyint 允許共享到文集和supe? allowpostspecial tinyint 允許發(fā)表特殊主題? alloweditrules tinyint 允許版主修改論壇規(guī)則? recyclebin tinyint 是否啟用回收站? modnewposts tinyint 是否審核發(fā)帖? jammer tinyint 是否啟用干擾碼? disablewatermark tinyint 是否圖片附件增加水印? inheritedmod tinyint 本論壇或分類版主的權(quán)力繼承到下級論壇? autoclose smallint 自動關(guān)閉主題? forumcolumns tinyint 增加論壇水平橫排設(shè)置? threadcaches tinyint 主題緩存功能設(shè)置? allowpaytoauthor tinyint 允許直接向作者支付?
第二章 插件代碼安全規(guī)范
? ?? ???第一節(jié) PHP安全信息 總的來說PHP還是相對安全的Web程序,但是由于一些代碼在處理方式上的不成熟導(dǎo)致了安全隱患.由于這個議題范圍太廣,所以推薦PHPCHINA的Essential PHP Security -PHP安全基礎(chǔ)一書給大家,希望大家多看看,很不錯的一本書哦,更詳細(xì)的PHP安全信息請登錄php.net查找. 第二節(jié) 我們該怎么做 對于插件安全究竟我們要做些什么怎么做?建議本內(nèi)容在看過上節(jié)推薦的書之后再看會更好
變量的初始化 這里不討論magic_quotes_gpc和register_globals的設(shè)置情況,大家只要注意不要“無中生有”變量,每個變量的得到都是自己初始化過的
邏輯關(guān)系清楚 對于邏輯的判定不是一句話能夠說明白的,舉個簡單的例子,在判斷上傳文件的時候,我們判斷的依據(jù)是他的后綴是否在我們允許的后綴里面,如果是允許的就執(zhí)行上傳,反之就提示上傳文件后綴不對,但是如果用戶上傳的文件名是webshell.xxx.mht(允許mht文件上傳,mht是一種網(wǎng)頁存儲格式),于是文件上傳了,在apache系統(tǒng)的默認(rèn)配置下,這個文件是會用PHP來解析的,利用這個算是BUG的問題吧,小版本人就曾伙同PHP安全界知名人士(幫他匿了)對我們學(xué)校的服務(wù)器完成了入侵,并最終取得了root權(quán)限(目前俺們學(xué)校的服務(wù)器已經(jīng)修正此問題),舉這個例子是為了說明程序處理的重要性,如果當(dāng)時多一步判斷上傳的文件,也許這個安全問題就不再存在,其實(shí)這個例子來說明邏輯關(guān)系并不是很合適,但是程序處理真的是一個非常重要的部分
''與""的區(qū)別運(yùn)用 單引號中,任何變量($var)、特殊轉(zhuǎn)義字符(如“\t \r \n”等)不會被解析,因此PHP的解析速度更快,轉(zhuǎn)義字符僅僅支持“\’”和“\\”這樣對單引號和反斜杠本身的轉(zhuǎn)義; 雙引號中,變量($var)值會代入字符串中,特殊轉(zhuǎn)義字符也會被解析成特定的單個字符,還有一些專門針對上述兩項(xiàng)特性的特殊功能性轉(zhuǎn)義,例如“\$”和“{$array[‘key’]}.這樣雖然程序編寫更加方便,但同時PHP的解析也很慢; 數(shù)組中,如果下標(biāo)不是整型,而是字符串類型,請務(wù)必用單引號將下標(biāo)括起,正確的寫法為$array[‘key’],而不是$array[key],因?yàn)椴徽_的寫法會使PHP解析器認(rèn)為key是一個常量,進(jìn)而先判斷常量是否存在,不存在時才以“key”作為下標(biāo)帶入表達(dá)式中,同時出發(fā)錯誤事件,產(chǎn)生一條Notice級錯誤. 因此,在絕大多數(shù)可以使用單引號的場合,禁止使用雙引號.依據(jù)上述分析,可以或必須使用單引號的情況包括但不限于下述: 字符串為固定值,不包含“\t”等特殊轉(zhuǎn)義字符; 數(shù)組的固定下標(biāo),例如$array[‘key’]; 表達(dá)式中不需要帶入變量,例如$string = ‘test’;而非$string = “test$var”;
數(shù)據(jù)的過濾與處理 對于任何得到的數(shù)據(jù)在不能確定或者不能充分確定其來路的時候一定要進(jìn)行過濾與處理,在數(shù)據(jù)進(jìn)入程序運(yùn)行處理階段之前,一定要保證它的準(zhǔn)確性和正確性
不要相信任何數(shù)據(jù)的準(zhǔn)確性和正確性 這條視乎是和上面一條雷同,但是即使是從數(shù)據(jù)庫中查出來的數(shù)據(jù)也一樣不能確定,比如生成cache文件,如果用戶POST的數(shù)據(jù)錯誤不是我們期望的數(shù)據(jù),而“恰巧”生成到文件中,于是一個webshell產(chǎn)生了,同樣這個例子也不是很合適,我只是希望大家明白這么一點(diǎn),如果我們沒有一個很好的處理數(shù)據(jù)的方式,那么代碼的安全崩潰也就指日可待
不要妄圖直接把低版本的Discuz!插件直接運(yùn)行 由于每個大版本的升級都會帶來系統(tǒng)構(gòu)架的一些變化,可能舊版本的插件仍然可以使用,但是或許一些不可預(yù)料的問題正在隱藏中,所以建議任何低版本的Discuz!插件最好是經(jīng)過仔細(xì)研究之后再公告說可以適用新版本Discuz!插件 第三章 Discuz!中常用變量說明 | |