Nginx下配置虚拟目录并支持PHP

Nginx虚拟目录支持PHP也是花了不少时间查找资料研究摸索,最终用下面两段解决。下面不是一段完整的Nginx配置文件,对于该配置片段简单解释如下:

1. 该文件配置一个主机www.mydomain.com在/data/Service下
2. 将一个在/data/Forum下的论坛程序挂在www.mydomain.com/Forum下,这里我用的是phpBB3
3. 将一个在/data/Mantis下的Bug跟踪管理程序MaintisBT挂在www.mydomain.com/Mantis下

phpBB3和MantisBT分别是两个独立的PHP程序。

对于Nginx虚拟目录支持分两段:

1. 第一段用alias解决虚拟目录问题,使用rewrite处理访问重定向,并传递用于fastcgi的正确的脚本位置
2. 第二段用于处理所有的非PHP文件在虚拟目录中的访问,没有第二段,访问非PHP文件就是出现404

发表在 应用工具软件, 操作系统相关 | 标签为 , | 留下评论

使用PHP的反射Reflection获取对象信息

PHP5添加了一项新的功能:Reflection。这个功能使得程序员可以reverse-engineer class, interface,function,method and extension。通过PHP代码,就可以得到某object的所有信息,并且可以和它交互。

假设有一个类Person:

通过ReflectionClass,我们可以得到Person类的以下信息:

  • 常量 Contants
  • 属性 Property Names
  • 方法 Method Names
  • 静态属性 Static Properties
  • 命名空间 Namespace
  • Person类是否为final或者abstract

只要把类名”Person”传递给ReflectionClass就可以了:

获取属性(Properties):

默认情况下,ReflectionClass会获取到所有的属性,private 和 protected的也可以。如果只想获取到private属性,就要额外传个参数:

可用参数列表:

  • ReflectionProperty::IS_STATIC
  • ReflectionProperty::IS_PUBLIC
  • ReflectionProperty::IS_PROTECTED
  • ReflectionProperty::IS_PRIVATE

如果要同时获取public 和private 属性,就这样写:ReflectionProperty::IS_PUBLIC | ReflectionProperty::IS_PROTECTED

应该不会感觉陌生吧。

通过$property->getName()可以得到属性名,通过getDocComment可以得到写给property的注释。

有点不可思议了吧。竟然连注释都可以取到。

获取方法(methods):通过getMethods() 来获取到类的所有methods。返回的是ReflectionMethod对象的数组。不再演示。

最后通过ReflectionMethod来调用类里面的method。

有点意思。

发表在 BS架构后台语言 | 标签为 , , , | 留下评论

PHP反射类ReflectionClass和ReflectionObject的使用方法

PHP反射类ReflectionClass和ReflectionObject是PHP中的扩展反射类,该扩展用来分析php程序,导出或提取出关于类、方法、属性、参数等的详细信息,包括注释。
看一个这样的问题,php类的成员变量没有在类中声明,而是在函数中声明,有什么不同?
 

在这个test类中,声明了两个成员变量$name和$sex,但是在构造函数中,又声明了一个变量$aaa,初始化类,使用反射类打印默认成员属性只有声明的两个成员变量属性,但是打印类的$aaa变量发现还是可以输出结果。
请问类的成员变量不用声明,在函数中声明也是可以的吗,有什么区别?
在你这个例子中,使用ReflectionClass是不恰当的,因为__construct只有在实例化class时,才会执行。
也就是说ReflectionClass更多的是反射类声明时的结构,而不是类实例化后的结构,所以没有输出属性aaa是正确,因为属性aaa确实是(在类声明时)不存在的。
那么怎么看属性aaa呢,应该用ReflectionObject反射实例化后的结构,例如
 

经过实例化以后,属性aaa才会存在,这时你就能看到属性aaa了
因为php是“动态”语言,所以可以类的成员变量不用声明,在函数中声明也是可以的。

发表在 BS架构后台语言 | 标签为 , , | 留下评论

C#设置本地网络(DNS、网关、子网掩码、IP)

如今网络在我们的生活工作中所起的作用越来越大,可以说离开了网络我们就无法正常的工作和生活。作为程序员我们写的程序大多数也会跟网络相关,而想要使用网络首先要将机器的网络配置设置好。而手动设置的方法显然很不可取,所以我们要让程序帮我们完成。下面是一个很常用的C#设置系统各种网络参数的一个小Demo一起看看吧。

这个Demo是通过”Win32_NetworkAdapterConfiguration”这个管理类.这里面已基本包括了IP,DNS,网关的设置信息。

在C#中使用WMI还是比较简单的:

好了,写好上面这个类以后,就等着哪里需要然后NEW一个就可以了。很简单吧,如果遇到设置失败的情况,可能是因为权限不够,请参考C#默认以管理员身份运行程序

发表在 CS架构后台语言 | 标签为 , , , | 留下评论

C#默认以管理员身份运行程序

在Vista 和 Windows 7 及更新版本的操作系统,增加了 UAC(用户账户控制) 的安全机制,如果 UAC 被打开,用户即使以管理员权限登录,其应用程序默认情况下也无法对系统目录、系统注册表等可能影响系统正常运行的设置进行写操作。这个机制大大增强了系统的安全性,但对应用程序开发者来说,我们不能强迫用户去关闭UAC,但有时我们开发的应用程序又需要以 Administrator 的方式运行,如何实现这样的功能呢?

下面演示 C# 程序如何实现提示用户以管理员权限运行。

本例以WinForm程序演示,新建一项目生成后进行相应修改:

方法一:通过 System.Diagnostics.Process.Start() 方式启动:

实现方法: 修改默认生成的Program文件,修改后的代码如下:

由于已经在代码上做了注释,所以不再详细说明;

效果:由于是通过System.Diagnostics.Process.Start() 方式外部调用启动,所以直接通过VS运行时,是不会提示VS也需要管理员权限,只有程序本身需要管理员权限,与生成应用程序的程序不同。这点是和方法二实现的主要不同之处。

方法二:通过添加应用程序清单文件:

在 项目 上 添加新项 选择“应用程序清单文件” 然后单击 添加 按钮

添加后,默认打开app.manifest文件,将:

<requestedExecutionLevel  level=”asInvoker” uiAccess=”false” />

修改为:

<requestedExecutionLevel level=”requireAdministrator” uiAccess=”false” />

然后打开 项目属性 ,将 应用程序 标签页中的 资源 中的 清单 修改为新建的 app.manifest。

重新生成项目,再次打开程序时就会提示 需要以管理员权限运行。

需要注意的是:如果在VS中 启动调试 的话,就会提示 此任务要求应用程序具有提升的权限。如下图:

提升权限

选择 使用其他凭据重新启动 即可。

方法三:直接修改程序文件的属性

右击程序文件,在弹出的属性对话框中的 兼容性 标签页中

勾选“以管理员身份运行此程序”即可。

设置权限等级

发表在 CS架构后台语言 | 标签为 , | 留下评论

苹果开发者账号免费注册图文教程

免费注册苹果开发者账号图文教程详解:

  1.点击进入苹果开发者社区:http://developer.apple.com

  2.然后把页面拉到底部,点击右下角的“Register”

苹果开发者账号怎么免费注册图文教程

  3.跳转页面如下:

苹果开发者账号怎么免费注册图文教程

  如果你已经拥有一个属于自己苹果ID,那么你便可以直接点击“Sign in”直接进入登陆页面(如下图所示);如果你还没拥有自己的苹果ID,那先点击下方的“Create Apple ID ”创建一个吧。

  4.点击“Sign in”后跳转至如下页面,然后输入你的苹果ID和密码后,继续点击 “sign in”!

苹果开发者账号怎么免费注册图文教程

  5.接下来就出现了常见的注册注意事项及免责啥啥啥的…就不多说了,按照一贯的惯例,打钩,然后点击同意,看图:

苹果开发者账号怎么免费注册图文教程

  6.接着便是到了个人开发者信息填写页面。填写完毕后,继续点击“Register”,如下图:

苹果开发者账号怎么免费注册图文教程

  7.看到结束页面后,说明此时此刻你的苹果ID同时也是开发者ID了!

如果你还是不太敢相信自己已经成功拥有了一个苹果开发者账号的话,那么,接下来你还可以这样做:

1.打开你的iphone,进入apple store,然后搜索WWDC ,然后把它下载回来吧。

苹果开发者账号怎么免费注册图文教程

2.下载后打开软件,在下面导航栏里点击maps,然后,再单击一下“Sign in”吧。

苹果开发者账号怎么免费注册图文教程

此时会要求你登入ID,并提示只有开发者ID才可以登入,那么你就可以点击“sign in ”的文字登入你的ID了,如下图所示:

苹果开发者账号怎么免费注册图文教程

如果成功,你便会看到WWDC2014大会的各楼层平面规划图,此时你大可放心了,因为你的苹果ID也是开发者ID了!

发表在 生活随笔 | 留下评论

如何解决在zend studio中代码无法自动提示以及代码跟踪函数和变量的问题

zend studio这工具会突然抽风,所有函数方法不能自动提示。下面是一些penngo用过的、收集整理的解决方法。

方法1、在不提示的项目上鼠标右键,打开菜单,选择Build Path->Configure Build Path,在弹出窗口中选择PHP Build Path->Add Folder…,把当前项目添加到build path。

如果函数突然不提示,可以先用这个方法检查build path有没有当前项目。但比较多情况是从外部导入项目(例如svn),会没有build path数据。

方法2、先取消菜单Project->Build Automatically的选中状态,再点击Project->Clean…清理项目,再重新选中Project->Build Automatically。这个方法我用得最多。

方法3、打开zend studion的wordspace目录(如果不知wrodspace目录在哪,可以打开菜单file->switch wordspace->other…查看),接着到这个文件夹,打开文件目录.metadata->.plugins->org.eclipse.core.runtime->.settings。到了.settings目录之后,删除org.eclipse.dltk.ui.prefs文件。然后刷新项目或重启Zend Studio。

现在遇到不提示情况,先用方法1检查,再用方法2检查,最后用方法3检查。。。。。大多数情况下,用方法1和方法2就能解决问题。

发表在 应用工具软件 | 标签为 , , | 留下评论

最新webqq密码的加密方式分析过程

授人以鱼,不如授人以渔,今天就分享一个 分析qq加密的过程。

工具:谷歌浏览器自带的的调试工具(在浏览器中按F12呼出)

以下是全过程,历时4个的小时。

提交的时候调用 onFormSubmit

如果用户没有勾选保存密码调用 ptui_onLogin

接下来调用 ptui_checkValidate(A)

然后:

最后在这个函数中加密组装提交地址:

核心的加密代码如下:

hexchar2bin算法如下:

最终加密过程如下:

此处改变了 pt.uin:

其实找出这个算法花的时间很少,只是一直找不到 ptui_checkVC 调用的地方,后来恍然大悟,在验证qq是否需要图片验证码的时候返回的就是给js调用的,地址是:

返回内容如下:

第三个参数就是 16进制表示的qq号码

至此全搞定,剩下的就是编程实现。https方式访问。可以试试 libcurl   或者自己 用openssl+socket也可以

[原文地址]

各种吐槽:

不告诉你 | 2014/03/27 22:55 | #

前端功力很强啊

Kuuki | 2014/03/28 00:17 | #

记得13年XDCTF线上赛中某题就是重现朋友网加密过程…

刘海哥 | 2014/03/28 09:33 | #

膜拜

PlO | 2014/03/28 10:10 | #

http://blog.csdn.net/agoago_2009/article/details/9492961

园长 | 2014/03/31 11:17 | #

很早以前就有人把webqq的协议和demo发出来了,调用webqq接口可以自由收发消息。

niphor | 2014/04/04 16:32 | #

QQ 新浪微博 什么的登陆都基本一样的流程

本文“2014 最新 web qq 密码的加密方式分析过程,WebQQ 登陆密码加密算法分析”,来自:Nuclear’Atk 网络安全研究中心,本文地址:http://lcx.cc/?i=4272,转载请注明作者及出处!

发表在 Web前台开发技术 | 留下评论

基于WebQQ3.0协议写一个QQ机器人

一个偶然的机会,在某群看到一个类似QQ机器人的玩意在骚动,问那哥们回答说是JAVA写的,原来QQ还能这样玩儿。于是乎,我也就开始骚动了。Let’s go

1.WEBQQ3.0登陆协议

进入WEBQQ, http://web.qq.com/

通过工具分析,可以知道,用户在输入密码之前(也就是输入帐号后),会首先GET一个请求过去

https://ssl.ptlogin2.qq.com/check?uin=58237991&appid=1003903&r=0.5534069868735969

我们只详细分析下这一个请求,看看,这个请求到底携带了什么样的数据

这个GET请求返回ptui_checkVC(’0′,’!TMX’,’\x00\x00\x00\x00\x0e\xe9\x41\xc1′);这样的字符串,其中第一个字符串,’0′代表不需要验证码,’!TMX’这个数据,是等会登陆需要的,第三个字符串加密密码的时候会用到。

附PHP代码如下:

密码登陆后,监控到这样一个请求

http://ptlogin2.qq.com/login?u={$uid}&p={$passwd}&verifycode={$verify}&webqq_type=10&remember_uin=1&login2qq=1&aid=1003903&u1=http%3A%2F%2Fweb.qq.com%2Floginproxy.html%3Flogin2qq%3D1%26webqq_type%3D10&h=1&ptredirect=0&ptlang=2052&from_ui=1&pttype=1&dumy=&fp=loginerroralert&action=8-38-447467&mibao_css=m_webqq&t=3&g=1

其中有三个参数需要解释一下

u:QQ号

p:加密后的密码

verifycode:验证码

附PHP版登录函数以及加密函数代码如下:

登录成功后返回值类似:

ptuiCB(’0′,’0′,’http://web.qq.com/loginproxy.html?login2qq=1&webqq_type=10′,’0′,’登录成功!’, ‘秋风’);

还有一组COOKIE,COOKIE值全都保存起来,待会儿会用到。

到这一步其实还没有真正的登录QQ的聊天接口,继续往下看。

第一次登录成功后,紧接着发送一个POST到http://d.web2.qq.com/channel/login2

POST值(请把参数值用urlencode函数编码)如下:

r={“status”:”online”,”ptwebqq”:”{$ptwebqq}”,”passwd_sig”:””,”clientid”:”{$clientid}”,”psessionid”:null}&clientid={$clientid}&psessionid=null

其中ptwebqq的值来自第一次登录时候的COOKIE值ptwebqq

clientid是个随机数,自己定义就行了

请求后的返回值是一个JSON格式的值,保存起来,后边收发信息时会用到:

到此为止,登陆就完成了。

附PHP版解析Cookie File函数以及登录函数代码如下:

2.传说中的心跳包

顾名思义,心跳包,就是维持一个长连接,让WEBQQ保持在线的一种机制,.这个心跳包非常简单,只需要每隔几秒,或者写一个死循环发起请求就好(长时间不触发此步骤,会导致QQ掉线)

POST地址:http://d.web2.qq.com/channel/poll2

POST值(请把参数值用urlencode函数编码)如下:

r={“clientid”:”{$clientid}”,”psessionid”:”{$psessionid}”,”key”:0,”ids”:[]}&clientid={$clientid}&psessionid={$psessionid}

其中psessionid的值,在第二次登录返回的JSON信息里边能找到

clientid与第二次登录时候的clientid相同

附PHP版心跳请求函数代码如下:

3.获取QQ群列表

POST地址:http://s.web2.qq.com/api/get_group_name_list_mask2

POST值(请把参数值用urlencode函数编码)如下:

r={“vfwebqq”:”{$vfwebqq}”}

只有一个参数,很爽对吧?这个值在第二次登录的时候可得到,回头去找找看吧

附PHP版获取群列表函数代码如下:

4.获取好友列表

POST地址:http://s.web2.qq.com/api/get_user_friends2

POST值(请把参数值用urlencode函数编码)如下:

r={“h”:”hello”,”vfwebqq”:”{$vfwebqq}”}

vfwebqq的值在第二次登录的时候可得到,回头去找找看吧

(ps:在编辑本文时,发现这个请求链接的POST值已经加了一个参数hash,分析出来源后尽快补上,这对全局影响并不大)

附PHP版获取好友列表函数代码如下:

5.发送QQ消息

POST地址:http://d.web2.qq.com/channel/send_buddy_msg2

POST值(请把参数值用urlencode函数编码)如下:

r={“to”:{$from_uin},”face”:606,”content”:”[\”{$msg}\\n\”,[\”font\”,{\”name\”:\”宋体\”,\”size\”:\”10\”,\”style\”:[0,0,0],\”color\”:\”000000\”}]]”,”msg_id”:{$msg_id},”clientid”:”{$clientid}”,”psessionid”:”{$psessionid}”}&clientid={$clientid}&psessionid={$psessionid}

部分参数解释:

to:好友的uin(非QQ号)

content:发送的消息内容

psessionid:在第二次登录返回的JSON信息里边能找到

clientid:与第二次登录时候的clientid相同

附PHP版发送QQ消息函数代码如下:

6.发送QQ群消息

POST地址:http://d.web2.qq.com/channel/send_qun_msg2

POST值(请把参数值用urlencode函数编码)如下:

r={“group_uin”:{$group_id},”content”:”[\”{$msg}\\n\”,[\”font\”,{\”name\”:\”宋体\”,\”size\”:\”10\”,\”style\”:[0,0,0],\”color\”:\”000000\”}]]”,”msg_id”:{$msg_id},”clientid”:”{$clientid}”,”psessionid”:”{$psessionid}”}&clientid={$clientid}&psessionid={$psessionid}

部分参数解释:

group_uin:群的uin(非QQ群号)

content:发送的消息内容

psessionid:在第二次登录返回的JSON信息里边能找到

clientid:与第二次登录时候的clientid相同

附PHP版发送QQ群消息函数代码如下:

事实上,做到心跳包的时候,再往下已经没有技术含量了,已经属于体力活了。

最后附一个基于WebQQ3.0写的一个开源的WebQQ机器人,有兴趣的朋友可以研究研究。

参考资料

http://www.cnblogs.com/gitdnn/archive/2013/01/13/2858408.html

http://www.meesii.in/71.html

发表在 应用工具软件 | 留下评论

如何在Windows下远程桌面连接Mac OS X

第一步:Mac OS X 10.5 已经增加支持了由VNC Viewer访问的功能,设置如下:
系统偏好设置-共享-勾选“屏幕共享”,然后在电脑设置—VNC显示程序可以使用密码控制屏幕输入8位密码,并输入登录使用的密码允许设置,这样就可以通过其它PC或Mac上的VNC Viewer来连接这台Msc进行远程控制了。

第二步:安装VNC Viewer,推荐一个自由软件TightVNC,下载地址http://www.tightvnc.com/download.php,TightVNC 是一套免费的 VNC 软件,能让你轻松控制远程的计算机,就像坐在自己家的计算机前面一般:

image

image

输入在Mac中设置的8位密码即可。

发表在 应用工具软件 | 标签为 , | 留下评论