在网络编程方面,我还很绿,我把大部分时间花在了客户端应用程序上.所以我很好奇我应该在我的网站上担心/测试的常见漏洞.
Ada*_*vis 34
我在这里发布了OWASP Top 2007缩写列表,这样人们就不必查看另一个链接,以防万一.
-亚当
Rob*_*per 10
bool UserCredentialsOK(User user)
{
if (user.Name == "modesty")
return false;
else
// perform other checks
}
Run Code Online (Sandbox Code Playgroud)
小智 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的数据.