在网络编程方面,我还很绿,我把大部分时间花在了客户端应用程序上 . 所以我很好奇我应该在我的网站上担心/测试的常见漏洞 .
除了大量其他有用的Web开发安全信息之外,OWASP还会保留一份列出的Top 10网络攻击以供我们查看 .
我在这里发布OWASP Top 2007 abbreviated list所以人们不必查看另一个链接,以防万一 .
The Open Web Application Security Project
-亚当
这三个是最重要的:
Cross Site Request Forgery
Cross Site Scripting
SQL injection
每个人都会说“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的数据 .
bool UserCredentialsOK(User user) { if (user.Name == "modesty") return false; else // perform other checks }
SQL注入攻击 . 它们很容易避免但很常见 .
永远不会永远(我是否曾提到“永远”?)信任从表单元素传递给您的用户信息 . 如果您的数据在传递到应用程序的其他逻辑层之前未经过审核,您也可以将网站的密钥提供给街道上的陌生人 .
你没有提到你所使用的平台,但是如果在ASP.NET上开始使用好的'Scott Guthrie和他的文章“Tip/Trick: Guard Against SQL Injection Attacks” .
之后,您需要考虑允许用户提交并最终退出数据库的数据类型 . 如果您允许插入HTML,然后再显示您对跨站点脚本攻击(称为XSS)的开放性 .
这些是我想到的两个,但是我们自己的杰夫阿特伍德在Coding Horror上有一篇很好的文章,并对“19 Deadly Sins of Software Security”这本书进行了评论 .
这里的大多数人都提到了SQL注入和XSS,这是正确的,但不要被愚弄 - 作为Web开发人员,您需要担心的最重要的事情是INPUT VALIDATION,这是XSS和SQL注入源自的地方 .
例如,如果您有一个只接受整数的表单字段,请确保您在客户端和服务器端实现某些操作来清理数据 .
检查并仔细检查任何输入数据,特别是如果它最终将在SQL查询中 . 我建议构建一个escaper函数并将其包装在查询中 . 例如:
$query = "SELECT field1, field2 FROM table1 WHERE field1 = '" . myescapefunc($userinput) . "'";
同样,如果您要在网页上显示任何用户输入的信息,请确保您已剥离任何<script>标签或可能导致Javascript执行的任何其他内容(例如onLoad = onMouseOver = etc.标签上的属性) .
这也是wordpress的核心开发人员之一关于安全性的简短介绍 .
Security in wordpress
它涵盖了Web应用程序中的所有基本安全问题 .
最常见的可能是数据库注入攻击和跨站点脚本攻击;主要是因为那些是最容易实现的(这可能是因为那些是程序员最懒的) .
您甚至可以在此站点上看到,您将要关注的最具破坏性的事情是将代码注入到您的应用程序中,因此XSS(Cross Site Scripting)和SQL注入(@ Patrick的建议)是您最关心的问题 . 基本上你要走了要确保如果您的应用程序允许用户注入任何代码,则需要对其进行监管和测试,以确保只传递您确定要允许的内容(HTML链接,图像等),并且没有别的执行 .
SQL注入 . 跨站脚本 .
使用存储过程和/或参数化查询将大大有助于保护您免受SQL注入 . 另外,不要让您的Web应用程序以sa或dbo的形式访问数据库 - 设置标准用户帐户并设置权限 .
AS for XSS(跨站点脚本)ASP.NET有一些内置的保护 . 最好的方法是使用验证控件和Regex过滤输入 .
我不是专家,但从我到目前为止所学到的,黄金法则不是信任任何用户数据(GET,POST,COOKIE) . 常见的攻击类型以及如何自救:
SQL Injection Attack:使用准备好的查询
Cross Site Scripting:在没有先过滤/转义的情况下,不向浏览器发送用户数据 . 这还包括存储在数据库中的用户数据,该数据最初来自用户 .
13 回答
除了大量其他有用的Web开发安全信息之外,OWASP还会保留一份列出的Top 10网络攻击以供我们查看 .
我在这里发布OWASP Top 2007 abbreviated list所以人们不必查看另一个链接,以防万一 .
跨站点脚本(XSS)
注射缺陷
恶意文件执行
不安全的直接对象参考
跨站请求伪造(CSRF)
信息泄漏和错误处理不当
破坏的身份验证和会话管理
不安全的加密存储
不安全通信
无法限制URL访问
The Open Web Application Security Project
-亚当
这三个是最重要的:
Cross Site Request Forgery
Cross Site Scripting
SQL injection
每个人都会说“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的数据 .
SQL注入攻击 . 它们很容易避免但很常见 .
永远不会永远(我是否曾提到“永远”?)信任从表单元素传递给您的用户信息 . 如果您的数据在传递到应用程序的其他逻辑层之前未经过审核,您也可以将网站的密钥提供给街道上的陌生人 .
你没有提到你所使用的平台,但是如果在ASP.NET上开始使用好的'Scott Guthrie和他的文章“Tip/Trick: Guard Against SQL Injection Attacks” .
之后,您需要考虑允许用户提交并最终退出数据库的数据类型 . 如果您允许插入HTML,然后再显示您对跨站点脚本攻击(称为XSS)的开放性 .
这些是我想到的两个,但是我们自己的杰夫阿特伍德在Coding Horror上有一篇很好的文章,并对“19 Deadly Sins of Software Security”这本书进行了评论 .
这里的大多数人都提到了SQL注入和XSS,这是正确的,但不要被愚弄 - 作为Web开发人员,您需要担心的最重要的事情是INPUT VALIDATION,这是XSS和SQL注入源自的地方 .
例如,如果您有一个只接受整数的表单字段,请确保您在客户端和服务器端实现某些操作来清理数据 .
检查并仔细检查任何输入数据,特别是如果它最终将在SQL查询中 . 我建议构建一个escaper函数并将其包装在查询中 . 例如:
同样,如果您要在网页上显示任何用户输入的信息,请确保您已剥离任何<script>标签或可能导致Javascript执行的任何其他内容(例如onLoad = onMouseOver = etc.标签上的属性) .
这也是wordpress的核心开发人员之一关于安全性的简短介绍 .
Security in wordpress
它涵盖了Web应用程序中的所有基本安全问题 .
最常见的可能是数据库注入攻击和跨站点脚本攻击;主要是因为那些是最容易实现的(这可能是因为那些是程序员最懒的) .
您甚至可以在此站点上看到,您将要关注的最具破坏性的事情是将代码注入到您的应用程序中,因此XSS(Cross Site Scripting)和SQL注入(@ Patrick的建议)是您最关心的问题 . 基本上你要走了要确保如果您的应用程序允许用户注入任何代码,则需要对其进行监管和测试,以确保只传递您确定要允许的内容(HTML链接,图像等),并且没有别的执行 .
SQL注入 . 跨站脚本 .
使用存储过程和/或参数化查询将大大有助于保护您免受SQL注入 . 另外,不要让您的Web应用程序以sa或dbo的形式访问数据库 - 设置标准用户帐户并设置权限 .
AS for XSS(跨站点脚本)ASP.NET有一些内置的保护 . 最好的方法是使用验证控件和Regex过滤输入 .
我不是专家,但从我到目前为止所学到的,黄金法则不是信任任何用户数据(GET,POST,COOKIE) . 常见的攻击类型以及如何自救:
SQL Injection Attack:使用准备好的查询
Cross Site Scripting:在没有先过滤/转义的情况下,不向浏览器发送用户数据 . 这还包括存储在数据库中的用户数据,该数据最初来自用户 .