-1

我在 ASP Classic 中使用 SQL 进行了查询,得到的语法如下所示:

    mQry = "SELECT name FROM finals WHERE invoice_num = " &request.querystring("num") & " AND name LIKE '&" & request.querystring("nam") & "%'"
    response.write("Operating Unit")
    for each x in TestRally.fields
    response.write(": ")
    response.write(x.value)  '-- got error in this area...
    response.write("<br>")
    next
    response.write("<br>")
    TestRally.MoveNext

基于上面提到的语法,什么是最好的补救办法..???

到目前为止我收到的错误消息是这样的:

Microsoft OLE DB Provider for Oracle 错误 '80040e07' ORA-01722: 无效号码

4

4 回答 4

2

您的代码对 SQL 注入攻击是开放的,这部分是您的问题的原因:您没有验证(更不用说清理)用于制定查询的输入。

在继续之前请参阅此 QA:什么是 SQL 注入?

在不知道您使用的是什么 DBMS 的情况下,我们无法告诉您如何正确解决它,但一个快速的解决方法是:

Dim invoiceNum
invoiceNum = CInt( Request.QueryString("num") )
Dim name
name = Request.QueryString("nam")
name = Replace( name, "'", "''" )

Dim sql
sql = "SELECT name FROM finals WHERE invoice_num = " & invoiceNum & " AND name LIKE '&" & name & "%'"
于 2013-08-30T01:16:22.977 回答
0
invoiceNum = CInt( Request.QueryString("num") ) 

可能导致溢出。

您传递的发票编号对于整数来说太大了。将发票编号另存为字符串。

使用 Dai 的代码,试试这个:

Dim invoiceNum
invoiceNum = Request.QueryString("num")
invoiceNum = Replace( invoiceNum, "'", "''")

Dim name
name = Request.QueryString("nam")
name = Replace( name, "'", "''" )

sql = "EXEC sp_executesql N'SELECT name FROM finals WHERE invoice_num = @invoice_num AND name LIKE ''&'' + @name + ''%'''"
sql = sql & ",N'@invoice_num varchar(20),@name varchar(255)',@invoice_num = '" & invoiceNum & "',@name = '" & name & "'"
于 2013-08-30T02:26:54.203 回答
0

"SELECT name FROM finals WHERE invoice_num='" & request.querystring("num") & "' AND name = '" & request.querystring("nam") & "'"

这是 ASP Classic 中查询的正确 SQL 语法,而不是我在问题中提到的上述 SQL 查询。

于 2013-09-16T02:57:10.590 回答
0

在执行上述语句之前启用 sql 跟踪或更好的 10046 跟踪,您将看到为 invoice_num 传入的值。这将创建一个跟踪文件,详细说明所有语句及其执行方式。

另外发布表是如何定义的。

于 2013-09-02T03:32:54.040 回答