准备好的报表和清除数据



在将准备好的语句与经典ASP一起使用时,例如:

SQL = "SELECT user_name, user_sign_up_date FROM tbl_users WHERE this = ? AND id = ? "
Set stmt01 = Server.CreateObject("ADODB.Command")
stmt01.ActiveConnection = oConn
stmt01.Prepared = true
stmt01.commandtext = SQL
stmt01.Parameters.Append stmt01.CreateParameter("@x1", adVarChar, adParamInput, 255, card_pwd)
stmt01.Parameters.Append stmt01.CreateParameter("@x2", adInteger, adParamInput, , this_id)
set myRS = stmt01.Execute

除了进行通常的意义检查,例如确保数字是数字等等,使用这种参数化语句的过程是否意味着我不再需要担心,例如对于varchar或文本字段,清除用户输入的数据-例如,我是否不再需要使用函数来推送用户通过Server.HTMLencode输入的所有内容?

我不确定参数化的语句路由是否意味着我现在可以不那么严格地重新清理用户数据?

您将两种不同类型的消毒混为一谈。SQL参数化可防止"Bobby Tables"漏洞,这是一个恶意写入的数据位,诱使SQL结束当前查询并执行攻击者选择的单独查询。

https://bobby-tables.com

即使使用SQL参数,攻击者也可以通过(例如(在字段中输入"alert('Gotcha!'("来尝试在您的页面上运行脚本。在HTML页面上显示字段数据,然后编写并执行该脚本。为了防止使用Server.HTMLencode

如果您关心的是SQL注入攻击,那么参数化应该消除SQL字符串被篡改的可能性,因为这些值是在执行时提供的。

其他人是正确的,您不需要担心参数的内容。你确实需要担心字符串的长度。我会将Left(card_pwd, 255)传递给CreateParameter(),以避免异常导致脚本崩溃。我倾向于不担心对整数参数调用IsNumeric(),但这可能是值得的(试着传递一些废话,看看会发生什么(。

最新更新