你会做Web上的用户登录功能吗

justjavac 发表于 2012-04-13

Web上的用户登录功能应该是最基本的功能了,可是在我看过一些站点的用户登录功能后,我觉得很有必要写一篇文章教大家怎么来做用户登录功能。下面的文章告诉大家这个功能可能并没有你所想像的那么简单,这是一个关系到用户安全的功能,希望大家能从下面的文章中能知道什么样的方法才是一个好的用户登录功能。以下内容,转载时请保持原文一致,并请注明作者和出处。

用户名和口令

首先,我们先来说说用户名和口令的事。这并不是本站第一次谈论这个事了。如何管理自己的口令让你知道怎么管理自己的口令,破解你的口令让你知道在现代这样速度的计算速度下,用穷举法破解你的口令可能会是一件很轻松的事。在这里我想告诉从开发者的角度上来做设计这个用户名和口令的事。下面一几件规则:

  • 限制用户输入一些非常容易被破解的口令。 如什么qwert,123456, password之类,就像twitter限制用户的口令一样做一个口令的黑名单。 另外,你可以限制用户口令的长度,是否有大小写,是否有数字,你可以用你的程序做一下校验。 当然,这可能会让用户感到很不爽,所以,现在很多网站都提供了UX让用户知道他的口 令强度是什么样的(比如这个有趣的UX),这样可以让用户有一个选择, 目的就是告诉用户——要想安全,先把口令设得好一点。

  • 千万不要明文保存用户的口令。 正如如何管理自己的口令所说的一样,很多时候,用户都会用相同的ID相同的口令来登录很多网站。 所以,如果你的网站明文保存的话,那么,如果你的数据被你的不良员工流传出去那对用户是灾难性的。 所以,用户的口令一定要加密保存,最好是用不可逆的加密,如MD5或是SHA1之类的有hash算法的不可逆的加密算法。 CSDN曾明文保存过用户的口令。 (另,对于国内公司的品行以及有关部门的管理方式,我不敢保证国内网站以加密的方式保存你的口令。 我觉得,做为一个有良知的人,我们应该加密保存用户的口令)

  • 是否让浏览器保存口令。 我们有N多的方法可以不让浏览器保存用户名和口令。 但是这可能对用户来说很不爽。因为在真实世界里谁也记得不住那么多的口令。 很多用户可能会使用一些密码管理工具来保存密码,浏览器只是其中一种。 是否让浏览器保存这个需要你做决定,重点是看一下你的系统的安全级别是否要求比较高, 如果是的话,则不要让浏览器保存密码,并在网站明显的位置告诉用户——保存口令最安全的地方只有你的大脑。

  • 口令在网上的传输。 因为HTTP是明文协议,所以,用户名和口令在网上也是明文发送的,这个很不安全。 你可以看看这篇文章你就明白了。要做到加密传输就必需使用HTTPS协议。 但是,在中国还是有很多网站的Web登录方式还在使用ActiveX控件,这可能成为IE6还大量存在的原因。 我通常理解为这些ActiveX控件是为了反键盘记录程序的。 不过,我依然觉ActiveX控件不应该存在,因为在国外的众多安全很重要的站点上都看不到ActiveX的控件的身影。

首先,我想告诉大家的是,因为HTTP是无状态的协议,也就是说,这个协议是无法记录用户访问状态的, 其每次请求都是独立的无关联的,一笔是一笔。 而我们的网站都是设计成多个页面的,所在页面跳转过程中我们需要知道用户的状态, 尤其是用户登录的状态,这样我们在页面跳转后我们才知道是否可以让用户有权限来操作一些功能或是查看一些数据。

所以,我们每个页面都需要对用户的身份进行认证。 当然,我们不可能让用户在每个页面上输入用户名和口令,这会让用户觉得我们的网站相当的SB。 为了实现这一功能,用得最多的技术就是浏览器的cookie,我们会把用户登录的信息存放在客户端的cookie里, 这样,我们每个页面都从这个cookie里获得用户是否登录的信息,从而达到记录状态,验证用户的目的。 但是,你真的会用cookie吗?下面是使用cookie的一些原则。

  • 千万不要在cookie中存放用户的密码。 加密的密码都不行。因为这个密码可以被人获取并尝试离线穷举。 所以,你一定不能把用户的密码保存在cookie中。 我看到太多的站点这么干了。

  • ...

最佳 Web 中文默认字体

justjavac 发表于 2012-04-13

最近淘宝网首页有个小小的 默认字体调整风波,中文默认字体远比我们想象中的复杂。以前主要关注 font-family 自身,忽略了 lang 属性和 charset 设置。今天做了个更详尽的测试:

http://lifesinger.github.com/lab/2011/default-fonts/

在不同操作系统下,用各个浏览器打开,特别是 Firefox 和 Opera,混乱的世界啊,真真的与浏览器斗,乐趣全无!

虽然沮丧悲情愤,但分析研究的工作还是得继续:

  • lang, charset 和 font-family 都会对默认字体产生影响,规律很复杂。

  • 浏览器偏好里的字体设置,对默认字体有直接影响,比如 WebKit 内核的 Chrome 浏览器。

  • 宋体转成 “\5b8b\4f53” 也不能通吃所有浏览器。比如在 Mac OS 的 Chrome 中,只认识 simsun.

    ...

git多人协作开发流程

justjavac 发表于 2012-04-13

时间仓促,能力有限,错误难免(代码没有经过实际验证,所以可能会有问题),欢迎指正 :)

这个开发流程就是基于a successful git model这篇文章而来的

项目背景

张三 / 李四 / 王五 打算共同协作,开发一套博客系统

项目分工

张三 / 李四 负责文章系统 王五 负责评论系统

建立服务端仓库

git虽然是分布式版本管理工具,但为了方便管理,我们需要建立一个中心仓库,先在服务端建立两条分支

master develop

master保存稳定版(production ready),开发人员平时的代码都提交到develop分支上

开发者的Git分支

张三的Git分支

因为张三和李四同时开发文章系统,所以就有了下面的分支

# 张三的Git分支 article (local) lisi/article (via git...

从Reddit学到的七条经验

justjavac 发表于 2012-04-13

Steve Huffman,Reddit的共同创始人,分享了将Reddit从一个小型Web应用程序发展为大型社交网站过程中学到的主要经验。

Steve Huffman和Alexis Ohanian在2005年创建了Reddit,当时在一台机器上运行Web应用程序、应用服务器和数据库。 发展至今,Reddit已经成长为每月750 万用户、2亿7千万PV的站点。

Huffman在一次演讲 中谈到 Reddit发展过程中学到的经验, 他们犯的很多错误,以及他们是如何修复这些错误的。

1、宕机是家常便饭

起初他们经常宕机,Huffman常常睡在笔记本电脑旁边,每隔几个小时就醒一下,看看网站是否仍在运行。

当时的解决方案是使用 Supervise,那是一个能重启崩溃应用程序的守护进程。 这带来了一种很有趣的运行应用程序的方式:如果应用程序有内存泄露,或者消耗了太多的内存, 只需终止它随后重启即可。 这只是一个临时方案,而非最佳方案,最终是基于日志内容修复了应用程序。

2、服务分离

Huffman建议将类似的进程集中在一台机器或一组机器上,这样可以避免频繁的上下文切换,减少资源消耗。 他还提供了一个最佳实践——在一个数据 库中处理类似的数据,以此避免频繁的索引缓存切换, 将其他类型的数据移到别的机器上去。

Huffman强烈建议避免使用线程,在Python中这就是“死亡之吻,缓慢之道”。 如果多个任务被分配到独立的进程而非线程上,那在请求量上 升、需要更多资源的时候, 就可以方便地将它们移到不同的机器上。

这种做法的唯一问题就是进程间通信,除此之外都比使用线程要好,因为这样的架构能更平滑地 进行扩展。

3、开放Schema

随着数据库的发展,每个要更新Schema的新特性都会带来更多的问题。 向一个有1千万行数据的表中增加一个新字段需要很多时间,尤其是有备份 (backup)和复制(replication)时。 他们当时虽然没有备份,但也花了好多天,因为他们构建了一个副本(replica)。

解决方案是使用开放Schema或实体-属性值,Key-Value存储。现在每个数据类型有两张表:

image

...

25个必须记住的SSH命令

justjavac 发表于 2012-04-13

OpenSSH是SSH连接工具的免费版本。 telnet,rlogin和ftp用户可能还没意识到他们在互联网上传输的密码是未加密的, 但SSH 是加密的,OpenSSH加密所有通信(包括密码),有效消除了窃听,连接劫持和其它攻击。 此外,OpenSSH提供了安全隧道功能和多种身份验证方法, 支持SSH协议的所有版本。

SSH是一个非常伟大的工具,如果你要在互联网上远程连接到服务器,那么SSH无疑是最佳的候选。

下面是通过网络投票选出的25个最佳SSH命令,你必须牢记于心。

(注:有些内容较长的命令,在本文中会显示为截断的状态。 如果你需要阅读完整的命令,可以把整行复制到您的记事本当中阅读。)

1、复制SSH密钥到目标主机,开启无密码SSH登录

ssh-copy-id user@host

如果还没有密钥,请使用ssh-keygen命令生成。

2、从某主机的80端口开启到本地主机2001端口的隧道

ssh -N -L2001:localhost:80 somemachine

现在你可以直接在浏览器中输入 http://localhost:2001 访问这个网站。

3、将你的麦克风输出到远程计算机的扬声器

dd if=/dev/dsp | ssh -c arcfour -C username@host dd of=/dev/dsp

这样来自你麦克风端口的声音将在SSH目标计算机的扬声器端口输出,但遗憾的是,声音质量很差,你会听到很多嘶嘶声。

4、比较远程和本地文件

ssh...