分类文档:程序设计 9篇

心得:PHP PK Shell
2018年09月16日 17:13

最近一个重要的文件管理小项目需要用到Shell+PHP,两者本来是完全不同的平台,但是可以互相调用,以实现需要的功能。PHP语法精炼易读,易于开发。需要判断系统某个进程是否存在时,必须运用Shell命令的编程,PHP则不具有这样的权限。

两者各有优缺点,Shell是Linux操作系统的内置命令,有更高的权限,可以直接实现很多系统级的功能,但是调试繁琐,语法不易读。我更倾向把更多的功能交给PHP来实现。

固定链接 | 发表评论(0) | Trackback(0)

干货分享6:HTTP/HTTPS密码防止泄密的新方案
2018年08月25日 10:20

在项目里准备用这个设计的新方案。现在各大网站越来越多地使用HTTPS,使用HTTPS主要是防止密码被窃取。如果在登录时,就已经使用JavaScript经过一定的规则,将密码的<input>的值,经过加密,或者增加一些随机的乱码,即使此明文值被获取,也无法猜出实际的密码。经过这样的方案,HTTP/HTTPS的密码安全级别增加了很多。

示例:用户输入的密码是abc,加密后的post的密码可能是W9g#fyx@0t。

步骤提示:
登录提交时,在<form></form>内的所有表单都会被发送,因此用户输入密码的那个<input>框(如表单框A),要放置在<form></form>之外,这个“表单框A”需要写入<input name=aaa onkeyup=abc();>。自定义函数abc()的内容为:在<form></form>之内建立一个<input name=password>表单框B,并将这个表单框B隐藏。abc()这样写,function abc(){document.all.password.value='……';},其中省略号的内容为关键内容,是从document.all.aaa.value获取值后,然后给它改变规则、或增加乱码。

这样,由于表单A,即<input name=aaa onkeyup=abc();>这个表单是在<form></form>之外,所以提交时它不会被发送,发送的是经过加密的密码,即使被截获,也无法知道实际密码。

表单框B必须隐藏,因为如果不隐藏,用户会同时看到2个密码框,并且表单框B的密码是经过加密的密码,会比原密码长很多。

服务器端收到密码后,并不存储用户的实际明文密码,而将密码再次加密,有点类似于MD5加密,就像31+18=49,22+27=49这样,这个49的值即使是被恶意截取,也无法还原出原来的值(实际的规则比这个等式复杂得多)。实际上这个49的值是很难被截取的,因为如果网站是使用别人开发的公共程序,有一定的可能被攻破,但如果是全新开发的,通常被攻破的可能性无限接近于0。

经过这种加密的HTTP,理论上比没有这种加密的HTTPS还安全。

这种加密,由于只在客户端提交前做了加密,所以不会增加服务器的任何成本,增加的只是开发者的开发时间。

[2018-08-25 16:06]更新,再进阶一步

上面的表单框B,就是经过加密的客户端发送的密码,通常被截获的可能性很小,除非是一个项目到有名的程度,有人专门制作病毒,带有病毒的客户端可截获此表单。如本文在客户端的加密方法,即使截获,也很难解读、破解,完全解读、分析它至少要花费1~10年的时间,没有人会闲到做这种事。

这里再进一步加密,可将<form></form>之外的表单A这个明文密码(此密码如上所述,因为在form之外,不会发送,所以无法截获),经过在客户端加密之后,再将生成的加密之后的密码,拆分成2~4段,传给表单框B、表单框C、表单框D等等,这样更加提高安全等级。

服务器收到表单框B、C、D……的数据后,根据相应的规则重新合并、提取,再做服务器端的非明文的加密

有了这项方案,即使使用HTTP,也能安心地继续运营,因为对于流量大的站点,HTTPS确实较繁琐,高费用、影响效率。

[2018-08-26 10:47]更新:此方案今天已经在程序中完成。

固定链接 | 发表评论(3) | Trackback(3)

干货分享5:安卓手机阻止低电量关机的方法
2018年08月24日 21:52

本文只适用于使用直流连供的手机。由于项目的需要,我把多台安卓手机改成4.2V、24×365天直流供电,去掉了锂电池,免去了经常充电的烦恼。

大部分手机可以正常运行,电量一直恒定在92%、或100%等等。但有个别机型,虽然是直流连供,但是电量一直在掉,约1小时掉1%,其实电压是一直不变的,两三天后手机会因为电量低于15%而自动关机(其实是满电的),这可能是手机的程序在自动掉电量。在网上搜索,并各种尝试、调试,花费了3个小时,都失败了。

失败过程:
1. /sys/class/power_supply/battery/capacity 权限改为只读,也就是将此文件的权限改为444,失败,电量还是在掉。
2. /sys/class/power_supply/battery/uevent 权限改为只读,将此文件的权限改为444,失败,电量还是在掉。
3. 手写一个电量95的capacity文件,替换 /sys/class/power_supply/battery/capacity,失败,会很快自动关机,而且这个文件在手机重启后、或平时会被自动重新替换成现有的电量。
4. /sys/class/power_supply/battery 目录还有多个目录,好几个目录里也有uevent,这些uevent文件的权限都改为444,失败,电量还是在掉。
5. 网上有一个阻止低电量关机的APK,安装后,无法运行,失败。
6. 使用电池较准软件,无效,失败。

成功过程,方法很简单:
最后,尝试把 /sys/class/power_supply/battery 目录的权限改为444,意外的惊喜出现了!几秒钟后出现“电池检查异常”。这样,手机的电量不会再掉,手机不再自动关机。同时,也减少了/sys/class/power_supply/battery 目录被频繁写入数据,而延长手机闪存的寿命。

修改权限的方法有2种:shell命令,或者用Root Explorer 2.21.1。这两种方法,手机都必须事先Root。

方法1:
给安卓手机安装一个“Shell终端”,shell命令如:

su
chmod 444 /sys/class/power_supply/battery

第1行的su命令是切换到root用户。我使用的是方法1,因为同时间我还用shell命令实现别的功能。

方法2:
用Root Explorer 2.21.1,/sys/class/power_supply/battery 的目录的权限设置如下图:

至此,发现Android、Linux系统的权限,有一个很大的好处是能阻止某些程序的运行、数据访问,正如本文发现的方法,是通过暴力,阻止某个目录的写入来实现的

需要注意的是,手机重启后,/sys/class/power_supply/battery 的权限会自动恢复为755,需要再次使用方法1、或方法2。

固定链接 | 发表评论(0) | Trackback(0)

程序设计是一种高危的工作
2018年08月14日 07:36

程序设计是一种高工作强度、高注意力集中、高危的工作。高危,一是因为原计划大约3个小时内完成的任务,实际可能需要5~10倍的时间,也可能提前完成,时间完全不可预测;二是开发是很不舒适的事情,需要咬紧牙关、坚持,挺过最难的部分,每天都要做复杂的统筹、数学运算、大量的调试。但是程序设计带来的好处是:总是能实现需要的功能,当完成之后,一个机器就诞生了。程序设计90%以上都是数学运算,成品能实现很多不可思议的功能。只要有思路和需求,大部分功能都能实现。

固定链接 | 发表评论(0) | Trackback(0)

干货分享2的后续:VPS发邮件
2018年08月13日 19:09

本文接《干货分享2:调试 - VPS发邮件显示“由root@localhost.localdomain代发”彻底解决》,当时调试了整整2天才完成。这两天又经过了很多的测试,取得了意外的进展。

用“干货分享2”建立的VPS邮件发送平台,没有经过SMTP验证,发件人、代发人名称一致,在国内的邮箱我测试了QQ邮箱、网易、新浪邮箱,都能收到,且只显示发件人,没有显示代发人。Gmail则直接进入垃圾箱,但也只显示发件人,不显示代发人。可能极少人用这个方法,因为这个方法是我测试中无意发现的,所以国内邮箱的开发者还没有遇到这种情形,是属于“漏洞”。但我的VPS发邮件,是用于发送注册的验证码,这是重要邮件。

(其实原计划是想通过验证SMTP来发邮件,但是所有的方法都无效。)

之后,同一VPS,每隔一段时间发送,都能100%发送。然后我测试每隔1分钟,甚至时间更短,也能发送。这说明,我的VPS可能没有对邮件的发送频率做出限制。

前两天的测试中,总是同一VPS、同一收件人,只能收到第一封信,后面再次发间隔几小时也收不到,当时误以为是VPS被限制了。其实,当时的收件人是用的腾讯企业邮箱,腾讯企业邮箱会这样拒收。收件人换成了国内的免费邮箱,能顺利发送,正好解决了一个重大的问题。

此方法发送邮件,网易、新浪免费邮箱接收最快,在5秒内,QQ免费邮箱约15秒左右才收到。

固定链接 | 发表评论(0) | Trackback(0)

干货分享4:防止下载/提交数据不完全
2018年08月13日 09:16

简述:有了这一功能,用户提交留言时,再也不用按Ctrl+A、Ctrl+C来防止发送失败而丢失。

在过去开发的项目里,有些部分用户需要提交、或修改数据,偶尔有时候会因为服务器响应慢而导致文字下载不完全、提交数据不完全或丢失。在新项目里,我想到了一个新办法:

1. 防止文字下载不完全的方案:
用户需要编辑文章时,在<textarea></textarea>标签1中下载的服务器的文字部分,用PHP的strlen函数,获取该文字的长度值。该页面,建立一个AJAX,并建立另外一个<form>,内含<textarea></textarea>标签2,用户打开页面,该AJAX会让网页自动提交标签2的文字内容,由服务器来判断标签1、标签2的strlen()是否一致,如果一致则下载完全。

之所以这样做,而不在客户端用JavaScript的length,是因为全角字符,JavaScript会识别为长度1;PHP会识别为长度2(ANSI编码),或长度3(UTF-8编码)。

2. 防止提交数据不完全的方案:
在<form>里,建立一个隐藏的<input>,用来获取<textarea></textarea>的最后几个字符,同时,在<textarea>标签里用onkeyup=……来自动改变这个<input>的值。提交后,在服务器端进行对比,如果这个<input>与<textarea>提交的数据的最后一段字符相同,则说明提交成功。

3. 防止提交后找不到服务器的方案:
要提交时,在客户端的JavaScript写入Cookies数据;提交成功后,在服务器端清除这个Cookies。

虽然这3个步骤比原先复杂了好多,但是对于一个重要的项目,会有很好的用户体验。

固定链接 | 发表评论(0) | Trackback(0)

干货分享3:防止重复提交的新方案
2018年08月11日 08:45

新项目的用户注册,需要严格防止重复提交,因为重复提交会导致相应的数据错误。昨天突然出现灵感,提交后,让程序判断需要写入的数据库文件的最后修改时间,如果距离现在的时间在3-5秒内,则不写入数据,这是运行在服务器端的程序部分。

服务器端以前我的设计方案是,注册时如果重复提交,会提示“已被注册”,这带来的问题,会让注册者误以为被别人注册过。这个新方案,解决了这个问题。

客户端,以前我的方案是自己想的办法:submit的按钮建立一组<div></div>标签1,然后编写一个和submit样子完全一样的button按钮,button按钮也建立一组<div></div>标签2,标签2用<div style=display:none>来隐藏这个button按钮。当提交后,让submit的按钮的div标签1的display为none(即隐藏),同时让标签2的button去掉隐藏。

固定链接 | 发表评论(0) | Trackback(0)

干货分享2:调试 - VPS发邮件显示“由root@localhost.localdomain代发”彻底解决
2018年08月07日 09:35

因为新项目中需要向用户自动发送验证电子邮件,所以很需要服务器发邮件的功能。

调试了整整2天,搜索了网上的大量文章,大部分都没有效果。今天在想办法的无意当中,解决了这个问题,所以特此作为干货分享。这2天在调试中,无论如何修改hostname,@后面始终是localhost.localdomain。昨天发现国外的客服邮件的发件人,会显示“由abc@serverabc.com代发”,感觉非常酷。(本次的调试结果,无意中连“由***代发”都没有了,纯属无心插柳柳成荫。)

测试环境,是干净的CentOS 5新机,已安装PHP,新机的配置方法如这一篇。本次测试用的是OVZ,因为默认直接支持sendmail,无需任何配置。

测试中,我发现代发人有时是root@localhost.localdomain,有时是apache@localhost.localdomain。后来发现,这是因为root的用户名,是我用shell命令直接发邮件,会显示“由root@localhost.localdomain代发”。而我用php的exec()函数调用shell命令,来运行VPS上的sendmail,会显示“由apache@localhost.localdomain代发”。

于是想到通过建立用户,然后更改Apache所在的用户,就可以顺利更换@前的用户名。步骤为:

步骤1. shell命令:

adduser yourabc && passwd yourabc

注:这里的yourabc,是您要新建的用户,它就是将要在@前显示的名称,例如我的用户名是webshu,输入这样的shell命令:adduser webshu && passwd webshu

然后会提示输入此用户的密码。

步骤2. 更改Apache的用户组,下载/etc/httpd/conf/httpd.conf文件,在本地修改后上传。此文件是Apache的配置文件,用户文本工具打开,找到这2行:

User apache
Group apache

把apache改成为您的名字,例如:
User yourabc
Group yourabc

步骤3. 查看主机名、添加在127.0.0.1这一行,这一步非常重要,如果没有这一步,发邮件会很慢。

shell命令:

hostname

下载/etc/hosts文件,用文本工具编辑,然后上传。

大约在第3行,会看到自己的主机IP,IP后面跟着一个名字,实际这个就是主机名,和刚才的hostname命令后显示的名称是一样的。找到第1行,也就是127.0.0.1这一行,原有的localhost.localdomain localhost这些保留,在最后的localhost加一个空格,再加上现在的主机名。例如我的主机默认的主机名是server81,添加后的效果如:

127.0.0.1 localhost.localdomain localhost server81
# Auto-generated hostname. Please do not remove this comment.
104.223.255.255 server81

步骤4:更改主机名,这一步非常重要,会显示@后面的域名。

shell命令:

hostname yourdm.com

此步骤在重启Apache后会立即生效,但是重启系统后会失效。永久更改主机的方法请在百度上搜索,然后调试,我经过测试多次,更改/etc/sysconfig/network文件,暂无法实现永久更改。

步骤5. 重启Apache,shell命令:

service httpd restart

测试:

前面已经安装PHP。默认的PHP路径为/var/www/html,在/var/www/html目录下建立一个1.php。1.php写入这样的语句:

<?exec('echo -e "Subject: biao ti\nTo: abc@abc.com\nFrom: yourabc@yourdm.com\nMessage text" | sendmail -t');?>OK!

附:上述这个exec()函数里的sendmail命令直接发邮件,单是这一项,前两天查找资料、调试所花的时间不低于8小时,最后才成功,这几乎是唯一正确的写法。因为别的写法,无法发送成功,或者会让有的邮箱拒收、或者进入垃圾邮箱。
而且,此写法是直接调用CentOS原生的sendmail,无需额外安装mailx。

步骤6. 此步骤可省略。如果不能发送,可以尝试配置/etc/mail.rc这个文件,添加SMTP信息,具体可以在网上搜索一下。我发现里面的发件人名称、密码是可以任意填写的,但是SMTP地址必须是个存在的域名。

10秒钟后查看自己的abc@abc.com邮箱,此时很惊叹,因为现在连“由***代发”都没有了,发件人直接显示yourabc@yourdm.com。虽然CentOS系统里复杂的原理暂时无法得知,但是已经实现了非常酷的功能。请注意,步骤2、步骤4,实际上是在分别修改yourabc、yourdm.com。步骤5编写的PHP文件,From后面的发件人地址,必须与此相同,就不会显示“由***代发”,而且对方能够正常查收,且不会进入垃圾邮件箱。一旦不同,可能会拒收,或者直接进入垃圾邮件箱,有时也能正常查收。至此,已经解决了一个很大的问题。

但是,新的问题又出现了。在隔几分钟后,尝试更改这个1.php文件,发送给别的地址,或者同个地址,发现同个地址需要间隔很长时间才能再次发送;或者需要间隔很长时间才能发给别的地址。很可能是这个VPS空间做了限制,限制发送邮件的数量,这个解决不了,只能更换配置更高的VPS了,毕竟我的测试机是一年几美元的空间。

固定链接 | 发表评论(1) | Trackback(1)

新增“程序设计”的分类
2018年08月10日 08:20

程序都是根据方案而编写。很多时候,为了解决一个问题,需要想很多的办法,这就是程序设计。在不同的语言,不同的平台,都可以用相同的方案。比如我在开发中,同样的功能,有时候在PHP里实现,有时在Shell编程里实现,有时在JavaScript里实现。

有时不具体到哪个语言,或者只提出方案、办法的时候,这些博客收录在这个新的目录“程序设计”里。

地址是 http://blog.emxel.com/category/program/

固定链接 | 发表评论(0) | Trackback(0)

Copyright © 2017-2018 blog.emxel.com 版权所有 Powered by Arsue