Web

trojan-gfw 安装

trojan-gfw 是一种科学上网代理软件,在外部看来它是一个正常的https网站,然而加密流量会伪装在其中。trojan 现在用的人还比较少,不容易被针对。不过很多时候服务器的443端口也容易被gfw 封锁。 本文简要记录trojan-gfw 的部署过程。 reference: https://trojan-tutor.github.io/2019/04/10/p41.html 原理图 简要说明下原理,外部https 流量通过443端口输入,trojan 监听443端口,若是正常https 流量则转发至127.0.0.1:80 端口的 nginx 服务器。若是trojan 流量则由trojan 进行代理。 外部访问80 端口的流量由 nginx 转成https 请求,跟正常https 网站一样。 由于我的服务器只用来科学上网,安全性要求不是很高,方便起见安装时全用root 账户,这样可以省去很多权限引起的问题。 系统版本 ubuntu1604. 以下域名用 <example.com>表示 ,请替换成你的域名。 nginx 安装 把/etc/nginx/sites-enable/default 这个默认网站删掉。 创建伪装网站 vim /etc/nginx/sites-available/<example.com> 网站配置文件 @line 4 & 17 : 把<example.com> 改成你的域名。 @line 7 : proxy_pass 指向一个没有敏感信息的网站, 这里用了 ieee.org。(原作者用的是ietf.org,好像现在网站禁止转发了。。) @line 15 : 把<10.10.10.10> 改成你的服务器IP。 server { listen 127.

又折腾网站迁移

终于把wordpress 的博客用hugo 转成静态网站放到github 了, 不过还很多细节要调整。 前段时间国内的域名空间备案被注销了,因为域名和空间不在同一家,真是无语。 之前是因为备案的那家空间续费太贵了,然后就把网站搬到另一家做活动的服务器上了。结果半年后就被警告备案的域名没有指向他家的服务器,要被注销。查了一下它家服务器还是贵,还让不让人活了。索性把网站做成纯静态的搬到github 上了。真是不容易。 也难怪这几年国内中文搜索的内容质量起来越差了。 这就有种像住出租房付不起房租,被赶来赶去的感觉。国内这一套真是被玩得越来越溜了。

域内的PC 访问非域内的samba服务器

加入某个域内的PC 在登录samba服务器的时候,默认会在USERNAME 前加上DOMAIN\, 所以一直登录失败。登陆窗口上也无法取消加 DOMAIN\。 解决方法: 控制面板->凭据管理器(Credential Manager) -> 手动添加Windows 凭据, 这样就可以用此用户账户正常登录了。

网站迁移笔记

迁移参考: https://www.digitalocean.com/community/tutorials/how-to-move-an-apache-web-root-to-a-new-location-on-ubuntu-16-04 Ubuntu1604 安装php5.6 由于Ubuntu1604 默认安装的是php7。由于网站兼容性问题,需要装php5。 步骤参考:https://phpraxis.wordpress.com/2016/05/16/install-php-5-6-or-5-5-in-ubuntu-16-04-lts-xenial-xerus/ > add-apt-repository ppa:ondrej/php > apt-get update > apt-get install php5.6 php5.6-mbstring php5.6-mysql php5.6-sqlite3 > 还有这些按需要装 php5.6-cli php5.6-curl php5.6-json php5.6-mcrypt php5.6-curl php-xdebug libapache2-mod-php5.6 libapache2-mod-php7.0 mysql-server-5.7 apache2 # php 版本切换方法2 > sudo a2dismod php7.0 ; sudo a2enmod php5.6 ; sudo service apache2 restart ; echo 1 | sudo update-alternatives –config php > sudo a2dismod php5.6 ; sudo a2enmod php7.

关于Apache httpd 的SSI和cgi使用和思考

因为在单片机上的web服务是使用删减版的httpd服务器,只保留最原始的扩展功能,SSI和CGI。无法像pc上的服务器可以使用php,jsp之类的引擎。 SSI主要是为了往网页里面插入实时的变量,CGI主要是处理客户端发送来的请求。这样即使是最古老的浏览器也不会有什么兼容性问题。 但是这样的做法的结果是服务端的编程变繁琐了。作为单片机这种嵌入式web应用,应该尽可能工作量放在客户端来完成,减少服务端的复杂度。而且不需要太考虑兼容古老的浏览器,因为落后的东西就应该被淘汰。 早期的浏览器作为通用的客户端只拥有简单的功能,比如实现get和post等几个方法。大量的跳转和内容生成是在服务端运行的,就造成服务器的负载较大。自从javascript成为浏览器端标准的脚本语言后,各种网站的内容交互方式就变得更加自由了。我这里感受最深的就是使用客户端脚本把动态网页的生成工作放在浏览器端来做,数据由ajax 单独请求更新。嵌入式web经常需要显示一些实时的数据,把单独的数据请求放在后台实时更新,然后由脚本把它填写至网页。不像早期的技术使用SSI,服务端需要检索整个网页的SSI tag,然后查找变量,将数据实时更新至网页,然后发送整张网页。可以想服务端的压力有多大。其实这种思维模式就像网站程序和网站数据分开放一个道理。好处多多! 因为用单片机的web服务器调试前端代码会比较繁琐,要转码要下载,频繁修改就不方便。所以直接在pc的web服务器上调试前端代码,并且使用SSI和CGI,模仿单片机C后台的动作,这里要有一些技巧。 在Apache httpd web服务器上使用SSI和cgi,可以参考服务器主页上的帮助文档 http://httpd.apache.org/docs/current/howto/ssi.html。这里简单做个记录。 SSI 按照官方介绍把SSI功能打开。怎么设置httpd.conf就不多说。这里简单记录下其使用规则。 想设置某个SSI tag时,可以使用 [html] [/html] 在需要调用它的地方使用 [html] [/html] 就可以显示出 xxxx 了。 仅仅是这样使用,跟我们在使用最原始的SSI还是有点不一样。 为了方便调试,我们可以在页面上头加上 [html] [/html] 重定义这个未找到SSI时的提示语言,原本的提示语言很长,不方便调试。 CGI有几个要点: 1. CGI开启后,默认设置ScriptAlias是只执行cgi-bin下的脚本。你可以将自己的web目录添加进去,因为实际请求的路径不一定是/cgi-bin。 2. 这里可以用perl、python或者bash脚本来模仿单片机c的后端应答动作。这样调试好前端代码后,下进单片机后再慢慢调试后端代码就方便了。注意在perl前面要设置好perl.exe的路径。同时可以修改.pl后缀为我们想要的.cgi它也可以得到执行。完美模仿单片机后端逻辑! Get!

Http Authorization

Basic Authorization 从最初的基本的授权方式说起。 http头里添加:WWW-Authenticate: Basic realm="xxx” 即可要求浏览器输入授权信息。 浏览器发送时会附带授权信息:Authorization:Basic YWRtaW46YWRtaW4= 它是由base64加密的。如上解密后为:admin:admin Basic authorization 的授权方式就是每个请求中在http头里都携带着base64加密的授权信息,服务器在每次收到请求时都要进行权限判断,再执行对应的操作。 由于考虑到授权,那自然涉及到了客户端状态。http /0.9是无状态无连接的协议,一个特定的输入就对应一个特定的输出。由于http 不需要很强的实时性,属于一问一答的对话形式,且有时并发性强,不可能是一对一的专人(线程)负责一个会话。所以如果涉及到状态就不如把状态参数放置在请求中,服务端就要先对请求中携带的状态进行判断,再判断对应的操作是否有权限等等。按数字电路的理论,服务端的业务就变成两段式状态机的组合逻辑部分。状态部分可以保存在客户端或者服务端,这就变成了cookie和session了。 http /1.0增加了keep-alive 选项,http /1.1则默认了所有连接都有keep-alive选项。http keep-alive 选项就是说 发送完响应之后不服务端不主动关闭连接(http /0.9 是会主动关闭连接的)。http 的keep-alive 应该通过是tcp的keep-alive 定时心跳来维持的,不过http的keep-alive 还有一层意思是即使tcp 连接断开了,http的session还是keep alive的,http 可能也维护着一个保活定时器去试探每个连接上的客户端是否仍在线(这个不清楚)。 当http涉及到用户的概念时,就需要识别用户了,可能最早http识别一个客户端的方法跟标识一个tcp连接的方法是一样的,即IP+Port的形式来断定。然后变成 client 的(IP+Port+uid+password)的,也就是Basic Authorization的方式。状态信息可以放在url(GET),http header(authorizatin, cookie) 或者 post content里面。 对安全性的考虑: 由于每次都携带用户名和密码的这种请求方式极不安全,所以衍生版本就是用cookie来替代每次都携带的用户名和密码,这样就算cookie被人获取利用,也不会泄漏用户名和密码。只有在登陆的时候会传输一次用户名和密码。再者base64是可逆的加密方式,后面也使用不可逆的加密方式如md5(因为它是有损的加密,不可能还原出原密是什么)。但是如果被抓包,还是会被黑客冒名向服务器发出请求。所以早期网上支付等等就需要k宝,动态口令卡之类的东西。现在由于TLS/SSL等技术的出现,http on TLS/SSL 就很安全了。传输层或者socket层之上的信息全部使用密钥加双方证书加密,再靠抓包破解就很难了,所以这几年网络支付又火了起来。 PS: 看了一个wordpress登录的时候是直接POST 明文用户名加密码,好危险。 FAQ: Chrome delete authorization information 在使用 header(‘WWW-Authenticate: Basic realm="userlogin”'); 调试用户登录授权时,浏览器总是会保存之前输入的授权信息。想输入其它用户测试都不行。 所以有两个方法: 1. 使用隐私窗口调试。 2. 在url之前增加 “admin@” 就可以输入新的授权信息了。 php 的header函数,和html 中的标签效果的区别 两个都用来产生response header的,不同的是前者应该直接由服务端在http header里的添加值对。后者只是将值对放在html中传送,由浏览器来解析。这可以在浏览器中调试发现它们的区别。 Session and Cookie Session 是服务端维护的会话信息, cookie是用于标识客户对象和携带客户状态参数的变量。最初由客户端发送,服务端即认识了这个访问对象(可能还要加上ip+port信息),每次客户端有相应的操作之后,服务端即会把一些状态参数加入cookie中返回给客户端。这样服务端就不需保存用户操作状态了。session 保存着这次会话的信息,超时无操作之后就会结束这次会话。 以上纯属个人理解,因为目前在应用层的使用经验比较少,只是在嵌入式开发中涉及到一些初级的简单的应用层开发。属于http的一些最初的实现,只求简单可靠,服务端处理只有C语言。不过也有必要了解一下所谓“未来”的解决方案。有高级的框架的比如 jQuery.

HTTP协议与HTTP表单传输格式

HTTP请求 从使用者的角度看,一个HTTP请求起始于 用户端浏览器上输入的一个URL地址; 网页中的一个超链接; 提交一个HTML表单。 但本质上说,一个HTTP请求起始于用户端向HTTP服务器发送的一个URL请求。 一个标准的HTTP请求由以下几个部分组成 [code] [] [/code] 在HTTP请求中,第一行是请求行(request-line),用来说明请求类型、要访问的资源(URL)以及使用的HTTP版本; 紧接着是多行头部(headers)信息,用来说明服务器要使用的附加信息; 头部信息之后是一个回车换行符(/r/n),用于标明头部信息的结束。 以上是必须内容,根据需要可在头部信息结束之后增加主体数据(request-body); 主体数据之后是一个回车换行符(/r/n),用于标明主体数据的结束。 需要注意的是 请求行(request-line)中的URL部分必须以application/x-www-form-urlencoded方式编码。 主体数据(request-body)的编码方式由头部(headers)信息中的Content-Type指定。 主体数据(request-body)的长度由头部(headers)信息中的Content-Length指定。 例如,我们可以在IE浏览器上输入下面的网址: http://localhost:8000/hello/index.html HTTP请求的头部信息如下: [code] GET /hello/index.html HTTP/1.1 Accept: */* Accept-Language: zh-cn Accept-Encoding: gzip, deflate Host: localhost:8000 Connection: Keep-Alive Cookie: JSESSIONID=BBBA54D519F7A320A54211F0107F5EA6 [/code] 上述信息没有request-body部分,这是以GET方式发送的HTTP请求。如果请求中需要附加主体数据,即增加request-body部分,则必须使用POST方式发送HTTP请求。HTML超链接()只能用GET方式提交HTTP请求,HTML表单( )则可以使用两种方式提交HTTP请求。 HTML表单 HTML表单的使用方法如下: [html] … VALUE VALUE … [/html] 表单中存在各种类型的表单域标签,如 [html] 、及。 [/html] 每一种表单域标签均有NAME与VALUE两种标签属性。这两个标签属性决定了表单提交时传送的属性名及相应的值。 目标地址(URL) action标签属性指定了表单提交的目标地址,其值可以是完整的URL。如: [html] … 如果放置表单的网页与表单提交的目标地址在同一个HTTP服务器上,则目标地址可以用绝对路径表示(绝对路径相对于HTTP服务器)。绝对路径以“/”开头,包括WEB应用上下文及请求。如: 如果放置表单的网页与表单提交的目标地址在同一个WEB应用上下文上,则目标地址可以用相对路径表示(相对路径相对于放置表单的网页)。相对路径不以“/”开头,不包括WEB应用上下文。如: 需要注意的是,action标签属性的值必须符合URL的要求,其编码必须符合application/x-www-form-urlencoded编码规则。如下面的表单: … [/html] 这样的表单是不符合要求的。如果其URL值存在非法字符(如中文字符),应将其进行URL Encoding处理。URL Encoding的处理方法如下: 字母数字字符 “a” 到 “z”、“A” 到 “Z” 和 “0” 到 “9” 保持不变。 特殊字符 “.

SSI Tag的使用

这里先说最原始的使用SSI tag的方式,因为这样做在C开发中最简单。跟后来通用的web服务器的SSI有点不一样,因为后来为了使上层开发更方便,又进行了一些封装。 最原始的SSI是这样规定的,如在html中嵌入SSI tag。使用 [code]<–#tagname–>[/code] ;,则当Web服务器生成网页时,会将当前的标签后插入所指定的内容。这就是SSI Tag的作用。 SSI可以说是最初动态生成网页的方法,不仅仅是用来插入一些变量也可以直接插入javascript、json等等你想要发送给客户端的内容!一般用SSI来插入静态变量比较方便,如果是插入input框的当前值的话,可以往SSI中插入一段javascript代码或者是json格式的数据,再用javascript把这些实时的值加载进input框。 [html] Name:IP Address:MAC Address:[/html] 其Tag 在Web 服务端代码中作如下定义,并定义其序号的宏。 [c] static const char *g_pcConfigSSITags[] = { “ipaddr”, // SSI_INDEX_IPADDR “macaddr”, // SSI_INDEX_MACADDR “p0br”, // SSI_INDEX_P0BR “p0sb”, // SSI_INDEX_P0SB “p0p”, // SSI_INDEX_P0P “p0bc”, // SSI_INDEX_P0BC “p0fc”, // SSI_INDEX_P0FC “p0tt”, // SSI_INDEX_P0TT “p0tlp”, // SSI_INDEX_P0TLP “p0trp”, // SSI_INDEX_P0TRP “p0tip”, // SSI_INDEX_P0TIP “p0tip1”, // SSI_INDEX_P0TIP1 “p0tip2”, // SSI_INDEX_P0TIP2 “p0tip3”, // SSI_INDEX_P0TIP3 “p0tip4”, // SSI_INDEX_P0TIP4 “p0tnm”, // SSI_INDEX_P0TNM “p1br”, // SSI_INDEX_P1BR “p1sb”, // SSI_INDEX_P1SB “p1p”, // SSI_INDEX_P1P “p1bc”, // SSI_INDEX_P1BC “p1fc”, // SSI_INDEX_P1FC “p1tt”, // SSI_INDEX_P1TT “p1tlp”, // SSI_INDEX_P1TLP “p1trp”, // SSI_INDEX_P1TRP “p1tip”, // SSI_INDEX_P1TIP “p1tip1”, // SSI_INDEX_P1TIP1 “p1tip2”, // SSI_INDEX_P1TIP2 “p1tip3”, // SSI_INDEX_P1TIP3 “p1tip4”, // SSI_INDEX_P1TIP4 “p1tnm”, // SSI_INDEX_P1TNM “modname”, // SSI_INDEX_MODNAME “pnpport”, // SSI_INDEX_PNPPORT “disable”, // SSI_INDEX_DISABLE … }; [/c] 然后在SSIHandler里如下解析,当每次serving a page with a ``.

[转]Apache与Tomcat有什么关系和区别

经常在用apache和tomcat等这些服务器,可是总感觉还是不清楚他们之间有什么关系,在用tomcat的时候总出现apache,总感到迷惑,到底谁是主谁是次,因此特意在网上查询了一些这方面的资料,总结了一下: 一 apache支持静态页,tomcat支持动态的,比如servlet等,一般使用apache+tomcat的话,apache只是作为一个转发,对jsp的处理是由tomcat来处理的。 apache可以支持php\cgi\perl,但是要使用java的话,你需要tomcat在apache后台支撑,将java请求由apache转发给tomcat处理。 apache是web服务器,Tomcat是应用(java)服务器,它只是一个servlet(jsp也翻译成servlet)容器,可以认为是apache的扩展,但是可以独立于apache运行。 这两个有以下几点可以比较的: 1、两者都是apache组织开发的 2、两者都有HTTP服务的功能 3、两者都是免费的 不同点: Apache是专门用了提供HTTP服务的,以及相关配置的(例如虚拟主机、URL转发等等) Tomcat是Apache组织在符合J2EE的JSP、Servlet标准下开发的一个JSP服务器 二: APACHE是一个web服务器环境程序 启用他可以作为web服务器使用 不过只支持静态网页 如(asp,php,cgi,jsp)等动态网页的就不行 如果要在APACHE环境下运行jsp 的话就需要一个解释器来执行jsp网页 而这个jsp解释器就是TOMCAT, 为什么还要JDK呢?因为jsp需要连接数据库的话 就要jdk来提供连接数据库的驱程,所以要运行jsp的web服务器平台就需要APACHE+TOMCAT+JDK 整合的好处是: 如果客户端请求的是静态页面,则只需要Apache服务器响应请求 如果客户端请求动态页面,则是Tomcat服务器响应请求 因为jsp是服务器端解释代码的,这样整合就可以减少Tomcat的服务开销 三: apache:侧重于http server tomcat:侧重于servlet引擎,如果以standalone方式运行,功能上与apache等效 , 支持JSP,但对静态网页不太理想; apache是web服务器,tomcat是应用(java)服务器,它只是一个servlet(jsp也翻译成servlet)容器,可以认为是apache的扩展,但是可以独立于apache运行。 换句话说,apache是一辆卡车,上面可以装一些东西如html等。但是不能装水,要装水必须要有容器(桶),而这个桶也可以不放在卡车上。

Web 开发环境搭建

1.安装eclipse。 2. TOMCAT依赖JDK运行,必须安装JDK,光有JRE不行。 JDK的环境变量配置: (1)先配置 JAVA_HOME = C:\Program Files\Java\jdk1.8.0_77; (2)然后 PATH 里添加 %JAVA_HOME%\bin;%JAVA_HOME%\jre\bin;这两个目录,以便命令行里能直接寻到这里。 注意: 安装 JDK时会默认在外部安装一个JRE,这里TOMCAT是依赖JDK运行的,所以JRE的环境变量目录要用JDK文件夹里的那个JRE,不要配置成外部的JRE目录了。 运行java -version 不出现java版本的一般是这里没配置好。 (2)最后是 CLASSPATH = .;%JAVA_HOME%\lib;%JAVA_HOME%\lib\tools.jar; 注意:这里有三个目录,第一个是.; //表示当前工作目录,别丢了。运行TOMCAT时一闪而过一般是这个环境变量没设置好。 3. 安装 tomcat ,直接解压即可。 添加环境变量: CATALINA_HOME = D:\WebDev\apache-tomcat-6.0.45-windows-x64\apache-tomcat-6.0.45; //是你的tomcat目录。 PATH 里添加:%CATALINA_HOME%\bin; 点 bin/startup.bat直接可运行tomcat。或者命令行里打startup即可,若不行则是TOMCAT的 PATH变量没设置好。 尝试访问 http://localhost:8080,出现示例页说明配置成功。可以关闭控制台。 平时有要调试的网页文件可以拷到 webapps/ 底下,浏览器输入 http://localhost:8080/foldername/ 即可访问。 3.安装mysql。 eclipse 配置tomacat 路径方法. Window->Preference->Server->Runtime Environments Add : 添加 Tomecat 路径,即可。