转一篇文章 ,标题和原标题一样,没有做变化。原文内容很短:
http://www.solidot.org/story?sid=32079
- 穷人的一些行为如过度借钱、不参与援助和储蓄过少让他们更难摆脱贫困。科学家对他们的行为给出了不同的解释,如个性和环境因素。发表在《科学》上的最新论文指出,穷人的这些行为源于他们的贫困,匮乏会影响他们的决策。研究人员让志愿者参与一系列游戏,他们发现较穷的玩家会在选择上犹豫不决或过于投入,随着游戏的进展而感到心力交瘁,他们的一些决策常常适得其反。研究人员得出结论:穷人常常会为具体的费用储蓄及借钱,认为吸引他们到未来具体需求上的政策和计划需要对他们的储蓄有帮助。
之所以会转载这个。是因为在群里的时候,廖羽雷说,他买了一个后台模版,花了15美金,然后我们说说了。好贵啊。100块钱。
这时候老廖说了这么几句:
- 反正比你自己做模版快多了。而且你自己做不到这么专业
- 自己搭配各种js就搞死了
- 一个php工资5k,一个工作日就是200.给他半个月也做不出这效果来
- 以前看到好的模版就照着抄,现在觉得这事儿太傻逼
- 是观念变了。按理说没钱的时候更应该花这种钱,把有限的精力用在更重要的事情上
基于上述5点,sm和神仙都说了自己的看法,然后hc转了上面的网址:
- SuperMan 屁股决定脑袋的事。苦逼码农才不会想着拿钱买时间
- 神仙 以前当码农的时候,再便宜,自己出也是从自己工钱来啊
- Horadric.Cube 人们在钱少的时候很干扰自己的决定
对着上面转贴的内容,你现在觉得自己是怎么想的呢?
号码小助手,会自动将号码分析成:AAAB,AABB,ABAB之类的方式。
调用方式:http://ixyz.sinaapp.com/api/phone?h=13912341234,13912123344,13912345678&type=json
默认返回值是json,可支持json,xml,text三种返回形式
号码最多一次传10个
PHPCODE:
esult = file_get_contents('http://ixyz.sinaapp.com/api/phone?h=13912341234,13912123344,13912345678&type=json');
返回值是:
json格式返回:
{"phones":{"13912341234":["ABCD","ABCDABCD"],"13912123344":["ABCD","ABCDABCD","AABB","ABCD","ABAB"],"13912345678":["ABCD","ABCDABCD","AABB","ABCD","ABAB","ABCD"]},"copyright":"Written by walkerlee, api support by gouki","error":"sorry,phone doesn't match"}
xml格式返回:
XML/HTML代码【xml返回的格式结果与json的有一点点不太一样】
- <?xml version='1.0' encoding='UTF-8'?>
- <root>
- <result>
- <phones>
- <phone number="13912341234">
- <ABCD>ABCD</ABCD>
- <ABCDABCD>ABCDABCD</ABCDABCD>
- </phone>
- <phone number="13912123344">
- <ABCD>ABCD</ABCD>
- <AABB>AABB</AABB>
- <ABAB>ABAB</ABAB>
- </phone>
- <phone number="13912345678">
- <ABCD>ABCD</ABCD>
- </phone>
- </phones>
- <copyright><![CDATA[Written by walkerlee, api support by gouki]]></copyright>
- </result>
- </root>
----------
目前支持的类型有:XML/HTML代码
- Array
- (
- [0] => AABB
- [1] => ABCD
- [2] => AAAB
- [3] => ABAB
- [4] => ABCABC
- [5] => ABCDABCD
- [6] => ABBB
- [7] => ABCCBA
- [8] => ABBA
- [9] => AAAA
- [10] => AAAAA
- [11] => AAAAAA
- [12] => AAAAAAA
- [13] => AAAAAAAA
- [14] => ABCDCBA
- [15] => ABCDDCBA
- [16] => ABCBA
- )
---------
以上类型可以根据需要随便加,如果你觉得有哪些规则不错,你可以告诉我(这个正则是自动生成的,因此只要告诉规则就OK了)
嗯,这个程序的核心函数是walkerlee写的,我只是稍稍的封装处理了一下
这篇文章很有意思,以前注意过,但没仔细考虑过用来注入,或许就象王猛说的:
了解很长一段时间的web安全了,个人觉得世上最聪明的程序员其实是黑客,一次想N步,逻辑超强,技术全面,从操作系统漏洞、到语言本身漏洞、数据库本身漏洞、再到开发者代码,无孔不入。
文章来自寂寞hacker,http://hi.baidu.com/isbx/blog/item/08ef48547ef1ad58574e00bf.html:
当前的Web开发者中肯定有不少人没有注意到作者所提到的这两个问题的。
第一个问题是这样的,MySQL默认有一个配置参数 max_packet_size,这个参数是用于限制MySQL客户端和MySQL服务器端数据通信的数据包大小,MySQL的默认配置是1MB。如果客 户端发送的数据超过了1MB,则MySQL服务器端会忽略掉这个请求数据。作者接下来举了两个利用这个缺陷的例子,第一个是利用超长数据来使MySQL的 日志记录程序失效,第二个是在PHP+MySQL的环境下,PHP的Session清理程序会由于一次发送的清理session数据的请求数据包超过 max_packet_size的限制,而导致清理session失败。
而实际上,由于很多PHP+MySQL的程序都会运行用户上传附件之类,而一般的PHP+MySQL的上传附件限制都是大于1MB的,所以PHP的 程序开发人员一般是会去修改max_packet_size的值为大于1MB。这就给我们的漏洞利用带来了一定的麻烦,毕竟在当前的网络状况下,构造 1MB多的数据去上传还是可以忍受的。但是太大的数据量就比较考验我们的耐心了,呵呵。
第二个问题就比较严重了,MySQL对于超过字段长度的数据插入操作会进行默认的字符串截短。例如一个字段定义的长度为10,如果插入的字符串长度 超过10,MySQL会将长度超过10的部分字符串自动舍去后插入到数据表中。默认配置条件下,MySQL会产生一个警告信息,但是这个警告信息不会被 Web应用程序捕获到。所以,从表面上来看,超长数据也是可以“成功”插入数据表的。作者在下面举的这个例子就很有代表性了,首先是一个场景假设:
- The application is a forum where new users can register
- The administrator’s name is known e.g. ‘admin’
- MySQL is used in the default mode
- There is no application restriction on the length of new user names
- The database column username is limited to 16 characters
用户如果尝试注册一个用户名为admin的用户,会由于Web应用程序中的isAlreadyRegistered函数的校验而注册失败。
SQL代码
- SELECT * FROM user WHERE username='admin'
但如果用户使用用户名’admin x’来注册(注意admin和x之间有11个空格),则注册流程会是这样的:
isAlreadyRegistered函数会使用上面的SQL语句来检查user表中是否存在相同用户名的用户,查询结果肯定是不存在的。那么用户注册成功!
实际上,真正插入到user表中的用户名是’admin’!也就是说,MySQL不仅会截短超过长度限制部分的字符串,也会对字符串头尾的空白字符进行截短!所以,在user表中,现在存在了两个admin用户!
接下来,用户登陆,他使用的是用户名admin,密码是他刚才设置的’admin x’的密码。假设Web应用程序的登陆认证和授权函数是这样的一段代码:
PHP代码
- $userdata = null;
- if (isPasswordCorrect($username, $password)) {
- $userdata = getUserDataByLogin($username);
- ...
- }
其中isPasswordCorrect函数使用的SQL语句为:
SQL代码
- SELECT username FROM users WHERE username = ? AND passhash = ?
getUserDataByLogin函数使用的SQL语句为:
SQL代码
- SELECT * FROM users WHERE username = ?
可以看得出,上面的语句使用了预编译的SQL语句,是无法实施SQL注入的。但是由于MySQL的默认字段截短策 略,isPasswordCorrect函数会成功执行并返回用户名admin,接下来的getUserDataByLogin也会正确执行,返回的结果 虽然是一个数组,但是Web应用程序一般是取返回数组中的第一个结果,也就是真正的管理员用户admin的所有数据!
怎么样,不用SQL注入,一样拿到管理员权限!
后记:经过测试,上面的漏洞利用过程在MySQL 4中是确实存在并且可以利用的。但是在MySQL 5中,本机测试失败。失败的关键就在于MySQL 5对于超过字段长度限制的字符串插入会报错,并停止字符串插入操作。
附:MySQL 4的测试过程
SQL代码
- mysql> select * from tb_sqltest where name='jason';
- +
- | id | name | remark | time | col1 | col2 | col3 |
- +
- | 1 | jason | NULL | NULL | NULL | NULL | NULL |
- +
- 1 row in set
-
- mysql> select * from tb_sqltest where name='jason x';
- Empty set
-
- mysql> insert into tb_sqltest (id,name) values (2,'jason x');
- Query OK, 1 row affected
-
- mysql> select * from tb_sqltest where name='jason';
- +
- | id | name | remark | time | col1 | col2 | col3 |
- +
- | 1 | jason | NULL | NULL | NULL | NULL | NULL |
- | 2 | jason | NULL | NULL | NULL | NULL | NULL |
- +
- 2 rows in set
该信息来自于edong网站:
网址为:http://www.edong.com/News/NewsView.aspx?NewsID=186
并非是我故意关闭。。
移动公司突击检查网站备案情况紧急通知
尊敬的E动网用户:
由于中国移动突击检查网站备案情况,将移动双线机房的大量服务器拔线检查,对所有未通过备案和存在有害信息的网站,移动公司会做封IP处理。
我公司和移动沟通后争取到以下权益:在本日(2009.11.20)上午11点-12点,我们会帮客户开启服务器,请客户自行核对网站是否备案、是否存在色情、暴力、赌博等有害信息,核对没有问题后请到有问必答提交已复核的IP和域名,我司会再次复审并提交移动扫描,移动扫描通过后服务器会正常开启。请您务必利用这段时间,确保服务上没有任何未备案网站运行及有害信息,如存在未备案的网站,请您停止域名解析。
中国E动网再次提醒您务必重视此次移动备案突击检查。
郁闷啊。。。
本文首发于www.ucapi.com,下篇预告:supesite与uchome等应用在同步登录时注意事项
原文如下:
如果你写了一个WEB程序,你又想与ucenter共用一个用户库,你会怎么做?
来吧,让我告诉你,只要几个简单的步骤就行了。
1、先到ucenter administrator建一个应用,在应用里配置完你的项目的地址,在UC_KEY那里随便输入一些字符串,越长越好。【在这里有配置通讯文件的名 称,好象是提示你在api目录下,你可以定义一个,默认是uc.php】。然后你会一直发现应用列表中,该应用一直是通讯失败。
2、生成应用后,在应用详情的最下方有一个textarea框,这个就是系统帮你生成的连接ucenter的配置文件 。
3、在您的项目根目录下建立一个api目录,里面放上刚才说的通讯文件,默认是uc.php
在通讯文件里定义一些常量,可以从uchome、supesite、等里面拷贝出来,其实就是一些返回值 的常量。
加载刚才ucenter administrator所生成的配置文件。
到comsenz的任何一个程序中拷贝一下authcode函数(一般在common.inc.php或者global.inc.php中)
写上简单的判断代码:
PHP代码
- $code = $_GET['code'];
-
-
- parse_str(authcode($code, ‘DECODE’, UC_KEY), $get);
-
-
- if(time() – $get['time'] > 3600) {
- exit(’Authracation has expiried’);
- }
-
-
- if(emptyempty($get)) {
- exit(’Invalid Request’);
- }
-
-
- $action = $get['action'];
-
-
- if ($action == ‘test’){
- exit(API_RETURN_SUCCEED);
- }
4、写完这样的代码后,去ucenter管理中心看一下应用列表,是不是通讯成功了?
其实那个通讯成功,就是发送了一个 action = test过来。所以当返回1的时候就直接成功了。
不过,由于exit();函数自身的状态,如果参数是字符串,则会直接输出,而如果参数是整数,则仅仅用来表示退出程序,而整数则代表了error code。
If status
is an integer, that value will also be used as the exit status. Exit statuses should be in the range 0 to 254, the exit status 255 is reserved by PHP and shall not be used. The status 0 is used to terminate the program successfully.
这时候,你就会发现,你必须得使用exit(”1″);才会真正的输出1。【当然,这是PHP的基础,与通信问题不大,在这里提出来,只是为了防止你明明写了exit(1),却不会输出而在那里拼命调试】
OK,到现在为止,一个简单的通讯就完成了。如果你需要更多的功能,可以参考一下server究竟提供了哪些服务,然后写上针对性的代码和判断就可以了。
本文没图,但我相信,说的应该够明白了吧?