iOS&Android密码不再神奇

2012年3月29日

一家名为Micro Systemation的瑞典安全公司,一直帮助警察、军方以及政 府官方对数码产品进行破解工作,他们的一部视频资料显示,他们可以轻易使用自家软件破解iPhone、Android设备的密码,并提取内部资料。

该安全公司使用的软件名为XRY,可以快速破解iOS和Android的密码锁,并将手机设备内部资料全部导入PC并进行解码,可以显示用户的GPS定位信息,文件资料,通话日志,联系人资料,短信息,甚至还包括所有的按键记录。

这个世界什么“锁”都能解!

Frank Mobile, 文章

PHP5.3浮点数转换整型的问题

2012年3月28日

最近工作中遇到一个奇怪问题:

浮点数 intval((0.7+0.2)*100)=89 或者 (int)((0.7+0.2)*100)=89,其中只有0.7与0.2才会出现这样的情况,浮点数运算后,

转换为整型才有这个问题,也算是PHP的一个BUG吧,一句话:PHP够…..

我的PHP环境:php 5.3

Frank PHP相关

在手机上使用 HTML5 创建离线的 Web 应用

2012年3月19日

记得在几年前的SAAS模式下,在浏览器实现离线操作,受到很多的局限性,今天在手机 上做一些离线小应用是没有问题的,如下:
开启浏览器缓存:<html manifest=”MyHomeStuff.manifest”>

(详细说明GOOGLE下)

有三个文件,test.html, MyHomeStuff.js, MyHomeStuff.manifest,具体内容如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
&lt;!DOCTYPE HTML&gt;
&lt;html manifest="MyHomeStuff.manifest"&gt;
 &lt;head&gt;
 &lt;meta name="viewport" content="width=480; initial-scale=1.0; maximum-scale=1.0; user-scalable=0;"&gt;
 &lt;title&gt;MyHomeStuff&lt;/title&gt;
 &lt;script type="text/javascript" src="MyHomeStuff.js" &gt;&lt;/script&gt;
 &lt;/head&gt;
 &lt;body onload="onInit()"&gt;
 &lt;h3&gt;Overview.&lt;/h3&gt;
 &lt;ul  id="itemData" &gt;
 &lt;/ul&gt;
 &lt;h3&gt;Details&lt;/h3&gt;
 &lt;form name="itemForm"&gt;
 &lt;label for="id"&gt;Id:&lt;/label&gt;&lt;input type="text" name="id" id="id" size=2 disabled="true"/&gt;
 &lt;label for="amount"&gt;Qty:&lt;/label&gt;&lt;input type="text" name="amount" id="amount" size = 3/&gt;
 &lt;label for="name"&gt;Name:&lt;/label&gt;&lt;input type="text" name="name" id="name" size=10 /&gt; &lt;br&gt;
 &lt;br&gt;
 &lt;input type="button" name="create" value="create" onclick="onCreate()" /&gt;
 &lt;input type="button" name="update" value="update" onclick="onUpdate()" /&gt;
 &lt;input type="button" name="delete" value="delete" onclick="onDelete()" /&gt;
 &lt;/form&gt;
 &lt;h4&gt;Status&lt;/h4&gt;
 &lt;div id="status"&gt;&lt;/div&gt;
 &lt;/body&gt;
&lt;/html&gt;
?View Code JAVASCRIPT
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
//1. initialization
 
var localDB = null;
 
function onInit(){
    try {
        if (!window.openDatabase) {
            updateStatus("Error: DB not supported");
        }
        else {
            initDB();
            createTables();
            queryAndUpdateOverview();
        }
    }
    catch (e) {
        if (e == 2) {
            updateStatus("Error: Invalid database version.");
        }
        else {
            updateStatus("Error: Unknown error " + e + ".");
        }
        return;
    }
}
 
function initDB(){
    var shortName = 'stuffDB';
    var version = '1.0';
    var displayName = 'MyStuffDB';
    var maxSize = 65536; // in bytes
    localDB = window.openDatabase(shortName, version, displayName, maxSize);
}
 
function createTables(){
    var query = 'CREATE TABLE IF NOT EXISTS items(id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, amount VARCHAR NOT NULL, name VARCHAR NOT NULL);';
    try {
        localDB.transaction(function(transaction){
            transaction.executeSql(query, [], nullDataHandler, errorHandler);
            updateStatus("Table 'items' is present");
        });
    }
    catch (e) {
        updateStatus("Error: Unable to create table 'items' " + e + ".");
        return;
    }
}
 
//2. query db and view update
 
// event handler start with on*
 
function onUpdate(){
    var id = document.itemForm.id.value;
    var amount = document.itemForm.amount.value;
    var name = document.itemForm.name.value;
    if (amount == "" || name == "") {
        updateStatus("'Amount' and 'Name' are required fields!");
    }
    else {
        var query = "update items set amount=?, name=? where id=?;";
        try {
            localDB.transaction(function(transaction){
                transaction.executeSql(query, [amount, name, id], function(transaction, results){
                    if (!results.rowsAffected) {
                        updateStatus("Error: No rows affected");
                    }
                    else {
                        updateForm("", "", "");
                        updateStatus("Updated rows:" + results.rowsAffected);
                        queryAndUpdateOverview();
                    }
                }, errorHandler);
            });
        }
        catch (e) {
            updateStatus("Error: Unable to perform an UPDATE " + e + ".");
        }
    }
}
 
function onDelete(){
    var id = document.itemForm.id.value;
 
    var query = "delete from items where id=?;";
    try {
        localDB.transaction(function(transaction){
 
            transaction.executeSql(query, [id], function(transaction, results){
                if (!results.rowsAffected) {
                    updateStatus("Error: No rows affected.");
                }
                else {
                    updateForm("", "", "");
                    updateStatus("Deleted rows:" + results.rowsAffected);
                    queryAndUpdateOverview();
                }
            }, errorHandler);
        });
    }
    catch (e) {
        updateStatus("Error: Unable to perform an DELETE " + e + ".");
    }
 
}
 
function onCreate(){
    var amount = document.itemForm.amount.value;
    var name = document.itemForm.name.value;
    if (amount == "" || name == "") {
        updateStatus("Error: 'Amount' and 'Name' are required fields!");
    }
    else {
        var query = "insert into items (amount, name) VALUES (?, ?);";
        try {
            localDB.transaction(function(transaction){
                transaction.executeSql(query, [amount, name], function(transaction, results){
                    if (!results.rowsAffected) {
                        updateStatus("Error: No rows affected.");
                    }
                    else {
                        updateForm("", "", "");
                        updateStatus("Inserted row with id " + results.insertId);
                        queryAndUpdateOverview();
                    }
                }, errorHandler);
            });
        }
        catch (e) {
            updateStatus("Error: Unable to perform an INSERT " + e + ".");
        }
    }
}
 
function onSelect(htmlLIElement){
	var id = htmlLIElement.getAttribute("id");
 
	query = "SELECT * FROM items where id=?;";
    try {
        localDB.transaction(function(transaction){
 
            transaction.executeSql(query, [id], function(transaction, results){
 
                var row = results.rows.item(0);
 
                updateForm(row['id'], row['amount'], row['name']);
 
            }, function(transaction, error){
                updateStatus("Error: " + error.code + "
Message: " + error.message);
            });
        });
    }
    catch (e) {
        updateStatus("Error: Unable to select data from the db " + e + ".");
    }
 
}
 
function queryAndUpdateOverview(){
 
	//remove old table rows
    var dataRows = document.getElementById("itemData").getElementsByClassName("data");
 
    while (dataRows.length &gt; 0) {
        row = dataRows[0];
        document.getElementById("itemData").removeChild(row);
    };
 
	//read db data and create new table rows
    var query = "SELECT * FROM items;";
    try {
        localDB.transaction(function(transaction){
 
            transaction.executeSql(query, [], function(transaction, results){
                for (var i = 0; i &lt; results.rows.length; i++) {
 
                    var row = results.rows.item(i);
                    var li = document.createElement("li");
					li.setAttribute("id", row['id']);
                    li.setAttribute("class", "data");
                    li.setAttribute("onclick", "onSelect(this)");
 
                    var liText = document.createTextNode(row['amount'] + " x "+ row['name']);
                    li.appendChild(liText);
 
                    document.getElementById("itemData").appendChild(li);
                }
            }, function(transaction, error){
                updateStatus("Error: " + error.code + "
Message: " + error.message);
            });
        });
    }
    catch (e) {
        updateStatus("Error: Unable to select data from the db " + e + ".");
    }
}
 
// 3. misc utility functions
 
// db data handler
 
errorHandler = function(transaction, error){
    updateStatus("Error: " + error.message);
    return true;
}
 
nullDataHandler = function(transaction, results){
}
 
// update view functions
 
function updateForm(id, amount, name){
    document.itemForm.id.value = id;
    document.itemForm.amount.value = amount;
    document.itemForm.name.value = name;
}
 
function updateStatus(status){
    document.getElementById('status').innerHTML = status;
}
1
2
CACHE MANIFEST
MyHomeStuff.js

Frank Ajax相关, Mobile

Redis 曝新 BUG:内存超限后的死循环

2012年3月15日

Redis曝出了一个新bug,如果你设定了Redis的maxmemory,并且这个Redis有Slave,那么当你的maxmemory限制达到后,就会出现死循环。具体原因和流程如下:

  • Redis 达到了配置中设定的maxmemory限制,开始按LRU策略删除数据
  • 被过期清除的数据会生成DEL 日志推送到Slave
  • 但是如果Slave达到一定数量时,这条DEL日志使用的output buffer空间可能会超过刚刚清除数据空闲出来的空间,这时候会导致空间又超限了
  • 于是整个清除过程就变成了死循环

而且这个问题不仅会出现在Slave的情况下,在写AOF buffer的时候也会发生同样的问题。

Redis作者随后发布了补丁(This fixes issue)对这个问题进行修复。目前此bug的修复已经合并到2.4的主干中,截止目前为止,Redis官方2.4.8稳定版本中已经包含对此问题的修复。

问题地址:issues #327

Frank Database相关, Network/Servers相关

SEO优化网站的.htaccess技巧

2012年2月22日

1. 反盗链
那些盗用了你的内容,还不愿意自己存储图片的网站是无耻的。你可以通过以下配置来放置别人盗用你的图片:
RewriteBase /
RewriteCond %{HTTP_REFERER} !^$
RewriteCond %{HTTP_REFERER} !^http://(www.)?yoursite.com/.*$ [NC]
RewriteRule .(gif|jpg|swf|flv|png)$ /feed/ [R=302,L]

2. 防止目录浏览
有时候目录浏览是有用的,但大部分情况会有安全问题。为了让你的网站更安全,你可以通过htaccess文件来禁用这个功能:
1 Options All -Indexes

3. SEO友好的301永久重定向
这一招是我常用的。每次我更改网站URL结构的时候,我都会做301重定向:
Redirect 301 http://www.yoursite.com/article.html http://www.yoursite.com/archives/article

阅读全文…

Frank Network/Servers相关, 文章 ,

精美的后台管理界面模板布局和手机网站模版[转]

2012年2月21日

想必这个对WEB开发人员非常有用吧!

Free Admin HTML Website Templates

Free Admin Template

Web App Theme

阅读全文…

Frank Ajax相关, 文章 , ,

15个微型的JavaScript框架[转]

2012年2月13日

问一个 Web 开发者最喜欢的 JS 库是什么,多数回答都是 jQuery,不管他所作的网站是大是小。开发者倾向使用 jQuery 的原因是它可以降低代码的复杂度、而且 jQuery 经过良好的测试,大量的用户以及很好的社区生态以及大量的插件。

不过 jQuery 的体积比较大,本文即将介绍的是 15 个微型的 JavaScript 小框架,这些框架都支持 Web 和智能手机平台,短小精干。

Zepto.js

Zepto.js 是支持移动WebKit浏览器的JavaScript框架,具有与jQuery兼容的语法。2-5k的库,通过不错的API处理绝大多数的基本工作。

Data.js

Data.js 是一个数据操作和持久化的 JS 库,支持 Node.js 和浏览器。

阅读全文…

Frank Ajax相关

一个简单的HTML标签搞死64位的Windows7

2012年2月8日

<iframe height=’18082563‘></iframe>
这个很小的 iframe 标签(当然了,实际上它运行起来并不小)是一个强大到足以让一个64位的Win7系统崩溃的标签,它将导致 Win7 发生著名的蓝屏错误 Blue Screen Of Death (BSoD). 该漏洞是由 w3bd3vil 报告的。
该漏洞在64位的Win7下的Safari 浏览器测试中招,我很讨厌蓝屏,因此没有测试其他浏览器。微软正在进一步验证该漏洞,下面是关于该漏洞的一些技术细节:
注意:请为自己的测试负责
描述:
该漏洞是由于 win32k.sys 的一个错误导致内存的崩溃,当页面上包含一个 iframe,其 height 属性是个非常大的值时该错误就会发生。
目前该漏洞仅存在于64位的win7系统。
解决方案:
目前尚无有效方案

Frank 文章 ,

Mac下架SVN

2011年12月12日

Mac create svn 作个笔记:

1.准备工作
准备好源码包安装,客户端我用smart svn

2.安装
安装不多写,make && make install

3.配置
首先需要创建一个版本库存放的目录,如:
# mkdir -p /usr/local/svndata
之后需要使用 svnadmin 命令来创建一个版本库,如:
# svnadmin create /usr/local/svndata/test

svnadmin 和 svnlook 都是服务器端的工具,他们可以直接操作版本库服务器上的目录和文件,
而不需要 Subversion 服务器运行。

进入到刚才创建的版本库目录 /var/svnroot/test 中,可以看到里面的目录结构如下:
# ls
conf db format hooks locks README.txt

其中的conf目录为存放配置文件的地方,里面共有三个文件:authz、passwd 和 svnserve.conf 。

svnserve.conf 文件是用来设置认证和授权策略的,例如认证使用简单的用户名和密码机制,授权策略为经过认证的用户可以读写版本库、匿名用户只能读不能写。这个配置文件如下:
  [general]
  # 匿名用户只读
  anon-access = read
  # 认证用户可写
  auth-access = write
  # 使用 passwd 文件保存用户名和密码
  password-db = passwd

其中最后一行 password-db = passwd 的意思是按照 passwd 文件中设置的用户名和密码进行验证,故需要配置 passwd 文件,如:
  [users]
  test = 111111

4.启动
运行 svnserve 命令,带 -d 选项即可以作为一个单独的守护进程运行,-r 选项可以指定发布哪个目录下的版本库。
# svnserve -d -r /var/svnroot

一旦服务器运行,就在端口3690进行监听。使用 telnet 可以测试到 3690 端口已经开放了,如下:
# telnet 127.0.0.1 3690

Frank Linux/Unix相关, Network/Servers相关 ,

Linux服务器管理软件

2011年11月29日

发现一套WEB服务器管理软件,个人感觉不错,与大家分享!

Linux服务器管理系统 wdcp v2.0 正式版发布

不多说,可看演示http://demo.wdlinux.cn:8080
用户密码:admin/wdlinux.cn
详细功能列表 http://www.wdlinux.cn/wdcp

原文章链接:URL

Frank Linux/Unix相关, 文章