分类 - 程序

2018-07-02 17:27:19    383    0    0

首先随便注册个账号进入到手记栏目, 也就是文章区

点击右侧的写文章

点击插入图片

关键来了:

title

图片描述这里, 是直接写入img标签的title字段的!

这里我们可以尝试拼接onload来触发js

title

而且最最傻逼的一点, SESSIONID 不是httpOnly

title

随便发布一篇文章, 等待管理员审核

成功拿到管理员账号

title

更为讽刺的是, 该名管理员还在看XSS 安全视频...


2018年7月2日更新
不用尝试了, 已经反馈给官方, 已修复

2018-06-01 15:55:04    187    0    0

开新坑啦!

大概流程是

  • 自拍杆绑定到身后上方
  • 手机开启VR 直播模式
  • RTMP 协议推流到局域网服务器
  • VR 眼镜拉RTMP 流数据

待解决的几点

  • 延迟, 据说RTMP 协议延迟很大
  • VR 客户端拉RTMP流
  • 局域网流服务器迁移到手机上, 方便携带出门

最终要达到的效果

真人版吃鸡!

PHP Swoole    2017-12-04 10:12:53    344    0    0

公司里很多网站都是ThinkPHP框架

研究了下如何用Swoole 加载ThinkPHP框架

方向很明确 , onWorkerStart 里加载框架

onRequest 里调用每次请求入口

下面顺着文件一点点看吧


首先是入口文件 /public/index.php

  1. // 定义应用目录
  2. define('APP_PATH', __DIR__ . '/../application/');
  3. // 加载框架引导文件
  4. require __DIR__ . '/../thinkphp/start.php';

对我们有用的只有APP_PATH , 继续往下看/thinkphp/start.php

  1. namespace think;
  2. // ThinkPHP 引导文件
  3. // 加载基础文件
  4. require __DIR__ . '/base.php';
  5. // 执行应用
  6. App::run()->send();

这里就是我们需要的两个方面了 , 加载框架和请求入口

onWorkerStartrequire __DIR__ . '/base.php'
onRequestApp::run()->send()

好了 , 必要条件已经齐了 , 开始写吧

框架根目录下创建文件swooleServer.php(可以随意命名)

  1. <?php
  2. // 调试模式开关
  3. define("APP_DEBUG", true);
  4. // 定义应用目录
  5. define('APP_PATH', __DIR__ .'/application/');
  6. class server
  7. {
  8. private $serv;
  9. public function __construct(){
  10. $this->serv = new swoole_http_server("0.0.0.0", 9503);
  11. $this->serv->set([
  12. 'worker_num' => 2,
  13. 'dispatch_mode' => 2,
  14. ]);
  15. $this->serv->on('WorkerStart', array($this, '
2017-11-16 18:21:56    344    0    0

自己在前端的路上越走越远了.....


封装一下ajax

  1. var ajax = async (url, body, data = {}) => {
  2. let _data = {
  3. credentials : 'include',
  4. method: "POST",
  5. headers: {
  6. "Content-Type": "application/x-www-form-urlencoded"
  7. },
  8. body : '',
  9. },
  10. http_build_query = (obj) => {
  11. let param = [];
  12. for(let [k, v] of Object.entries(obj)){
  13. param.push(`${k}=${v}`);
  14. }
  15. return param.join('&');
  16. }
  17. Object.assign({}, _data, data);
  18. if (typeof(body) == 'object'){
  19. body = http_build_query(body);
  20. }
  21. _data.body += body;
  22. return (await fetch(url, _data)).text();
  23. }

代码里的_body_data 可以填写缺省值, 不需要的删掉也可以

以百度为例
同步ajax 可以这样写

  1. a = 3;
  2. while(a--){
  3. let result = await ajax('/', {
  4. path:"vega/GET/mtllist/idea"
  5. });
  6. console.log(result);
  7. }

title

result 就是返回值

异步的更简单

  1. a = 3;
  2. while(a--){
  3. ajax('/', {
  4. path:"vega/GET/mtllist/idea"
  5. }).then((result) => {
  6. conso
2017-09-15 15:40:19    246    0    0

也就是[1, 2, 3, 4, 5, 6, 7], [1, 2, 3, 4, 5, 6, 8]...这样子

不重复的7位数组, 那么和原数组的差集也是不重复的3位数组

需求可以简化为

1-10中输出全部不重复3位数组,取差集

也就是求[1, 2, 3], [1, 2, 4]...全部3位数组

思路很简单,每次遍历只需要输出比自身大的范围

比如k1 = 2 ,那么k2范围为3 - 10,k3k2 - 10

实现代码如下

  1. <?php
  2. $arr = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
  3. $onlyArray = new OnlyArray($arr);
  4. print_R($onlyArray->getAllOnlyArray());
  5. class OnlyArray
  6. {
  7. private $range = [];
  8. private $result = [];
  9. public function __construct($range, $layer = 3)
  10. {
  11. $this->range = $range;
  12. $this->layer = $layer;
  13. $this->tmp1 = $range;
  14. }
  15. //生成一个不重复数组
  16. public function getAllOnlyArray()
  17. {
  18. //逐渐缩小k1的范围
  19. // while($k1 = array_shift($this->tmp1)){
  20. // $this->tmp2 = $this->tmp1;
  21. // //逐渐缩小k2的范围
  22. // while($k2 = array_shift($this->tmp2)){
  23. // //遍历k3
  24. // foreach($this->tmp2 as $k3){
  25. // $this->result[] =array_diff($thi
2017-08-15 16:12:16    204    0    0

  1. <?php
  2. /**
  3. * Created by PhpStorm.
  4. * User: zhangyue
  5. * Date: 2017/4/11
  6. * Time: 下午9:32
  7. */
  8. //设计公共接口
  9. interface Visit
  10. {
  11. public function go();
  12. }
  13. //实现不同交通工具类
  14. class Leg implements Visit
  15. {
  16. public function go()
  17. {
  18. echo "walt to Tibet!!";
  19. }
  20. }
  21. class Car implements Visit
  22. {
  23. public function go()
  24. {
  25. echo "drive car to Tibet!!";
  26. }
  27. }
  28. class Train implements Visit
  29. {
  30. public function go()
  31. {
  32. echo "go to Tibet by train!!";
  33. }
  34. }
  35. //设计容器类,容器类装实例或提供实例的回调函数
  36. class Container
  37. {
  38. //用于装提供实例的回调函数,真正的容器还会装实例等其他内容
  39. //从而实现单例等高级功能
  40. protected $bindings = [];
  41. //绑定接口和生成相应实例的回调函数
  42. public function bind($abstract, $concrete = null, $shared = false)
  43. {
  44. if (!$concrete instanceof Closure) {
  45. //如果提供的参数不是回调函数,则产生默认的回调函数
  46. $concrete = $this->getClosure($abstract, $concrete);
  47. }
  48. $this->bindings[$abstract] = compact('concrete', 'shared');
  49. }
  50. //默认生成实例的回调函数
  51. protected function getClosure($abstract, $co
PHP    2017-08-15 16:08:40    158    0    0

  1. <?php
  2. /**
  3. * Created by PhpStorm.
  4. * User: zhangyue
  5. * Date: 2017/4/12
  6. * Time: 下午9:50
  7. *
  8. * 请求处理管道
  9. *
  10. */
  11. interface Middleware{
  12. public static function handle(Closure $next);
  13. }
  14. class VerifyCsrfToken implements Middleware {
  15. public static function handle(Closure $next)
  16. {
  17. echo "验证Csrf Token<br/>" . PHP_EOL;
  18. $next();
  19. }
  20. }
  21. class ShareErrorsFromSession implements Middleware {
  22. public static function handle(Closure $next)
  23. {
  24. echo "如果session中有'errors'变量,则共享它<br/>" . PHP_EOL;
  25. $next();
  26. }
  27. }
  28. class StartSession implements Middleware {
  29. public static function handle(Closure $next)
  30. {
  31. echo "开启session,获取数据<br/>" . PHP_EOL;
  32. $next();
  33. echo "保存数据,关闭session<br/>" . PHP_EOL;
  34. }
  35. }
  36. class AddQueuedCookiesToResponse implements Middleware {
  37. public static function handle(Closure $next)
  38. {
  39. $next();
  40. echo "添加下次请求需要的cookie<br/>" . PHP_EOL;
  41. }
  42. }
  43. class
2017-08-12 14:31:39    262    0    0

之前所说的微信内置浏览器会代理用户,用这个可以防止微信代理

原理很简单,微信只代理GET和4K以下的POST,那就把所有A标签改成POST,Form追加内容


  1. window.onload = function(){
  2. var doc = document
  3. ,wxframe = {
  4. createForm : function(){
  5. this.form = doc.createElement('form')
  6. ,this.additional = doc.createElement('input');
  7. var weight = ' '
  8. ,i = 3
  9. ,input = this.additional
  10. input.type = 'hidden';
  11. input.name = ' ';
  12. while(i--){
  13. weight = weight.replace(/./g, function(a,b){
  14. return ' ';
  15. });
  16. }
  17. input.value = weight;
  18. this.form.method = 'POST';
  19. }
  20. ,each : function(array, method){
  21. var i = array.length
  22. while(i--){
  23. method(array[i]);
  24. }
  25. }
  26. ,init : function(){
  27. this.createForm();
  28. wxframe.each(doc.byTagName('form'), function(the
JS    2017-08-09 14:32:09    141    0    0

前几天同事问我一个JS问题

代码太长,抽象一下类似于:

  1. var obj = {
  2. name : 1,
  3. init : function(){
  4. this.name = 2;
  5. console.log(this.name);
  6. window.addEventListener('click', this.getName);
  7. },
  8. getName : function(){
  9. console.log(this.name);
  10. }
  11. }
  12. obj.init();

click的时候this.name没值,这是为啥

嗯,正好前段时间看过关于JS的this关键字的详解

给她改写了一下:

  1. var obj = {
  2. name : 1,
  3. init : function(){
  4. this.name = 2;
  5. console.log(this.name);
  6. window.addEventListener('click', this.getName(this));
  7. },
  8. getName : function(obj){
  9. return function(){
  10. console.log(obj.name);
  11. }
  12. }
  13. }
  14. obj.init();

原理其实很简单,JS的this始终指向调用它的对象

比如window.addEventListener('click', function(){this})

这里的functionwindow.click触发,那么this指向了window

而window里没有name

并不会因为在obj里绑定监听而指向obj

而改写后的代码,闭包封装了obj,然后window.click调用obj.name,从而达到目的

然而最后同事选择了别的解决办法:

  1. obj_name = 1;
  2. var obj = {
  3. //name : 1,
  4. init : function(){
  5. obj_name = 2;
  6. conso
Android Cordova APP    2017-07-24 10:21:41    167    0    0

朋友有一个全景网站

想把每个用户的全景封装成一个个App

以前没接触过App开发,听说Html封装App已经相当成熟了

那就百度着上手完成这个任务吧...

初期走了一些弯路,这里跳过不讲了:基于DCloud封装的App使用的WebView跟随系统内核,而我手机系统内核不支持WebGL...为了解决兼容问题(没钱换手机),开发环境决定采用Cordova+CrossWalk

环境部署

百度了下,发现这篇文章讲解的简单易懂,跟着做就可以,这里说一下文章里遗留的坑

环境

  1. //修改环境变量~/.bashrc
  2. #AndroidDev PATH
  3. export PATH=${PATH}:/usr/local/android-sdk-linux/tools
  4. export PATH=${PATH}:/usr/local/android-sdk-linux/platform-tools
  5. #Gradle PATH
  6. export GRADLE_HOME=/usr/local/gradle-2.7
  7. export PATH=$PATH:$GRADLE_HOME/bin

以上

注意Android SDK安装的时候选自己需要的,不要全装,太浪费时间.

可能会出现的问题

cordova build android 的时候,可能需要的Gradle和你安装的版本不一致,需要翻墙更新.

  • Gradle 不存在
    title

Gradle加入环境变量即可

  • 找不到MainActivity.java

src/包名/MainActivity.java

  • activity_main为空

res/layout下建完activity_main.xml即可

  • Android SDK 未授权

链接标题

  • CrossWalk不生效

有可能手机GPU在CrossWalk黑名单里,如果是的话,需要强制运行CrossWalk
项目/platforms/android/assets下新建文件xwalk-comman