gpt4 book ai didi

asp.net - 防止 ASP.Net 中的 SQL 注入(inject)

转载 作者:行者123 更新时间:2023-12-02 02:35:36 24 4
gpt4 key购买 nike

我有这个代码

UPDATE OPENQUERY (db,'SELECT * FROM table WHERE ref = ''"+ Ref +"'' AND bookno = ''"+ Session("number") +"'' ') 

如何防止 SQL 注入(inject)?

更新

这就是我正在尝试的

SqlCommand cmd = new SqlCommand("Select * from Table where ref=@ref", con); 
cmd.Parameters.AddWithValue("@ref", 34);

出于某种原因,我尝试添加的所有内容似乎都不起作用,我不断收到下面提到的SQL Command

错误是这样的

'SqlCommand' is a type and cannot be used as an expression

我正在接管别人的工作,所以这对我来说是全新的,我希望以正确的方式做事,所以如果有人可以提供更多关于如何使我的查询免受 SQL 注入(inject)安全的帮助,那么请这样做。

更新 2

我按照 VasilP 的说法在代码中添加了这样的内容

Dim dbQuery As [String] = "SELECT * FROM table WHERE ref = '" & Tools.SQLSafeString(Ref) & "' AND bookno = '" & Tools.SQLSafeString(Session("number")) & "'"

但是我收到错误工具未声明我是否需要指定某个命名空间才能使其工作?

更新

有没有人知道如何最好地让我的查询免受 SQL 注入(inject)的影响,而不会出现我遇到的错误?

更新

我现在有了它,所以它可以在没有参数的情况下工作,这是我更新的源代码,知道为什么它不会添加参数值吗?

Dim conn As SqlConnection = New SqlConnection("server='server1'; user id='w'; password='w'; database='w'; pooling='false'")
conn.Open()


Dim query As New SqlCommand("Select * from openquery (db, 'Select * from table where investor = @investor ') ", conn)
query.Parameters.AddWithValue("@investor", 69836)

dgBookings.DataSource = query.ExecuteReader
dgBookings.DataBind()

它的工作原理是这样的

Dim conn As SqlConnection = New SqlConnection("server='server1'; user id='w'; password='w'; database='w'; pooling='false'")
conn.Open()


Dim query As New SqlCommand("Select * from openquery (db, 'Select * from table where investor = 69836') ", conn)

dgBookings.DataSource = query.ExecuteReader
dgBookings.DataBind()

我收到的错误是这样的

An error occurred while preparing a query for execution against OLE DB provider 'MSDASQL'. 

这是因为它没有用 69836 替换 @investor

有什么想法吗?

解决方案

这是我解决问题的方法

Dim conn As SqlConnection = New SqlConnection("server='h'; user id='w'; password='w'; database='w'; pooling='false'")

conn.Open()

Dim query As New SqlCommand("DECLARE @investor varchar(10), @sql varchar(1000) Select @investor = 69836 select @sql = 'SELECT * FROM OPENQUERY(db,''SELECT * FROM table WHERE investor = ''''' + @investor + ''''''')' EXEC(@sql)", conn)

dgBookings.DataSource = query.ExecuteReader
dgBookings.DataBind()

现在我可以编写查询而不必担心 SQL 注入(inject)

最佳答案

尝试使用 parameterized query这是一个链接 http://www.aspnet101.com/2007/03/parameterized-queries-in-asp-net/

另外,不要使用 OpenQuery...使用它来运行选择

SELECT * FROM db...table WHERE ref = @ref AND bookno = @bookno
<小时/>

更多描述您的一些选项的文章:

http://support.microsoft.com/kb/314520

What is the T-SQL syntax to connect to another SQL Server?

<小时/>

已编辑

注意:您最初的问题是询问分布式查询和链接服务器。这个新语句不引用分布式查询。我只能假设您现在直接连接到数据库。这是一个应该有效的示例。这是另一个使用 SqlCommand.Parameters 的引用站点

SqlCommand cmd = new SqlCommand("Select * from Table where ref=@ref", con); 
cmd.Parameters.Add("@ref", SqlDbType.Int);
cmd.Parameters["@ref"] = 34;
<小时/>

已编辑:

好的,杰米·泰勒,我会尝试再次回答您的问题。

您正在使用 OpenQuery,因为您可能正在使用链接数据库

基本上,问题是 OpenQuery 方法采用一个字符串,而您无法将变量作为发送到 OpenQuery 的字符串的一部分传递。

您可以像这样设置查询格式。符号遵循服务器名称.数据库名称.架构名称.表名称。如果您通过 odbc 使用链接服务器,则省略数据库名称和架构名称,如下所示

    Dim conn As SqlConnection = New SqlConnection("your SQL Connection String")
Dim cmd As SqlCommand = conn.CreateCommand()
cmd.CommandText = "Select * db...table where investor = @investor"
Dim parameter As SqlParameter = cmd.CreateParameter()
parameter.DbType = SqlDbType.Int
parameter.ParameterName = "@investor"
parameter.Direction = ParameterDirection.Input
parameter.Value = 34

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

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