Tic Tac Toe with PHP-GTK2

Posted on 12th October 2006 by Nio in 程序人生

PHP-GTK2 写的井字棋,很有意思:
tictactoe.png

使用 Google Code Search 发现代码漏洞

Posted on 10th October 2006 by Nio in 程序人生

来自 Chris Shiflett
今天早些时候,Stephen de Vries 发了封邮件到 SecurityFocus 的 web application security mailing list,邮件里提到了 Google Code Search:

Google's code search provides an easy way to find obvious software flaws in open source and example applications.

为了证实他的观点,提供了几个查询实例:

相应地,Chris Shiflett 也列出了几个 PHP & MySQL 相关的查询实例:

Google Code Search 给了 Chris Shiflett 一个启发,那就是创建一个静态的搜索,对源代码进行索引,然后通过查询来检查代码中的漏洞。这个想法很有意思,我想还需要一个查询知识库,把一些常见的漏洞查询语句存入库中,然后创建一个自动检查机制,这样漏洞扫描检测可以更加方便快捷。(Update: 后来发现实际上已经有个叫 Bugle 的利用 Google Code Search 在做这个事情了。)

十一·中秋

Posted on 6th October 2006 by Nio in 宝宝, 日常生活

这几天都是陪着宝宝玩,去朝阳公园、王府井、天安门,拍了一些照片。每每出门,小家伙都是兴奋得不得了,左顾右盼,东张西望,不管什么都觉得好奇 :)

DSC04855_resize.JPG

DSC04857_resize.JPG

DSC04875_resize.JPG

DSC04862_resize.JPG

DSC04924_resize.JPG

Writing Software Patterns

Posted on 3rd October 2006 by Nio in 程序人生

Martin Fowler 关于设计模式的书本、文章一直以来都深深地影响着众多开发者。这篇《Writing Software Patterns》可以作为设计模式的入门介绍了,希望更多的人能够认识到其重要性。

I've spent a lot of my writing energy writing patterns. From time to time I get asked questions about why I do that and what makes a good pattern. This is a brief article about how I look at patterns with my suggestions for people who are interested in writing patterns themselves. [....]

CSRF - Cross-site Request Forgery

Posted on 1st October 2006 by Nio in AJAX, 程序人生

什么是 CSRF?

CSRF - Cross-site Request Forgery 字面意思是指跨站点请求伪造,通常用来指 WEB 网站的这一类漏洞,即在某个恶意站点的页面上,促使访问者请求你的网站的某个 URL(通常会用 POST 数据方式),从而达到改变服务器端数据的目的。这一类攻击依赖于你的网页中的表单,脆弱的表单很容易受到攻击。对于你网站中的访问者而言,可能会受到以下攻击:

  • 在你的网站之外记录受攻击者的日志(比如:Slashdot);
  • 修改受攻击者在你的网站的设置(比如:Google);
  • 修改你的硬件防火墙;
  • 使用受攻击者的登录信息在你的网站中发表评论或留言;
  • 通过受攻击者的 IP 地址发表匿名留言;
  • 将资金转移到另一个用户帐号中。

CSRF 攻击的典型是那些使用 cookie 记录登录信息的网站,但对于一些允许某个 IP 地址访问的页面(如内部网),这一类攻击也会奏效。

CSRF 攻击通常会使用到 JavaScript(但不仅限于 JavaScript)实现跨站点自动提交表单--表单数据可以隐藏,提交按钮可以伪装成链接或滚动条。

如何防止 CSRF 漏洞

  • 确定那些接受可改变服务器数据的 CGI 只接受 POST 参数,不接受 GET 参数,一些服务器端语言默认同时接受两种方式提交过来的参数;
  • 确定表单提交处理的是你自己的表单,可以使用一个隐藏字段中存放 MD5 字符串,此字符串是将登录 cookie 数据与服务器端存放的密钥进行 MD5 之后的结果,只有这个 MD5 字符串正确时才接受表单数据;
  • 另外还可以增加一个更为严格的方法:在表单中增加一个时间戳的隐藏字段,并将其包含到 hash 字符串中,如果时间戳超过某个时间,则认为表单已过期。当表单过期时,给出一个方法可以让用户重新提交表单,比如将用户之前填写的数据依旧放入表单中,但使用一个新的 hash 字符串。

一个 PHP 的表单例子,表单代码:


<?php
$key 'y8s4Z7m2'//MD5 加密密钥
$time time(); //当前时间
$hash md5($time.$key); //hash 字符串
?>
<form method="post" action="comment.php">
    <p>Your name: <input type="text" name="person_name" /></p>
    <p>Comment:<br /><textarea name="comment" rows="10" cols="60"></textarea></p>
    <input type="hidden" name="time" value="<?php echo $time?>" />
    <input type="hidden" name="hash" value="<?php echo $hash?>" />
    <p><input type="submit" name="comment" value="Submit Comment" /></p>
</form>

表单提交之后的 comment.php 后台处理程序代码:


<?php
$key 'y8s4Z7m2'//密钥,与上面的一致
$expire 1800//表单过期时间:半小时
$my_hash md5($_POST['time'].$key); //正确的 hash 字符串
if ($my_hash != $_POST['hash']) //hash 字符串不正确
    die('非法表单提交。');
if (time() - $_POST['time'] > $expire) {
    //表单已经过期,生成新的时间戳和 hash 字符串,显示表单让用户重新提交。(此处省略)
    //....
}
//表单验证通过,可以接受表单提交的数据,并进行其它操作。
//....
?>

不要以为可以通过 Referer 头信息来保护你的网站用户,使其不受 CSRF 攻击。

参考资料

Security tips for web developers