我想知道与通过网络表单向网站提交数据的用户相关的最佳编程任务是什么。
我对从用户点击提交按钮到数据到达数据库之间的整个过程中应该使用的任何C#或VB.NET命令特别感兴趣。
我一直在阅读您可能想采取SQL注射等预防措施的原因。
答案 0 :(得分:4)
避免SQL注入非常简单 - 只需使用parameterized queries或ORM,例如LINQ to SQL或nHibernate(所有这些都使用引擎下的参数)。图书馆会为您处理一切,并经过彻底审查。
之后,在您将数据写回其他用户之前,您是安全的。您始终希望将数据尽可能靠近原始用户输入存储。另一种说法是 - 不要存储擦洗版本(除非您还将原始文件存储在其中)。擦洗是一个单向过程 - 它会破坏信息。如果需要,再次擦洗总是很容易,但你无法取消擦洗。
但是,存储原始格式意味着您需要在将其写入浏览器之前确保encode the output。这可以防止用户将malicious cross-site scripts和其他内容放入可能在其他用户页面上呈现的数据中。
在最高级别,请记住,所有工作都应该尽可能晚地完成。 在你所接受的内容中保持自由(只做保护自己所必需的事情)并严格发送内容(编码所有内容,擦掉地狱,改造它,等等)。您希望拥有一个“纯”副本,该副本被更改为符合目标输出。
答案 1 :(得分:3)
如果您认真对待它,请阅读本书:19 Deadly Sins of Software Security
使用 linq2sql 可以防止SQL注入。 或者使用参数化查询 .Parameters 。
当您在页面上发回数据时,您必须阻止数据通过编码运行js。使用http://msdn.microsoft.com/en-us/library/w3te6wfz.aspx
总体而言,考虑使用该数据是否有机会进行攻击,并寻找防止攻击的方法。例如,使用用户数据作为文件名来访问/保存某些内容可能意味着可以访问非预期资源(通过添加..\
)。
答案 2 :(得分:2)
在任何地方验证!您验证的位置决定了用户体验的质量。离用户越近,安全性越低,但反应越快。越远,越安全,但往往会给出更糟糕的错误信息。
在前端验证以向用户提供响应错误。
在中间验证,为用户提供更好的错误消息。
在数据库中进行验证(约束等)以保持数据库的正常。
尽早使用参数,并经常使用它们!尽早找到那些方形钉。
尽快将数据强制转换为正确的类型。 (这是一种验证形式。)如果某个东西是int,请不要像字符串一样处理它。
检查参数时不要丢失错误。如果你的正则表达式不匹配,或者你的try { parse } catch { }
被触发,那么重要的是你知道为什么而不是继续!
无论是使用LINQ还是使用自己动手的SQL:不要使用用户提供的数据构建SQL语句。 EVER。使用参数化查询和/或存储过程调用。如果必须将SQL拼凑为字符串,请不要使用用户数据。获取存储的“不值得信赖的”数据,并在以后的单独查询中根据需要对其进行操作。
对传递给用户的所有数据进行编码。错误的数据可能不是他们的错,也不要诋毁他们的世界。
假设他们传递给你的任何内容都充满了JavaScript和HTML。假设“二进制”数据将会进入。有人会最终在“浏览器”之外的其他网站上运行您的网页。您的“电话号码”字段将用于存储.EXE
。
返回所有已编码且无害的数据。不要认为“因为它在数据库中”(或者它是一个int,或者它只是一个1字符的字符串)它是无害的。
假设您的数据库最终会以某种方式失败。开发人员会输入“测试”数据,你会错过上面的边缘情况,或者某些东西可能会运行并插入通用垃圾。这个垃圾必须安全地传递给用户。
没有人是完美的:特别是你。计划好。
答案 3 :(得分:2)
虽然Open Web Application Security Project(OWASP)网站上的所有指南都很有用,但here是他们的数据验证指南。