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{
//登录超时
}

抱歉,评论已关闭。

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

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

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

Blog存档 Archives

2022年07月
2022年06月(15)
2022年05月(20)
2022年04月(16)
2022年03月(9)
2022年02月(9)
2022年01月(10)
2021年 +

2020年 +
2019年 +
2018年 +
2016年-2017年(9)
2014年06月-09月(10)
2013年 +
2012年 +
2011年 +
2010年 +
2009年 +
2008年 +
2007年 +
2006年 +
2005年09月(4)

Copyright © 2006-2024 auiou.com All rights reserved.
此Blog程序由王志勇编写