我应该知道哪些常见的Web漏洞?

在networking编程方面,我仍然非常绿色,大部分时间都花在客户端应用程序上。 所以我很好奇在我的网站上应该担心/testing的常见漏洞。

OWASP保留了十大networking攻击清单,除了大量其他有用的Web开发安全信息外,

我在这里发布了OWASP Top 2007的缩写列表 ,所以人们不必去查看另一个链接,以防万一源代码崩溃。

跨站点脚本(XSS)

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

注射缺陷

  • 注入缺陷,特别是SQL注入,在Web应用程序中很常见。 当用户提供的数据作为命令或查询的一部分发送给解释器时,就会发生注入。 攻击者的敌对数据欺骗解释器执行意想不到的命令或更改数据。

恶意文件执行

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

不安全的直接对象引用

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

跨站请求伪造(CSRF)

  • CSRF攻击迫使已login的受害者浏览器向易受攻击的Web应用程序发送预先validation的请求,然后强制受害者的浏览器执行恶意行为,以利于攻击者的利益。 CSRF可以像攻击的Web应用程序一样强大。

信息泄露和不正确的error handling

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

破坏的身份validation和会话pipe理

  • 帐户凭据和会话令牌通常没有得到适当的保护。 攻击者损害密码,密钥或身份validation令牌以承担其他用户的身份。

不安全的encryption存储

  • Web应用程序很less使用encryption函数来保护数据和证书。 攻击者利用弱保护的数据进行身份盗窃等信用卡欺诈等犯罪行为。

不安全的通信

  • 当需要保护敏感通信时,应用程序经常无法encryptionnetworking通信。

未能限制URL访问

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

开放的Web应用程序安全项目

-亚当

这三个是最重要的:

  • 跨站请求伪造
  • 跨站脚本
  • SQL注入
bool UserCredentialsOK(User user) { if (user.Name == "modesty") return false; else // perform other checks } 

;)

每个人都会说“SQL注入”,因为这是最令人难以置信的漏洞,也是最容易让你头痛的问题。 跨站脚本(XSS)将排在第二位,因为它也容易理解。 “糟糕的inputvalidation”不是一个漏洞,而是一个安全最佳实践的评估。

我们从不同的angular度来尝试。 以下是在Web应用程序中实施的function,可能会让您感到困惑:

  • dynamicSQL(例如,UI查询构build器)。 到现在为止,您可能知道在Web应用程序中使用SQL的唯一可靠安全的方法是使用参数化查询,其中将查询中的每个参数显式绑定到variables。 我看到networking应用程序的地方最常违反这个规则,即恶意input不是一个明显的参数(如名称),而是一个查询属性。 一个明显的例子是在search网站上看到的类似iTunes的“智能播放列表”查询构build器,其中像where子句操作符直接传递到后端。 另一个很好的摇滚是表列sorting,在那里你会看到像HTTP参数暴露的DESC的东西。

  • 上传文件。 因为文件path名看起来像URLpath名一样可疑,而且因为networking服务器只是通过将目标URL指向文件系统上的目录就可以很容易地实现“下载”部分。 我们testing的10个上传处理程序中有7个允许攻击者访问服务器上的任意文件,因为应用程序开发人员假定相同的权限应用于文件系统“open()”调用,就像应用于查询一样。

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

  • 随机数生成。 对networking应用程序的经典攻击:重置另一个用户的密码,并且由于该应用程序正在使用系统的非密码强的“rand()”函数,所以密码是可预测的。 这也适用于你在做密码学的任何地方。 顺便说一句,你不应该这样做:如果你依赖任何地方的encryption,你很可能是脆弱的。

  • dynamic输出。 人们对inputvalidation过于信任。 用户input所有可能的元字符的机会,特别是在现实世界中,元字符是用户input的必要部分的机会很小。 一个更好的方法是有一个统一的过滤数据库输出的制度,并将其转换为HTML实体,如quot,gt和lt。 Rails会自动为你做这个。

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

除了这些特性之外,在应用程序中可能出现的#1错误是在某处公开数据库行ID,以便用户X只需将数字从“5”更改为“6”即可看到用户Y的数据。

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

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

你没有提到你在哪个平台上,但是如果在ASP.NET上,可以从Scott Guthrie和他的文章“ 提示/技巧:防范SQL注入攻击 ”开始。

之后,您需要考虑允许用户提交哪些types的数据,并最终从数据库中提取数据。 如果您允许插入HTML,然后再提交,则可能会出现Cross Site Scripting攻击(称为XSS)的情况。

那些是我想到的两个,但是我们自己的Jeff Atwood在Coding Horror上发表了一篇很好的文章,回顾了“ 软件安全的19个罪恶 ”一书。

这里的大多数人都提到SQL注入和XSS,这是正确的,但不要被愚弄 – 作为Web开发人员需要担心的最重要的事情是INPUT VALIDATION,这是XSS和SQL注入的源头。

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

检查并重新检查任何input数据,特别是如果它将在SQL查询中结束。 我build议构build一个助手函数,并将其包装到任何查询中。 例如:

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

同样,如果您要在网页上显示任何用户input的信息,请确保已经剥离了任何可能导致Javascript执行的<script>标记或其他任何内容(例如onLoad = onMouseOver = )。

这也是wordpress核心开发人员对安全性的简短介绍。

wordpress中的安全

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

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

你甚至可以在这个网站上看到,你所要关注的最具破坏性的事情是将代码注入到你的应用程序中,所以XSS(跨站脚本)和SQL注入(@ Patrick的build议)是你最大的担心。 基本上,你要确保如果你的应用程序允许用户注入任何代码,它是受到监pipe和testing,以确保只有你确定要允许的东西(HTML链接,图像等)被传递,没有别的被执行。

SQL注入。 跨站脚本。

使用存储过程和/或参数化查询将大大地保护您免受SQL注入。 也不要让你的networking应用程序访问数据库为sa或dbo – 设置一个标准的用户帐户,并设置权限。

AS XSS(跨站点脚本)ASP.NET有一些内置的保护。 最好的事情是使用validation控件和正则expression式来过滤input。

我不是专家,但从我迄今为止所了解到的黄金法则是不相信任何用户数据(GET,POST,COOKIE)。 常见的攻击types和如何保存自己:

  1. SQL注入攻击 :使用准备好的查询
  2. 跨站点脚本 :不先发送用户数据到浏览器,不先过滤/转义。 这也包括用户数据存储在数据库中,最初来自用户。