有了这个一起共享 Visual Studio 壁纸来美化自己的桌面的网站,你还等什么呢?
用Visual Studio的logo做壁纸,Visual Studio 控看过来,首发于极客范 – GeekFan.net。
一个码农的自留地
有了这个一起共享 Visual Studio 壁纸来美化自己的桌面的网站,你还等什么呢?
用Visual Studio的logo做壁纸,Visual Studio 控看过来,首发于极客范 – GeekFan.net。
说起市面上的高效节能智能灯泡,消费者的选择还是不少的,能叫上名的就有LIFX、飞利浦的Hue、Brightup、LuMini、Emberlight、LightFreq还有三星的蓝牙Smart Bulb。这些产品的特点各异,但花哨的灯光颜色(甚至还有铃儿响叮当的功能)却是共同的特点。除此之外,它们还有一个共性,那就是必须使用相对应的手机应用进行控制。
但如果你不想连调个灯光亮度都要麻烦手机(其实是你自己),那么接下来的产品可能就是你需要的。
一般对于传统灯泡,把墙上的开/关面板换成旋钮式面板,或者买一个直接插到电源插座上的明暗控制器就可以解决这个问题,但如果你不想用传统的解决方案,非要使用智能灯泡,那么就会如上面所说每次都要使用手机进入物联网控制,这比用传统灯泡要麻烦多了。
不过,问题马上就能得到解决了。Kickstarter上的一个项目为人们提供了一只更智能的LED灯泡,它可以在不用安装任何额外应用或者更换旋钮面板的前提下调整灯泡的亮度,而且它的外观还很有型呢。
这款“更智能的灯泡”叫做Nanoleaf Bloom,整个灯体由33颗LED灯珠均匀覆盖,并直接利用大多数家庭里的开/关面板控制亮度,这意味着户主不需要额外的硬件和或者应用就能控制,一步到位。说实话我心里已经长草了,估计买上10个都不够。而且,看项目的进展,我觉得很多人都和我抱有同样的想法——项目原先的3万美元筹资目标早在几天前就达成了,现在,距项目结束还有24天的时候,它们获得的资金总额是13万8千美元!
Nanoleaf Bloom包含一个微处理器,它能够将墙上的普通开关转换成可调亮度开关。要设置灯泡亮度,首先打开开关,灯泡开始由暗转明,达到你要的亮度时,关掉开关再打开就可以锁定了,就这么简单。
这款灯泡可以阶梯式调暗,只需按几下开关。此外它还提供了亮度5%(功率0.5W)的夜灯模式,只要快速开-关-开一次就可以了。如果你想要最亮,只要像普通灯泡一样打开开关,按下关闭的时候它就会直接熄灯,简单明了。要知道这一切的控制不需要任何形式的应用和额外控制器实现,简直太神奇了。
那么,Nanoleaf Bloom到底要多少钱呢?在Kickstarter上,他们为初期支持者提供了40美元一只的价格,即使是优惠价也不算便宜,不过算上开发团队的巧思和努力以及简约的设计,这笔投资还是很值得的。
Sonatype已经对此帖做出了相应的反应,并在他们的博客上声明将会对所有的用户开启SSL链接。这变化让Java程序的生态系统变得更加安全可靠,我为此感到非常高兴。
虽说如此,但如果当你看到这个博客,并考虑花10美元来评估你的产品是否需要这个安全性的需要时,答案是否定的。这就好比汽车公司决定花10美元来评估他们的汽车是否需要气囊。幸运的是,现实生活中汽车公司必须安装气囊。
Sonatype的这次机制修改令我感到很开心,希望他们能够继续减少安全性与产品的冲突。对于我们开发者而已,为用户提供最安全的最有保障的产品是我们的责任。用户对于不能处理好产品与安全性的容忍度能有多大。
有一天,我看到我的防火墙是这么设置的,于是我开始对我的一个Clojure项目进行入侵:
然后我通过80端口在 http//repo.maven.apache.org下载了clojure.jar。这意味着我将能够通过一个未加密的http来下载包。我一开始认为这是leiningen的问题。但结果完全不是。Clojure.jar和其他许多的jar包在Java/Clojure/Scala领域都很重要,他们都会被正式的放在Sonatype提供的一个公共服务 – Maven Central。Sonatype有一个机制:只有那些拥有身份标识的人才允许SSL链接。你需要通过捐给Apache基金会十美元,才能获得身份标识和SSL链接。如果你不相信我说的话,捐赠的网页在这,此机制在此博客上声明。这里面甚至提到了中间人攻击。
因为身份标识是针对个人或者组织分发,所以像maven或者leiningen这些工具不能绑定它。如果你使用这些工具,那么下载java程序或者安装它的一些依赖不会通过SSL。经过我在twitter和Sonatype的一个员工对此事进行了争论,确认了此事。
你下载的jar包会来自中间人的,并且你执行的代码会被恶意软件替换过。要想阻止这类的事情发生,你需要小心的执行每一步操作,稍有不慎就会支付别人十美元。
通常什么时候会发生这类事情?如果你曾链接过咖啡店的公共网络或者别人的无线网络,中间人就能和你通信了。你的网络服务提供者应能够随意的跟你通信,有的人这么做是为了打广告。或者,你也会还会遭受来自国家操纵的这类攻击。
Dilettante
为了证明这有多么容易,我写了一个中间人代理dilettante,它功能是拦截来自于maven central的JAR包然后再注入恶意代码进去。
通过dilettante来代理http的传输,然后给任何在maven central下载的JAR包设置后门。那个设置了后门的版本同时会保留原有的功能,但是当他们使用的这个类库的时候,将会提示一个友好的信息。你可以看这个视频:
或者截图:
源代码在这。
具体实现
JAR包从maven central 下载的时候,由于是通过HTTP进行传输的,因此中间人可以随意的替换。JAR包是可以被标识的,但是根据我对于标准工具使用的经验,这些标识是不会被检查的。其他唯一的方法可以验证一个也是通过HTTP传输的SHA1和。当dilettante发现有JAR来自maven central,它将会把一个拥有后门的版本来替换成原来的。然后替换后的版本将会在受害者的电脑上运行恶意的代码。由于SHA1仅是通过HTTP传输,那么dilettante会简单地将它所能看到的所有哈希表替换成对应的拥有后面JAR包的哈希表。
我用优秀的mitproxy类库来创建我的工具。我先为代理写一个inline script,然后又用libmproxy创建一个独立的工具。
package dilettante; public class Dilettante { public static void() { // do some evil stuff } }
JAR包只是一个包含资源,类和元数据的压缩包。我通过添加自己的类到JAR,从而给这个JAR设置了后门。
稍微头疼的是想办法如何调用我的恶意代码。我知道受害者肯定会下载一些类库。然而我需要不管用户调用类库中的哪个类,它都能运行我的代码,并且还不能影响以前类库的正常使用。
Java有静态类块这一概念,它能在类级别进行初始化。当类加载到内存的时候,静态类里面的代码会只被调用这一次。在我把恶意的类插入到Jar包之后,我就能像下面这样在静态块里面调用代码:
import dilettante.*; static { Dilettante.backdoor(); }
为了插入上面的代码,我需要将它直接插入到Java class里面,而不是source文件。我是使用Karakatau将代码以Jasmin的格式插入进去。Karakatau是一个针对Python的Java 反编译/编译类库。
.method static <clinit> : ()V ; method code size: 4 bytes .limit stack 0 .limit locals 0 invokestatic dilettante/Dilettante backdoor ()V return .end method
局限性
这只是个概念化的试验,同时它还是存在局限性。
1.目前由于一些原因,它还不是很快:
我必须进行反编译和编译。如果能够直接插入编译好的代码到类里面,那就更高效了。
我实际上是通过使用Python的zipfile类库将压缩包的类文件都创建了个副本。从空间和速度方面而言,这是不高效的。如果能够更加了解zip的功能,可能会找到一个高效插入数据的方法。
2.如果用户同时下载多个JAR包。那么我将会逐个设置后门。恶意的代码在每个JAR只会被执行一次。但是如果多个jar被设置了后门,那么它将会被执行多次。如果我们将那个猫的图片替换成一个高质量,稳定的后门并且它能够只影响系统一次,那么这个问题就不会再出现。
Kyle McCormick 在 StackExchange 上发起了一个叫做 Tweetable Mathematical Art 的比赛,参赛者需要用三条推这么长的代码来生成一张图片。具体地说,参赛者需要用 C++ 语言编写 RD 、 GR 、 BL 三个函数,每个函数都不能超过 140 个字符。每个函数都会接到 i 和 j 两个整型参数(0 ≤ i, j ≤ 1023),然后需要返回一个 0 到 255 之间的整数,表示位于 (i, j) 的像素点的颜色值。举个例子,如果 RD(0, 0) 和 GR(0, 0) 返回的都是 0 ,但 BL(0, 0) 返回的是 255 ,那么图像的最左上角那个像素就是蓝色。参赛者编写的代码会被插进下面这段程序当中(我做了一些细微的改动),最终会生成一个大小为 1024×1024 的图片。
// NOTE: compile with g++ filename.cpp -std=c++11 #include <iostream> #include <cmath> #include <cstdlib> #define DIM 1024 #define DM1 (DIM-1) #define _sq(x) ((x)*(x)) // square #define _cb(x) abs((x)*(x)*(x)) // absolute value of cube #define _cr(x) (unsigned char)(pow((x),1.0/3.0)) // cube root unsigned char GR(int,int); unsigned char BL(int,int); unsigned char RD(int i,int j){ // YOUR CODE HERE } unsigned char GR(int i,int j){ // YOUR CODE HERE } unsigned char BL(int i,int j){ // YOUR CODE HERE } void pixel_write(int,int); FILE *fp; int main(){ fp = fopen("MathPic.ppm","wb"); fprintf(fp, "P6\n%d %d\n255\n", DIM, DIM); for(int j=0;j<DIM;j++) for(int i=0;i<DIM;i++) pixel_write(i,j); fclose(fp); return 0; } void pixel_write(int i, int j){ static unsigned char color[3]; color[0] = RD(i,j)&255; color[1] = GR(i,j)&255; color[2] = BL(i,j)&255; fwrite(color, 1, 3, fp); }
我选了一些自己比较喜欢的作品,放在下面和大家分享。
首先是一个来自 Martin Büttner 的作品:
它的代码如下:
unsigned char RD(int i,int j){ return (char)(_sq(cos(atan2(j-512,i-512)/2))*255); } unsigned char GR(int i,int j){ return (char)(_sq(cos(atan2(j-512,i-512)/2-2*acos(-1)/3))*255); } unsigned char BL(int i,int j){ return (char)(_sq(cos(atan2(j-512,i-512)/2+2*acos(-1)/3))*255); }
同样是来自 Martin Büttner 的作品:
这是目前暂时排名第一的作品。它的代码如下:
unsigned char RD(int i,int j){ #define r(n)(rand()%n) static char c[1024][1024];return!c[i][j]?c[i][j]=!r(999)?r(256):RD((i+r(2))%1024,(j+r(2))%1024):c[i][j]; } unsigned char GR(int i,int j){ static char c[1024][1024];return!c[i][j]?c[i][j]=!r(999)?r(256):GR((i+r(2))%1024,(j+r(2))%1024):c[i][j]; } unsigned char BL(int i,int j){ static char c[1024][1024];return!c[i][j]?c[i][j]=!r(999)?r(256):BL((i+r(2))%1024,(j+r(2))%1024):c[i][j]; }
下面这张图片仍然出自 Martin Büttner 之手:
难以想象, Mandelbrot 分形图形居然可以只用这么一点代码画出:
unsigned char RD(int i,int j){ float x=0,y=0;int k;for(k=0;k++<256;){float a=x*x-y*y+(i-768.0)/512;y=2*x*y+(j-512.0)/512;x=a;if(x*x+y*y>4)break;}return log(k)*47; } unsigned char GR(int i,int j){ float x=0,y=0;int k;for(k=0;k++<256;){float a=x*x-y*y+(i-768.0)/512;y=2*x*y+(j-512.0)/512;x=a;if(x*x+y*y>4)break;}return log(k)*47; } unsigned char BL(int i,int j){ float x=0,y=0;int k;for(k=0;k++<256;){float a=x*x-y*y+(i-768.0)/512;y=2*x*y+(j-512.0)/512;x=a;if(x*x+y*y>4)break;}return 128-log(k)*23; }
Manuel Kasten 也制作了一个 Mandelbrot 集的图片,与刚才不同的是,该图描绘的是 Mandelbrot 集在某处局部放大后的结果:
它的代码如下:
unsigned char RD(int i,int j){ double a=0,b=0,c,d,n=0; while((c=a*a)+(d=b*b)<4&&n++<880) {b=2*a*b+j*8e-9-.645411;a=c-d+i*8e-9+.356888;} return 255*pow((n-80)/800,3.); } unsigned char GR(int i,int j){ double a=0,b=0,c,d,n=0; while((c=a*a)+(d=b*b)<4&&n++<880) {b=2*a*b+j*8e-9-.645411;a=c-d+i*8e-9+.356888;} return 255*pow((n-80)/800,.7); } unsigned char BL(int i,int j){ double a=0,b=0,c,d,n=0; while((c=a*a)+(d=b*b)<4&&n++<880) {b=2*a*b+j*8e-9-.645411;a=c-d+i*8e-9+.356888;} return 255*pow((n-80)/800,.5); }
这是 Manuel Kasten 的另一作品:
生成这张图片的代码很有意思:函数依靠 static 变量来控制绘画的进程,完全没有用到 i 和 j 这两个参数!
unsigned char RD(int i,int j){ static double k;k+=rand()/1./RAND_MAX;int l=k;l%=512;return l>255?511-l:l; } unsigned char GR(int i,int j){ static double k;k+=rand()/1./RAND_MAX;int l=k;l%=512;return l>255?511-l:l; } unsigned char BL(int i,int j){ static double k;k+=rand()/1./RAND_MAX;int l=k;l%=512;return l>255?511-l:l; }
这是来自 githubphagocyte 的作品:
它的代码如下:
unsigned char RD(int i,int j){ float s=3./(j+99); float y=(j+sin((i*i+_sq(j-700)*5)/100./DIM)*35)*s; return (int((i+DIM)*s+y)%2+int((DIM*2-i)*s+y)%2)*127; } unsigned char GR(int i,int j){ float s=3./(j+99); float y=(j+sin((i*i+_sq(j-700)*5)/100./DIM)*35)*s; return (int(5*((i+DIM)*s+y))%2+int(5*((DIM*2-i)*s+y))%2)*127; } unsigned char BL(int i,int j){ float s=3./(j+99); float y=(j+sin((i*i+_sq(j-700)*5)/100./DIM)*35)*s; return (int(29*((i+DIM)*s+y))%2+int(29*((DIM*2-i)*s+y))%2)*127; }
这是来自 githubphagocyte 的另一个作品:
这是一张使用 diffusion-limited aggregation 模型得到的图片,程序运行起来要耗费不少时间。代码很有意思:巧妙地利用宏定义,打破了函数与函数之间的界限,三段代码的字数限制便能合在一起使用了。
unsigned char RD(int i,int j){ #define D DIM #define M m[(x+D+(d==0)-(d==2))%D][(y+D+(d==1)-(d==3))%D] #define R rand()%D #define B m[x][y] return(i+j)?256-(BL(i,j))/2:0; } unsigned char GR(int i,int j){ #define A static int m[D][D],e,x,y,d,c[4],f,n;if(i+j<1){for(d=D*D;d;d--){m[d%D][d/D]=d%6?0:rand()%2000?1:255;}for(n=1 return RD(i,j); } unsigned char BL(int i,int j){ A;n;n++){x=R;y=R;if(B==1){f=1;for(d=0;d<4;d++){c[d]=M;f=f<c[d]?c[d]:f;}if(f>2){B=f-1;}else{++e%=4;d=e;if(!c[e]){B=0;M=1;}}}}}return m[i][j]; }
最后这张图来自 Eric Tressler :
这是由 logistic 映射得到的 Feigenbaum 分岔图。和刚才一样,对应的代码也巧妙地利用了宏定义来节省字符:
unsigned char RD(int i,int j){ #define A float a=0,b,k,r,x #define B int e,o #define C(x) x>255?255:x #define R return #define D DIM R BL(i,j)*(D-i)/D; } unsigned char GR(int i,int j){ #define E DM1 #define F static float #define G for( #define H r=a*1.6/D+2.4;x=1.0001*b/D R BL(i,j)*(D-j/2)/D; } unsigned char BL(int i,int j){ F c[D][D];if(i+j<1){A;B;G;a<D;a+=0.1){G b=0;b<D;b++){H;G k=0;k<D;k++){x=r*x*(1-x);if(k>D/2){e=a;o=(E*x);c[e][o]+=0.01;}}}}}R C(c[j][i])*i/D; }
自2012年3月开始我就一直运营的一个网站:RamshackleGlam.com 在上周被别人给盗了。它被一个叫“bahbouh”的家伙放到了一个名叫Flippa.com的拍卖网站上,差点就被卖给了出价最高的竞争者(大概3万刀的样子)。他答应给竞标人提供我的流量、文件以及数据,并且建议我可以受雇佣的形式继续写文章(或者说,他希望提供给竞标人“高质量的文章”和“SEO(搜索引擎优化)建议”来维持网站的流量售后服务)。
我是在上周六意识到我的网站被盗的。三天过后我把它给找了回来,而这中间经历了6个部门,超过50多名雇员的参与,和律师们的午夜会议,FBI的介入,以及一个诱捕行动——可能在Sandra Bullock主演的影片中出现过,只不过这次主角换成了…我。
当然,我之前就听说过身份盗用以及网络黑客的故事,但说实话,当这些事情发生在我身上时我的第一反应就是“这不可能!”即便是在发生后,我也没有完全弄懂为什么这是一件非常严重的事情。你(指黑客)难道就不能给我解释一下到底发生了什么事情,证明你是谁,怎么安排了这一切吗?!我们生活在这样一个高度被记录的世界,我完全想象不到有人能够伪装成别人带走任何真实的东西最后却全身而退,仅仅留下几个电话和我的一些懊恼。
这非常非常糟糕——它让我更惊恐、沮丧、难以适应——超乎了我的想象。
我从父亲那里找到了黑客的痕迹。他的朋友Anthony(也是他在Pro Italia Online上的合伙人,经营着一家名叫ThoughtBox的网站开发和咨询公司)曾经在Flippa上面浏览过——现在来看真是非常的巧——并发现了我的网站被放在了上面,并且列着一大堆可疑的清单。突然,我记起了在那天之前收到的一封邮件——它被我我当作垃圾邮件忽视掉了——来自于某人,说他“有兴趣购买”我的“博客”。我记得一个来自于YouTube的通知,有人在别处访问了我的账户——而我忽略了,上面说我登陆了一个移动设备,当时我以为是我的丈夫偶然登陆了我的账户。
但即便在我看到清单之后,我也没有在意:这看上去就像什么东西用几封邮件就能定下来一样。只是那个拍卖网站被定位在澳大利亚,并且没有联系电话,而当我发送了一封附带身份证复印件和网站的所有权证明后得到的却是一封打印信件。我询问了HostMonster——我花钱让他们运营我的网站,悲剧的发现我已经不再是我的网站的拥有者了:有人用他们的邮箱验证系统授权了我的域名转移给一个在GoDaddy(另外一个web注册服务,我也是他们的客户)上的私人账户。
如果你有一个依赖于URL的业务,你就会明白为什么这是一个非常让人沮丧的新闻:通过控制我的网站的域名,一个黑客就可以将这个网站完全拿下,或者将其重定向至任何地方。进一步讲,后来被证实这个黑客也同样控制了网站上的所有内容;他可以将我写的东西改道发送至任何他想要到的地方。
Ramshackle Glam可能“仅仅”是一个关于育儿、时尚和装饰的生活类博客,但这也是我花了五年的时间苦心经营的一个网站,而它却落到了某些不坏好意的人手中,这伤透了我的心。我本可以转移到一个新的URL,并导出我所都的内容到那上面(我确实做了备份),但这会让我损失大量的流量。这个网站可是我的主要收入来源,它关系到我的房子,我的两个孩子(另一个马上就要出生了),我这周即将要出版的一本书,和我在工商学院的老公,这可不是开玩笑。失去这个URL很可能会对我的事业和生活造成实实在在的打击。
这个事件之后的接下来几天很复杂,所以我会解释我所走的每一步到最后导致的结果(我会详细的描述细节,希望能为那些有类似经历的人提供帮助)。
从周日到周二,我花了大量的时间(而且很多都是在晚上)与GoDaddy和HostMonster进行电话沟通,而几乎所有的人都给了我同样的回答:“对不起,我们对此无能为力。”
HostMonster坚持认为由于他们不再控制这个域名,他们就没有什么能做的了。GoDaddy则认为由于该账户是私人的,并且那个人通过HostMonster的转移获取了域名的所有权,所以他们也不能做什么。
要说最后有什么进展:我引用了ICANN的关于域名的争端解决方案。这让我的案子升级了,但这也并没有导致什么实际行动。
原因在此:HostMonster的法律部门向我告知,他们启动转让纠纷需要以GoDaddy向我返还域名为前提,他们的“内部调查”才能找出证据证明在释放网站的过程中出现了哪些问题。换句话说,他们到时候就不得不承认他们把事情给搞砸了…而这将打开对他们的诉讼。
不用说,我不会再听什么法律部门的胡扯了。尽管乍一看大家好像都是清白的,但事实是我拥有的网站在没经我授权的情况下被转移了,要是我不启动一个耗时且费钱的诉讼我将什么也做不了,总之,这些都不能很快挽回我那个即将要被出售的网站。
所以这条道走不通了。
译者注:如果你的域名在未经你授权的情况下被转移了,让支持人员告诉注册热线,说你有一个TEAC的适用场景并且需要立刻联系主管人。
在我发现转让的那个早上我就联系了FBI。我当时觉得自己蠢爆了,居然打了这样的电话,但事实却是这是一个国际网络犯罪事件,而FBI正好是干这个的。何况这也是我的事业。可能放到大背景下我这种事情简直就是鸡毛蒜皮的小事,可对我来说却不是,它可支撑着我的家庭。
那么让我来告诉你吧:所有在过去这一周遇到的令人吃惊的事情,绝大多数都是来自FBI。那天他们没过多久就给了我回应,包括几次电话和邮件的沟通,还在当天就派了两名特工来我家和我进行了一次当面的交流,一直到昨天,他们又来了一次。除此之外,过去这周我接触的每一个特工都非常能干,而且很友善,很体贴,也很投入并且行动非常迅速。他们待我并不是一个简单的号码,而是一个活生生的人。总而言之,他们令人尊敬。
而我所期望的是在一个邮箱上留言并在某个时刻收到一封信件;当然我并不想要立马就看到一封调查报告。当然,在这里我也不打算写这些调查过程,因为它还没有结束(尽管我得到了他们的授权),但是我觉得非常有必要讲一下我是如何对FBI的回应感到惊喜的。
当前面的工作都在进行的时候,我也在想办法直接找那个要卖我网站的家伙要回它。
我可不想直接联系那个“卖家”,要是让那个家伙知道网站的真实主人已经意识到了这笔交易,他很有可能会向我敲诈更多的钱。所以我找了Anthony——是他看到的最原始的清单,而且他还在Flippa上面有个有效账户——让他联系“bahbouh”问他是否有兴趣私下交易。经过一番讨价还价,我们最终得到了同意,并最终决定在一个第三方的交易网站(Escrow.com)上面完成交易:当确认卖家将域名转移给我之后钱才会打给他。
正当我以为一切都很顺利的时候,在周二的晚上,那个卖家突然要求我立即把钱打给他(在收到网站之前)。我拒绝了,结果他声称他要将网站卖给另外一个人:“sorry,bye”
以下是我当时的想法:如果我不给钱,那肯定是收不回我的网站了。如果给钱,那么有一种可能是他拿了钱立马跑掉,但也有可能他会履行他的承诺,把网站还给我。这就像一场赌博…但显然我毫无选择。所以我最后还是同意了。
我花了20几分钟的时间坐在这该死的GoDaddy账户面前,等着看我的钱是不是打了水漂。
然后我的网站回来了。
我立即将这个域名(和我的其它域名一起)转移到另一个账户上,并锁定了它们。并致电汇款公司让他们终止交易。
RamshackleGlam.com又重新回到了我的怀抱,感谢那些不辞辛劳尽其所能帮助我的人。我的其它账户(包括银行账户及其它)都安全了。我最终也没有把钱给要回来,但那个小偷也没有得到它,永远都别想了。
这件事情总算结束了。该死的!
当然我会因为网站被偷而生气,但我对此无能为力。我之所以写这篇文章有一部分原因是我要让人们知道这种事情是确实会发生在我们每一个人身边的,也希望通过我的一些建议去帮助大家尽量避免悲剧的发生,但除此之外,真正激发我动笔的是我对GoDaddy和HostMonster的愤愤愤愤愤愤怒。我希望你们能明白。
这两家公司都没有质疑我的声明(有书面证据的支持)即我对网站的所有权,也没有怀疑网站在未经我授权的情况下被转移。而我仍然话花了几天的时间自己去找那个黑客——这几天足以让他做任何想做的事情——就是因为那群技术支持和监察员除了说“天啊,真糟糕。我们帮不了你”之外什么也做不了!
而当我找到真正能帮我的人——我是指那些能为我打一个电话或者按一个钮然后把我的财产还给我的人(亦或是简单的冻结它而避免被卖掉或摧毁),他们才不会跟我说这些。这帮人(指两家公司的人员)只会躲在他们的法律部门后面而不会做任何事,即使知道他们的不作为会逼我不得不跟一个罪犯做交易,或让我失去我事业的重要部分。
而黑客们也知道这些公司会这样做。
它们指着这活呢。
这是一个很严重的问题——一个犯罪组织不仅“无视”公司的政策,而且事实上导致了公司将自身的利益至于其所声称的对用户的“保护”之上。我能理解像HostMonster和GoDaddy这样的公司为什么会把精力都放在保护自己免受诉讼上吗?当然!但事实是他们并没有去“保护”他们的用户,而且刚好相反地加深了对他们所支持的那些小型企业和家庭的威胁。
这些公司知道如果他们堵住了那扇帮助的大门那些资产收到侵犯的用户将没有其他的依靠,他们不得不向罪犯妥协或是眼睁睁看着自己的事业——也很可能是生活——毁掉。这些公司也知道他们的不作为给那些依赖于用这种手段赚钱的黑客创造了良好的环境。而他们什么也不做。
这种情况必须得改变了。
在代理公司的支持人员必须要非常熟悉ICANN有关域名分配的相关条例,同时也需要在第一时间从客户那了解情况后就制定一个行动计划,别让客户一个又一个电话的催。
此外,建立一个TEAC**可以让争议账户立即被冻结,直到事情得到圆满解决。这也不会需要任何一方去承认罪责;基于这样一个尝试:当存在争议时,我们需要确保域名必须是被安全的转移。
1、要有一个非常非常靠谱的密码,并且经常更换。密码不要含有“明显”的单词(当然也不要有像“whitecat”或“angrybird”这样两个或多个连在一起的单词),而且应该包含大写字母、数字和符号。最好的密码看上去应该是杂乱无章的。
2、如果可以的话,最好使用一个单独的计算机(可以是个旧的或买个便宜点的)来处理跟财产有关的业务,比方说银行转账等等,否则的话指不准哪天你家小孩点了一个恶意链接就可能会招来黑客。
3、当你不再使用电脑和个人设备的时候就关掉它。
4、装一个杀毒软件(但是记住这也只能让你扫描到30-40%的病毒,所以哪怕是一次“彻底”的检查也不代表你的电脑是安全的)。
5、购买CyberRisk保险(可以点击链接查看更多信息,它可以确保你的利益不会因为网络攻击和数据泄露遭到大的损失)。
1、立即仔细的检查(并且截图)。不要删除任何的邮件以及其它信息,它们很有可能在后面起到重要作用。
2、立刻更改你所有的密码(包括——但不限于——域名注册商、网站托管、网站登录信息、邮箱、银行账户、无线家用电子产品、以及Apple ID)根据以下的规则。在情况还没有确定下来时我每隔几个小时都会改一次密码,并且在这之后我仍然会每隔几天都会改一次密码。
3、联系注册商,引用下面的ICANN方案,然后看是否能快速解决。要是你发现你自己走近死胡同也不要惊讶。
4、查看你的邮件的“过滤器”和“规则”(通常情况下,任何可能的设备都会被黑客推送邮件,比方说cetera)。
5、联系合适的执法部门(我联系了FBI是因为这看上去像是一个国际犯罪,至少也是个洲际犯罪——因为Escrow.com在加利福利亚而我在纽约)。
注意:每一种情况都会不同,而且我也不会全力推荐这些方法——虽然它们让我最终夺回了我的域名的控制权,但是让我不得已跟罪犯打交道。很明显这并不理想,而且也可能导致不可预料的结果。(尽管我老公说他也很想让大家知道我是个大坏蛋,但很明显这也不是事实…好吧,至少是在这件事上)
(完)
*Icann.Org全名为互联网域名和号码管理组织,负责管理并协调DNS。ICANN的域名争议解决方案基本规定了在域名纠纷的案件下,原注册商(“Losing Registrar”,在转移发生前的域名持有人,与之相对的“Winning Registrar”,指在转移发生后的域名持有人)需要立即启动紧急转移行动接触方式(“TEAC”)将球踢到立刻解决的方向上来。当初一得到这个信息,我的案子就立刻升级了。
**TEAC:由ICANN建立的一种接触方式,用于其它注册商和ICANN在必要时快速解决两个注册商之间的域名转移问题。该接触必须在调查开始四小时之内响应,尽管最终的解决时间会很长。
市面上的iPhone手机壳太多了,即使你每天换一个一年都不会重样,一般的手机壳都只是起到保护手机的作用,而有些会让你感觉很饿(详见《十款“美味的”iPhone5s/5c外壳、支架》),但是还有一类手机壳还具有保护之外的功能,这些设计师在这个小小的手机壳充分地发挥着自己的创造力,让我们看一下这八个有独特功能的iPhone手机壳吧。
Tasklab TaskOne iPhone5/5s手机壳
这个iPhone的瑞士军刀外壳内置22个不锈钢的工具,并有大的铝合金按键按控制它们,这样你就可以用你的iPhone来修理任何东西了。
Leverage i5 iPhone手机壳
这个由Graft公司设计的iPhone手机壳是世界上少有的模块化手机壳之一,它的后壳是可以更换的,可以换成耳机线缠绕器、信用卡或者是时髦的背板。
Pocketbuddy iPhone5/5s手机壳
这个外壳也可以当做一个“储藏室”、药片盒和卡片夹,该手机壳是由轻的聚碳酸酯制造,虽然这个后壳会让iPhone变得笨重和叮当作响,但是它还是比较实用的。
Sanwa PRJ016 iPhone4微型投影仪外壳
这个外壳带有1850mAh的电池,可以将你的手机充电到80%,同时它也是一个微型投影仪,可以投影电影、图片到你的墙上。
iPhone镜子外壳
女士们,有了这个外壳你就不用翻箱倒柜地找镜子了,这个可以当做镜子用的外壳价格不菲,高达86美元,难道是用了可以让人变漂亮的镜子?
SuperNova iPhone5打火机外壳
这个是吸烟者的梦想外壳,这个外壳可以当做打火机用,并且可以通过USB充电。
Yobrush iPhone5梳子外壳
该外壳在意大利设计,美国制造,这个可以用来理顺头发的iPhone外壳售价14.99美元,并有五种颜色可选。什么时候给男士也设计一个剃须刀外壳啊。
Mophie Space Pack iPhone5/5s手机壳
苹果配件的粉丝们应该同Tim Cook一样熟悉Mophie这个品牌,他们生产的这个Space Pack外壳不仅可以给iPhone5带来额外的1700mAh电量,同时还能扩充其内存空间,有16GB\32GB\64GB可选,虽然其笨重了一些,但是功能性还是不错的。
如今智能家居已经不再停留在概念阶段,高大上的科技公司都已经推出了自己的部分或全套的智能家居解决方案,不过就目前的现状而言,大多还停留在展厅阶段,还没有广泛的推广起来,有人说最大的问题是标准不统一云云,但在我看来,最大的问题在于两个方面,一个是价格,一个是操作的简便性,技术上的问题并不是阻碍智能家居推广的核心因素。
再来说说最近很火很惹人爱的微软小娜,Cortana。本人作为微软的死忠,作为一名靠.Net混饭的屌丝程序男,自然是有一部撸妹的,并且在小娜推送当天更新了手机,迫不及待地体验了小娜的功能,小娜会记事、会提醒、会唱歌、会说笑话、会学林志玲等等着实让我惊叹了一把,而且语气非常接近自然人的语气,不是那种生涩的机器语调。作为平时生活中不使用Android,Iphone的我,那晚想当然的觉得小娜应该就是当今世界上最好的语音助手了吧,怀着这样的心情,让小娜给我定了个闹钟,第二天早早起床迫不及待要向同事得瑟一把了。
第二天给同事小马看后,小马淡然一笑,拿出他的Android手机,默默的打开手机上的一个叫“灵犀”的软件,递给我说:“试试这个”。不试不知道,一试,心情还有点小低落,优越感顿无,怎么说呢,应该说除了在语气上小娜占上风外,在识准率,识别速度,各类功能应用上,小娜和“灵犀”已然不是一个档次,可能是小娜刚起步吧,希望以后可以不断完善。
看了一下“灵犀”官网,恍然大悟,这就是科大讯飞的产品啊,再次把玩灵犀,就只想真心点赞了,当时脑子里还飘过一个画面,未来能够对百度造成威胁的,很有可能就是科大讯飞,科大讯飞将把持移动互联网的使用入口!哦,那画面太美,不知李彦宏怎么想这个问题。
语音识别不仅仅会影响到人们使用手机的方式,在智能家居方面也大有可为,最直接的就是带来操作上的便捷性,试想,如果你在家时,你慢悠悠的拿出你的手机,慢悠悠的打开你的操作应用,慢悠悠的点击一个控制按钮,然后你的电视或者调动窗帘才执行你的命令,这图的个什么啊,还不如直接走过去手动暴力解决,而如果你在家的时候,只需要说“小文,换到体育频道”,或者“小文,打开窗帘”,然后安放在屋子里的中控盒子二十四小时随时听候理解你的命令,出门在外的时候,也只需对着手机说一声就行,这才叫易用的智能家居啊!
今天我们就采用Arduino开发板+Asp.Net MVC Api+Android版的讯飞语言SDK,实现用语音来控制一个小Led的实验。
关于Arduino
我的硬件准备
左边是Arduino主板,右边是网络拓展板,下边的是什么?哈哈,实验室小孟同学亲手给我焊接的小小Led灯,用来模仿开关性质的设备,这么小,看着都是泪水啊。组合后就是这么个样子了
以上总造价不超过100元。
Ardunio是一个开源的开发板,据说国外都是小朋友和艺术家都可以玩的开发板,简单易学,功能完善,目前也是非常火爆。事实也确实如此,看了几个示例工程后,有一定开发基础的人一看就知道怎么玩了。大部分web开发者基本上可以直接上手Arduino的网络部分的开发,看一遍示例保证你明白怎么个搞法,不信?那上个截图吧,这是Ardunio提供的IDE,内置了很多常用的开发场景示例,基本上在示例的基础上简单修改就可以完成一些简单的任务。
如果你是一个web开发者,好吧,看到菜单你也应该联想到你熟悉的网站开发模式了吧,是的,Arduino为你提供了客户端模式,服务端模式,还有些不常用的其他模式,让我们来看看Ardunio的WebClientRepeatping,这是一个客户端轮询服务端的方式,简单粗暴,通信稳定,容易理解和上手,下面是Ardunio提供的该模式示例代码
/* Repeating Web client This sketch connects to a a web server and makes a request using a Wiznet Ethernet shield. You can use the Arduino Ethernet shield, or the Adafruit Ethernet shield, either one will work, as long as it's got a Wiznet Ethernet module on board. This example uses DNS, by assigning the Ethernet client with a MAC address, IP address, and DNS address. Circuit: * Ethernet shield attached to pins 10, 11, 12, 13 created 19 Apr 2012 by Tom Igoe modified 21 Jan 2014 by Federico Vanzati http://arduino.cc/en/Tutorial/WebClientRepeating This code is in the public domain. */ #include <SPI.h> #include <Ethernet.h> // assign a MAC address for the ethernet controller. // fill in your address here: byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED }; // fill in an available IP address on your network here, // for manual configuration: IPAddress ip(192, 168, 1, 177); // fill in your Domain Name Server address here: IPAddress myDns(1, 1, 1, 1); // initialize the library instance: EthernetClient client; char server[] = "www.arduino.cc"; //IPAddress server(64,131,82,241); unsigned long lastConnectionTime = 0; // last time you connected to the server, in milliseconds const unsigned long postingInterval = 10L * 1000L; // delay between updates, in milliseconds // the "L" is needed to use long type numbers void setup() { // start serial port: Serial.begin(9600); while (!Serial) { ; // wait for serial port to connect. Needed for Leonardo only } // give the ethernet module time to boot up: delay(1000); // start the Ethernet connection using a fixed IP address and DNS server: Ethernet.begin(mac, ip, myDns); // print the Ethernet board/shield's IP address: Serial.print("My IP address: "); Serial.println(Ethernet.localIP()); } void loop() { // if there's incoming data from the net connection. // send it out the serial port. This is for debugging // purposes only: if (client.available()) { char c = client.read(); Serial.write(c); } // if ten seconds have passed since your last connection, // then connect again and send data: if (millis() - lastConnectionTime > postingInterval) { httpRequest(); } } // this method makes a HTTP connection to the server: void httpRequest() { // close any connection before send a new request. // This will free the socket on the WiFi shield client.stop(); // if there's a successful connection: if (client.connect(server, 80)) { Serial.println("connecting..."); // send the HTTP PUT request: client.println("GET /latest.txt HTTP/1.1"); client.println("Host: www.arduino.cc"); client.println("User-Agent: arduino-ethernet"); client.println("Connection: close"); client.println(); // note the time that the connection was made: lastConnectionTime = millis(); } else { // if you couldn't make a connection: Serial.println("connection failed"); } }
请从头到尾看一变,我保证如果你有编程基础看一遍也就知道的差不多该怎么玩了。无非就是定时轮询,请求服务器,对返回的字符串进行处理。下面的代码就是我在上面代码的基础上做的修改,实现了定时从服务器获取命令,如果是1则打开Led,如果是2则关闭Led。
/* Repeating Web client This sketch connects to a a web server and makes a request using a Wiznet Ethernet shield. You can use the Arduino Ethernet shield, or the Adafruit Ethernet shield, either one will work, as long as it's got a Wiznet Ethernet module on board. This example uses DNS, by assigning the Ethernet client with a MAC address, IP address, and DNS address. Circuit: * Ethernet shield attached to pins 10, 11, 12, 13 created 19 Apr 2012 by Tom Igoe modified 21 Jan 2014 by Federico Vanzati http://arduino.cc/en/Tutorial/WebClientRepeating This code is in the public domain. */ #include <SPI.h> #include <Ethernet.h> const int ledPin = 2; // assign a MAC address for the ethernet controller. // fill in your address here: byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xEF }; // fill in an available IP address on your network here, // for manual configuration: IPAddress ip(192, 168, 1, 177); EthernetClient client; IPAddress server(你的服务器地址); unsigned long lastConnectionTime = 0; // last time you connected to the server, in milliseconds const unsigned long postingInterval = 2L * 1000L; // delay between updates, in milliseconds // the "L" is needed to use long type numbers void setup() { // start serial port: Serial.begin(9600); while (!Serial) { ; // wait for serial port to connect. Needed for Leonardo only } // give the ethernet module time to boot up: delay(1000); pinMode(ledPin, OUTPUT); // start the Ethernet connection using a fixed IP address and DNS server: Ethernet.begin(mac); // print the Ethernet board/shield's IP address: Serial.print("My IP address: "); Serial.println(Ethernet.localIP()); } int iscoming=0; void loop() { // if there's incoming data from the net connection. // send it out the serial port. This is for debugging // purposes only: if (client.available()) { char c = client.read(); if(iscoming==1){ handle(c); iscoming=0; } if(c=='@'){ iscoming=1; } Serial.write(c); } // if ten seconds have passed since your last connection, // then connect again and send data: if (millis() - lastConnectionTime > postingInterval) { httpRequest(); } } void handle(char value){ if(value=='1'){ Serial.print("dakai"); digitalWrite(ledPin, LOW); } if(value=='2'){ Serial.print("guanbi"); digitalWrite(ledPin, HIGH); } } // this method makes a HTTP connection to the server: void httpRequest() { // close any connection before send a new request. // This will free the socket on the WiFi shield client.stop(); // if there's a successful connection: delay(1000); if (client.connect(server, 8009)) { Serial.println("connecting..."); // send the HTTP PUT request: //api/getcmd是请求的网站资源 client.println("GET /api/getcmd HTTP/1.1"); client.println("Host: www.arduino.cc"); client.println("User-Agent: arduino-ethernet"); client.println("Connection: close"); client.println(); // note the time that the connection was made: lastConnectionTime = millis(); } else { // if you couldn't make a connection: Serial.println("connection failed"); } }
Android客户端
关于科大讯飞的介绍,自己去官网看吧,深耕语音领域二十年,不是一般企业可以超越的,很好很强大。申请成为开发者,创建应用,开通服务,下载SDK(我下的是带UI的SDK),参考SDK的代码就可以开始自己的开发了。话不多说,直接上核心代码
/** * 听写UI监听器 */ private RecognizerDialogListener recognizerDialogListener=new RecognizerDialogListener(){ public void onResult(RecognizerResult results, boolean isLast) { String text = JsonParser.parseIatResult(results.getResultString()); mResultText.append(text); mResultText.setSelection(mResultText.length()); sendmeg(text); } private void sendmeg(String msg){ AsyncHttpClient client = new AsyncHttpClient(); try { String url = "http://服务器地址/api/values/"+msg; client.get(url, new AsyncHttpResponseHandler() { @Override public void onSuccess(int statusCode, Header[] headers, byte[] responseBody) { super.onSuccess(statusCode, headers, responseBody); Toast.makeText(CmdActivity.this, "请求成功" + new String(responseBody), Toast.LENGTH_SHORT).show(); } @Override public void onFailure(int statusCode, Header[] headers, byte[] responseBody, Throwable error) { // TODO Auto-generated method stub super.onFailure(statusCode, headers, responseBody, error); } }); } catch (Exception e) { } } /**
Asp.Net Mvc Api
服务端的代码相对就简单了,我这里创建了两个控制器,一个负责接收手机端的命令,存入数据库,一个负责返回Arduino的网络请求,将命令代码返回。虽然觉得没必要,还是上一下代码吧
接收手机端传过来的命令
// GET api/values/5 public string Get(string id) { ardunioEntities a = new ardunioEntities(); string tempid = "123456789"; cmd c = a.cmd.Where<cmd>(n => n.ardunioid ==tempid).SingleOrDefault(); if (c == null) { c = new cmd(); c.ardunioid = tempid; c.command = "0"; c.status = "未读"; a.cmd.Add(c); } if (id.Contains("打开")) { { c.command = "1"; c.status = "未读"; } } if (id.Contains("关闭")) { { c.command = "2"; c.status = "未读"; } } a.SaveChanges(); return "接收成功!"; }
返回命令给Arduino的请求
public string Get() { ardunioEntities a = new ardunioEntities(); string tempid = "123456789"; cmd c = a.cmd.Where<cmd>(n => n.ardunioid == tempid & n.status == "未读").SingleOrDefault(); if (c == null) { return "@0"; } c.status = "已读"; a.Entry(c).State = EntityState.Modified; a.SaveChanges(); return "@"+c.command; }
效果实现与总结
对着手机说“打开灯泡”,然后灯就亮了!话说程序员看到这一幕,兴奋之情溢于言表啊。(请忽略旁边的美桃,女友由于对我崇拜的五体投地给我洗的,嘻嘻)。
这篇文章只是一个小实验而已,后续还可以做很多有趣的玩法,比如在这个程序的基础上开发语音控制电动窗帘的的工作(目前正在玩耍…),比如直接弄一个Android开发板或者使用语音模块做一个中控,二十四小时伺服,回到家直接说话“小文,换台到体育频道”等等等等,现有的智能家居产品都可以把语音技术集成过来,相信会大大增加智能家居的易用性。
本月科大讯飞即将召开智能家庭产品发布会,我们实验室也申请了票,期待看到高大上的东东开开眼。。。。一场革命或许已经来临。
看完了就默默点个赞吧:)
一百元的智能家居——Asp.Net Mvc Api+讯飞语音+Android+Arduino,首发于极客范 – GeekFan.net。
这段时间,存储圈内对宁夏银行7月系统瘫痪事件讨论热烈,为什么作为在IT基础架构和系统建设都相对严谨和严格的银行会频频出现宕机等问题。可能大家还记得2013年6月工行和中国银行的两次事件。
“6月23日,中国工商银行系统瘫痪导致全国多地工行系统柜面取款、ATM、网银等无法办理。24日,中国银行系统也短暂瘫痪,一时间金融业钱荒,银行股价暴跌,金融市场流动性紧张。”
对于去年发生的银行系统问题,网友讨论也比较多,归结起来,还是系统维护方面纰漏。
对于今年宁夏银行的系统瘫痪事件,官方消息如下:
银行二部(2014)187号正式发全国文件,对宁夏银行事故的描述大致如下2014年7月1日,宁夏银行核心系统数据库出现故障,导致该行(含异地分支机构)存取款、转账支付、借记卡、网上银行、ATM和POS业务全部中断。
经初步分析,在季末结算业务量较大的情况下,因备份系统异常导致备份存储磁盘读写处理严重延时,备份与主存储数据不一致,在采取中断数据备份录像操作后,造成生产数据库损坏并宕机。因宁夏银行应急恢复处置机制严重缺失,导致系统恢复工作进展缓慢,直至7月3日5点40分核心系统才恢复服务,业务系统中断长达37小时40分钟,其间完全依靠手工办理业务。
该事件的根本原因是在于该行安全生产意思薄弱、应急管理体系缺失、应急处置过程混乱。该行核心系统数据库版本严重老化,且2007年至今未购买核心数据库的维保服务,核心系统长期缺乏维护,事故发生后,无法获得系统供应商及时技术支持。系统恢复过程中,缺乏应急预案和准备,长时间无法实施有效处置,导致业务恢复缓慢,对银行运营产生较为严重影响。
对于这个事件的发生,网上论坛有网友开始怀疑当时在2010年进行的高大上的宁夏银行800公里灾备演练,当时号称区域性商业银行的第一次。
查阅资料,回忆当时演练现场,时任宁夏银行信息技术部总经理的王春表示,随着区域性商业银行的跨省发展,实施灾难备份系统已经势在必行,宁夏银现在实施成功之后,实现了宁夏银行所提出的“提升业务连续性,提升业务管理水平”的战略目标,做到了核心系统的灾难恢复的“全范围覆盖”。
其中演练主要包括了两种“突发情况”:数据库系统瘫痪和数据中心发生火灾——前者模拟宁夏银行生产中心数据库系统发生崩溃瘫痪的严重故障,测试根据需要启动应急响应流程,进行本地的数据库系统恢复;后者模拟生产中心发生大火,测试根据应急流程进行从银川到西安的异地切换。
整场演练全部在真实的生产环境进行,步骤衔接流畅,而且恢复速度让在场观摩人员无不惊叹,两个场景的演练时间加起来不过10分钟:第一场数据库瘫痪演练,4分钟成功恢复完成;第二场火灾演练,6分钟系统异地切换成功。
当时的IT环境是IBM AIX UNIX、Informix、EMC DMX800。
以上是宁夏银行2010年灾备演练情况的存储在线当时报道摘要,在整个演练过程中,飞康CDP起到了举足轻重的作用。为此,网友在论坛上评论说,“停止备份系统,竟然会导致主数据库损坏,看来FalconStor CDP ,不靠谱啊。”也有网友评论道:“系统维护没有跟上,再好的方案也会有问题。”
对此,阿明认为:宁夏银行本次事件发生的根本应该更多归咎在系统维护上,很多时候,大型企业或银行做过周密的预案或灾备演练之后,就放松了对系统的整体维护,这是发生问题的主要原因所在。为此,宁夏银行官方表态也是“2007年至今未购买核心数据库的维保服务,核心系统长期缺乏维护,事故发生后,无法获得系统供应商及时技术支持。”(要知道,数据库厂商很牛叉,这是圈内人士有目共睹的,既然长期不交“保护费”,自然得让你痛一下,痛定思痛之后,你就得乖乖上交数据库“保护费”了。)
说完今年宁夏银行这次事件之后,我们再回看一下去年工行、中行出现的系统问题,当时CSDN的夏梦竹同学找到了一位叫jaccc的IT顾问,这位顾问的看法分析很透彻,也很中肯,对当前宁夏银行出现的系统问题也有借鉴意义,大家不妨“温故知新”:
为什么IT系统会出问题?
1)现代IT系统非常复杂,当系统大到一定的程度,总会有失控的状况。世界上就从来都没有过没错误的复杂程序,问题只在于这个错误你有没有碰上而已。银行的系统是由很多不同软硬件厂商的产品拼在一起运作,复杂程度远超过普通家用电脑,这么简单的家用电脑还会死机呢….而且系统复杂到一定程度,就不是人多或者钱多就能完全解决问题的了,推荐看看《人月神话》。
2)要尽量不出问题,要钱,很多钱(比如中型银行建设一个过得去的容灾系统要上亿)。但出问题只是“有可能”,花的钱可是实实在在的。换了你是领导,你也不会无限制的向里面投钱。
3)稳定运行的最好的办法之一是不对系统进行改造。由于有新的业务要求,系统确实要不停的升级,很多银行每周都在升级,每次变动对系统的稳定运行都是一个挑战。你每天走路有时候还会摔倒,只要一动作,就有出错的可能,这就是科学。
为什么会大面积的出现问题?
因为三个字:大集中。最早之前,银行系统还没联网,一出问题只是某个区或者某个市。最近十多年银行业都在搞大集中:五大行除了中国银行之外的四家都已经完成了大集中。
为什么这种故障好像越来越多了?
以前没有微博没有微信,只要你不是倒霉的用户就不会知道出过问题。我要不是上微博也不知道工行出这么大的事。以前没有网银没有淘宝,你半夜不会买东西刷卡。用行话来说就是以前没那么多7*24的需求(一周7天,一天24小时运行)。
为什么没有应急预案或者应急预案没有起作用?
与电信运营商,政府行业,普通企业相比,银行是中国IT业中IT基础最好,最严谨的行业。比如有的银行还要求厂商维护人员不能操作,只能银行员工操作。
大的变更一定会有预案,甚至换个硬盘,改个IP这种做过几百次的操作都会有预案。但预案与真实一般都有相当差距。上面已经提到系统非常复杂,可能出现的问题如果真全部写下来,可能有几百几千分支。而且,系统的故障并不会根据你的应急预案来发生。
只靠应急预案真解决问题的概率比拿着《泡妞指南》泡到美眉的几率还低,应急预案的最重要的作用是应付上级监管,根据应急预案搭好可能需要的应急软硬件环境,大致理清概要思路,以及锻炼团队。真有复杂问题,还是靠牛人现场解决的多。
平心而论,工行的IT能力和运维水平在四大行里面不是第一就是第二了(不同的省份略有不同)。
为什么要停几个小时这么久?
先说定位问题的时间:从发现问题上报到IT信息中心(或者在监控系统发现问题),IT中心的人开始查系统,定位故障原因,如果定位不清还要找相关的软硬件人员到场或者远程网络支持(基于安全原因,银行大部分都不能远程网络查看系统,维护人员到数据中心也需要时间,如果还堵车…..),找出问题的根源,一小时算超快的了。类似你莫名高烧,到底是哪个器官出问题,去医院做检查做判断总需要时间吧???解决问题就更不好说了,其实和大家的电脑一样,往往重启是最有效的方法,但很多业务系统部分出现问题是不能重启的(可能会影响别的业务系统)。至今国外各大厂商的标准维护合同,绝大部分都没有承诺修复时间。??根据手头的一份略过时的银监会突发事件应急管理规范:一个省停业6个小时以上才算I级特别重大突发事件,3小时是II级,半小时以上是III级。以管窥豹,落叶知秋,几小时真不算什么。
不是说有容灾和备份吗?为啥不快速切过去就好了?
这是一个很常见的误解:出了故障的时候,有备份系统和容灾系统就可以很快恢复业务。一怀愁绪,几年离索,错,错,错。
先说备份系统,常规备份系统是不能运行业务程序的:备份一般只是把数据保存多一份或者几份,一般是在丢数据的时候才用来恢复,而且恢复的时间很多都在几小时以上。类似大家手头只有一个avi文件,没有播放软件也没法看啊,只不过银行的“播放软件”要架设起来就复杂了…..
再说容灾系统,强调一个连很多IT人都不清楚的事实:银行容灾系统不会轻易启用整体切换!前面已经说了,IT系统已经这么复杂了,容灾系统相当于再复制一套,复杂性增加了不止2倍。切换起来是非常麻烦,非常伤筋动骨,惊动非常多人力物力,不是碰到大灾大难(比如地震,机房着火,恐怖分子爆炸之类)不会进行切换。
当然平时会进行容灾切换演练,但一般不会拿核心系统来真实切换,原因是有风险。以前也出现过华东某省级行(还是某省某运营商?记不太清楚了)切换到了容灾中心后切不回生产中心的悲催惨剧。最近西北某地农信社成功的把核心生产切到了容灾系统上,比较不简单,不过这毕竟是独立法人的小银行,大行不是这么个玩法。
这么说吧,迄今为止,五千年来,四大行的核心容灾系统都没出现过需要两地切换的重大灾难的场景,和准备买iPhone6的肾一样,有两个,没切过,但时刻准备着切….其实个人不太靠谱的猜想,就算停个三五天,各大行都不会愿意全业务切换,今天这种停几小时的算个毛有啥好切的,赶快修好系统就是了。
另外,看到有不少评论说“没人敢担风险切换到灾备节点上”。其实一般是这样的:建好容灾系统之后往往都会写一套DRP(灾难恢复计划)或者BCP(业务连续性计划),就是容灾系统启动的流程方案,里面会规定好什么场景下由什么人拍板切换到灾备中心,一般不会真出问题才临时来拍脑袋来想,(当然临时调整也是有可能的),也不是谁说切换就谁去背黑锅。
当然,大部分的小故障会通过双机切换,快速重启部分应用的等方式解决。但很快解决了,你们就意识不了其实已经出过故障了嘛,是不是有点人择原理的味道?……但总有无法快速解决的问题。补充一句,当然业界有很多新技术已经把备份高可用灾备等揉在一起了,但银行业应用还不多,这里就不展开了。
升级要失败,快速回退不就好了嘛?
一个常见的误会:升级不成功马上回退啊。这是很理想的情形,现实的情形是这样的:
1)技术上无法回退。我举个例子,你从winxp升级到win7,升到一半,蓝屏了,或者报某个文件包找不到了。你会回退吗?
2)回退的风险更大,升级过程中很多配置,软硬件都改掉了,改不回来了,或者耗费的时间比继续升级更大。
3)硬着头皮冲过去就算超了时间的还能找个理由掩饰一下,回退了就确定升级失败了,下次继续升级的政治压力会很大。
所以实际情况中,除非可以很干净利落的回退,而且实在升级无法成功,才会回退。真的升级切割出问题会进行回退的不超过5%。
周日到底出什么问题了?
在中国,无论出现什么IT系统问题,对外宣称总是电脑系统升级。我以前就有个变态的习惯在处理故障中途如果有空(等别人处理或者等系统回滚什么的时候)就打呼叫中心电话,听那些美眉怎么解释系统用不了了。清一色的,100%的,毫无例外都说是电脑系统升级。当我再问为什么大白天升级啊?为什么之前不通知我们客户啊?这时候就能体现呼叫中心的培训能力的差距了。
回到今天这事,别说我现在还没去八卦,就算知道了也不可能公开说,这是职业操守的问题。而且有的故障的真相是查不出来的(你知道你每次生病的确切原因吗?),有的故障是查出来但不能实说(一般故障分析报告书很快就能到竞争对手手中)。这种情况下,怎么去写故障分析报告,是一门艺术:真相不重要,达到目的才重要。这个目的有可能是大事化小,有可能是小事化大,水深着呢。
这几天微信圈里,继续在讨论宁夏银行系统问题,据圈内人士透露,银监会正在查这件事情, IBM和飞康都在等待结果。相信事实的真相不久后将浮出水面。
银行系统相对复杂,银行IT建设也相对要求严格与苛刻,在建设好了IT系统之后,只是万里长征走了第一步,后面更为重要的是长期的运行与维护,包括核心系统、数据库的后续维保等,因此,这也是为什么某国内著名厂商舍得将设备免费送给银行测试一年多,希望得到银行采购后长期使用,只有使用之后才有价值,一旦使用了,后续的服务收费才是真金白银。
因此,不管是什么情况,不管遇到什么变化,只有长期的服务品质不变,长期保持演练时的心态不变,即便遇到突发情况,也会比想象的情况要好一些。
全球著名开源硬件公司 Adafruit 在今年6月份举办了树莓派摄影挑战赛,在历经了两个多月的角逐今天该挑战赛的冠军终于诞生,冠军能够获得价值$314的 Adafruit 商城代金券,而其他14名获奖选手获得$30代金券……
本次大会公开向社交媒体用户开放,用户只需要使用树莓派的摄像头拍摄照片然后打上#RPPA标签上传到社交网络就能参与本次活动,本次活动收集了大量的图片,经过 Adafrui t最终评定下面这张全景图成为了为本次冠军。
本次图像挑战赛的冠军,利用乐高和树莓派打造的Panobot拍摄
一盏好看的台灯,会给房间带来不错的视觉效果,比如这款“3D”立体感的台灯——BULBING。
BULBING是一款非常挑战大脑和眼睛的LED错觉台灯,它看似是个立体图案,实际上是一块厚度仅有5毫米的有机玻璃,每一块都通过激光雕刻出三维线性图案,点亮后会出现3D立体视觉效果。
它有各种图案,如气球、灯泡、骷髅头等形状,灯的底座是桦木胶合板,想要啥图案就换上相应的玻璃即可。特有的节能技术使灯泡寿命也变得很长,并且不会过热,换灯泡很容易。
目前,BULBING已在众筹平台Kickstarter上筹得超过十倍的资金,一个灯座加一个灯的价格约为30英镑(约318元),图案不同价格也不同。
首先用手机开闪光灯,定位芯片的位置,在用笔画出芯片位置。卡内构造是一个比较大的线圈连接一个小小的芯片,最重要的就是那个芯片,通俗来讲就是无线电波通过线圈激活IC卡芯片在将IC卡芯片数据发射出去或接受读写器的数据。
因为最开始的时候找不到剪刀只能用网线钳了,哈哈。
然后再将剪好的卡芯片放进了丙酮,就是溶解PVC的药水。泡几个小时就能把白白的外壳泡烂。注意不要直接用手触摸这是有毒的,最好用镊子抓出来。
把多余的塑料和原来的线圈用刀片分开。
然后用烙铁把锡和自己做的线圈焊接芯片上,放在IC卡器上测试是否能感应到(PS线圈太小的话很有可能感应不了的!!!!!)
把线圈和芯片放进手环U盘槽里。
假如说市面上的智能手环(如小米)内置IC芯片然后通过大杀器acr122u,或者用radiowar团队Proxmark3 复制到手环上刷各种卡时候直接上了一个档次.妈妈再也不用担心我的卡丢掉了!
一说到@radiowar团队就想吐槽一下.WiFiPineapple卖的好贵撒。然后我通过自己的努力以及某基友的帮助终于吧WiFiPineapple系统移植到自己屌丝机HG255D上karma居然不能正常工作了。这是芯片问题么?还是移植不完美.
我记得在两年前,两步验证(2-Factor-Authentication, 2FA)变得非常普及并且在各大主流网站(Google, Facebook, Yahoo 等)广泛应用。那时我十六岁,天真的我想不通为什么这么天才的想法之前没有人想到过。在那时,我认为2FA就是一个可以保护自己的金色盾牌,它可以抵御那些最复杂的网络欺诈。
当两步验证依旧是你所使用的主要应用的金色盾牌时,我开始列出以下文档—我是如何用一系列的方法来绕过Google, Facebook, Yahoo, LinkedIn的两步验证以及几乎任何向语音信箱发送两步验证标记的服务的。
注:超过959万的澳大利亚Optus公司的手机用户会受到我下面所说的语音信箱的攻击。这959万使用两步验证的用户中任何一人,都很有可能会受到我下文所说的绕过两步验证的攻击。
当将两步验证看做一个整体时,从一个攻击者的角度看来仅仅有这些东西。在我第一次对两步验证的分析中,我经常在想是否可能进行以下的攻击:
以上技术都是攻击的有效手段,但是通常没有人会使用,因为这些手段太老套了,已经有了相应的防御。
在我经历过这个初步测试的阶段后,我列举了更多的东西,意识到一定有一个弱点能够让我们完全避开两步验证。这个弱点就是语音信箱。
有些读者可能会知道为什么语音信箱容易出问题,因为他们可能听说过2009年英国某些名人的语音信箱被黑客攻击的丑闻。他们进入语音信箱的方式相当让人担心,分为以下几种:默认的语音信箱PIN,未设置语音信箱PIN以及拨打自己电话的方法—都在Sophos Security中写到过。
在另一起类似的事故中,Cloudflare公司的CEO也是通过语音信箱绕过两步验证的受害者之一。然而,在这一次事件中,攻击更为复杂,要求攻击者设法使得AT&T(美国电话电报公司)的员工将Matthew Prince的语音信箱重定向到一个假的语音信箱处。
那些我用来登录到语音信箱账号(仅限于那些已经授权的用于测试的账号)的方法在很久以前我就写过了,并且执行起来并不难。
虽然进入语音信箱的方法受到越来越多的关注,但是这一方法并不适应部分国家的大多数网络。
作为一个攻击者,你需要知道四件事情,才能进入被攻击者被两步验证保护的账号中。它们包括:
在现实中,作为一名富有经验的攻击者,以上四点要求并不难达到。获取用户名和密码可以通过任何传统的方法做到,获取关联的手机号码在现在也并不困难。
手机号欺诈服务,比如Spoofcard(可以显示虚假的手机号码的服务)仅仅花费十美元就可以多次使用并且可以获得手机语音信箱的端点。另外,如果想要避免Spoofcard的登记,他们可以雇佣VoIP服务,打电话人的ID可以是虚假的,作用是一样的。
攻击第一阶段:
由于被攻击者正在跟攻击者通话,两步验证的电话服务就会立即将验证码发送到被攻击者的语音信箱里。
这是第一个漏洞。我是这样认为的,大家或许不同意,但是我想不出别的使验证码发送到语音信箱的方法了。由于这种方法的易用性,这样做的时候有一点危险。根据过去几年的语音信箱黑客的情况来看,通过向语音信箱发送pin,看起来好像不用管下面我将要告诉你们的第二个漏洞,直接就可以绕过两步验证。
当被攻击者没有接两步验证的电话时,两步验证的pin码也会被发送到语音信箱中。
绕过两步验证的第二阶段实际上依赖所谓的语音信箱窃听/电话窃听。
上图是应用于澳大利亚的和我的整个第二部分的方法,它只是和上述移动服务运营商相对应(在未发现其他的运营商之前)。在图中,我展示了我认为容易受到语音信箱攻击的网络以及其他部分或者完全不易攻击的网络。
另外,我必须指出,英国的Three 和EE网络也很容易通过电子欺骗受到语音信箱攻击。这一点最近被英国的The Register证实。
完全易受攻击的:
Telco公司的自动数字识别(ANI)或者是Caller ID是用来判断呼叫者是否是语音信箱账户的合法拥有者。如果ANI或Caller ID和账户持有者相匹配,在进入语音信箱账户时系统就不会要求输入pin码。
在美国,可以不通过Caller ID来请求pin码,然而在澳大利亚,据我所知除非服务提供商从他们的服务上来解决问题,否则没有可以预防语音信箱受到欺诈攻击的办法。
为什么目标号码是+610411000321:
注意:Optus语音信箱中任何易被攻击的端点都已经被固定了,包括我曾经用来绕过他们的端点。
部分易受攻击/不易受到攻击的:
我说过Telstra, Virgin和 Vodafone是部分易受攻击或不易受到攻击的,因为我并没有机会彻底测试攻击语音信箱的能力。然而我的确知道:
你如果不确定你现在使用的是哪种网络,或者你想检查一下自己是否是易受攻击的,我的一个朋友((Aleksa Sarai)写了一段程序通过你的手机号来确定你的在澳大利亚的移动网络。你只需输入你的手机号然后点击check就可以了。
你可以在Github上找到检测移动网络的代码。
谷歌是两步验证的早期使用者,它的全部服务都使用了两步验证。如果你所选择的电话公司在语音信箱安全方面管理非常严格的话,谷歌现在使用的两步验证系统还是非常安全的,但是谷歌所提供的两步验证可以绕过的概率其实是非常高的。
假设你现在已经阅读了上文中提到的破解步骤,使我能够绕过两步验证的Google, Facebook, Yahoo 等其他主要的支持两步验证服务的漏洞是当你不在线时,两步验证会发送两步验证标记到你的语音信箱中。单看这一点,这是个很小的问题,但是站在安全的角度上来看,这个漏洞是非常明显的。
语音信箱并未实现全球统一化,它的安全性也是一样的。每个电话公司都运行他们自己的语音信箱管理服务。
如果你想看我和谷歌对话的全部邮件记录,你可以点击这里: google.pdf。
注意:通过这个绕过两步验证的方法并不能不动声色地来盗取谷歌账户,因为很有可能一旦登录到支持两步验证的谷歌账户中就会自动向用户发送信息。在前面的步骤中你必须选择拨打电话的方式然后继续破解。这样很可能会引起受害者的警觉。
他们对我最初的破解的回复如下:
嗨,
谢谢你的错误报告。我们已经看了你提交的数据并且确信这不是谷歌产品的安全缺陷。这个攻击假设了一个易被盗取的密码,并且实际的易被攻击性是由于电话商提供的对语音信箱的保护不够充分导致的。请直接向电话商报告这些。
Regrads,
Jeremy
虽然我知道语音信箱系统不够安全这是电话商的错误,我仍然觉得谷歌把两步验证标记发送到语音信箱这一做法有缺陷,这是个很危险的做法,并且大部分2FA提供商都不这样做。因此,我作出了以下回复:
Hi, Jeremy,
当我发现这些漏洞时,我完全理解并且我也和电话商在不断联系。
澳大利亚和英国的大部分电话商都只要求一个并未锁定的四位的pin码。然而,使用VoIP服务以及Asterisk AGI(http://www.voip-info.org/wiki/view/Asterisk+AGI)的一些脚本就在一天内可以进入语音信箱的账号。
实质上,虽然你说的“这一定是电话商的问题”是对的。这不仅意味着在最近四年里(或更多),在澳大利亚使用Optus提供的服务的人(澳大利亚的大部分人)是非常容易受到绕过两步验证攻击的,这也意味着许多国家的电信商也非常容易受相同种类的攻击。
我觉得把这个问题说成是一个纯粹的电话商的问题,会有点忽略掉两步验证并没有很好的理由来发送到个人的语音信箱里这个事实。另外,先不考虑由于外部的易受攻击性使得谷歌的两步验证可以被绕过这件事,谷歌这样做事实上还是会把敏感信息交给一个可能易受攻击的终端。
另外,在做了一些调查后,我能够跟Duosecurity 和Authy的专门负责两步验证的工作人员交流了。当我第一次发现谷歌发送两步验证的标记到语音信箱时,我非常肯定像Duosecurity 和Authy这样的两步验证服务提供商也是易受攻击的。但是我错了,他们并不会将两步验证标记发送到语音信箱。他们是这样处理这个问题的:
请让我知道你对此有何看法以及谷歌是否有应对这种情况的措施。十分显然这个问题是由于电话商的不安全的语音信箱服务造成的,然而这并不是谷歌或者是我可以控制的因此使得两步验证在某种程度下易受攻击。
两步验证对于那些将Optus手机号和谷歌账户绑定到一起的澳大利亚人来说是无效的,并且至少近四年是无效的(假设其他人已经知道Optus语音信箱的漏洞了)。
谢谢,
Shubham
谷歌很快回复道:
嗨,
感谢你解释这个问题的潜在作用域。
由于这并不是我们2SV系统在技术上的缺陷,我不确定我们能够做些什么来应对这个问题。但是我已经把一个bug记录下来并且会让团队成员来看一看。
Jeremy
假设这个问题不能修正,因此目前解决这个问题的最好方法就是禁用通过短信或者电话的两步验证,启用谷歌的两步验证,如果你绑定到手机就可能容易受到攻击。
这个设置方法可以在下面找到:https://accounts.google.com/b/0/SmsAuthSettings
另外,当不确定时,可以通过下面的方法通过两步验证来还原谷歌账户:
https://support.google.com/accounts/answer/183728
https://support.google.com/accounts/answer/152124
我自己还原账户时失败了,我的朋友也是一样的。然而一段时间以前,Matthew Prince (Cloudflare)成功地还原了账户。
状态: 仍然易受攻击/并不会修复 | 揭露时间: Wed, Apr 30, 2014 at 11:49 AM
———————————————————————————————————————————————————–
因为我的一个失误,在这次揭露之前我刚刚意识到可以用攻击谷歌的类似方法来攻击Facebook。Facebook称他们的两步验证“Login Approvals”是一个类似于登录通知的特点,但是有额外的安全步骤。
用和上述步骤相同的流程来破解,同样可以绕过Facebook的两步验证。
让Facebook发送验证码到语音信箱的步骤如下:
另外,除了上述模式,也可以通过向”https://www.facebook.com/ajax/login/approvals/send_sms“发送表单数据为”method_requested=phone_requested”的请求。
这个方法是通过截取最初发送短信的请求,将”sms_requested”替换为”phone_requested”来实现的,它是最有效地方法。
你可以在这里找到我向facebook 披露这个漏洞的完整版本facebook.pdf.
然而,他们对此的回复如下:
Shubham 你好,
我们目前暂时禁用了通过电话来发送登录验证码的功能,未来还将进一步研究。我们的计划是当可以实现用户在通话中的交互时再重新启用这一功能,这样就可以防止我们将验证码发送到语音信箱中。
Neal, Facebook 安全团队
Facebook在我绕过两步验证之后迅速的禁用了部分功能,他们非常迅速地采取了措施,至少是临时的措施。
状态: 不再会受攻击| 揭露日期: Sun, May 11, 2014 at 10:28 AM
正如谷歌和Facebook一样,当被攻击者没有接到系统自动来电或者占线时LinkedIn就会将两步验证码发送到被攻击者的语音信箱中。
LinkedIn处理地很好,他们关闭了通过电话发送两步验证码这个功能,直到他们可以和第三方的两步验证提供商来修复这个问题。
你可以在这里看到我和LinkedIn发送的所有邮件linkedin.pdf.
他们对这一问题的主要回复如下:
Shubham,你好
感谢你在公开这个问题之前告诉我们。
虽然这个问题对我们的影响是有限的,但是我们暂时关闭了发送两步验证码的语音的功能。我们正在和第三方协商解决这个问题。在问题修复后,我们会考虑恢复语音功能。
谢谢,
David
状态: 不再会受攻击| 揭露日期: Wed, Apr 30, 2014 at 4:15 AM
雅虎支持两步验证的主要服务也容易受到我上文中所说的攻击。事实上,对支持两步验证的雅虎账号的攻击会更严重因为攻击者并不用担心被攻击者知道他的账号已经登录。
通常支持两步验证的网络应用会在有人登录后发送短信通知。然而,当登录到雅虎账号以后,并不会发送短信,并且可以选择通过短信或者是电话来发送验证码。
由于攻击者不用冒着被立刻知道的风险,攻击者会更有可能登录更长时间。
当我揭示这个问题14天后,雅虎仍然没有回复,因此他们仍然很容易受到攻击。
在这里可以看到我揭示雅虎漏洞的全过程yahoo.pdf
状态: 仍然易受攻击/尚未回复 | 揭露日期: 2014-04-29 13:46:16 UTC
我很快假设那些提供两步验证的服务都一定是易受攻击的。然而,我是错误的—因为他们知道这个事实并且对发送pin码到语音信箱这个问题有着长远考虑。
你可以阅读我和Authy 及 Duosecurity的来往邮件 authy.pdf and duosecurity.pdf
这两个服务提供商都在24小时内给了我回复,并且他们对此都非常热心。
Authy | 状态:不易受攻击 | 揭露日期: Wed, Apr 30, 2014 at 1:27 AM
Duosecurity | 状态:不易受攻击 | 揭露日期: 2014-04-29 13:46:16 UTC
Authy会发送空白的语音信息,Duosecurity会在验证前要求用户的交互操作。
感谢Authy 和Duosecurity!
广大的读者你们好,我校对了上面的一些信息,包括世界各地各种移动网络的终端。
由于我不能查对 Telco 的海外电话商,我 知道世界各地的人都关心他们的电话商是否是易受攻击的。
要看你是否可以通过欺诈服务不用pin码就进入语音信箱,仅需要跟着上午所说的流程来,将终端号码改为你的电话商用的。
如果你的电话商也容易受到攻击请通过邮件或者是评论来告诉我。
应对这个问题并没有想象中的那么简单,这要求重新构造两步验证的电话通知。这里是一些建议的解决方法(在给那些公司的邮件里都提到过):
最后也是最重要的:
我和Ben Grubb一起工作很愉快(The Sydney Morning Herald and The Age的编辑),他帮助我把这些问题反映给Optus并且在此过程中非常热心也很有合作精神。
当我第一次发现Optus是易受攻击的时候,我的研究让我注意到这篇文章thisIs your Voicemail Hackable? Optus, Telstra and Vodafone respond
Optus很严肃认真地对待顾客的隐私。顾客必须设置一个独一无二的PIN码来激活他们的语音信箱系统。当他们的PIN码被用户服务重新设置时,Optus会建议他们重新设置一个只有他们自己知道的PIN码。
至于欺诈服务,我们正在寻求多种方式来强调这一正在出现的整个工业界的威胁,包括技术上的解决途径以及进行对顾客的教育。
这篇文章的日期是2011年7月22号,距今已经三年了,令人惊讶的是这个问题依然存在并且是一个关于隐私的巨大隐患!
我和Ben在2014年3月2日将这个问题告诉了Optus,从那以后七天左右Optus修复了这个问题。
然而,在修复以后几个小时之内,我能够又一次找出不用pin就可以进入任何Optus顾客语音信箱的方法。Optus正在研究这样的绕过方法,但是在没有其他公告之前,如果你使用Optus或者其他使用他们网络的代理商的服务,请假设你的语音信箱是不安全的,比如Vaya, LiveConnected, Amaysim, Exetel, Yatango 等等。
正如同我之前对于captchas, SSRF和 rate limiting的迷恋一样,我认为语音信箱和移动网络的安全会占用我未来的许多时间。
每个人都知道移动网络的安全性很差,但是都没有做出什么改变,直到我们因此受到侵害才能意识到这件事情的重要性。
如果你想要跟进我的语音信箱的研究,我会根据电话商的回复来定期更新我的twitter.
以下服务可能会受到影响,但是我并没有彻底去检测:
另外有已确认是易受攻击的:
感谢你的阅读,我希望你能够觉得这篇文章有用。
如果你手边正好有多余的乐高积木以及一部任天堂Wii的话,就可以考虑为你的Android手机DIY一部游戏手柄了。如下图所示,它看起来或许略显简陋,但组装的过程才是乐趣所在。
首先你要在一大堆的乐高零件中找出合适的部件拼装成可以用来固定手机和Wiimote手柄的框架,由于Wiimote外观设计方面的原因,只有一处地方可以用来固定而不影响到按键。
想让Android设备和你的Wiimote融合起来,还需要一款名为Wiimote-link的安卓应用,需要注意的是该应用只支持Android 4.2及以上设备。
理论上使用PS3手柄也是可以的,但由于PS3手柄的造型不如Wiimote来得方正,不适合使用乐高积木进行固定。
艺术家贾斯汀祖父的铁路工人,爸爸是计算机迷。他从童年开始生活周围就被机械的东西包围着。长大了后,他仍然热爱将机械小零件拆卸,制作出新的东西非常迷人的。下面这些小蜘蛛,苍蝇,蝎子和螳螂等就是他的“机械”雕塑。
蜻蜓
蝎子
蜘蛛
甲虫
这个蜘蛛说不定会发光哦
这个双头昆虫,太酷了!
这个是一个脑袋的
苍蝇
膛螂
蚊子
甲虫
机械怪兽
蝎子
蝗虫
其实咱们没事也可以研究研究做些好玩的东西,买个小电焊,20块左右,在弄点零件和铁丝,一个个让人爱不释手的小玩意就可以诞生了。
今天是七夕佳节,大家想好怎么过节了吗?单身的朋友是否想要借着牛郎织女鹊桥相会之日向心仪已久的Ta表白爱意?热恋中的情侣们是否也想要趁机玩一把浪漫,给彼此留下美好回忆呢?今日发福利,送上七夕浪漫宝典,教你用科技玩转浪漫,我们只能帮你到这儿了。
【案例1:零基础自制app表爱意】
Lovestagram是一款基于Instagram的情人卡应用程序。这款应用是Instagram创始人迈克·克里格的女友Kaitlyn送给迈克的情人节礼物。在耶鲁大学修读政治学的Kaitlyn从未上过编程课程,为了给迈克惊喜,秘密下载教程,疯狂自学编程语言,终于编写出了这一应用。图为Kaitlyn为迈克制作的情人卡。
浪漫指数: ★★★★★
评:迈克·克里格太幸福了!程序员们遇到愿意为你学编程的妹纸就赶快娶了吧。
【案例2:花5个月做游戏向女友求婚】
美国一名叫罗伯特·芬克(Robert Fink)的男子是3D视频游戏设计者,为了向女友Angel White求婚,他花了5个月做了一款名叫“Knight man”的游戏,并骗女友参与游戏测试。当女友试玩游戏通关时,游戏中的主人公救出公主,屏幕中出现一段话:“Angel White,我是否有幸能伴你共享余生呢?”选择“是”或“否”。而女友唯有选择后才能进入下一关。
浪漫指数: ★★★★★
评:对于不会做游戏的童鞋们,从中可以学习的是“投其所好”。芬克之所以通过游戏来表白,是因为他女友可是资深游戏玩家哦。
【案例3:创意发光戒指助力求婚】
求婚时总少不了有颗戒指,旧金山一工程师 Ben Kokes花费了5个月为其未婚妻Julie Nicolai打造了一枚独一无二的求婚戒指,当他靠近未婚妻时,纯钛戒指中镶嵌的微型 LED 灯就会发光,照亮戒指中的宝石。由于收到戒指十分惊讶,Julie甚至没让Ben说完求婚词,就感动得say“Yes,I do”啦。
浪漫指数:★★★★★
评:如此有创意的发明着实为求婚加分不少,相比于花钱买一个普通的戒指,花心思、花时间DIY更加令人感动。
【案例4:让枯燥的代码罗曼蒂克起来】
程序猿总给人呆板无趣的印象,因为他们经常跟枯燥的代码打交道。不过,有人让代码罗曼蒂克起来了。比如“Debug love,If exists bugs,Error :me” (译文:在爱里 检查错误/如果有错/错在我)这个用代码写就的三行情诗。比如西班牙程序猿Roman Cortes 用纯javascript脚本编写的红色玫瑰花。再比如有人用代码给自己的女友写了一个表白网页。
浪漫指数: ★★★★
评:程序猿也有春天,代码也能成为浪漫武器。
【案例5:地王大厦投激光向男友表白】
今年“5·20”前夜,一名女孩制作激光动画并投影在深圳地王大厦外墙,向男神求爱。动画中,这位微博名叫@沐沐花开1990的女生讲述了自己和男神的故事:她去桂林散心时遇险,男神英雄救美,女生一见钟情,百般请求下男神只留下一张数独名片,女生解不开名片,就想到了投激光求爱的办法寻找男神。
浪漫指数:★★★★
评:女孩勇气可嘉,一见钟情难得,各种努力“只为在人群中多看你一眼”也极为难得,有时感情就是需要争取的。
【案例6:自制Prezi视频送异地恋女友生日祝福】
复旦大学男生小计的女友到英吉利交流一学期,他们相恋后的第一个生日没法一起过,于是小计就用演示文稿软件Prezi制作了一个视频给女友当作生日礼物。视频中生动的动画展现了女友的成长经历和两人的恋爱经历,小计还在视频中邀请了女友的闺蜜们出镜送上祝福。
浪漫指数:★★★★
评:比起用设备拍摄剪辑视频,这种方式成本还是比较低的,而且爱的动力也将激励你成为PPT达人、Prezi大神。
【案例7:用iPhone记录女友生活,剪辑成求婚影片】
网上曾热传一段影院求婚的视频,10天内点击率达200余万次。视频中男子用iPhone拍下和女友生活的片段,并剪辑成影片,跟朋友们合伙把女友骗到电影院观看。女友被感动得泪流满面,男子求婚成功。
浪漫指数:★★★★★
评:专注美图三十年的某软件现在也能够一键帮你拍MV了,所以技术不是问题,展现你对生活的热忱是打动她的关键。
【案例8:“光影涂鸦”求爱】
中山大学学生小白之前用“光影涂鸦”的摄影技术向心仪女生Sandy表白。夜晚的校道上,他事先调整好相机参数,然后将Sandy“骗”到相机前,自己拿着手电筒,沿着石子铺设的轨迹奔跑,Sandy按下快门后,发光的表白字体映入眼帘。最终,两人成为情侣。
浪漫指数: ★★★★
评:蜡烛求爱已经out了,光影告白的新技能你get到了吗?
【案例9:“黑掉”电视求认识】
7月初,网友@苏哚i微博爆料,称她同学家智能电视被邻居“黑”掉了,电视屏幕黑屏后,出现一颗“心”,下面附语“我是802的板寸男,很想认识你。PS:微信已加你,求通过”。有安全工程师表示,板寸男可能是破解WiFi密码后,对接入WiFi的智能电视进行篡改。
浪漫指数: ★
评:此等奇葩表白,我和我的小伙伴们都惊呆了。这是哪门子浪漫嘛,分明是惊吓,已然花容失色的女邻居都不敢回家了,还敢认识你吗?
【案例10:贴吧社区发动众人短信表白】
编辑部一同事曾经参与过一次表白计划,至此谈及都兴奋不已。当时一男子在虎扑社区公布了自己的表白计划,并希望得到社区网友的支持,留下女友手机号,邀请大家发送“答应他吧”到女友手机。
浪漫指数: ★★★
评:网友的力量不可小觑,这哥们善于利用这股力量成事,也算蛮有想法和创意的。只是,一下子收到那么多陌生人短信,妹纸还是会受到惊吓吧。