回答

收藏

如何防止用户生成SQL查询进行Sql注入

技术问答 技术问答 245 人阅读 | 0 人回复 | 2023-09-14

我有一个项目(私有,ASP.net网站,使用https其中一个要求是用户可以输入并直接查询数据库Sql查询。我需要能够允许这些查询,防止它们损坏数据库本身,并防止它们访问或更新不应该访问/更新的数据。
) W& A8 |# |% Y我提出了以下实施规则:/ Y  ]+ f" e% {2 h* @  i8 r
[ol]使用     具有选择表/视图和更新表的权限db(因此,任何其他命令(例如)drop / alter / truncate / insert / delete)。- _( g( {* A1 X5 e( t
验证句子是否从单词选择或更新开始
8 V) I7 E0 d/ ~, Q3 T, [9 d( d; r验证(使用Regex)句子中没有分号的例子,没有单引号、空格和字母。(这里的想法是,它们包括第二个查询的唯一方法是结束第一个查询,而不是输入字符串)。% h/ E; l/ A* j+ M; s, j# i. s
验证(使用Regex)用户是否有权访问正在查询/更新的表,包括连接。这包括所有子查询。(完成此操作的部分方法是用户将使用数据库中实际不存在的一组表名,部分查询分析将在查询中更换正确的对应表名) 。[/ol]我有什么想念的吗?0 n- h0 S4 g; K6 a
目的是让用户以任何他们认为合适的方式查询/更新他们有权访问的表格,并防止任何意外或恶意尝试破坏数据库。(并要求用户生成sql,因此,我不能使用我所知道的任何内置工具来参数化或清理查询。
! `) G$ c3 @6 x5 f                                                               
7 i& q, P6 [. U$ a# S7 u6 {- W& A    解决方案:                                                                ; q. A2 _' }8 u; J9 a
                                                                嗯,你有足够的人告诉你 不要这样做    因此,如果他们不能说服你,有一些建议:4 O2 C  K# ~" A6 I$ Y  G3 ?
包括好,不要试图排除坏的
* T0 ^* Y1 b- @' Z(我认为正确的术语是 白名单    与 黑名单    ),指 不要寻找邪恶或无效的东西扔掉    (写法太多)或伪装),而是寻找7 O$ P( b( t( |' g. a! B. N
包含有效的东西    抛弃所有其他内容。
/ u! v9 f, Z  T6 L2 u5 E. h" s您在另一条评论中提到,您正在寻找用户友好的表名列表,并替换实际模式表名。这就是我在说的-如果您要执行此操作,那么也要使用字段名称。8 c) Y/ |; G5 q- `4 {2 e; l( e
然而,我仍然倾向于使用图形用户界面:选择在这里查看的表,选择在这里查看的字段,并使用一些下拉列表来构建where子句等。
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则