代码之家  ›  专栏  ›  技术社区  ›  Ian Johnson

在DMZ中只公开一些服务方法

  •  0
  • Ian Johnson  · 技术社区  · 14 年前

    我有一个内部Web服务,它公开了一个给定任务的支付率。当前有一个服务公开:

    • 货币-添加、编辑、删除、按ID选择
    • 国家/地区-添加、编辑、删除、选择ByID
    • 任务-添加、编辑、删除、SelectByID
    • 费率-添加、编辑、删除、全选、按ID-(*1)搜索
    • 参考数据(货币、国家、用户、任务…)-全选
    • 用户-添加、编辑、删除、SelectByID

    (*1)这只需要执行SQL查询(我知道这是一个SQL注入的噩梦!我没有写这个)

    在有人决定通过防火墙将服务公开到DMZ之前,我被要求检查该服务,即使他们告诉我防火墙规则将阻止攻击,我拒绝允许该服务公开。

    需要信息的应用程序只需要对数据进行只读访问,我建议我们生成一个更安全的外观(可能使用WCF),它只公开所需的信息,并计划对系统进行彻底的检修。

    我的建议是将服务分解为一系列特定的接口:

    • 货币
    • 国家
    • 任务
    • 费率
    • 用户

    但是,如果我只需要DMZ中的只读数据,那么将每个服务分解为只读服务合同和可写服务合同是否有意义,例如,对于货币:

    public interface ReadOnlyCurrencyService
    {
        IEnumerable<Currency>GetAll();
        Currency GetById(int id);
    }
    
    public interface CurrencyService : ReadOnlyCurrencyService
    {
        void Add(Currency currency);
        void Update(Currency currency);
        void Delete(Currency currency);
    }
    
    public class CurrencyServiceLAN : CurrencyService
    {
    }
    

    通过这种方式,我们只能公开货币服务的只读部分作为跨DMZ-LAN边界的端点,但使用相同的服务会公开LAN内服务的可写部分。

    只是想知道是否有人有任何想法/评论/不同的方法

    1 回复  |  直到 14 年前
        1
  •  1
  •   David Hoerster    14 年前

    在不知道基础数据模型是什么样子或者它是如何构造的情况下,我有一个建议,那就是考虑一下WCF数据服务。如果您希望在实体模型的基础上构建一系列CRUD和搜索服务,那么WCF-DS可能是一种有用的方法。

    创建只读服务是非常直接的,因为您必须创建一个数据上下文,它将您的实体作为iqueryable公开,这并不太难 roll on your own . 如果您使用的是实体框架,那么它就更容易处理了。甚至可以将这些iQuery公开的实体创建为一个数据服务(.svc),并对其进行配置,使这些实体仅为只读。

    您可以创建第二个服务来处理内部更新(和读取)。可更新的服务将要求您实现IUpdatable,这比实现IQueryable要复杂得多(除非您使用的是EF,否则您可以免费获得它——也就是说)。

    我在WCF-DS中发现的一个好处是,CRUD操作的管道已经为您准备好了,然后您可以更加准确地关注安全性和一次性服务方法,而不是处理基本的CRUD代码。另外,返回的数据是标准格式(OData),可以作为XML或JSON返回。

    总的来说,我喜欢这个框架,并把它考虑到新的类似crud的项目中。请注意,我主要使用.NET 4。

    希望这个观点有帮助。如果你还有其他问题,请告诉我。祝你好运!