2009-12-16 65 views
3

我正在设计一个服务器端webservice dll的过程,其他公司的开发人员可以访问中央服务器上的数据。 我需要考虑的问题是 - 确保他们只看到允许他们看到的数据 - 允许他们上传/下载文件。再次只有他们被允许。确保webservice中的功能在delphi中是安全的

我可以设计一个sql查询,它将包含他们将能够看到的数据,但我需要确保他们不能编辑查询来访问其他数据。此外,我需要确保上传,下载功能足够安全,以至于无法下载其他人的文件。将这些函数过程和对象放在私人声明中是否足够,或者我需要做更多的工作来控制访问。

我也在通过密码控制来控制web服务。在web服务中做这件事的最好方法是什么?

回答

2

您最好也是最安全的选择是不允许直接输入SQL,而是从您公开给客户端的方法构建。无论何时处理任何字符串数据,check for injection以确保用户不试图绕过您已有的控制。最终用户不应直接调用简单的SQL语句。

例如,使用表“产品”,并揭露这个客户消费,这些方法可能如下所示:

function GetAllProductsByAmount(topn:integer):tDataset; 
    //Returns all products sorted by amount, no more than topn.} 
function GetAllProductsByName(topn:integer):tDataset; 
    //Returns all products sorted by name, no more than topn} 
function FindProductByName(name:string):tDataset; 
    //returns all products which start with name} 

FindProductByName功能将有一个检查,以确保不存在名称中的额外引号,如果是,则返回空集。如果第一个查询导致没有数据,我通常也会执行自动通配符查询。

对于下载/上传逻辑,请确保整个请求都通过您的系统。用户文件的存储点应位于未暴露于外部环境的保护区域,但仅供内部使用。当受保护资源的请求进入时,您可以检查凭据,如果它们不正确拒绝该文件。如果一切正常,然后打开并将文件流式传输给用户。 如果你的文件非常大,那么考虑一个带有单独用户的FTP服务器,这样每个用户都有自己的私人目录。这需要更多的维护,但是由于FTP服务器只针对这种访问进行了调整,所以用户可以更快地下载他们的数据。 正如以下注释中所述,由于用户名和密码以纯文本形式发送,因此FTP不够安全。

对于这种类型的应用是我历来做的是创建一个包含一个GUID在服务器上,标志着在最后的有效访问日期/时间(和IP地址)沿着表的会话cookie。会话cookie创建的唯一时间是成功登录后。每次我收到一个请求时,我都会验证这个cookie是否可用,并且仍然有效(比如说30分钟后我才开始扫描),然后更新上次访问的时间戳。如果用户注销,那么我也删除他们的会话cookie。任何包含无效会话Cookie的请求都会重定向到登录页面。这使得事情变得简单,并且减少了在过去30分钟内需要查看谁在线的数据量(或者未注销并且尚未清理)。我会自动清除所有在每次登录/注销尝试都失效的无效登录。

对于你的web服务,你可以做一些类似的事情。有一个LOGIN例程,它返回一个GUID,并要求在每个请求时传递GUID。如果它无效,则拒绝该请求。

+0

+1,但FTP通过线路发送未加密的凭证(帐户和密码) – mjn 2009-12-16 18:31:48

3

在一个web服务中,你可以完全控制你暴露给外部世界的功能。安全性必须由您自己来执行。因此,如果用户请求文件下载,则必须进行检查并根据用户的权利决定是否正确。

使用具有参数的查询来确保没有人可以混淆你的SQL代码。查询属性不应该暴露在服务上,也不需要这样做。

- 编辑:

我忘了问:你想一个SOAP服务或接近网页?

+0

我们目前已经用肥皂在Delphi 7.我们有一些web服务的已经运行,但仅在内部应用程序使用所以安全是没有这么大的问题 – LizHanson 2009-12-16 14:11:54

+0

如何将一个程序的范围影响它是另一个如何访问开发者? – LizHanson 2009-12-16 14:14:40

+1

除了参数之外,验证所有输入以确保其在达到DB代码之前满足您的界限。 – 2009-12-16 14:22:30

2

让它放置一个SQL查询本质上是不安全的,因为正如你所指出的那样,客户端可能会找到一个解决它的方法。更好的办法是将查询放入存储过程中,然后允许客户端调用存储过程。将过程的两个参数设置为用户名和密码,或者沿着这些线,可以用来识别用户并决定允许他看到的内容。

+0

这将是一个好主意。不幸的是,后端是数据库服务器的优势,因此存储过程不可用。我们使用adt/adi文件而不是dbf文件 – LizHanson 2009-12-16 14:13:25

+0

没有存储过程?哎哟!对我来说听起来不是很有利。 :对于服务层方法,P – 2009-12-16 14:17:19