【问题标题】:What should I be aware of to make my web application secure?为了使我的 Web 应用程序安全,我应该注意什么?
【发布时间】:2011-04-12 20:32:30
【问题描述】:

我通过查看网络上的各种文章和教程构建了简单的 PHP 应用程序。由于我现在将其提供给一些客户,因此我担心它的安全性。如何确保它不会被黑客入侵?

【问题讨论】:

标签: php security web-applications


【解决方案1】:

我选择的清理用户输入的函数是

$input = mysql_real_escape_string($input);<br>
$input = trim($input);<br>
$input = strip_tags($input);<br>
$input = htmlspecialchars($input);

然后如果我想禁止某些字符,那么我只需执行以下操作。

$nono = array("=", "{", "}", ";", "[", "]","$","&");<br>
$input = str_replace($nono, "", $input);

【讨论】:

    【解决方案2】:

    对于 Web 应用程序的安全性,您真的不能错过 OWASP。它由一群专注于Web应用安全的安全专家组成,并定期更新相关资源。

    最著名的是OWASP Top 10(2010 最新版本),它总结了 Web 应用程序经常遇到的 10 大安全风险。当人们试图在渗透测试或代码审查期间评估 Web 应用程序的安全级别时,这已成为事实上的参考。

    对于开发人员,您还可以在他们的development guide 中增加,其中包含您编写代码时的一些注意事项。

    此外,{ISC}^2 在这个主题中也有一些不错的reference。我会推荐一个关于如何将安全性集成到您的软件开发生命周期 (SDLC) 中的文章。您可能还想阅读 Web 应用程序安全 101 演示幻灯片。

    【讨论】:

      【解决方案3】:

      如果您只是从确保代码安全的角度来谈论,那么您应该注意一些事项(这是一个不完整的列表,但应该可以帮助您入门):

      SQL 注入

      如果您的应用程序中有任何 SQL 查询并且其中任何一个使用来自用户的输入,则您可能容易受到 SQL 注入的攻击。这是当用户在表单字段的位置提交恶意内容时,当将其插入到您的查询中时,攻击者将能够访问您数据库的其他部分。

      如何防止:您从用户那里获得的任何输入都需要在您在查询中使用之前过滤。为此,您可以使用prepared(或parameterized)语句(即mysqli::preparePDO)或使用正确转义输入值的函数在查询中使用它们之前(即mysql_real_escape_string

      跨站脚本 (XSS) 攻击

      如果您从用户那里获取任何输入并将其输出到另一个页面(例如,您可能会收集用户数据,然后输出用户列表),您可能容易受到 XSS 攻击。这些工作的方式是将代码(通常是&lt;script&gt;标签)添加到表单字段中,如果在输出之前没有对它们进行清理,攻击者会将他们自己的Javascript添加到您的页面中,这将在您的页面上下文中运行(因此,可以访问您的 cookie 等内容)。

      如何预防:除非有充分的理由让您的用户输出 HTML,否则每次输出来自用户的内容时,都应使用htmlspecialchars 对其进行清理,这将将具有潜在危险的字符(例如&lt;&gt;)转换为 HTML 实体。如果你必须让你的用户输出 HTML,你应该有一组特定的允许标签,并确保只允许这些标签通过(例如使用 DOM 解析器或strip_tags)。

      另请参阅: The Cross-Site Scripting (XSS) FAQ

      跨站请求伪造 (CSRF) 攻击

      这是一种攻击,其中攻击者利用存储在用户的浏览器。例如,假设您创建了一个银行应用程序,攻击者可能会导致仍然拥有您网站的有效身份验证 cookie 的合法用户在不知情的情况下请求 http://yourapp.com/transfer_funds.php?to=attacker

      如何防止: GET 请求应该是 idempotent(也就是说,应该始终具有相同的效果,或者不应导致您的应用程序状态更改)。这意味着用户可以进行的任何操作(例如,CRUD 操作)都应该通过POST 进行,而不是GET。同样,对于这些操作,您应该检查 $_POST,而不是 $_REQUEST,因为 $_REQUEST 将包含来自 $_POST$_GET 的值。
      但是,即使您正在使用 POST。为了更好地保护,许多人使用挑战令牌系统,其中应用程序生成与用户会话相关的随机字符串。此质询令牌与应用程序本身发出的任何相关请求(通过将其包含在表单中)一起传递,然后在允许进行任何操作之前进行验证。请注意,如果您的应用程序存在 XSS 漏洞,您的质询令牌可能会被泄露。

      另请参阅: The Cross-Site Request Forgery (CSRF/XSRF) FAQ

      利用eval或系统命令

      如果您将eval 与用户输入一起使用,您将打开您的整个应用程序环境(以及除此之外,您的服务器环境)以受到潜在的攻击,因为如果您不是非常小心(即使您是),您让用户能够运行他们想要的任何任意代码。这可能导致修改数据库、更改服务器环境、在服务器上安装和运行脚本或二进制文件、删除 PHP 文件……(这种攻击适用于任何进行系统调用的 PHP 函数,包括systemfopen、任何访问文件系统的函数……所以在使用用户输入时要非常小心!)

      如何预防:不要在用户输入时使用eval。如果您认为需要在用户输入中使用eval,则可能有更好(更安全)的方法来解决问题。

      【讨论】:

      • 我会添加到 XSS 中,将仅由 PHP 使用的任何 cookie(如会话)设置为 httponly,这样至少在支持浏览器时,跨站点 javascript 将无法窃取那些。
      【解决方案4】:

      在开发 Web 应用程序时,最重要的事情是将用户输入视为瘟疫。这是邪恶的,不可信任!

      任何时候您使用客户端/用户可能修改的变量(例如 POST、GET 或其他变量)时,都需要对其进行清理。删除任何不属于您期望的输入的多余内容。

      例如,如果您有以下代码:

      $var = $_POST['myNumber'];
      echo 'You entered the number ' . $var . '!';
      

      此代码容易受到攻击 - 您需要在此处清理 POST 变量:

      $cleanVar = sanitize($_POST['myNumber']);
      echo 'You entered the number ' . $cleanVar. '!';
      

      sanitize(string) 是一个删除多余引号之类的函数。您可以想象传入第二个参数,以正确过滤您期望的内容类型。例如,告诉您的 sanitize 函数以某种方式去除数字的废话,并以另一种方式去除字符串。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-08-15
        • 2017-12-04
        • 1970-01-01
        • 1970-01-01
        • 2010-11-22
        • 2011-05-07
        相关资源
        最近更新 更多