转义序列导致的XSS注入

问题示例代码


出现xss注入的视图页面部分代码:

<script>
window.onload = function () {
    var url = '<?php echo htmlspecialchars($_GET['url']); ?>';
    div = document.createElement('div');
    div.innerHTML = '<iframe src="' + url + '"></iframe>';
    document.body.appendChild(div);
}
</script>

Read more...

2016-11-04 xss

静态库与动态库

学习自:《程序员的自我修养》和Static, Shared Dynamic and Loadable Linux Libraries

在Linux下有两种类型的C/C++库:

静态库:以lib{name}.a命名,会被链接为可执行文件的一部分。

被动态链接的共享库(以下简称动态库):以lib{name}.so命名,可执行文件运行时才进行链接,称为动态链接。链接的方式有:

  • 动态链接器在可执行文件真正开始运行前,链接动态库;
  • 动态连接器在可执行文件运行过程中,链接动态库,又称为延迟绑定,是为了避免程序在启动时就链接了所有依赖的库,等到真正需要的时候才进行链接;
  • 可执行文件运行过程中,调用dlopen()系统调用链接动态库,又称为运行时装载,PHP的扩展就是通过该方式加载的。

Read more...

2016-10-04

C开发时遇到一些问题

1、局部变量的地址赋值给了全局变量指针,导致程序出现诡异的Segmentation fault,且是在MAC下,Linux下碰巧没遇到!。

排查问题:

当时发现全局变量*executor_globals.return_value_ptr_ptr的值在经过某个函数调用的时候发生了改变(至于怎么发现这点的忘了= =)。

如下图,在经过efree(client->cli)之后,*executor_globals.return_value_ptr_ptr的值从0x000000010a244318变为了0x000000010a244340


Read more...

2016-09-25

初识火焰图

本文学习自:白话火焰图

火焰图的分类


压测程序时,火焰图能够帮助我们直观地了解到程序的性能瓶颈。本文主要是记录下在生成火焰图的时候的一些注意事项。以下链接是对每个类别的火焰图的详细说明。

  1. On-CPU:CPU Flame Graphs
  2. Off-CPU:Off-CPU Flame Graphs
  3. Memory:Memory Leak (and Growth) Flame Graphs
  4. Hot/Cold:Hot/Cold Flame Graphs
  5. Differential:Differential Flame Graphs

关于火焰图的PPT(讲解得非常详细):Blazing Performance with Flame Graphs


Read more...

2016-09-24

Laravel 依赖注入的实现

依赖注入


网上已经有许多不错的文章介绍依赖注入了,维基百科-DI也有其详细的介绍。

翻译一段PHP-DI官网的解释

在没有使用依赖注入的框架代码中:

  • App需要Foo
  • App创建了Foo
  • App调用了Foo
    • Foo需要Bar
    • Foo创建Bar
    • Foo调用Bar
      • Bar需要Bim
      • Bar创建Bim
      • Bar调用Bim
        • Bim做某些事情
      • Bar做某些事情
    • Foo做某些事情

在实现了依赖注入的框架代码中:

  • App需要Foo,Foo需要Bar,Bar需要Bim
  • App创建Bim
  • App创建Bar,并提供Bim
  • App创建Foo,并提供Bar
  • App调用Foo
    • Foo调用Bar
      • Bar调用Bim
        • Bim做某些事情
      • Bar做某些事情
    • Foo做某些事情

App在这里就相当于一个IOC(Inversion of Control控制反转)容器,依赖注入是IOC最普遍的一种实现。App负责创建实例,调用方只需要告诉App需要哪个类的实例就可以了。


Read more...

2016-08-23 Laravel

PHP Composer类自动加载工作原理

composer.json


首先需要了解下Composer的配置文件,在composer.json中,与类加载相关的指令有:

  • require
  • require-dev(root-only)
  • autoload
  • autoload-dev(root-only)
  • include-path
  • target-dir

每个指令在The composer.json Schema中都有说明。

root-only指在我们正在开发的项目中定义了composer.json(里面声明了项目依赖的包等),那么这个项目就是一个根包。require-devautoload-dev只在根包起作用。

require定义了项目依赖的包,这些包会被安装到与composer.json同级的vendor目录下。例如我们的项目A->B、C,而B->D,那么A是根包,B、C、D都会被安装到vendor下。


Read more...

2016-07-20 composer

PHP扩展与Zend扩展区别

本文参考自PHP Wiki: Extensions

数据结构区别


通常在php.ini中,通过extension=*加载的扩展我们称为PHP扩展,通过zend_extension=*加载的扩展我们称为Zend扩展,但从源码的角度来讲,PHP扩展应该称为“模块”(源码中以module命名),而Zend扩展称为“扩展”(源码中以extension命名)。

两者最大的区别在于向引擎注册的钩子。少数的扩展,例如xdebug、opcache,既是PHP扩展,也是Zend扩展,但它们在php.ini中的加载方式得用zend_extension=*,具体原因下文会说明。


Read more...

2016-07-10 PHP扩展