关于本博客
纯粹研究PHP相关技术的一个博客,欢迎大家交流。
博主QQ: 友情链接、技术交流联系此Q
当前位置: >>
下面是摘自hp官方的公告,官方直接贴出这些东西是非常不负责的行为,跟上次apahe公开的Struts2的一样的行为,会造成很多被黑。似的厂商不要再做这种蠢事。 Think 3..3及之前的版本存在一个,漏洞存在于ThinkPHP/Lib/Core/Model.class.php 根据官方文档对&SQL&的(见http://doc..cn/manual/_injection.html) 使用条件预可以防止SQL注入,没错,当使用如下代码时可以起到: $Model-&(&=%d and username='%s' and xx='%f&&,($id,$username,$xx))-&(); 或者 $Model-&where(&id=%d and username='%s' and xx='%f&&,$id,$username,$xx)-&select(); 但是,当你使用如下代码时,却没有&防止SQL注入&效果(而官方文档却说可以防止SQL注入): $-&query(&select * from user where id=%d and status=%s',$id,$status); 或者 $model-&query('select * from user where id=%d and status=%s',array($id,$status)); : ThinkPHP/Lib/Core/Model.class.php 文件里的parseSql没有SQL。原函数: protected
parseSql($sql,$parse) { // 达式 if(true === $parse) { $options =& $-&_parseOptions(); $sql& =&& $this-&db-&parseSql($sql,$options); }elseif(is_array($parse)){ // SQL $sql& = vsprintf($sql,$parse); }else{ $sql&&& =&& strtr($sql,array('__TABLE__'=&$this-&TableName(),'__PREFIX__'=&C('DB_PREFIX&))); } $this-&db-&setModel($this-&name); return $ } 验证漏洞(举例): 地址: http://localhost/Main?id=boo& or 1=&1 或 http://localhost/Main?id=boo%22%20or%201=%221action代码: $model=M(&Peipeidui&); $m=$model-&query(&select * from peipeidui where name=&%s&',$_GET['id']); dump($m); 或者 $model=M('Peipeidui&); $m=$model-&query(&select * from peipeidui where name=&%s&',array($_GET['id'])); dump($m); 结果: 表peipeidui所有被列出,SQL注入语句起效。办法: 将parseSql函数修改为: protected function parseSql($sql,$parse) { // 分析表达式 if(true === $parse) { $options =& $this-&_parseOptions(); $sql& =&& $this-&db-&parseSql($sql,$options); }elseif(is_array($parse)){ // SQL预处理 $parse = array_map(array($this-&db,'escapeString&),$parse);//此行为新增代码 $sql& = vsprintf($sql,$parse); }else{ $sql&&& =&& strtr($sql,array(&__TABLE__'=&$this-&getTableName(),'__PREFIX__'=&C('DB_PREFIX&))); } $this-&db-&setModel($this-&name); return $ } : 不要过分依赖TP的底层SQL过滤,员要做好安全检查 不建议直接用$_GET,$_
文章如需转载请注明:转载自 本文链接地址:
发布:sccscc | 分类: | 评论:0 | 引用:0 | 浏览:
&&( 22:54:45)&&( 20:26:55)&&( 20:21:53)&&( 12:57:59)&&( 12:56:24)&&( 12:51:56)&&( 2:45:1)
正文(*)(留言最长字数:2000)
记住我,下次回复时不用重新输入个人信息
◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。
随机推荐文章ThinkPHP函数详解:M方法 - ThinkPHP框架
M方法用于实例化一个基础模型类,和D方法的区别在于:
1、不需要自定义模型类,减少IO加载,性能较好;
2、实例化后只能调用基础模型类(默认是Model类)中的方法;
3、可以在实例化的时候指定表前缀、数据库和数据库的连接信息;
D方法的强大则体现在你封装的自定义模型类有多强,不过随着新版ThinkPHP框架的基础模型类的功能越来越强大,M方法也比D方法越来越实用了。
M方法的调用格式:
M('[基础模型名:]模型名','数据表前缀','数据库连接信息')
我们来看下M方法具体有哪些用法:
1、实例化基础模型(Model) 类
在没有定义任何模型的时候,我们可以使用下面的方法实例化一个模型类来进行操作://实例化User模型
$User&=&M('User');
//执行其他的数据操作
$User-&select();这种方法最简单高效,因为不需要定义任何的模型类,所以支持跨项目调用。缺点也是因为没有自定义的模型类,因此无法写入相关的业务逻辑,只能完成基本的CURD操作。$User&=&M('User');其实等效于:$User&=&new&Model('User');表示操作think_user表。M方法和D方法一样也有单例功能,多次调用并不会重复实例化。M方法的模型名参数在转换成数据表的时候会自动转换成小写,也就是说ThinkPHP的数据表命名规范是全小写的格式。
2、实例化其他公共模型类
第一种方式实例化因为没有模型类的定义,因此很难封装一些额外的逻辑方法,不过大多数情况下,也许只是需要扩展一些通用的逻辑,那么就可以尝试下面一种方法。$User&=&M('CommonModel:User');改用法其实等效于:$User&=&new&CommonModel('User');因为系统的模型类都能够自动加载,因此我们不需要在实例化之前手动进行类库导入操作。模型类CommonModel必须继承Model。我们可以在CommonModel类里面定义一些通用的逻辑方法,就可以省去为每个数据表定义具体的模型类,如果你的项目已经有超过100个数据表了,而大多数情况都是一些基本的CURD操作的话,只是个别模型有一些复杂的业务逻辑需要封装,那么第一种方式和第二种方式的结合是一个不错的选择。
3、传入表前缀、数据库和其他信息
M方法有三个参数,第一个参数是模型名称(可以包括基础模型类和数据库),第二个参数用于设置数据表的前缀(留空则取当前项目配置的表前缀),第三个参数用于设置当前使用的数据库连接信息(留空则取当前项目配置的数据库连接信息),例如:$User&=&M('db2.User','think_');表示实例化Model模型类,并操作db2数据库中的think_user表。
如果第二个参数留空或者不传,表示使用当前项目配置中的数据表前缀,如果操作的数据表没有表前缀,那么可以使用:$User&=&M('db1.User',null);表示实例化Model模型类,并操作db1数据库中的user表。
如果你操作的数据库需要不同的用户账号,可以传入数据库的连接信息,例如:$User&=&M('User','think_','mysql://user_a:1234@localhost:3306/thinkphp');表示基础模型类用Model,然后对think_user表进行操作,用user_a账号进行数据库连接,操作数据库是thinkphp。
第三个连接信息参数可以使用DSN配置或者数组配置,甚至可以支持配置参数。
例如,在项目配置文件中配置了:'DB_CONFIG'=&'mysql://user_a:1234@localhost:3306/thinkphp';则可以使用:$User&=&M('User','think_','DB_CONFIG');
基础模型类和数据库可以一起使用,例如:$User&=&M('CommonModel:db2.User','think_');如果要实例化分层模型的话,利用公共模型类的方式,我们可以使用:M('UserLogic:User');来实例化UserLogic,虽然这样做的意义不大,因为可以用D('User','Logic');实现同样的功能。
积分:7023
ThinkPHP 是一个免费开源的,快速、简单的面向对象的 轻量级PHP开发框架 ,创立于2006年初,遵循Apache2开源协议发布,是为了敏捷WEB应用开发和简化企业应用开发而诞生的。ThinkPHP从诞生以来一直秉承简洁实用的设计原则,在保持出色的性能和至简的代码的同时,也注重易用性。并且拥有众多的原创功能和特性,在社区团队的积极参与下,在易用性、扩展性和性能方面不断优化和改进,已经成长为国内最领先和最具影响力的WEB应用开发框架,众多的典型案例确保可以稳定用于商业以及门户级的开发。关于本博客
纯粹研究PHP相关技术的一个博客,欢迎大家交流。
博主QQ: 友情链接、技术交流联系此Q
当前位置: >>
最近涉及到的项目中用到了hp,我都N年没有碰过这玩意了。但现在还是用一用。正好那些能够得到的wxms也可以用这个来一下其实我就一台。装逼而已 于是转一下别人的文章,因为他其中特别写了一句:只要是就一定从主库走,query一定从从库走。所以query中不要有实际的和插入。以防万一 原文地址: 前言: Thinkphp 本身是支持读写分离的,如何做呢? 最简单的做法是在中修改:& 'DB_TYPE'=& '', 'DB_DEPLOY_TYPE' =& ,& //开打支持多服务器 'DB_RW_SEPARATE'=&true, //读写&strong&分离&/strong&分开 'DB_HOST'=& '192.168.100.78,192.168.100.60', // 库服务器地址 master(写)/slave(读) 'DB_NAME'=&'test', 'DB_USER'=&'root', 'DB_PWD'=&'root', 'DB_PREFIX' =& 'fav_', 默认第一台78是主数据库,负责写入操作,第二台60负责读操作,Thinkphp 会自动读和写,然后分配对应的数据库,来达到读写分离的。 事项: 1. 要设置,暂时不支持DB_DSN配置。 2.如果你当前采用了分布式数据库,并且设置了读写分离的话,query始终是在读服务器,因此query方法对应的都是读操作,而不管你的是什么。 3.如果你当前采用了分布式数据库,并且设置了读写分离的话,execute方法始终是在写服务器执行,因此execute方法对应的都是写操作,而不管你的SQL语句是什么。 因此,&DB_DSN'=& 'my:host=192.168.100.60;dbname=51fanli_cang', 这种方式不支持主从分离,需要改。 当采用原生态的sql语句进行写入操作的时候,要用execute,读操作要用query,切记,否则乱掉了。&
文章如需转载请注明:转载自 本文链接地址:
发布:sccscc | 分类: | 评论:0 | 引用:0 | 浏览:
&&( 22:21:46)&&( 22:34:5)&&( 22:37:13)&&( 22:33:58)&&( 22:30:12)&&( 21:31:12)&&( 22:9:51)&&( 22:7:25)&&( 21:59:47)&&( 21:57:5)
正文(*)(留言最长字数:2000)
记住我,下次回复时不用重新输入个人信息
◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。
随机推荐文章关于本博客
纯粹研究PHP相关技术的一个博客,欢迎大家交流。
博主QQ: 友情链接、技术交流联系此Q
当前位置: >>
[ad ode= align=center] $data[1]['name'] = &阳光雨& $data[1]['e'] = $User&addAll($data)&sccscc@& $['phone'] = && $-&assign($array)&Xp@User:edit&) //
Xp 主题的 User 的 edit $this-&(&../Member/read.html&) // 直接指定模版的全名} //输出 Session {&var} //输出 {%var} //输出语言变量 {*var} //输出常量 {^var} //输出
变量 {.var} //输出 GET 变量 Think中的BUG及与策略: 1. If 如: 试验后总是有想不到的, 这样,还不如直接用来得快些呢. 2. 中不能使用的标签 {$content} {$i} 约定: 1.库名全部采用小写, 2.模型的名以Model为后缀,类名第字母须大写 3.的类名以Action为后缀 4.所有类库文件必须使用.class.php作为文件后缀,并且类名和文件名保持一致 如: 数据表名: 前缀_表名 模型类名: 表名Model 注:这里的表名第一个字母要大写 创建: D(&表名&) 注:这里的表名第一个字母要大写 定义控制器类 class IndexAction ends Action{ public
show(){ echo &这是新的 show 操作&; } } 然后在里面 类: class 表名Model extends Model{ [//手动定义字段[可选] protected $fields = array( &&, &username&, &email&, &age&, &_pk&=&&id&, //主键 &_autoInc&=&true //是否自增 ) ] } 记录的修改: $User = D(&User&) // 化 User 对象 $User-&find(1) // 查找 id 为 1 的记录 $User-&name = &ThinkPHP& // 把查找到的记录的名称字段修改为 ThinkPHP $User-&save() // 保存修改的数据 特定字段的值 $User-&setField(&name&,'TopThink&,'id=1&) 同样可以支持对字段的操作 $User-&setField(&score&,'(score+1)&,'id=1&) 新建记录,1: $User = new UserModel() //实例化 User 对象 $User-&字段名 = 字段值 //给字段赋值 $User-&add() //添加记录 新建记录,方法2: $data['字段名'] = 字段值; //给字段赋值 $User = D(&User&); //实例化 User 对象 $User-&add($data); //$insertId,Add 方法的返回值就是最新插入的主键值,可以直接。 新增记录: $User = new UserModel() $data[0]['name'] = &ThinkPHP& $data[0]['email'] = 记录 $User-&DbFields() //数据字段 $User-&findAll(); //查找所有记录 $User-&findAll(&1,3,8&) //查询主键为1,3,8的记录集 $User-&count() // 获取记录数 $User-&max(&score&) // 获取的最大积分 $User-&min(&score&,&score&0&) // 获取积分大于 0 的用户的最小积分 $User-&avg(&字段名&) // 获取所有记录的字段值的平均值 $User-&sum(&字段名&) // 字段值 $User-&getN(2,&score&80&,&score desc&) // 返回符合条件的第 2 条记录 $User-&getN(2,&score&80&,&score desc&) //还可以获取最后第二条记录 $User-&first(&score&80&,&score desc&) //要查询第一条记录,还可以使用 $User-&last(&score&80&,&score desc&) // 获取 $User-&top(5,&,&score desc&) // 获取积分最高的前 5 条记录 $User-&getBy(&name&,'liu21st&) //跟据字段的字段值来查询记录 删除记录 $User-&find(2) $User-&dee() // 删除查找到的记录 $User-&delete(&5,6&) // 删除主键为 5、6 的数据 $User-&deleteAll() // 删除查询出来的所有数据 $Model = new Model() // 实例化一个
对象 没有对应任何数据表 $Model-&query(& * from think_user
status=1&P) $objrs = $Model-&query(&select * from think_user where status=1&P) //自定义查询 $Model-&ute(& think_user set name=&thinkPHP& where status=1&P) //用于更新和写入数据的
操作,返回的记录数 $User-&Trans() // 事务 $User-&commit() // 事务 $User-&rollback() // 事务回滚 模板: $this-&assign(&name&,$value); //在 Action 类里面使用 assign 方法对模板变量赋值,无论何种变量类型都统一使用 assign 赋值 $this-&display() // 输出模版文件 批量赋值 $array['name'] = &hp& $array['email'] = $this-&display() // 调用 User 模块的 read 操作模版 $this-&display(&edit&) // 调用 User 模块的 edit 操作模版 $this-&display(&Member:read&) // 调用 Member 模块的 read 操作模版 $this-&display( 模板标签: { } 或 {//
} // {$user['name']} //输出变量 {$user:name} //输出对象的 为了方便模板定义,无论输出的模板变量是数组还是对象,都可以用下列统一输出: {$user.name} 如果是或者多层对象属性的输出,请使用下面的定义方式: {$user['sub']['name']} {$user:sub:name} 使用: 格式:{$varname|function1|function2=arg1,arg2,### } : { 和 $ 之间不能有空格,后面参数的空格就没有 ###表示模板变量本身的参数位置 常量 {$Think.const.__FILE__ } {$Think.const.MODULE_NAME } 系统变量 {$Think.server.script_name } //取得$_ 变量 {$Think.session.session_id|md5 } // 获取$_ 变量 {$Think.get.pageNumber } //获取$_GET 变量 {$Think..name } //获取$_COOK 变量 特殊变量 ,由 ThinkPHP 系统定义的常量 {$Think.version } //版本 {$Think.now } //现在 快捷输出 {:function(&)} //方法并输出返回值 {~function} //执行方法不输出 包含外部文件 // 用变量控制要的模版 // 使用一个完整的文件名包含 循环输出 iterate 还有其它的别名,包括 volist,resultset,sublist 模版定义: {$vo.name} name 和 id 表示的 // 输出 list 的第 5~15 条记录 {$vo.name} 模版赋值: $User = D(&User&) $list = $User-&findAll() $this-&assign(&list&,$list) // 输出偶数记录 {$vo.name} //子循环输出 {$sub.name} // 输出 key {$k}.{$vo.name} Switch 标签 value1 value2 default 其中 name 属性可以使用函数以及系统变量,例如: admin default 也可以对 case 的 value 属性使用变量,例如: admin member default 标签 value // name 变量的值等于 value 就输出 value // name 变量的值不等于 value 就输出 value // name 变量的值小于 5 就输出 value // name 变量的值小于等于 5 就输出 value // name 变量的值大于 5 就输出 value // name 变量的值大于等于 5 就输出 //其实上面的所有标签都是 compare 标签的别名 // 其中 type 属性的值就是上面列出的标签名称 value // name 变量的值等于 5 就输出 If标签 value1 value2 value3 A操作 创建Action对象: $action = A(&User&); 等效于 $action = new UserAction(); C操作 操作(动态)配置: 主要用于Action方法里面 获取: C(&配置参数&) 设置: C(&配置参数&,新值) D操作 快速创建模型数据对象: $model = D(&User&); 等效于 $model = new UserModel(); F操作 快速文件数据保存方法 与S操作一样 L操作 快速操作语言变量 获取: L(&语言变量&); 设置: L(&语言变量&,'值&); 如: L(&USER_INFO&,'用户信息&); //设置名称为USER_INFO的语言变量 批量赋值: $arr['语言变量1'] = &值1&; $arr['语言变量2'] = &值2&; L($arr); S操作 快速操作方法 获取: S(&name&) 设置: S(&name&,'value&); 删除: S(&name&,NULL); Create PROCEDURE procedure1 (IN parameter1 INTEGER) BEGIN DECLARE 1 CR(10); IF parameter1 = 17 THEN SET variable1 = &birds&; ELSE SET variable1 = &beasts&; END IF; Insert INTO 1 VALUES (variable1); END WEB_LOG_ERROR=0 // 类型 WEB_LOG_DEBUG=1 // 调试日志类型 SQL_LOG_DEBUG=2 // SQL 日志类型 SYSTEM_LOG=0 // 系统方式记录日志 MAIL_LOG=1 // 邮件方式记录日志 TCP_LOG=2 // TCP 方式记录日志 FILE_LOG=3 // 文件方式记录日志 DATA_TYPE_OBJ=1 // 对象方式返回 DATA_TYPE_ARRAY=0 // 数组方式返回 _COMMON=0 // 普通模式 URL URL_PATHINFO=1 // PATHINFO URL URL_REWRITE=2 // REWRITE URL HAS_ONE=1 // HAS_ONE 关联定义 BELONGS_TO=2 // BELONGS_TO 关联定义 HAS_MANY=3 // HAS_MANY 关联定义 MANY_TO_MANY=4 // MANY_TO_MANY 关联定义 EXISTS_TO_VAILIDATE = 0 // 存在字段则验证 MUST_TO_VALIDATE = 1 // 必须验证 VALUE_TO_VAILIDATE = 2 // 表单值不为空则验证 ThinkPHP THINK_PATH // ThinkPHP 系统 APP_PATH // 当前项目目录 APP_NAME // 当前项目名称 MODULE_NAME //当前模块名称 _NAME // 当前操作名称 TMPL_PATH // 项目模版目录 LIB_PATH // 项目类库目录 CACHE_PATH // 项目模版缓存目录 CONFIG_PATH //文件目录 LOG_PATH // 项目目录 LANG_PATH // 项目语言文件目录 TEMP_PATH //项目临时文件目录 PLUGIN_PATH // 项目文件目录 VENDOR_PATH // 第三方类库目录 DATA_PATH // 项目数据文件目录 IS_APACHE // 是否属于 IS_ //是否属于 IIS IS_WIN //是否属于 IS_LINUX //是否属于 Linux 环境 IS_FREEBSD //是否属于 FreeBsd 环境 NOW_TIME // 当前时间戳 MEMORY_LIMIT_ON // 是否有 MEMORY_LIMIT_ON // 是否有内存使用限制 OUTPUT_GZIP_ON // 是否开启输出 MAGIC_QUOTES_GPC // MAGIC_QUOTES_GPC THINK_VERSION //ThinkPHP 版本号 LANG_SET // 浏览器语言 TEMPLATE_NAME //当前模版名称 TEMPLATE_PATH //当前模版路径 __ROOT__ // 地址 __APP__ // 当前项目()地址 __URL__ // 当前模块地址 __ACTION__ // 当前操作地址 __SELF__ // 当前 URL 地址 TMPL_FILE_NAME //当前操作的默认模版名(含路径) WEB_PUBLIC_URL //网站公共目录 APP_PUBLIC_URL //项目公共模版目录
文章如需转载请注明:转载自 本文链接地址:
发布:sccscc | 分类: | 评论:0 | 引用:0 | 浏览:
&&( 23:19:49)&&( 6:59:14)
正文(*)(留言最长字数:2000)
记住我,下次回复时不用重新输入个人信息
◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。
随机推荐文章}