phpthink 代码里的dsn写代码是什么意思思

关于本博客
纯粹研究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)
记住我,下次回复时不用重新输入个人信息
◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。
随机推荐文章}

我要回帖

更多关于 源代码是什么意思 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信