Yii 实现了两种模型:表单模型(CFormModel 类)和 Active Record 模型(CActiveRecord 类)。他们都继承自同一个基类 CModel。 在 Yii 中,每一个 AR 对象的实例可以是 CActiveRecord 类或它的子类,它包装了数据库表或视图中的一行记录,并封装了所有逻辑和访问数据库的细节,如果有大部份的业务逻辑,则必须使用这种模型
compare、addBetweenCondition、addInCondition 小结:addSearchCondition 不存在SQL注入风险,addCondition 存在SQL注入风险 0x02 CActiveRecord ->save 方法的安全性分析 在对公司内部代码进行安全审计的时候发现很多处都是直接调用CActiveRecord->save() 对于前端传来的数据进行保存或更新,但未对传来的数据进行任何过滤,最开始很好奇 (insert 型 or update型),使用SQLMAP一顿狂注之后无果,没有注入,更加好奇了,于是开始分析其源码,探究为啥这样没有SQL注入风险,以下是分析过程: CActiveRecord 中save
// AR最典型的功能就是执行CRUD操作 // DAO定位于解决复杂的数据库查询,而AR定位于解决简单的数据库查询 // 一个AR类代表一张数据表,而一个AR对象代表表中的一行真实的记录,AR类继承CActiveRecord // 如果有一张POST表`tbl_post`,你可以这样定义一个AR类 class Post extends CACtiveRecord { public static function model 使用如下方法: if( CActiveRecord::isNewRecord ) // update the rows matching the specified condition Post::model )->findAll(); // 返回的将会是所有发过帖子(且帖子已经公开)的用户 // 在relatinos()中定义更加复杂的关系 class User extends CActiveRecord user->posts(array('condition'=>'status=1')); // 返回的都是AR对象, 而不是数据 // 统计查询 class Post extends CActiveRecord
把字符串分解成数组,并去掉空值 复制代码 代码如下: preg_split('/s*,s*/','this , is , , a test',-1,PREG_SPLIT_NO_EMPTY ) CActiveRecord ctype_开始的几个函数,用于检查字任串是不是符合要求,代替了简单的正则表达式 CController中的setPageState可以保存同一页中的POST的表单状态 如何通过BEhavior修改CActiveRecord Compents(JTool中)定义的,即JTool中的onChange 处理方法同由Behavior(JBe中)类定义的,即JBe中的change 这样子再看CActiveRecordBehavior,其是绑定给CActiveRecord 中的onBeforeSave这个事件对应的处理函数是CActiveRecordBehavior中的beforeSave方法 这样子CActiveRecord在调用save()时,触发事件onBeforeSave ,调用CActiveRecordBehavior对应的处理函数beforeSave 我们只要写一个CActiveRecordBehavior的子类,重写其中的beforeSave,执行一些操作,然后给CActiveRecord