站长百科 | 数字化技能提升教程 数字化时代生存宝典
首页
数字化百科
电子书
▼
建站程序
开发
服务器
办公软件
开发教程
▼
服务器教程
软件使用教程
运营教程
热门电子书
▼
CSS教程
WordPress教程
导航
程序频道
推广频道
网赚频道
人物频道
网站程序
网页制作
云计算
服务器
CMS
论坛
网店
虚拟主机
cPanel
网址导航
WIKI使用导航
WIKI首页
热点词条
最新资讯
网站程序
站长人物
页面分类
使用帮助
编辑测试
创建条目
网站地图
站长百科导航
站长百科
主机侦探
IDCtalk云说
跨境电商导航
WordPress啦
站长专题
网站推广
网站程序
网站赚钱
虚拟主机
cPanel
网址导航专题
云计算
微博营销
虚拟主机管理系统
开放平台
WIKI程序与应用
美国十大主机
编辑“
Xoops ORM对象关系映射2
”(章节)
人物百科
|
营销百科
|
网赚百科
|
站长工具
|
网站程序
|
域名主机
|
互联网公司
|
分类索引
跳转至:
导航
、
搜索
警告:
您没有登录。如果您做出任意编辑,您的IP地址将会公开可见。如果您
登录
或
创建
一个账户,您的编辑将归属于您的用户名,且将享受其他好处。
反垃圾检查。
不要
加入这个!
===数据库安全=== 前面几个例子讲解了[[XOOPS]]系统以及Frameworks库对查询的支持,数据操作除了查询外,还包括增加、删除和修改等三种常用的操作。与查询相比,增加、删除和修改操作会修改[[数据库]]的内容,所以需要额外的安全检查,这些安全检查从以下三点考虑。 一,由于[[HTTP]]协议不保持[[TCP]]链接,因此这些安全检查应当针对用户采用浏览器操作时的情况,而不考虑采用特定工具模拟HTTP协议的情况。 二,参照[[W3C]]制订的标准,[[浏览器]]应当提供避免重复提交POST请求的机制,因此对于对于应当通过POST请求进行的增加、删除和修改操作,需要在非POST请求的情况下避免增加、删除和修改操作。 三,通过POST请求进行的增加、删除和修改操作,应当检查是否是通过本站提交的表单,避免处理站外提交表单的情况。 基于以上三点考虑,XOOPS系统提供了相应的数据库安全机制,接下来本例将讲解如何使用XOOPS系统提供的安全机制。本例的文件夹结构如下: <pre> /modules/ormproxy /class /section.php /images /logo.png /sql /mysql.sql /templates /ormproxy_index.html /index.php /xoops_version.php </pre> 其中xoops_version.php的内容如下: <pre> /modules/ormproxy/xoops_version.php <?php $modversion['name'] = "ORM对象关系映射 - 数据库安全"; $modversion['version'] = 0.01; $modversion['description'] = "演示数据库的安全访问机制"; $modversion['author'] = <<<AUTHOR 胡争辉 QQ: 443089607 QQMail: hu_zhenghui@qq.com GTalk: huzhengh GMail: huzhengh@gmail.com Skype: huzhenghui" AUTHOR; $modversion['credits'] = ""; $modversion['license'] = "版权所有"; $modversion['image'] = "images/logo.png"; $modversion['dirname'] = "ormproxy"; $modversion["hasMain"] = 1; $modversion["sqlfile"]["mysql"] = "sql/mysql.sql"; $modversion["tables"][] = "ormproxy_section"; $modversion["templates"][0]["file"] = "ormproxy_index.html"; $modversion["templates"][0]["description"] = "Template for index.php"; ?> </pre> 为便于对照学习,本例采用上例中的数据结构,但不包括数据,mysql.sql的内容如下: <pre> /modules/ormproxy/sql/mysql.sql CREATE TABLE `ormproxy_section` ( /* 详见源代码 */ ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_bin AUTO_INCREMENT=1; </pre> 本例的数据对象和数据访问句柄也不需要额外的编码,与上例类似,section.php文件的源代码如下: <pre> /modules/ormproxy/class/section.php <?php /* 详见源代码 */ class OrmproxySection extends ArtObject { function OrmproxySection () { $this->ArtObject("ormproxy_section"); /* 详见源代码 */ } } class OrmproxySectionHandler extends ArtObjectHandler { function OrmproxySectionHandler($db) { $this->ArtObjectHandler($db, "ormproxy_section", "OrmProxySection", "id", "caption"); return; } } ?> </pre> 在index.php中增加显示表单以及插入数据的处理过程,源代码如下: <pre> /modules/ormproxy/index.php <?php require_once dirname(__FILE__)."/../../mainfile.php"; $myts = MyTextSanitizer::getInstance(); /* @var $myts MyTextSanitizer */ if (true === isset($_REQUEST["submit"])) { $xoopsDB->query("INSERT INTO ".$xoopsDB->prefix("ormproxy_section"). " (caption) VALUES ('".$myts->addSlashes($_REQUEST["section"])."')"); } $sectionhandler = xoops_getmodulehandler("section", "ormproxy"); /* @var $sectionhandler OrmproxySectionHandler */ $xoopsOption["template_main"] = "ormproxy_index.html"; include XOOPS_ROOT_PATH."/header.php"; /* @var $xoopsTpl XoopsTpl */ include_once XOOPS_ROOT_PATH."/class/xoopsformloader.php"; $section_form = new XoopsThemeForm("Create Section", "section_form", ""); $section_form->addElement(new XoopsFormText("Section:", "section", 20, 20)); $section_form->addElement(new XoopsFormButton("", "submit", _SUBMIT, "submit")); $xoopsTpl->assign_by_ref("section_form", $section_form->render()); /* 详见源代码 */ include XOOPS_ROOT_PATH."/footer.php"; ?> </pre> 检查是否提交了submit参数来判断是否是一个需要插入数据的请求。 if (true === isset($_REQUEST["submit"])) { 如果是一个插入数据的请求,则构造并执行插入数据的[[SQL]]语句。 <pre> $xoopsDB->query("INSERT INTO ".$xoopsDB->prefix("ormproxy_section"). " (caption) VALUES ('".$myts->addSlashes($_REQUEST["section"])."')"); </pre> 提交数据的表单与前面讲解的表单类似,对应的模板需要增加显示表单的代码,源代码如下: <pre> /modules/ormproxy/templates/ormproxy_index.html <{strip}> <{$section_form}> <table> <!-- 详见源代码 --> </table> <{/strip}> </pre> 效果如图2-11安全提交表单所示。 <div> [[Image:xop98.png]] </div> 在Section文本框中输入文字,然后单击“提交”按钮就可以提交表单。提交的内容将显示在下侧的列表中。 本例从代码上看并没有特别的安全检查,这是因为XOOPS系统已封装必要的安全检查,从而提供透明的操作。如果把表单的方法设置为GET。 $section_form = new XoopsThemeForm("Create Section", "section_form", "", "GET"); 访问时将看到同样的界面,界面的下侧也会显示已提交的数据列表,但是提交的数据却不会被加入到列表中。这就是因为XOOPS系统进行了相应的安全检查,限制了GET方法仅能执行查询数据的操作。类似的,如果表单来自于XOOPS系统之外的网页,也会被XOOPS系统限制仅能执行查询数据的操作。 在某些业务逻辑中,如果不希望被XOOPS系统的安全检查限制执行SQL语句,则可以用queryF函数替代query函数,例如本例中如果希望能用GET方法提交表单,则进行如下修改。 <pre> $xoopsDB->queryF("INSERT INTO ".$xoopsDB->prefix("ormproxy_section"). " (caption) VALUES ('".$myts->addSlashes($_REQUEST["section"])."')"); </pre> queryF函数会强制执行SQL语句,而不受XOOPS系统的安全检查限制。queryF函数的定义如下: <pre> /class/database/mysqldatabase.php function queryF($sql, $limit=0, $start=0) {} </pre>
摘要:
请注意,您对站长百科的所有贡献都可能被其他贡献者编辑,修改或删除。如果您不希望您的文字被任意修改和再散布,请不要提交。
您同时也要向我们保证您所提交的内容是您自己所作,或得自一个不受版权保护或相似自由的来源(参阅
Wordpress-mediawiki:版权
的细节)。
未经许可,请勿提交受版权保护的作品!
取消
编辑帮助
(在新窗口中打开)