使用经典ASP防止SQL Server文本字段中的SQL注入

使用经典ASP防止SQL Server文本字段中的SQL注入,sql,sql-server,asp-classic,sql-injection,Sql,Sql Server,Asp Classic,Sql Injection,我有ASP中的代码,它使用参数化查询将值放入SQLServer中的文本字段。我想知道参数化是否足够,或者我是否必须在字段中搜索可能的命令,用双记号替换单记号,等等。文本字段是随笔,因此它们可能有任意数量的单词或字符 我安全吗 sSQL="[usp_SaveDocumentGradeCriteria]" Set dbCommand = Server.CreateObject("ADODB.Command") Set dbCommand.Act

我有ASP中的代码,它使用参数化查询将值放入SQLServer中的文本字段。我想知道参数化是否足够,或者我是否必须在字段中搜索可能的命令,用双记号替换单记号,等等。文本字段是随笔,因此它们可能有任意数量的单词或字符

我安全吗

sSQL="[usp_SaveDocumentGradeCriteria]"
            Set dbCommand = Server.CreateObject("ADODB.Command")    
            Set dbCommand.ActiveConnection = oConn  
            dbCommand.CommandType = adCmdStoredProc 
            dbCommand.Commandtext=sSQL  
            dbCommand.Parameters.Append (dbCommand.CreateParameter("@CriteriaXML", adLongVarChar, adParamInput, len(saveXML), saveXML))
            dbCommand.Parameters.Append (dbCommand.CreateParameter("@Comments", adLongVarChar, adParamInput, len(commentText), commentText))    
            dbCommand.Parameters.Append (dbCommand.CreateParameter("@documentGUID", adGuid, adParamInput, 0, documentGUID)) 
            dbCommand.Parameters.Append (dbCommand.CreateParameter("@graderFYCUserID", adInteger, adParamInput, 0, fycuserid))  
            dbCommand.Parameters.Append (dbCommand.CreateParameter("@graderSequence", adInteger, adParamInput, 0, graderSequence))  
            if trim(grade)<>"" then
                dbCommand.Parameters.Append (dbCommand.CreateParameter("@grade", adInteger, adParamInput, 0, grade))    
            end if


            set oRST=dbCommand.Execute
sSQL=“[usp\u SaveDocumentGradeCriteria]”
Set dbCommand=Server.CreateObject(“ADODB.Command”)
Set dbCommand.ActiveConnection=oConn
dbCommand.CommandType=adCmdStoredProc
dbCommand.Commandtext=sSQL
dbCommand.Parameters.Append(dbCommand.CreateParameter(“@CriteriaXML”、adLongVarChar、adParamInput、len(saveXML)、saveXML))
dbCommand.Parameters.Append(dbCommand.CreateParameter(“@Comments”、adLongVarChar、adParamInput、len(commentText)、commentText))
dbCommand.Parameters.Append(dbCommand.CreateParameter(“@documentGUID”,adGuid,adParamInput,0,documentGUID))
dbCommand.Parameters.Append(dbCommand.CreateParameter(“@graderFYCUserID”,adInteger,adParamInput,0,fycuserid))
dbCommand.Parameters.Append(dbCommand.CreateParameter(“@graderSequence”,adInteger,adParamInput,0,graderSequence))
如果纵倾(坡度)“,则
dbCommand.Parameters.Append(dbCommand.CreateParameter(“@grade”,adInteger,adParamInput,0,grade))
如果结束
设置oRST=dbCommand.Execute

将文本作为参数传递将消除调用存储过程时SQL注入的可能性。但是,这并没有说明存储过程本身,如果它使用动态SQL,它也可以暴露于SQL注入。而且,即使存储过程是安全的,您仍然必须确保在向客户端显示上载的内容时,不会对其执行任何跨站点脚本编写


这真的是一个端到端的游戏,你必须确保每一步。在调用过程时使用参数是好的,但是没有人知道这是否足够。您必须一直跟踪数据,直到将其显示回客户端浏览器(如果是由JScript操作的,则可能在显示之后继续…)

将文本作为参数传递将消除调用存储过程时SQL注入的可能性。但是,这并没有说明存储过程本身,如果它使用动态SQL,它也可以暴露于SQL注入。而且,即使存储过程是安全的,您仍然必须确保在向客户端显示上载的内容时,不会对其执行任何跨站点脚本编写


这真的是一个端到端的游戏,你必须确保每一步。在调用过程时使用参数是好的,但是没有人知道这是否足够。您必须一直跟踪数据,直到将其显示回客户端浏览器(如果由JScript操作,则可能会在显示之后继续…

这是一个好的观点。我更关心调用点,因为我已经在T-SQL中保护了这个过程。必须找到一个很好的资源来过滤XSS尝试。有什么想法吗?@Caveatrob使用正则表达式验证某些元素是否不在您的文本中。例如,限制用户使用“”,但最好只在提交时进行编码,在检索时进行解码,这将阐明SQL注入的任何可能性,并为内容提供安全性。这一点很好。我更关心调用点,因为我已经在T-SQL中保护了这个过程。必须找到一个很好的资源来过滤XSS尝试。有什么想法吗?@Caveatrob使用正则表达式来验证某些元素是否不在文本中。例如,限制用户使用“”,最好只在提交时进行编码,在检索时进行解码,这将阐明SQL注入的任何可能性,并为内容提供安全性。