一般来说,当你实现一个基本的SOAP Web服务时,你将服务暴露给世界,无论好坏。您在代码中必须考虑的主要问题是验证输入。天真地接受字符串可能会非常有害。如果有任何值可能是您无法处理的数字,请查找它并且不要继续。如果你接受字符串,确保你彻底清理它们(寻找和非常怀疑分号,并逃脱你看到的每一个“特殊字符”)。
对于在SQL查询中使用unsanitized字符串的天真服务的常见攻击可能看起来像“ABC”; drop database master;“。如果你的代码注入到SQL查询中而没有注意到伪造的查询终止和恶意脚本,你可能在第二天清理你的桌面。解决方案非常简单;转义单引号,用ASCII或Unicode表示法替换分号,您可以将其翻译回来(或简单地将其除去),并且服务调用将它视为垃圾。
这提出了第二点;即使它们是你的代码,你的Web服务也应该成为你系统其他部分非常怀疑的主题。 Web服务应该使用DB身份验证,它提供尽可能少的权限来完成他们的工作。如果您的服务使用管理员或DBO登录,则几乎肯定是错误的;上面的查询,如果它通过,实际上会被执行,并且您的主数据库不再能够使您的数据库服务器无法运行。如果你的服务使用了一个非常严格地将权限控制在服务所需要的权限的登录名,那么SQL Server会陷入困境,但是这比失去你的主数据库要好得多。
另外,要非常小心异常处理。通过SOAP返回的形式很差的异常,就像一个有效的结果一样,可能包含机密信息,鼓励攻击者尝试让您的服务抛出一个异常,其中包含有关服务背后实现的有用信息。 SQL/ADO例外对攻击者特别有用,因为它们提供了可能被利用来造成麻烦的数据结构信息。寻找可能会导致无法控制的异常的事情,并在CLR或其他层比代码更深的层次之前优雅地处理这种情况。捕获所有异常在其他地方通常是不好的做法,但是在某些情况下,带有一些消毒功能的“catch-and-release”可能是一个好主意,而通常指示异常陷阱的非常通用的500错误重定向在webosphere中是很常见的做法。如果您想要或必须在代码中抛出异常,请仔细制作它,并且不要包含任何您不希望世界知道的信息。
从建筑的角度来看,想想你的服务就像墙上的电源插座。插头是让你想要的东西(电源)离开墙壁的唯一途径。你知道有J-box,导管,开关等,但是如果没有很多(文字)黑客攻击,你就无法访问它们。按照这个比喻,你的端点应该被设置为在指定的已知端口上进行监听,而系统的其他部分应该看起来像从外面看到的墙;所有其他港口应该关闭。
Web服务威胁我的狗一次.. – 2010-09-01 16:12:10