在1198的赋值操作中可以看到 table 是可控的,在1206行中进行赋值this->db->table(table) 的返回内容,我们注意到在1201行进行检测了this->db->table的所属类...可以看到,调用this->db->protectIdentifiers方法。 ? 其中代码逻辑贴在图中,我们继续往下审计即可。 ? 我们回到调用处,查看一下往下的逻辑。 ?...那么我们看一下2837行的this->db->query( 找到BaseConnection下的query方法,如图: ? 继续跟进initialize方法,如图: ?...可以从图中看到笔者的猜想是没错的。 那么我们回到BaseConnection的query方法,继续观察。 ? 可以看到调用了一个simpleQuery方法,我们跟进。 ?...只是我们编写POC时,redirect()->withInput() && old(‘a’); 这种方式,我们需要注意反序列化的结果一定是一个数组,为了POC的通用性,笔者将该POC生成的返回结果为数组
url中的参数$this->uri 文件在system/core/URI.php 如:url为 localhost/CodeIgniter/index.php/index/home echo $this...->uri->segment(1); 输出为:index 还可以这样 url为:http://localhost/CodeIgniter/index.php/index/home/1 public function...query_builder = TRUE; // 这个数组可以有多个,不同数据库填写不同数组名称 $db[‘default’] = array( ); $db[‘hello’] = array( ); 从数据库中获取数据...$sql = "select id,title from article limit 10" ; // 2.执行sql $obj = $this ->db...->query( $sql ); // 3.获取结果集 $data = $obj ->result(); echo "" ; var_dump
结果被领导发现了,喝令他rm所有源码。在领导的淫威下,时雨也只好删除了所有源码。 但聪明的小朋友们,你能找到时雨君的源码并发现其中的漏洞么? 可得知获取源码的方式和git有关。...那么怎么从泄露的.git目录反提取出1.0的源码? 这道题有“原理法”和“工具法”。当然先从原理讲起。...这一步需要深入Codeigniter核心框架。...php protected function query_log($value, $key="ip") { $user_table = $this->db->dbprefix("...admin"); $log_table = $this->db->dbprefix("adminlog"); switch($key) { case
github项目中的Slog.php到libraries目录 common_helper.php全局函数中添加代码 /** * CI框架 socketLog 远程调试 * * 使用: * slog($this...->db->last_query()); * * chrome安装相关插件之后控制台就能看到相关数据 * * @URL https://github.com/luofei614/SocketLog...此项功能需要有服务器提供websocket服务,为了避免不必要的折腾,TP也提供了公共服务:http://slog.thinkphp.cn 打开之后获取socketLog帐号的client_id,粘贴到上一步的配置参数加载中
\CodeIgniter进行初始化并返回 调用CodeIgniter\CodeIgniter->run()执行主流程并返回响应结果 入口文件 - public\index.php 检测 PHP...CodeIgniter\HTTP\Request对象 获取CodeIgniter\HTTP\Response对象 检测安全访问(Https) 检测Request魔术方法($_POST['_method'...$this->handleRequest($routes, $cacheConfig, $returnResponse);处理请求 - CI->handleRequest() 解析当前请求路由并获取过滤器...CodeIgniter\HTTP\Request对象 获取CodeIgniter\HTTP\Response对象 检测安全访问(Https) 检测Request魔术方法($_POST['_method'...]) 执行pre_system事件触发器 实例化Config\Cache,根据当前URI检测缓存,存在则直接输出响应结果 调用CI->handleRequest()处理请求,详细解析见下文 $this
从传统守旧派的 PHP 代码到更复杂先进的架构,本章将跟随这些历史来对 PHP 圈子内每个相关的架构风格做一些介绍。...这得益于像 Symfony, Zend Framework 和 CodeIgniter这些的流行框架。 模型-视图-控制器 模型-视图-控制器模式将应用划分为三个主要层次,要点描述如下: 1....为了达到这一点,所有层次都必须从我们这些原始的混乱代码中识别出来。...->db->beginTransaction(); try { $stm = $this->db->prepare( 'INSERT INTO...->db->commit(); } catch (Exception $e) { $this->db->rollback(); throw new
但今天我要讲的不是业务操作日志,因为不同项目的业务不尽相同,所以它无法做成通用模块,而我要讲的,就是普通操作日志。 上面解释了一大段,下面干货就要亮相了,先洗把脸清醒下。 ...,操作后获取操作后数据 delete 在delete前执行 顺序清楚后,就来看下我写的一份日志操作类吧,第一版随便写写的,重复代码有点多,还未来得及优化。...]; } //查询所有字段信息,插入日志从表 $rs = $db->select(0, 1, $tbname, '*', 'and tbid = '....]; } //查询所有字段信息,插入日志从表 $rs = $db->select(0, 1, $tbname, '*', 'and tbid = '....下面就看下成品吧 最后把表结构分享下,一共2张表,一张主表一张从表,主表记录操作表及操作人等信息,从表记录操作的表字段信息。
例如,如果你有一个下面这个方法: protected function utility() { // some code } 使用下面的 URL 尝试访问它,你会发现是无法访问的: example.com...$this->request->isSecure()) { $this->forceHTTPS(); } 默认情况下,在支持 HTTP 严格传输安全报头的现代浏览器中,此调用应强制浏览器将非...$this->request->isSecure()) { $this->forceHTTPS(31536000); // one year } 注解 你可以使用更多全局变量和函数...你可以通过 $this->request 这个用法获取 POST 数据。 Validation Library docs 是有关规则和消息数组的格式以及可用规则的详细信息。...$this->validate('userRules')) { return view('users/update', [ 'errors' => $this
->initParam($param); $this->initConnect(); } private function __clone() { } //获取单例 public static...' => 'root', 'dbname' => 'data' ); //获取单例 $db=MySQLDB::getInstance($param); //更新 //$db->exec("update...$db->getLastInsertId(); 2、查询结果 db->getLastInsertId(); */ //查询 //$list=$db->fetchAll('select * from news','aa'); //$list=$db->fetchRow...'; var_dump($list); 小结: 1、instanceof 用来判断对象是否属于某个类 2、参数必须从外部传递到内部,不能写死到类的内部。
问题 代理在我们生活中无处不在,比如说:我们超时买的怡宝矿泉水,都零售商从地区代理商那批发来的,我们程序员也经常为了翻过一堵墙用谷歌查找资料使用代理等。...代理将自己伪装成数据库对象,可在客户端或实际数据库对象不知情的情况下处理延迟初始化和缓存查询结果的工作。 这样如果需要在类的主要业务逻辑前后执行一些工作,无需修改类就能完成这项工作。...function get() { // todo 做我代理想做的事 return $this->db->get(); } public function...set() { return $this->db->set(); } public function delete() { return...$this->db->delete(); } } 客户端使用 $db = new Proxy(); // 获取数据 echo $db->get() .
} // 执行预处理语句 $stmt->execute(); // 获取查询结果...->add('test_table', $insertData); // 结果 if ($insertSQL) { // 成功 echo...$db->errorMsg(); }?>update示例db->errorMsg(); }?>delete示例delete('test_table', $where); // 结果 if ($deleteSQL) { // 成功 echo '删除成功
问题 代理在我们生活中无处不在,比如说:我们超时买的怡宝矿泉水,都是零售商从地区代理商那批发来的,我们程序员也经常为了翻过一堵墙用谷歌查找资料使用代理等。...代理将自己伪装成数据库对象,可在客户端或实际数据库对象不知情的情况下处理延迟初始化和缓存查询结果的工作。 这样如果需要在类的主要业务逻辑前后执行一些工作,无需修改类就能完成这项工作。...function get() { // todo 做我代理想做的事 return $this->db->get(); } public function...set() { return $this->db->set(); } public function delete() { return...$this->db->delete(); } } PHP Copy 客户端使用 $db = new Proxy(); // 获取数据 echo $db->get() .
经过 就在上个月愚人节这天,typecho突然宣布更新1.2.0了,我还以为这是官方的愚人节玩笑,结果真的更新了,果断升级!...打开查看报错的文件, 找到问题所在 $post[0]['thumb'] = $this->db->fetchAll($this->db->select('str_value')->from('table.fields...$this->db->fetchAll($this->db->select('str_value')->from('table.fields')->where('cid = ?'...修复问题 最后我们用'来包裹它 $post[0]['thumb'] = $this->db->fetchAll($this->db->select('str_value')->from('table.fields...$this->db->fetchAll($this->db->select('str_value')->from('table.fields')->where('cid = ?'
我们通过仔细调查发现了以下细节: - 六个月前Web应用程序遭到入侵,修改了几个服务器脚本以在将数据插入数据库之前加密数据,并在从数据库获取数据后进行解密,这相当于对Web应用程序用户打了个不可见的“动态...- 在第X天,黑客从远程服务器上删除了密钥。数据库变得无法使用,网站停止服务,黑客要求获得加密密钥的赎金。 我们确信这是针对具体公司的复杂APT的个别例子,但是上周我们遇到了另一个类似案例。...修改了以下文件: 1.文件“ factory.php ”的“sql_fetchrow()”函数被修改为SQL查询结果“$ result = $ this-> get_driver() - > sql_fetchrow...; 攻击者等待了2个月,然后从远程服务器上删除了密钥。之后因为我们因为FTP密码泄露发现phpBB被损坏了。...- 几乎不可能在没有支付赎金的情况下从攻击中恢复,许多受害者不得不向黑客支付费用。 - 托管公司尚未准备好应对这一新挑战,可能无法帮助他们的客户。
$this->config->set_item(‘item_name’, ‘item_value’); //这里仅仅更改了当前获取的元素而不会更改配置当中的 不同环境加载不同配置文件 比如当前是...://codeigniter.org.cn/user_guide/libraries/pagination.html 7.XSS过滤 $data = $this->security->xss_clean...->load->library(‘session); 获取一项$this->session->userdata(‘item’); 添加session信息 $this->session->set_userdata...$this->session->unset_userdata(‘item_name’); 将session保存在数据库中可以参考http://codeigniter.org.cn/user_guide...注意: 如果你创建在应用程序内部的链接没有包含基本URL(http://…),这个参数会从你配置文件信息中自动加载。 只需要写上你的 URL 分段即可。
$sqlset = $this->_doset($set); //处理条件语句 $sqlwhere = $this->_dowhere($where);...return $this->sql_update("update `".dbpre."...->query($sql) == true) { $result = $this->affected_rows();//affected_rows()是获取insert/update.../delete结果集条数。...true : $result; } return 0; } 此时我们从product_id传上的数据会被直接拼接在语句中执行。
每次执行操作都会从cache数组中获取下连接,多次执行不超过10秒的情况下,只会有一个连接 代码中实现读写分离,判断sql语句前面6个字符是select的就查询从库,其余操作查询主库.主库和从库就是分别在配置数组中...mysql:host=127.0.0.1;port=3306;dbname=surframe",//主库 "mysql:host=127.0.0.2;port=3306;dbname=surframe"//从库...taoshihan1', ); $config->timeout=10; $config->charset="utf8"; $db=SinaPdoAdapter::getInstance($config); $db...->execute("select * from admin_users");//使用的从库 $rows=$db->fetchAll(); var_dump($db); $db=SinaPdoAdapter...::getInstance($config); $db->execute("select * from admin_users");//使用的从库 $rows=$db->fetchAll(); var_dump
大家是否会选择用数据库的查询方式来获取树结构呢?...//曾经的数据库查询获取方式res = this->db->query(“select * from menu where pid = 0”);foreach(res as k=>v){ res[k][...‘child’] = this->db->query(“select * from menu where pid =”. v){ } //获得结果 $res; 注意:不得不说,这种方式的确可行,但是它的缺点在于...public function getMenus(){ //查询 res = this->db->get(‘menu’)->result_array(); res = this->getChild(...意味着,数据库写多少层级,该算法,都可以获取出来 结果:Array( [0] => Array ( [id] => 1 [title] => PHP中文网 [pid] => 0 [sort] => 0
但是反序列化需要包含类原先定义的代码,否则还原后无法执行对象所属类的方法。 作用:将对象序列化,以便于将对象以字符串的形式存储在文件或数据库中。...PHP不同于java,构造函数无法被重写。 构造函数通常用于实例化类时对类的属性进行赋值,还有进行数据库连接等操作。具体用法在上面水果类的定义中已经提到。...2、__get与__set 当要对一个类定义的private属性进行获取或者赋值的操作时,如果没有在类中定义__get、__set,PHP会爆出Fatal错误。...结果如下: ? PHP源码如下: '; } echo '带查询条件' ; $result =$db->get_mytable_by_name_status('a', 1); /
PDO($this->Config['dsn'], $this->Config['name'], $this->Config['password']); $this->pdo->query('set...names utf8;'); //把结果序列化成stdClass //$this->pdo->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_OBJ...->update(1, 0, 'tb_member', $set, $where); ③ 可自定义sql语句 有时候,sql过于复杂,导致无法使用类里提供的方法去组装sql语句,这时候就需要一个功能...现在,这功能也有了 $db->query('select username, password from tb_member'); $rs = $db->fetchAll(); 是不是很像pdo原生态的写法...from tb_member'); $rs = $db->fetchAll(); var_dump($rs); $db->close();