gpt4 book ai didi

.net - 防止动态列名中的 SQL 注入(inject)

转载 作者:行者123 更新时间:2023-11-29 11:39:17 26 4
gpt4 key购买 nike

如果不在系统的一部分(使用 Postgres)中编写一些动态 sql 条件,我就无法摆脱

我的问题是如何用我目前使用的方法最好地避免 SQL 注入(inject)。

编辑(推理):许多表中有许多列(一个数字增长(仅)并在别处维护)。我需要一种允许用户决定他们想要查询的(预定义的)列的方法(如果需要,还可以应用字符串函数)。查询本身对于用户自己编写来说太复杂了,他们也无权访问数据库。有 1000 多个具有不同需求的用户,我需要尽可能保持灵 active ——除非主查询需要更改,否则我不必重新访问代码——而且,无法知道用户需要什么条件使用。

我有对象(通过网络服务接收)为一些大型 sql 查询生成条件(生成方法在下面 - 它还不完美)。

_FieldName 是用户可编辑的(参数名称是,但不需要),我担心它可能是一个攻击向量。我在字段名称周围加上双引号 ( see quoted identifier ) 以试图清理字符串,这样它就永远不会成为关键字。我也可以根据字段列表查找字段名称,但很难及时维护。

不幸的是,用户必须输入条件标准,我确定必须有更多我可以添加到 sanatize 方法?并引用列名是否安全? (我有限的测试似乎是这样认为的)。

一个示例构建条件是“AND upper(brandloaded.make) 像'O%' 和 upper(brandloaded.make) 不像'OTHERBRAND'”......

如有任何帮助或建议,我们将不胜感激。

Public Function GetCondition() As String
Dim sb As New Text.StringBuilder

'put quote around the table name in an attempt to prevent some sql injection
'http://www.postgresql.org/docs/8.2/static/sql-syntax-lexical.html
sb.AppendFormat(" {0} ""{1}"" ", _LogicOperator.ToString, _FieldName)

Select Case _ConditionOperator
Case ConditionOperatorOptions.Equals
sb.Append(" = ")

...

End Select

sb.AppendFormat(" {0} ", Me.UniqueParameterName) 'for parameter

Return Me.Sanitize(sb)

End Function

Private Function Sanitize(ByVal sb As Text.StringBuilder) As String

'compare against a similar blacklist mentioned here: http://forums.asp.net/t/1254125.aspx

sb.Replace(";", "")
sb.Replace("'", "")
sb.Replace("\", "")
sb.Replace(Chr(8), "")

Return sb.ToString

End Function

Public ReadOnly Property UniqueParameterName() As String
Get
Return String.Concat(":" _UniqueIdentifier)
End Get
End Property

最佳答案

您可以从数据库中获取列名并进行比较以检查用户是否输入了有效的列名。

关于.net - 防止动态列名中的 SQL 注入(inject),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10953145/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com