数据库设定:
引用:
`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注射有没有影响?
[
本帖最后由 horseluke 于 2008-10-9 14:43 编辑 ]