在网络编程方面,我还很绿,我把大部分时间花在客户端应用程序上。所以我很好奇我应该在我的网站上担心/测试的常见漏洞。
答案 0 :(得分:33)
我在这里发布了OWASP Top 2007 abbreviated list,因此人们不必查看其他链接,以防万一。来源。
The Open Web Application Security Project
- 亚当
答案 1 :(得分:29)
答案 2 :(得分:28)
答案 3 :(得分:10)
bool UserCredentialsOK(User user)
{
if (user.Name == "modesty")
return false;
else
// perform other checks
}
答案 4 :(得分:10)
每个人都会说“SQL注入”,因为它是最可怕的漏洞,也是最容易理解的漏洞。跨站点脚本(XSS)将排在第二位,因为它也很容易理解。 “输入验证不良”不是漏洞,而是对安全最佳实践的评估。
让我们从不同的角度来尝试。以下功能在Web应用程序中实现时可能会让您感到困惑:
动态SQL(例如,UI查询构建器)。到目前为止,您可能知道在Web应用程序中使用SQL的唯一可靠安全方法是使用参数化查询,您可以将查询中的每个参数显式绑定到变量。我看到网络应用程序最常破坏此规则的地方是恶意输入不是明显的参数(如名称),而是查询属性。一个明显的例子是您在搜索网站上看到的类似iTunes的“智能播放列表”查询构建器,其中where子句运算符等内容直接传递给后端。翻转的另一个好方法是表列排序,在这里您可以看到在HTTP参数中暴露的DESC等内容。
文件上传。文件上传会让人大吃一惊,因为文件路径名看起来像URL路径名,并且因为Web服务器只需将URL瞄准文件系统上的目录就可以轻松实现“下载”部分。我们测试的10个上传处理程序中有7个允许攻击者访问服务器上的任意文件,因为应用程序开发人员假定相同的权限应用于文件系统“open()”调用,如同应用于查询。
密码存储。如果您的应用程序在丢失时可以将我的原始密码邮寄给我,那么您将失败。密码存储有一个安全可靠的答案,就是bcrypt;如果你使用PHP,你可能想要PHPpass。
随机数生成。对Web应用程序的经典攻击:重置另一个用户的密码,并且,因为该应用程序正在使用系统的“rand()”函数,该函数不具有加密性,因此密码是可预测的。这也适用于您正在进行加密的任何地方。顺便说一句,你不应该这样做:如果你在任何地方都依赖加密,你很可能很脆弱。
动态输出。人们对输入验证过于信任。您擦除用户输入所有可能元字符的机会很少,特别是在现实世界中,元字符是用户输入的必要部分。一种更好的方法是使用一致的过滤数据库输出的方法并将它们转换为HTML实体,如quot,gt和lt。 Rails会自动为您完成此任务。
电子邮件。许多应用程序实现某种出站邮件功能,使攻击者能够创建匿名帐户,或者根本不使用任何帐户,将攻击者控制的电子邮件发送到任意电子邮件地址。
除了这些功能之外,您可能在应用程序中犯的第一个错误是在某处公开数据库行ID,以便用户X只需将数字从“5”更改为“6”即可查看用户Y的数据”。
答案 5 :(得分:3)
SQL INJECTION ATTACKS。它们很容易避免但很常见。
永远不会永远(我是否曾提到“曾经”?)信任从表单元素传递给您的用户信息。如果您的数据在传递到应用程序的其他逻辑层之前未经过审核,您也可以将网站的密钥提供给街道上的陌生人。
你没有提到你所使用的平台,但如果在ASP.NET上开始使用好的'Scott Guthrie和他的文章“Tip/Trick: Guard Against SQL Injection Attacks”。
之后,您需要考虑允许用户提交并最终退出数据库的数据类型。如果您允许插入HTML,然后再显示您对跨站点脚本攻击(称为XSS)的广泛开放。
这些是我想到的两个,但是我们自己的杰夫阿特伍德在Coding Horror上发表了一篇很好的文章,并对“19 Deadly Sins of Software Security”这本书进行了评论。
答案 6 :(得分:3)
这里的大多数人都提到了SQL注入和XSS,有点正确,但不要被愚弄 - 作为Web开发人员需要担心的最重要的事情是INPUT VALIDATION,这是XSS和SQL注入源自的地方。
例如,如果您有一个只接受整数的表单字段,请确保在客户端和服务器端实现某些操作以清理数据。
检查并仔细检查任何输入数据,特别是如果它最终会在SQL查询中结束。我建议构建一个escaper函数并将其包装在查询中。例如:
$query = "SELECT field1, field2 FROM table1 WHERE field1 = '" . myescapefunc($userinput) . "'";
同样,如果您要在网页上显示任何用户输入的信息,请确保您已删除任何< script>标签或可能导致Javascript执行的任何其他内容(例如标签上的onLoad = onMouseOver = etc.属性)。
答案 7 :(得分:1)
答案 8 :(得分:0)
最常见的可能是数据库注入攻击和跨站点脚本攻击;主要是因为那些是最容易完成的(这可能是因为那些是程序员最懒的)。
答案 9 :(得分:0)
您甚至可以在此网站上看到,您将要关注的最具破坏性的事情是将代码注入到您的应用程序中,因此XSS(跨站点脚本)和SQL注入(@ Patrick的建议)是您最关心的问题。 基本上你会想要确保如果你的应用程序允许用户注入任何代码,它会受到监管和测试,以确保只有你确定要允许的东西(HTML链接,图像等) )被传递,没有别的东西被执行。
答案 10 :(得分:0)
SQL注入。跨站脚本。
答案 11 :(得分:0)
使用存储过程和/或参数化查询将大大有助于保护您免受SQL注入。另外, NOT 让您的Web应用程序以sa或dbo的身份访问数据库 - 设置标准用户帐户并设置权限。
AS for XSS(跨站点脚本)ASP.NET有一些内置的保护。最好的方法是使用验证控件和Regex过滤输入。
答案 12 :(得分:0)
我不是专家,但从我到目前为止所学到的,黄金法则不是信任任何用户数据(GET,POST,COOKIE)。常见的攻击类型以及如何自救: