如何在经典的asp中制作一个预防sql注入的预备语句?

时间:2011-12-16 19:10:17

标签: asp-classic sql-injection

我有这个有效:

sqlString = "SELECT * FROM employees WHERE lastname = '" & last_name & "'"
Set cmd = Server.CreateObject("ADODB.Command")
Set cmd.ActiveConnection = dbConn
cmd.CommandText = sqlString
cmd.Prepared = True
Set recs = cmd.Execute

我遇到的问题是sqlString的动态部分之上是在准备好的语句命令之前。我不认为我上面提到的是保护我。

在执行预准备语句之前,我不必修复此sqlString吗?读这篇文章让我想到:How can prepared statements protect from SQL injection attacks?

“在准备好的陈述中,我们不会改变我们的计划,但它仍然完好无损    这就是重点。

我们首先将程序发送到服务器

 $db->prepare("SELECT * FROM users where id=?");

其中数据被称为“占位符”的变量替换    然后我们分别发送数据:

 $db->execute($data);

所以,它不能改变我们的程序并造成任何伤害。    很简单 - 不是吗?“

但我不知道如何使我的查询正确。我也不知道他是如何从prepare$data的。希望得到指导。感谢。

3 个答案:

答案 0 :(得分:10)

为什么不使用ADO命令参数?

var oCmd = Server.CreateObject("ADODB.Command");
oCmd.CommandText = "SELECT * FROM employees WHERE lastname = ?";
oCmd.Parameters.Append(oCmd.CreateParameter(undefined,202, 1, 50,"last name"))//adVarWChar

答案 1 :(得分:0)

这是一篇关于如何使用经典asp防止sql注入的好博客。

http://blogs.iis.net/nazim/archive/2008/04/28/filtering-sql-injection-from-classic-asp.aspx

答案 2 :(得分:0)

最简单的方法是在SQL中使用存储过程并以这种方式使用命令。否则,您必须转义从Request对象收集的某些字符,如单引号和双连字符等。