AL8 Forum
   登錄註冊幫助


標題: 开发某插件的一些困惑,寻求解答
 horseluke
 0109159
Rank: 1
點擊查看 horseluke 的詳細資料

頭銜: Newbie

帖子: 13

精華: 0

積分: 170 點

現金: 100 元

存款: 0 元

閱讀權限: 10

註冊: 2008-10-6

狀態: 離線
 
發表於 2008-10-9 11:52  資料  個人空間  短消息  加為好友 
开发某插件的一些困惑,寻求解答

为避免浪费资源,不转帖了。各位请到这里看,然后再在这里帮忙解答吧:http://www.freediscuz.net/bbs/thread-4288-1-1.html

P.S:不愿打开WPS OFFICE来简繁转换了,各位应该不会排斥我吧?

图片:
[attach]66539[/attach]



 附件: 您所在的用戶組無法下載或查看附件



 AL8 Forum © All rights reserved.
頂部
 horseluke
 0109159
Rank: 1
點擊查看 horseluke 的詳細資料

頭銜: Newbie

帖子: 13

精華: 0

積分: 170 點

現金: 100 元

存款: 0 元

閱讀權限: 10

註冊: 2008-10-6

狀態: 離線
 
發表於 2008-10-9 12:07  資料  個人空間  短消息  加為好友 
........忘记了有些人的IP是不能访问FD的(就比如我不能访问到hkdiscuss一样) .....转过来好了 ............

資料庫設定:
`title` varchar(50) NOT NULL,
`description` varchar(255) NOT NULL,

要求title字段不支持html格式,description支持html格式。並且必須防止SQL注射。
於是乎寫了如下PHP語句(僅貼出與此兩個字段有關的語句):
}elseif ($action == 'add'){
         if(submitcheck('idauthfieldaddsubmit')) {
                         $newtitle = cutstr(dhtmlspecialchars($newtitle),50);
                         $newdescription = cutstr(daddslashes($newdescription),255);
                         $db->query("INSERT INTO {$tablepre}idauthfieldsvar (...,title,description,...) VALUES (..., '$newtitle', '$newdescription',...)");
                                         showmessage('成功添加一条新的认证项目!', "idauthsetcp.php?action=index");
         }
         include template('idauth_set_add');
}

調試環境:PHP 5.2.5,MYSQL 5.0,Windows XP SP2,Apache2,插件運行平臺:Discuz! 6.1F

調試的時候遇到的困惑,希望得到解答:
1、在資料庫已經定義了varchar的字元段大小後還需不需要使用cutstr來進行字元截取?
查看dz代碼,相關的地方似乎都使用了cutstr來截取字元,但問題是一個漢字是兩個字元,DZ的cutstr函數截取的不很好。比如title字段輸入50個“日”字,cutstr函數就只是截取了前25個並且寫入資料庫(如上圖中infofieldid為9處所示),但事實上這50個“日”字的字串本來符合varchar(50)的要求。
另外在實際應用中,發現MySQL會自動幫你截取字串。比如66個“日”字的字串,在執行數據庫INSERT的操作過程中,MYSQL會自動截取到50個“日”字的字串來符合varchar(50)的要求,這樣一來又似乎失去了使用cutstr的需要(如上圖中infofieldid為10處所示)。
如此一來,在資料庫已經定義了varchar的字元段大小後還需不需要使用cutstr來進行字元截取?

2、對字串進行dhtmlspecialchars處理之後還需不需要使用daddslashes進行轉義?
由於title要求不能支持html格式,因此對$newtitle進行dhtmlspecialchars處理,然後就寫入資料庫(如上圖中infofieldid為7,8處所示)。
但現在非常關心的一件事情是,進行了dhtmlspecialchars處理之後,還需不需要使用daddslashes進行轉義以防止SQL注入?也就是說,在進行了dhtmlspecialchars處理的前提下,用了daddslashes和沒用daddslashes對防止SQL注射有沒有影響?



与该问题对应的该插件截图预览
[attach]66540[/attach]

[ 本帖最後由 horseluke 於 2008-10-9 12:08 編輯 ]



 附件: 您所在的用戶組無法下載或查看附件



 AL8 Forum © All rights reserved.
頂部
 Poka
 0000379
Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9

頭銜: Administrator

帖子: 6250

精華: 6

積分: 38455 點

現金: 4793 元

存款: 1493911 元

閱讀權限: 120

註冊: 2003-11-30

狀態: 離線
 
發表於 2008-10-9 13:29  資料  個人空間  短消息  加為好友 
又是一個中了 discuz 毒的例子

1. varchar 和 cutstr 完全是兩回事, varchar 是控制數據庫字數, cutstr  是 discuz 的一個定義用在一些環境下將字數控制在一定範圍, 如果是 varchar(50), 那超過此數超出部份就不會寫入數據庫

2. dhtmlspecialchars 和 daddslashes 也是兩回事, 前者用途你大慨已說出, 後者是也是 discuz 的一個在 addslashes  基礎上的定義, 是控制寫入數據庫時不受一些與數據庫相衝的字符




 AL8 Forum © All rights reserved.
頂部
 horseluke
 0109159
Rank: 1
點擊查看 horseluke 的詳細資料

頭銜: Newbie

帖子: 13

精華: 0

積分: 170 點

現金: 100 元

存款: 0 元

閱讀權限: 10

註冊: 2008-10-6

狀態: 離線
 
發表於 2008-10-9 13:39  資料  個人空間  短消息  加為好友 
QUOTE:
原帖由 Poka 於 2008-10-9 13:29 發表
又是一個中了 discuz 毒的例子
1. varchar 和 cutstr 完全是兩回事, varchar 是控制數據庫字數, cutstr  是 discuz 的一個定義用在一些環境下將字數控制在一定範圍, 如果是 varchar(50), 那超過此數超出部份 ...


看来只好dhtmlspecialchars 和 daddslashes 两个都用了

P.S:接了手就是dz,还用了一年,不研究不行
不过有时间的话会研究降到6.0,因为服务器的原因不能安装uc,而我又有一些整合需求




 AL8 Forum © All rights reserved.
頂部
 horseluke
 0109159
Rank: 1
點擊查看 horseluke 的詳細資料

頭銜: Newbie

帖子: 13

精華: 0

積分: 170 點

現金: 100 元

存款: 0 元

閱讀權限: 10

註冊: 2008-10-6

狀態: 離線
 
發表於 2008-10-9 14:42  資料  個人空間  短消息  加為好友 
再汗自己一下.........原来dz已经有相关的daddslashes处理了。

来源:http://www.phpchina.com/bbs/thread-82213-1-2.html
在common.inc.php
//对3种传输方式所传递的值进行处理:调用daddslashes函数,先对这些数据进行判断是否打开MAGIC_QUOTES_GPC。如果打开了,则对所有数据中的某些字符前加上了反斜线。这些字符是单引号(')、双引号(")、反斜线(\)与 NUL(NULL 字符)。这一步骤是为了确保安全性,防止被恶意sql注入
foreach(array('_COOKIE', '_POST', '_GET') as $_request) {
        foreach($$_request as $_key => $_value) {
                $_key{0} != '_' && $$_key = daddslashes($_value);
        }
}

插件包含了common.inc.php,所以只需要考虑dhtmlspecialchars的问题了......谢谢各位了




 AL8 Forum © All rights reserved.
頂部

聯繫我們 - AL8 Forum - 網頁空間由 I-SERVICES 提供 - Archiver - WAP
清除 Cookies, 當前時區 GMT+8, 現在時間是 2008-12-3 14:01
Processed in 0.024306 second(s), 7 queries , Gzip enabled
Powered by Discuz! 5.5.0  © 2001-2007 Comsenz Inc.