我有一个内部网络服务,可以公开给定任务的费率。目前有一项服务暴露:
(* 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内公开服务的可写部分。
只是想知道是否有人有任何想法/意见/不同方法
答案 0 :(得分:1)
在不知道底层数据模型的外观或构造方式的情况下,我提出的一个建议是考虑WCF数据服务。如果您希望在实体模型之上构建一系列CRUD和搜索服务,WCF-DS可能是一种有用的方法。
创建只读服务非常简单,因为您必须创建一个将您的实体公开为IQueryable的数据上下文,这对roll on your own来说并不难。如果您正在使用实体框架,那么为您照顾它会更容易。您甚至可以将这些IQueryable公开的实体创建为一个数据服务(.svc)并对其进行配置,使这些实体只是只读的。
您可以创建第二个服务来处理内部用途的更新(和读取)。可更新服务将要求您实现IUpdateable,这比实现IQueryable更复杂(除非您使用EF,然后您可以免费获得它 - 可以这么说)。
我在WCF-DS中找到的好处是CRUD操作的管道系统适合您,然后您可以更加专注于安全性和一次性服务方法,而不是处理基本的CRUD码。此外,返回的数据采用标准格式(OData),并且可以作为XML或JSON返回。
总的来说,我喜欢这个框架并将其视为新的类似CRUD的项目。另请注意,我主要使用的是.NET 4。
希望这个观点有所帮助。如果您有其他问题,请告诉我。祝你好运!