我正在设计服务器端webservice dll,其他公司的开发人员可以访问这些dll来访问中央服务器上的数据。 我需要考虑的问题是 - 确保他们只看到他们可以看到的数据 - 允许他们上传/下载文件。只有他们被允许的人。
我可以设计一个sql查询,它将包含他们将能够看到的数据,但我需要确保他们无法编辑查询以访问其他数据。此外,我将需要确保上传,下载功能足够安全,他们无法下载其他人的文件。是否足以放置我不希望他们在私有声明中看到的函数过程和对象,或者我需要做更多来控制访问。
我也在考虑通过密码控制来控制web服务。在Web服务中执行此操作的最佳方法是什么。
答案 0 :(得分:3)
在网络服务中,您可以完全控制向外界展示的功能。安全性必须由您自己实施。因此,如果用户请求下载文件,则必须进行检查,并根据用户的权限决定是否正常。
使用带参数的查询以确保没有人可以搞乱您的SQL代码。查询属性不应暴露在服务之外,也不需要这样做。
- 编辑:
我忘了问:你在考虑SOAP服务还是WebSnap?
答案 1 :(得分:2)
让它放置一个SQL查询本质上是不安全的,因为正如你所指出的那样,客户端可以找到一种方法来解决它。更好的想法是将查询放在存储过程中,然后允许客户端调用存储过程。将过程中的两个参数设置为用户名和密码,或者沿着这些行的某些内容,您可以使用这些参数来识别用户并决定他允许查看的内容。
答案 2 :(得分:2)
您最好和最安全的选择是不允许直接输入SQL,而是根据您向客户端公开的方法构建SQL。每当您处理任何字符串数据时check for injection,以确保用户不会试图绕过您所拥有的控件。最终消费者永远不应该直接调用简单的SQL语句。
例如,使用表“Products”并将其公开给客户以供消费,方法可能如下所示:
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不够安全,因为用户名和密码是发送纯文本。
对于这种类型的应用程序,我传统上所做的是创建一个会话cookie,其中包含服务器上的guid,并在表中标记该cookie以及最后一个有效访问日期/时间(和IP地址)。会话cookie创建的唯一时间是成功登录。每次我收到请求时,我都会验证此cookie是否可用且仍然有效(我说的是30分钟后我的时间),然后我会更新上次访问的时间戳。如果用户注销,我也会删除他们的会话cookie。任何具有无效会话cookie的请求都会重定向到登录页面。这使事情变得简单,并且减少了需要查找过去30分钟内在线人员(或者没有注销但尚未清理)的数据量。我会自动清除所有在每次登录/注销时都已过期的无效登录。
对于您的网络服务,您可以做一些类似的事情。有一个LOGIN例程,它返回一个guid并要求在每个请求时传递guid。如果它无效,则拒绝该请求。