UTF-8、HTTPS原来都是浮云/兼谈新款手机

王志勇 发表于 2018年09月23日 11:18

关于UTF-8
在某种特定环境下,我需要登录Gmail、Adsense的页面、查询网站的收录数,现在唯一能登录的方法只有用远程的Linux VPS主机,用VNC连接远程桌面,因为从今年开始17(隔开)23端(隔开)口在国内被封(隔开)锁,自建的威(隔开)P(隔开)N都已经全部失效,XP系统下又无法用SS。

此时的问题是,英文版的CentOS系统+火狐浏览器,访问所有的UTF-8网页,如果有中文字符,依然显示乱码,乱码如下截图。(这个Linux版的火狐浏览器能修改编码为中文,可是修改之后浏览器会彻底死机。)

过去,大家都知道UTF-8是国际编码,理论上即使系统、浏览器没有安装相应的编码,也能正常显示各国的字符。以前我用了差不多六、七年的英文版XP系统,记得当时系统没有额外安装中文包,自带的英文版IE6,都可以正常浏览UTF-8的网页。可见,出现这种问题是Linux版火狐浏览器的bug。

由于这个bug的出现,那么国外的英文版、非中文版的手机,自带的浏览器、或者手机安装的其它浏览器,访问utf-8的中文网页,是否同样有可能显示乱码呢?是有可能的。

这个例子,说明UTF-8并非是真正的国际通用编码

多年来,我也一直在utf-8和gb2312之间抗争,因为在数据库里,中文或全角字符utf-8会占用3个字符,gb2312(或gbk,都是ANSI 936编码)占用2个字符。理论上,在高并发时,gb2312的效率是utf-8的1.X~1.5倍。当时在程序作品里放弃gb2312而用utf-8的原因,只是因为别人都用utf-8,utf-8似乎看起来更专业的样子,仅此而已。

如今在新的网页项目里,同时有英文、中文版,且是潜在的流量型,我尝试采用utf-8和gb2312同时使用。运用$aa=iconv('UTF-8','GB2312//IGNORE',$aa);这个函数来自动实现两种编码的互相转换。用户看到的网页,英文版会自动变成utf-8,中文版自动变为gb2312或gbk。

关于HTTPS
如前所写,HTTP/HTTPS密码防止泄密的新方案HTML完全可以在用户提交密码前,通过JavaScript对这个密码进行类似md5加密,或者最好自创加密规则,用户输入明文密码A的这个<input>一定要放在<form></form>之外,这样不会被截获,因为它不发送。JavaScript将密码A经过加密,用document.all.password.value='……';这样的方式复制给<form></form>里的一个隐藏的<input>,服务器再将这个加密过的密码做相应的还原。

由于加密规则只有开发者知道,经过加密的数据即使不幸被截获,也是永远无法被逆向还原的。经过一次加密,已经无法被还原。

这个方案已经在我的程序里完成,我在程序里做了3-5次加密。

有了这种加密方式,HTTP实现了和HTTPS相同的安全功能。有这种显而易见的HTTPS方式仍然不安全:网站启用了HTTPS,但数据库里依然记录明文密码。

可见,HTTP在HTTPS安全性方面的不同,主要在于用户发送时的数据不同。而服务器是储存明文密码,还是经过加密的密码,则与HTTP、HTTPS无关,是否安全取决于网站的程序设计。

所以,如今HTTP并非想象中的不安全,HTTPS也并非想象中的安全。HTTPS会损失一定的服务器性能。另外,HTTPS免费的几乎没有,直接在主机上安装Linux系统“自带”的SSL,用户访问时还是会有个安全警告提示。收费版的SSL,价格远超过了网站自身的域名、主机。网络里大力推行SSL,是不是有SSL销售商在做推手?

当然,并不是说使用这些产品不好,有很多人的确很需要这些。这里想说的是,如果没有这些产品,依然能够对运转没有任何影响的情况。就像别人都用utf-8,自己也要用才跟得上潮流;别人都用https,自己也要用才不会落后;别人都用iPhone,自己也要用才不会落后等等。

记得2005年、2006年的时候,ASP是我的主力开发语言,我还在投入大量精力开发ASP。当时计算机系的朋友只因为这一点,直接说我外行,于是不得已投入了JSP。然而,后来发现最佳的web语言是PHP,它比ASP、JSP的语法都简单易读。

合适自己的,才是最好的。

顺便说一下iPhone和高版本安卓
如果您是业内的设计师、程序开发者,使用iPhone,我很尊敬您,因为技术人员是最理性的消费者。iPhone在过去几年流行,有几个很重要的原因,一是拍照效果很好(几乎和专业的家用佳能相机效果一样),二是流畅,三是很酷(价格高的效应),四是周围人都在用。但缺点,一是系统封闭,二是价格太高。

前几天有人问,现在同样的价格,是买iPhone 6s,还是华为P20?iPhone 6s是两三年前苹果发布的最高端手机,如今的性能相当于国产的安卓千元机型。因此,当然是华为P20的性价比比iPhone 6s高。华为P20我没有用过,没试过它的拍照效果,但是几年前的OPPO A59S(我家人在用,真八核)的拍照效果和iPhone基本一样。华为P20的配置参数比OPPO A59S高。

而专业的家用佳能相机,2003年时佳能最高端的是A60、A80,价格分别为2000元、3000元人民币,如今比A60、A80配置高得多的佳能新款相机,价格在400~1000元的型号比比皆是。为了便于无线传输,数码相机与安卓系统融合,是必然趋势,像三星GC100、三星WB50F、S800c都是好几年前的产品了,但是拍出来的效果都是在iPhone所有机型之上的,它们价格比佳能贵不少,但是和佳能效果差不多,仅仅是多了个安卓系统。

安卓相机可以通过蓝牙、或ES文件管理器(可在安卓2.3系统或以上运行)来无线传输文件。因为这十几年里,现有的数码相机通过数据线来传照片,已变得严重落后、渐渐变得不科学了,因为数据口寿命很有限,很多数码相机一插数据线就会充电,对锂电池有一定的损害。因此,无线传输应该尽快在数码相机里全面落实。

今年又是手机大降价的一年。3+32、4+64配置的机型,前两年的价格在1500、1900元以上,现在6XX~9XX就能买到。这样的一个手机,如果自身的拍照效果好,那么已经足够用了。如果拍照效果不好,再配一个安卓数码相机,完全实现了苹果手机的功能。

高版本安卓
现在在售的手机,如果是一两年前的库存货,最低是安卓5.1,新手机都是安卓6、安卓8了。如果是安装微信、支付宝等常用APP,这些安卓版本感觉不到多少区别,甚至和安卓4.3、4.4一样,只是界面变酷了一点。系统的变化,多数人应用不到。
从安卓4.3、安卓4.4开始,流畅度的确有了不少提升。

但如果您对Root要求较高,那么目前最后的一个版本是安卓4.4,或安卓5.1。安卓6.0以上,已经无法Root。对于习惯Root手机的用户,使用这些高版本安卓的手机,需要一个适应的过程。无法Root,可能手机的安全性会提升一些,但是功能少了。

对于只有Root才能运行的软件,则必须选一台安卓4.4的手机。安卓5.1还有部分机型能Root,有的机型Root之后再重启,会自动删除Root软件

厂家之所以封杀Root,可能是为了减少返修率。但对于需要Root的用户,造成了很大的不便。最基本的,Root Explorer等文件管理软件,无法操作系统文件,无法更换/system/media的内置铃声文件。

手机容量,一般的应用,微信、支付宝、淘宝,1+8G目前是足够用的,更不用说3+32、4+64的配置。很多人纠结买32G、64G,还是128G、256G的iPhone?手机不是用来存储大量数据的,因为手机可能会丢,手机的闪存随时会坏。实际的应用中,手机的闪存寿命可能远低于机械硬盘,因此需要及时把手机里的数据挪到硬盘,重要数据做双重备份。

安卓手机的品牌,现在较多人用华为、OPPO、VIVO等等,对于外形、上档次、炫酷有需求,选这些完全没问题,三星手机现在似乎使用的人少了,可能是由于前年三星Note手机电池爆炸。(受这个事件的影响,从那时起,全球的TF、SSD闪存、内存条都涨了一倍,直到现在2年多才刚刚回落到当时的价格)

但也有明智的人,会选择小众的良好品牌,它们和那些热销的品牌其实很多是一样的、甚至更好用,价格便宜了一半以上。不推荐中(隔开)兴、酷(隔开)派,因为有多个机型,即使是现在较新的型号,都会偷发短信。

我喜欢海信手机,家里有台HiSense的冰箱用了9年,没想到海信手机是难得的国产良心之作,主要是它大部分机型都能三键强刷机,自带来电防火墙,用来上网绝对很好用,唯一的缺点是一些机型的拍照差一些。安卓4.4以前的海信手机很好用,但是自从安卓5.1之后就没有优势了,因为安卓5.1之后的刷机包,体积到了1.7G,容易刷机变真砖。

高版本的安卓手机,由于刷机包太大,刷机风险很大。800M以内的刷机包,都能安全刷机。

18条评论:
1   自由勇 2019-01-25 08:06
Trackback来自《手机永远是最热门的话题:用安卓还是苹果?用多大的ROM?

安卓手机,如果不能Root,对于稍微喜欢折腾、DIY手机的用户来说,基本就是个半废品,安卓4.4的时候,很多手机还能Root。安卓5.1已经在逐渐禁止Root,因为Root之后的手机,重启之后会自动去除Root。安卓6.0以后的手机彻底无法Root。所以,经典的手机,目前只停留在安卓4.4版本。

2   简单 2019-05-31 10:51
“由于加密规则只有开发者知道,经过加密的数据即使不幸被截获,也是永远无法被逆向还原的。经过一次加密,已经无法被还原。”
此处我不太理解,你的意思是前端JS加密过的密码才发送到服务器,但是JS在客户端可以看到,怎么会“加密规则只有开发者知道”呢?
在服务器知道客户明文密码的情形下,通过相同加密方法可以比较客户端提交的密码是否正确,但是客户端如何修改密码呢?在不传输明文密码的情形下,服务端是没法解密后的明文密码的,就没法更新客户密码了。

自由勇 2019-05-31 11:01
Hi!JS的代码可以完全隐藏,因此加密规则可以做到只有开发者知道。

自由勇 2019-05-31 11:05
完全隐藏JS程序的方法:
<script src='abc.php'></script>

abc.php的开头写入如下这段,原理是先禁用缓存,然后判断abc.php的所在域名、访问来源的域名必须相同,则为站内引用。
因为如果是站外引用,则来源的域名会不同;或者直接用浏览器访问abc.php,则来源为空。
因此,这个方法可以完全隐藏JS程序:

<?header('Cache-Control:no-cache');
$h=explode('.',$_SERVER['HTTP_HOST']);$i=count($h);$domain=$h[$i-2].'.'.$h[$i-1];
$i=parse_url($_SERVER['HTTP_REFERER']);$b=$i['host'];$h=explode('.',$b);$i=count($h);$a1=$h[$i-2].'.'.$h[$i-1];if ($a1!=$domain) exit();?>
……
在这之后写入的所有内容均为隐藏。

3   简单 2019-05-31 11:46
感谢指教,我消化研究下

自由勇 2019-05-31 12:33
谢谢关注:)

4   简单 2019-06-13 14:46
这个隐藏js的办法我试了不行,右键查看表单的源码,点击abc.php,直接就显示出来了,js是客户端脚本,被浏览器执行,就肯定可以被看到

自由勇 2019-06-13 21:03
好的,我再测试一下。

自由勇 2019-06-14 10:27
昨天试了一下,应该是看不到的,我用的是火狐浏览器,不知道你用的环境是哪个浏览器?
2楼的程序应该是可行的,因为我用这样的方式已经将近10年。它的原理是,header('Cache-Control:no-cache');语句避免被浏览器缓存,防止被复制JS文件。
这个JS动态文件,由于没有缓存,理论上应该类似从内存读取。
用判断访问来源和自身文件的域名是否一致,因为这个JS文件没有被缓存,直接访问时,访问来源为空,所以不显示内容。
早期我是用这样的方式判断:(2楼的程序修改)

<?
if ($a1==$domain){
// 这里写入隐藏的内容
}
?>

后来为了减少最后的括号,以减少程序的逻辑,直接改为
if ($a1!=$domain) exit();

5   简单 2019-06-14 16:51
我也是火狐,由于你的评论框不能发html和截图,我发base64:
表单:

hide-js.php:

表单页右键看源码,看到hide-js.php的链接,点击后直接显示出其底部的js。

自由勇 2019-06-15 07:51
base64我昨天还原了一下,没有成功。
JS文件可以只写入加密规则(这样应该无法被右键看源代码),表单可以明文写在父页或者新建一个JS文件。

自由勇 2019-07-03 09:13
我最近开始开发PHP 7,上述程序在PHP 7有时候可能会有报错(比如非引用而直接访问这个动态的JS文件),需要把$i=parse_url($_SERVER['HTTP_REFERER']);改为:
$i=parse_url(@$_SERVER['HTTP_REFERER']);。

6   八戒 2019-10-06 10:14
“另外,HTTPS免费的几乎没有,。。”,博主,是不是我理解错了您 的意思:免费的HTTPS 证书网上一大把啊,腾讯云、阿里云、京东云、华为云都可以申请免费的证书啊?启用HTTPS网站除了会“牺牲那么一点点忽略不点的性能”(现在的服务器不都是性能过剩么?),还能加强安全,可以做任意端口转发,提升安全,没觉得不好啊。

自由勇 2019-10-11 09:05
可能现在的免费证书多了一些,去年的时候基本上只有Let’s Encrypt。

7   Buster 2019-10-10 22:31
免费的最大牌是LetsEncrypt(三个月一更),现在还有BuyPass(半年一更),通过acme.sh这个软件实现自动更新和部署。目前还有其它几个免费的SSL,至少个人小博客用完全没问题了。

自由勇 2019-10-10 22:33
那很不错,谢谢推荐!

8   最难的是起名字 2019-12-23 21:05
在Windows XP Service Pack 3可以用S(隔开)S 2.5.8版本的客户端,基本可用,但是要安装.NET v4.0.30319。
另外Firefox浏览器把汉字显示成了方块你确定是编码的原因?是不是Cent OS中没有中文字体? 我猜是没有中文字体导致的 . . .

自由勇 2019-12-23 21:47
是的,我现在也是在XP系统下用这个SS+.NET 4.0,能用,偶尔登录Gmail时用一下。
是的,原因是因为CentOS中没有中文字体。
不过,理论上因为UTF-8是通用编码,即使没有安装各国字体编码,也能正常显示。(正文的事例说明仍然需要安装各国编码。)

9   C-R 2020-11-12 01:51
关于密码加密,个人认为可以将密码的MD5值与JS从服务端获取到的当前时间戳连接,然后计算MD5,将时间戳与MD5值一起进行可逆加密后提交给服务器,服务端解密后先根据时间戳判断提交时间是否在限制时间内,在的话再根据提交的时间戳与数据库中的密码MD5值连接计算MD5,对比判断密码是否正确。

浏览器端提交的数据:
1、pwd:md5(md5('输入的密码') + 当前时间戳)
2、time:当前时间戳

服务端:
if(time() - $_POST['time'] < 3){
$pwd = ...//获取数据库中保存的密码的MD5值
if(md5($pwd.$_POST['time']) === $_POST['pwd']){
//登录成功
}else{
//密码错误
}
}else{
//登录超时
}

发表评论:
名字: (*必填)
博客: (可省)

正文:

  记住信息?

直接发送Trackback到此文章

说明:本评论系统不支持HTML代码。(您的留言需要审核,审核规则请见这里。)

王志勇:1980-09-26 (40周岁)
程序设计,前端设计。

版权声明:本博客所有文章,均符合原创的定义,禁止转载,违者将必究;正确的方法是贴原文的标题和网址即可。

与此相关的链接
自由勇专栏

Blog存档 Archives

2020年10月
2020年09月(14)
2020年08月(14)
2020年07月(14)
2020年06月(16)
2020年05月(13)
2020年04月(18)
2020年03月(14)
2020年02月(15)
2020年01月(16)
2019年12月(11)
2019年11月(26)
2019年10月(25)
2019年09月(30)
2019年08月(10)
2019年07月(29)
2019年06月(30)
2019年05月(26)
2019年04月(30)
2019年03月(30)
2019年02月(30)
2019年01月(30)
2018年12月(30)
2018年11月(30)
2018年10月(30)
2018年09月(17)
2016年-2017年(9)
2014年06月-09月(10)
2013年 +

2012年 +
2011年 +
2010年 +
2009年 +
2008年 +
2007年 +
2006年 +
2005年09月(4)

Copyright © 2006-2020 auiou.com All rights reserved.
此Blog程序由王志勇编写 已经发布在Arsue