在网络编程方面我还是很新手,我大部分时间都花在客户端应用程序上。所以我对我的网站中应该担心/测试的常见漏洞感到好奇。

有帮助吗?

解决方案

OWASP 保留一个列表 前10名 除了大量其他对 Web 开发有用的安全信息外,还需要注意的 Web 攻击。

其他提示

我正在发布 OWASP Top 2007 缩写列表 在这里,这样人们就不必查看另一个链接,以防源出现故障。

跨站脚本 (XSS)

  • 只要应用程序获取用户提供的数据并将其发送到 Web 浏览器而不首先验证或编码该内容,就会出现 XSS 缺陷。XSS 允许攻击者在受害者的浏览器中执行脚本,从而劫持用户会话、破坏网站、可能引入蠕虫病毒等。

注射缺陷

  • 注入缺陷,尤其是 SQL 注入,在 Web 应用程序中很常见。当用户提供的数据作为命令或查询的一部分发送到解释器时,就会发生注入。攻击者的恶意数据诱使解释器执行非预期命令或更改数据。

恶意文件执行

  • 容易受到远程文件包含 (RFI) 影响的代码允许攻击者包含恶意代码和数据,从而导致破坏性攻击,例如整个服务器遭到破坏。恶意文件执行攻击会影响 PHP、XML 以及任何接受用户的文件名或文件的框架。

不安全的直接对象引用

  • 当开发人员将对内部实现对象(例如文件、目录、数据库记录或密钥)的引用作为 URL 或表单参数公开时,就会发生直接对象引用。攻击者可以操纵这些引用来未经授权访问其他对象。

跨站请求伪造 (CSRF)

  • CSRF 攻击迫使已登录受害者的浏览器向易受攻击的 Web 应用程序发送预先身份验证的请求,然后迫使受害者的浏览器执行有利于攻击者的敌对操作。CSRF 的威力与其所攻击的 Web 应用程序一样强大。

信息泄露和错误处理不当

  • 应用程序可能会无意中泄露有关其配置、内部工作的信息,或通过各种应用程序问题侵犯隐私。攻击者利用这个弱点窃取敏感数据,或者进行更严重的攻击。

失效的身份验证和会话管理

  • 帐户凭据和会话令牌通常没有得到适当的保护。攻击者泄露密码、密钥或身份验证令牌以冒充其他用户的身份。

不安全的加密存储

  • Web 应用程序很少正确使用加密功能来保护数据和凭据。攻击者利用保护薄弱的数据进行身份盗窃和其他犯罪,例如信用卡欺诈。

不安全的通信

  • 当需要保护敏感通信时,应用程序经常无法加密网络流量。

限制URL访问失败

  • 通常,应用程序仅通过阻止向未经授权的用户显示链接或 URL 来保护敏感功能。攻击者可以利用此弱点,通过直接访问这些 URL 来访问并执行未经授权的操作。

开放 Web 应用程序安全项目

-亚当

这三个是最重要的:

每个人都会说“SQL 注入”,因为它是听起来最可怕的漏洞,也是最容易引起您注意的漏洞。跨站脚本(XSS)将排在第二位,因为它也很容易理解。“输入验证不良”不是漏洞,而是对安全最佳实践的评估。

让我们从不同的角度尝试一下。以下功能在 Web 应用程序中实现时可能会让您感到困惑:

  • 动态 SQL(例如,UI 查询生成器)。到目前为止,您可能知道在 Web 应用程序中使用 SQL 的唯一可靠、安全的方法是使用参数化查询,其中您将查询中的每个参数显式绑定到变量。我看到网络应用程序最常违反此规则的地方是恶意输入不是明显的参数(如名称),而是查询属性。一个明显的例子是您在搜索网站上看到的类似 iTunes 的“智能播放列表”查询构建器,其中诸如 where 子句运算符之类的内容直接传递到后端。另一个需要翻转的大问题是表列排序,您将在其中看到诸如 HTTP 参数中公开的 DESC 之类的内容。

  • 上传文件。文件上传会让人们感到困惑,因为文件路径名看起来很像 URL 路径名,而且 Web 服务器只需将 URL 指向文件系统上的目录就可以轻松实现“下载”部分。我们测试的 10 个上传处理程序中有 7 个允许攻击者访问服务器上的任意文件,因为应用程序开发人员假设应用于文件系统“open()”调用的权限与应用于查询的权限相同。

  • 密码存储。如果您的应用程序可以在我丢失原始密码时将其邮寄给我,那么您就失败了。对于密码存储,有一个安全可靠的答案,那就是 bcrypt;如果您使用 PHP,您可能需要 PHPpass。

  • 随机数生成。针对网络应用程序的经典攻击:重置另一个用户的密码,并且由于该应用程序正在使用系统的“rand()”函数,该函数不具有加密强度,因此密码是可预测的。这也适用于您进行密码学的任何地方。顺便说一句,你不应该这样做:如果你在任何地方都依赖加密货币,那么你很可能很容易受到攻击。

  • 动态输出。人们过于相信输入验证。清除所有可能的元字符的用户输入的机会很低,尤其是在现实世界中,元字符是用户输入的必要部分。更好的方法是采用一致的机制来过滤数据库输出并将其转换为 HTML 实体,例如 quot、gt 和 lt。Rails 会自动为您完成此操作。

  • 电子邮件。许多应用程序都实现了某种出站邮件功能,使攻击者能够创建匿名帐户或根本不使用帐户,将攻击者控制的电子邮件发送到任意电子邮件地址。

除了这些功能之外,您在应用程序中可能犯的第一个错误是在某处公开数据库行 ID,以便用户 X 只需将数字从“5”更改为“6”即可查看用户 Y 的数据。

bool UserCredentialsOK(User user)
{

    if (user.Name == "modesty")
        return false;
    else
        // perform other checks
}   

SQL 注入攻击。它们很容易避免,但又很常见。

永远 永远 永远 永远(我有没有提到“曾经”?) 信任从表单元素传递给您的用户信息。如果您的数据在传递到应用程序的其他逻辑层之前没有经过审查,那么您不妨将站点的密钥交给街上的陌生人。

您没有提及您所在的平台,但如果在 ASP.NET 上,请从好的 ol' Scott Guthrie 和他的文章开始”提示/技巧:防范 SQL 注入攻击".

之后,您需要考虑允许用户提交到数据库以及最终从数据库中提交什么类型的数据。如果您允许插入 HTML,然后再呈现,那么您就很容易受到跨站点脚本攻击(称为 XSS)。

我想到的就是这两个问题,但我们自己的杰夫·阿特伍德 (Jeff Atwood) 在 编码恐怖 以及对这本书的评论“软件安全的 19 条致命罪过".

这里大多数人都提到了SQL注入和XSS,这是 有点儿 正确,但不要被愚弄 - 作为 Web 开发人员,您需要担心的最重要的事情是输入验证,这就是 XSS 和 SQL 注入的根源。

例如,如果您有一个只接受整数的表单字段,请确保您在客户端和服务器端都实现了一些东西来清理数据。

检查并仔细检查任何输入数据,特别是如果它最终会出现在 SQL 查询中。我建议构建一个转义函数并将其包装在查询中的任何内容上。例如:

$query = "SELECT field1, field2 FROM table1 WHERE field1 = '" . myescapefunc($userinput) . "'";

同样,如果您要在网页上显示任何用户输入的信息,请确保您已删除任何 <script> 标记或任何其他可能导致 Javascript 执行的内容(例如 onLoad= onMouseOver= 等)。标签上的属性)。

这也是 WordPress 核心开发人员之一关于安全性的简短演示。

WordPress 的安全性

它涵盖了网络应用程序中的所有基本安全问题。

最常见的可能是数据库注入攻击和跨站点脚本攻击;主要是因为这些是最容易完成的(这可能是因为这些是程序员最懒的)。

您甚至可以在这个网站上看到,您要处理的最具破坏性的事情涉及到应用程序中的代码注入,因此 XSS(跨站脚本)和 SQL 注入(@Patrick 的建议)是您最关心的问题。基本上,您需要确保,如果您的应用程序允许用户注入任何代码,那么它会受到监管和测试,以确保只有您确定要允许的内容(html 链接、图像等) ) 被传递,并且没有执行任何其他操作。

SQL注入。跨站脚本。

使用存储过程和/或参数化查询将在很大程度上保护您免受 SQL 注入的侵害。还做 不是 让您的 Web 应用程序以 sa 或 dbo 身份访问数据库 - 设置标准用户帐户并设置权限。

AS for XSS(跨站点脚本)ASP.NET 有一些内置的保护措施。最好的办法是使用验证控件和正则表达式来过滤输入。

我不是专家,但从目前为止我所了解到的黄金法则是不要信任任何用户数据(GET、POST、COOKIE)。常见的攻击类型以及如何自救:

  1. SQL注入攻击: :使用准备好的查询
  2. 跨站脚本: :在不首先过滤/转义的情况下,不向浏览器发送任何用户数据。这还包括存储在数据库中的用户数据,这些数据最初来自用户。
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top