4

我目前正在处理一个遗留的 ASP 项目,其中安全性现在已成为一个大问题。它不仅是不安全的加密方法(md5),而且我担心 SQL 注入问题。我还不太擅长注射,我只尝试了我所知道的基础知识。我找到了“保护”任何用户输入的功能,但我想知道它是否真的在做任何事情来防止注入攻击。这是功能:

function sqlfix(input)
    if not isnull(input) and input <> "" then
        input = replace(input, ";", "&#59;")
        input = replace(input, "'", "&#39;")
        input = replace(input, """", "&#34;")
        input = replace(input, "(", "&#40;")
        input = replace(input, ")", "&#41;")
        input = replace(input, "|", "&#124;")
        input = replace(input, "<", "&#60;")
        input = replace(input, ">", "&#62;")
        input = replace(input , "'", "''")
        'input = Server.HTMLEncode(input)
        'input = Server.UrlEncode(input)
        sqlfix = input
    else
        sqlfix = ""
    end if
end function

我记得很多年前我第一次使用 mysql_* 函数启动 PHP 时做过类似的事情,但现在我已经转向 PDO 和参数绑定。但是我不知道这对于 ASP 应用程序有多安全。感谢您的任何意见。

4

4 回答 4

6

不要陷入字符串插值陷阱!它不安全。

即使在 ASP Classic 中,您也可以使用真正的 SQL 查询参数。

我不是 ASP 程序员,但我发现这个博客有一个清晰的示例,说明使用 ADODB.Command 对象进行参数化 SQL 查询,并在执行之前将值绑定到参数。

http://securestate.blogspot.com/2008/09/classic-asp-sql-injection-prevention_30.html

另请参阅此 SO question,了解更多使用命名参数的示例:

参数化查询中的 ASP 经典命名参数:必须声明标量变量

于 2012-11-26T21:36:33.263 回答
3

这与 ASP Classic 中的 PDO 最接近...

with createobject("adodb.command")
    .activeConnection = application("connectionstring")
    .commandText = "select * from sometable where id=?"
    set rs = .execute( ,array(123))
end with

如何在经典 asp 中创建一个准备好的语句来防止 sql 注入?

于 2012-11-26T21:41:02.617 回答
1

线

input = replace(input , "'", "''")

正在做大部分工作。我为安全站点所做的是为每种数据类型提供了几个不同的功能

fn_validstring replacing single quotes
fn_validnumber testing isnumeric 
fn_validint leveraging fn_validnumber and rounding
fn_bool 
etc ... 

无论如何,用存储过程替换动态并删除除执行之外的所有权限都可以保护环境。

于 2012-11-26T21:36:48.330 回答
0

PDO 和预处理语句是防止 SQL 注入的最佳方法。像上面的代码那样手写 SQL 清理代码要危险得多,因为你很容易错过很多东西。

使用准备好的语句将使 SQL 语句安全。

于 2012-11-26T21:32:03.370 回答