在SO和其他地方,几乎不可能在示例代码中发布长串联SQL指令,而没有人礼貌地指出使用参数化输入和存储过程更好 .
最近的例子here .
但是担心Winforms项目中的SQL注入是否有意义?
有没有理由不写安全的数据库代码?我不这么认为 .
每个人都应该养成安全执行SQL的习惯,因此在编写公共应用程序时甚至不必考虑它 .
还要考虑许多旨在私有化的代码最终会在几个月或几年后公开访问 . 例如,“嘿,这个用于库存报告的内部网应用程序很有用,为什么我们不将它上传到我们的公共网站供我们的业务合作伙伴使用?”
使用参数将未经验证的数据与SQL查询分开 .
您可以将经过验证的数据插入到SQL查询中 . 也就是说,如果你有代码来测试一个变量只能是一个整数(例如),那么把它当作一个整数就可以了 .
对于查询的其他动态部分(表名,列名,表达式等),您不能使用查询参数 . 但您可以将用户输入映射到硬编码字符串 . 例如 . 如果用户输入 1 ,则按 date 列排序 . 如果用户输入 2 ,则按 status 列排序 .
1
date
2
status
忽略那些说"just use stored procedures!"的程序员,好像这与SQL注入的防御有关 . 它没有 .
来自现实生活的史诗故事:中西部公司的Big Boss来看看项目的进展情况 . 不确定它是如何发生的,但不知何故,一个新的订单从调度办公室下来,从未见过的客户 . 并且在Boss来看看的时候开始投入 生产环境 . 他的姓是O'Shaughnessy .
使用参数化输入不仅仅是避免SQL注入 .
是的,出于你在其他项目中看到的所有原因 .
您的用户群可能更小,但存在相同的危险 .
3 回答
有没有理由不写安全的数据库代码?我不这么认为 .
每个人都应该养成安全执行SQL的习惯,因此在编写公共应用程序时甚至不必考虑它 .
还要考虑许多旨在私有化的代码最终会在几个月或几年后公开访问 . 例如,“嘿,这个用于库存报告的内部网应用程序很有用,为什么我们不将它上传到我们的公共网站供我们的业务合作伙伴使用?”
使用参数将未经验证的数据与SQL查询分开 .
您可以将经过验证的数据插入到SQL查询中 . 也就是说,如果你有代码来测试一个变量只能是一个整数(例如),那么把它当作一个整数就可以了 .
对于查询的其他动态部分(表名,列名,表达式等),您不能使用查询参数 . 但您可以将用户输入映射到硬编码字符串 . 例如 . 如果用户输入
1
,则按date
列排序 . 如果用户输入2
,则按status
列排序 .忽略那些说"just use stored procedures!"的程序员,好像这与SQL注入的防御有关 . 它没有 .
来自现实生活的史诗故事:中西部公司的Big Boss来看看项目的进展情况 . 不确定它是如何发生的,但不知何故,一个新的订单从调度办公室下来,从未见过的客户 . 并且在Boss来看看的时候开始投入 生产环境 . 他的姓是O'Shaughnessy .
使用参数化输入不仅仅是避免SQL注入 .
是的,出于你在其他项目中看到的所有原因 .
您的用户群可能更小,但存在相同的危险 .