1

我正在 VB.Net 中构建一系列 Web 服务

每个 Web 服务都采用多个字符串值,执行一些验证/处理,然后使用 Linq to SQL 调用存储过程。一些字符串包含存储在数据库中的用户数据:

从 Web 服务传递的这些字符串值被转义以捕获单引号字符、分号和各种括号类型。

我正在使用 datacontext.spname(parameter1, parameter2) 方法调用 SP。

目的是确保 Web 服务尽可能具有弹性,同时仍保持高性能。

我在防止 SQL 注入攻击方面做得足够吗?

4

3 回答 3

3

通常你很好,但有一些警告:

  • 小心使用 sp_executesql 或 exec 的存储过程。您可以在参数中传入查询并最终执行它。

  • 小心查询的 LIKE 部分,因为如果将它们比作参数,它们可以用 % 扩大。

  • 网页中使用的字段在发送之前可能需要一些额外的处理,以避免跨站点脚本。(在提取信息时您也应该防范)

于 2009-07-12T14:44:07.540 回答
1

我知道一个事实,LINQ to SQL 查询所有通过 SQL 参数发送到数据库的数据——这可以保护您免受 SQL 注入的影响。我不完全确定,但由于 LINQ 抽象了存储过程,它很可能以相同的方式将参数传递给存储过程。

这意味着什么?您不必担心清理数据,因为 LINQ 会处理它。您当然可以使用简单的 SQL 注入类型攻击来测试它——比如无害的插入或选择。

于 2009-07-12T14:53:18.473 回答
0

如果您使用的是参数,那么您根本不需要清理单引号,并且其他 sql 注入讨厌的东西会为您转义。

根据您存储的数据对输入进行清理可能不是一个好主意。如果您要存储最终嵌入网页的内容,并且您在数据输入时对它们进行编码/清理,如果您的清理代码有错误会发生什么?您最终会得到数据库中的数据,这将导致输出出现问题,并且如果不更新所有数据,就没有简单的方法来修复它。最好在输出数据时进行清理,因为对清理代码的更正将针对所有数据运行。如果这是一个问题,您还可以更轻松地在 SQL 中进行搜索。

我会将 Web 服务限制为明显的事情、空值和范围检查。

于 2009-07-12T15:05:04.753 回答