use*_*416 2 .net c# sql code-injection
我知道如何从C#执行查询,但我想提供一个下拉列表,人们可以在其中编写查询,它将执行并填充列表.
问题是我想禁止以任何方式修改数据库的所有查询.我还没有找到办法做到这一点,我用谷歌做到了最好.
我能想到的解决方案是我将扫描查询INSERT,DELETE,UPDATE并且只允许SELECT语句.但是,我希望能够允许用户也调用存储过程.这意味着我需要获取存储过程的主体并在执行之前对其进行扫描.我如何下载存储过程呢?
如果有人知道只执行只读查询的方法请分享!我有扫描文本的感觉INSERT,DELETE,UPDATE不会阻止SQL注入.
dle*_*lev 12
最简单的方法可能是将此作业卸载到数据库.只需确保将运行查询的数据库用户仅具有读访问权限.然后,执行除其他任何操作之外的任何查询都SELECT将失败,您可以将该故障报告给用户.
如果你不采用这种方式,复杂性就会变得非常庞大,因为你基本上必须准备好解析一个任意的SQL语句,如果允许运行存储过程,更不用说SQL语句的任意序列.
即便如此,请注意确保您不会通过查询泄露敏感数据.如果您不小心,直接从站点用户输入查询可能会很危险.即使你是这样,允许这些查询除了特定构造的沙箱数据库之外的任何东西都是"哎呀,我不小心改变了用户的权限",而不是成为安全噩梦.
另一种选择是编写"查询创建者"页面,用户可以在其中选择他们想要查看的表格和列.然后,您可以a)仅显示适合给定用户的表和列(可能基于用户角色等)和b)自己生成SQL,最好使用参数化查询.
更新:正如Yahia所指出的,如果用户具有执行权限(以便他们可以执行存储过程),那么过程本身的权限就会受到尊重.鉴于这种情况,它可能会更好不是允许任意存储过程的执行,而是提供用户的已知是安全的程序列表.但是,这可能很难维护并且容易出错,因此完全不允许存储过程可能是最好的.