在ASP.Net中防止SQL注入

前端之家收集整理的这篇文章主要介绍了在ASP.Net中防止SQL注入前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我有这个代码
UPDATE OPENQUERY (db,'SELECT * FROM table WHERE ref = ''"+ Ref +"'' AND bookno = ''"+ Session("number") +"'' ')

我该如何防止sql注入?

UPDATE

这是我正在尝试的

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

由于某些原因,我尝试添加它似乎没有工作,我不断得到下面提到的sql命令.

这是错误

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

我接管别人的工作,所以这对我来说都是新手,我想做正确的事情,所以如果任何人可以提供任何更多的帮助,如何使我的查询sql注入安全,那么请做.

更新2

我在代码添加了VasilP这样说的

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

但是我收到一个错误工具没有声明我需要指定一个名字空间才能工作吗?

UPDATE

有没有人有任何想法,最好的让我的查询sql注入安全,没有我遇到的错误

UPDATE

我现在有它所以它的工作没有参数位这里是我更新的源代码任何想法为什么它不会添加参数值?

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注入

解决方法

尝试使用 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;

编辑:

Ok Jamie taylor我会再次回答你的问题.

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

基本上问题是OpenQuery方法接受一个字符串,您不能传递一个变量作为发送到OpenQuery的字符串的一部分.

您可以像这样格式化您的查询.符号遵循servername.databasename.schemaname.tablename.如果您通过odbc使用链接的服务器,那么请省略databasename和schemaname,如下所示

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相关文章