c# - 检查存储过程的执行是否可以修改数据
问题描述
我想实现一个 WCF 服务,其范围可以从数据库中检索一些数据。
执行存储过程检索数据。数据以 xml 格式返回。
实际上,我的服务包含一个方法,其中一个参数指定要执行的存储过程的名称,如果需要,还包含一些输入参数。
为了安全起见,我想检查作为输入传递的存储过程的执行是否可以将数据修改到数据库中。
让我们做一个简单的例子。我,一个恶意用户,找出这个服务是如何工作的,然后像这样调用我的方法:
ExecuteStoredProcedureToGetData("proc_InsertNewRow", "<XML><User Id="VeryBadBoy"/></XML>");
是否有一种机制可用于检查是否proc_InsertNewRow
修改了数据库,与 C#、ADO.NET 和 SQL Server 一起使用。
我给我的实现的逻辑应该是这样的:我的设计目的是检索一些数据,而不是修改数据。我不执行这个存储过程。
编辑:我会尝试更好地解释它。我的系统会生成大量数据。决定在客户端和服务器之间添加一个新层,即我的 WCF 服务。因此,当客户端请求一些数据时,服务器会将数据转发给我的服务,并传递存储过程的名称。
前任。用户打开 Products 屏幕 -> call to server GetProducts()
-> call to WCF Service ExecuteStoredProcedure("proc_GetProducts")
。
检查是否调用ExecuteStoredProcedure
修改数据是我想做的额外检查(或者可能是定义的某人的 Xy 问题),因为我不希望有人使用我的通用方法来更改数据。
解决方案
尽管您已询问Y,但我将继续讨论X。
尝试对您的 WCF 进行编程以每次都预解析传递给它的每个存储过程名称,这是一个糟糕的主意。这将容易出错,对性能不利,而且它不是处理安全性的正确方法,甚至不是正确的地方。
我什至会说,拥有一个 WCF 方法来通用处理所有存储过程调用也不是正确的做事方式,但这与您的问题更加相切。
做你想做的事情的正确方法是从你的数据库所有者那里确切地找出应该允许 WCF 用户执行哪些过程,然后对 WCF 进行编程以仅执行这些过程并在用户尝试时返回某种错误/警告执行不在该列表中的任何内容。
如果您担心数据库所有者将来可能希望添加可以使用的新过程,他们可以将允许的过程列表保存在一个表中,并且您可以在每次过程调用进入时查询该表。
但是,进一步无视您的实际问题,处理此问题的最佳方法是根本不处理它......在 WCF 中。处理数据库安全的正确位置是在数据库中。应该为 WCF 提供一个特定的用户帐户来访问数据库。数据库专家应负责为该用户帐户授予对其数据库中过程的正确权限。您应该在 WCF 中负责的唯一事情是处理数据库返回的任何权限错误。
推荐阅读
- google-bigquery - BigQuery 创建标准和旧版 sql 之间的表差异
- excel - 循环遍历列表框多选
- python - 使用多处理有效地切片和读取图像
- ag-grid - 如何在 Ag-grid 中添加行标题?
- system-verilog - 如何使用 uvm 访问基于顺序寄存器的偏移量?
- c# - 为什么在创建新的 AppDomain 时根本不考虑 PrivateBinPath?
- node.js - 使用nodejs在猫鼬中加入两个集合
- liquibase - 使用 liquibase 时,无法获取数据库结果日志
- rx-java2 - RxJava2 合并和多播事件流
- visual-studio-code - flake8 和 vscode:在函数调用中的每个参数后禁用换行符