2016-09-09 12 views
-1

ASP를 사용하는 이전 내부 웹 사이트에서 발생하는 SQL 주입 공격으로부터 보호하기 위해 정리 중입니다. 여기ADO 명령으로 채워지지 않은 ADO 레코드 집합 메서드 실행

데이터베이스 연결이대로 Connect.asp

<% 
on error resume next 

Set DB = Server.CreateObject("ADODB.Connection") 
DB.CommandTimeout = 180 
DB.ConnectionTimeout = 180 

connStr = "Provider=SQLOLEDB;Data Source=xxx-xxxx-xxxxxx;Initial Catalog=xxxx;Persist Security Info=True;User ID=xxxxx;Password=xxxxxxxxxxxx;" 

DB.Open connStr 

' Check DB connection and go to Error Handler is error exists 
if DB.state=0 then 
    Response.Write "<p>Cannot connect to database.</p>" 
    TrapError Err.description 
    Response.end 
end if 
%> 

이 작동하고 DB 연결이 열립니다라는 별도의 ASP 파일에 설정입니다 ... 코드에서 모두의 요점입니다.

DBFunctions.asp라는 파일을 사용하여 저장 프로 시저와 해당 매개 변수에 맵 함수를 정렬하는 데 사용합니다. 다른 ASP 페이지 프런트 엔드 페이지에 ADO 레코드 집합을 반환하려면 아래 함수를 사용하려고합니다. 레코드가 반환 없다는 것을 여기

Function GetFacilityByFID(fid) 
    set rs = server.CreateObject("ADODB.Recordset") 
    Set cmd = Server.CreateObject("ADODB.Command") 
    Set cmd.ActiveConnection = DB 
    cmd.CommandText = "GetFacilityByFID" 
    cmd.CommandType = adCmdStoredProc 
    cmd.Parameters.Append cmd.CreateParameter("@FID", adVarChar, adParamInput, 20) 
    cmd("@FID") = fid 
    Set rs = cmd.Execute 
    Set GetFacilityByFID = rs  
End Function 

는 facDetail.asp

<% 

Dim FID, FCBI, Error 
FID = Request("FID") 
FCBI = Request("FCBI") 

' Check DB connection and go to Error Handler is error exists 
if DB.state=0 then 
    Response.Write "<p>Cannot connect to database.</p>" 
    TrapError Err.description 
    Response.end 
else 
    if FID then 
     Set RS = GetFacilityByFID(FID) 
    elseif FCBI then 
     Set RS = GetFacilityByFCBI(FCBI) 
    end if 

    if RS.EOF then 
     Response.Write "<BR><p class=alert>No record found</p>" 
     response.End 
    end if 
end if 
%> 

호출 페이지가 표시됩니다 호출 프런트 엔드 ASP 페이지에서 코드

enter image description here

하지만, 저장 프로시 저는 SSMS에서 실행될 때 작동합니다.

업데이트 코드

다음은 GetFacilityByFID 저장 프로 시저의 SQL 코드입니다.

CREATE PROCEDURE [dbo].[GetFacilityByFID] 
    @FID varchar(20) 
AS 
BEGIN 
    SET NOCOUNT ON; 

    SELECT [FAC_CBI_NBR] 
    ,[FAC_ID] 
    ,[FAC_TYPE] 
    ,[FAC_SUBTYPE] 
    ,[FAC_REGION] 
    ,[FAC_COST_CENTER] 
    ,[FAC_SUPPLY_CODE] 
    ,[FAC_UPLINE] 
    ,[FAC_SERVICE] 
    ,[FAC_LOCATION_NAME] 
    ,[FAC_LOCAL_ADDR1] 
    ,[FAC_LOCAL_ADDR2] 
    ,[FAC_LOCAL_CITY] 
    ,[FAC_LOCAL_STATE] 
    ,[FAC_LOCAL_ZIP] 
    ,[FAC_MAIL_ADDR1] 
    ,[FAC_MAIL_ADDR2] 
    ,[FAC_MAIL_CITY] 
    ,[FAC_MAIL_STATE] 
    ,[FAC_MAIL_ZIP] 
    ,[FAC_COUNTRY] 
    ,[FAC_PHONE] 
    ,[FAC_FAX] 
    ,[FAC_MANAGER] 
    ,[FAC_CONTACT] 
    ,[FAC_CONTACT_PHONE] 
    ,[FAC_CONTACT_EXT] 
    ,[FAC_CONTACT_EMAIL] 
    ,[FAC_COMMENTS] 
    ,[FAC_CHANGED_BY] 
    ,[FAC_LAST_UPDATE] 
    ,[FAC_MAILOUT] 
    ,[FAC_CONTRACTION] 
    ,[FAC_PROPERTY_CODE] 
    ,[FAC_ATTN_TO] 
FROM [cbid].[dbo].[FACILITY] 
WHERE [FAC_ID][email protected] 
END 

GO  

아무도 잘못되었다고 말할 수 있습니까? 나는 이것을 너무 오랫동안보고 있었고 그것에 좌절감을 느꼈다.

도움이 될 것입니다.

편집 :

이 문제의

현황 : 점점 ADO를 공급자로부터 다음

오류 번호 : -2147217904 오류 제품 설명은 : 프로 시저 또는 함수 'GetFacilityByFID가'매개 변수 기대 '@FID' , 그것은 공급되지 않았다. 오류 원본 : 당신이 매개 변수를 설정하는 방법은 권리를 보지 않는다

+0

내가 줄 수있는 최고의 조언은 Next'는 당신이 실제로 얻고있는 어떤 오류보고 받아 다시 시작 오류에'주석, 그것은 진짜 엉망 놀라지 아니에요 거기에서. – Lankymart

+0

다음 번에 On Error 오류를 제거하고 내가 얻는 것을 확인하겠습니다. –

+1

오류가 문에 의해 숨겨지기 때문에이 상황에서 가장 먼저해야 할 일입니다. 'On Error Resume Next'가 작동하는 방식은 오류가 'Err' 객체에 오류를 기록하고 다음 명령문으로 넘어가는 진술을 만날 때 발생합니다. 이것은 계속해서 원래의 오류를 찾는 문제를 일으킬 수 있습니다. – Lankymart

답변

-1

SQL Server 용 Microsoft OLE DB 공급자 대신이 시도 :

Dim param 
Set param = cmd.CreateParameter("@FID", adVarChar, adParamInput) 
cmd.Parameters.Append param 
param.Value = fid 

여기에서 자세한 내용을보실 수 있습니다 : https://msdn.microsoft.com/pt-br/library/ms675860(v=vs.85).aspx

희망 도움이

+0

@Ricardo Pontual에게 감사하지만 행운이나 변화는 없습니다. 나는 처음에는이 방법을 시도했지만 전류가 축약 된 버전이며 필수적이라는 것을 알았습니다. –

+0

매개 변수 설정 방법은 완벽하게 수용 할 수 있습니다. 그렇지 않은 경우'On Error Resume Next'가 설정되어 있지 않으면 오류가 발생할 가능성이 높습니다. 매개 변수를 설정하기 위해 여분의 보풀이 모두 필요하지는 않습니다. – Lankymart

1

크기를 지정해야합니다.당신이 유형 인수의 가변 길이 데이터 형식을 지정하는 경우 CreateParameter Method (ADO)

에서

, 당신은 크기 인수를 전달하거나 매개 변수Size 속성을 설정해야 하나 개체를 추가하기 전에 매개 변수 컬렉션; 그렇지 않으면 오류가 발생합니다. 더 진행하기 전에

cmd.Parameters.Append cmd.CreateParameter("@FID", adVarChar, adParamInput, Len(fid))

+0

@MattPedigo 여전히 같은 오류가 발생합니까? 문제를 진단하려면 오류를 아는 것이 중요합니다. 또한 프로 시저 (GetFacilityByFID) 작성 스크립트를 표시 할 수 있습니까? –

+0

여전히 같은 오류가 발생했습니다 ... 오류 번호 : -2147217904 오류 설명 : 프로 시저 또는 함수 'GetFacilityByFID'에 '@FID'매개 변수가 필요하지 않습니다.이 매개 변수는 제공되지 않았습니다. 오류 원본 : SQL Server 용 Microsoft OLE DB 공급자 SQL 저장 프로 시저 코드를 게시합니다. –

+0

@MattPedigo 스크립트를보고 나면 'fid'(GetFacilityByFID 매개 변수)가 비어 있거나 null이라는 것을 알 수 있습니다. 'IsNull (fid)','IsEmpty (fid)','Len (fid)> 0'을 출력하여 값을 확인하십시오. 그 외에는 모든 것이 OK입니다. –

0

는 우선 저장 프로 시저가 실제로 GetFacilityByFID 레코드를 반환하는 경우 확인하는 것입니다? 가능성이 높습니다. 그것은 단지 하나의 문자열 값을 반환 할 경우, 아래처럼 뭔가 Function GetFacilityByFID(fid)을 수정해야합니다 :

Function GetFacilityByFID(fid) 
    Set cmd = Server.CreateObject("ADODB.Command") 
    Set cmd.ActiveConnection = DB 
    cmd.CommandText = "GetFacilityByFID" 
    cmd.CommandType = adCmdStoredProc 
    cmd.Parameters.Append cmd.CreateParameter("@returnVal", adVarChar, adParamOutput, 255, "") 
    cmd.Parameters.Append cmd.CreateParameter("@FID", adVarChar, adParamInput) 
    cmd("@FID") = fid 
    cmd.Execute 
    GetFacilityByFID = cmd("@returnVal") 
End Function 
+0

저장 프로 시저는 Facility라는 테이블에서 모든 필드를 반환하며 SSMS에서 수동으로 테스트 할 때 작동합니다. –

+0

@MattPedigo 답안에서 설명했던 크기를 지정하지 않고 'adVarchar'형 매개 변수를 전달할 수 없습니다. 내 제안을 시도 했습니까? –

+0

예 귀하의 제안을 시도했습니다. 고마워.하지만 도움이되지 않았어. 이를 반영하기 위해 코드 예제를 업데이트하지 않았습니다. –

0

나는 내가 찾은 예제의 일부와 LankyMart의 제안의 일부를 사용하여 함수를 다시 썼다. 도움을 주신 모든 분들께 감사드립니다.

다음

작업 코드의 ...

Function GetFacilityByFID(fid) 

    Set rs = server.CreateObject("ADODB.Recordset") 
    Set cmd = Server.CreateObject("ADODB.Command") 
    Set cmd.ActiveConnection = DB 
    cmd.CommandText = "GetFacilityByFID" 
    cmd.CommandType = adCmdStoredProc 
    cmd.CommandTimeout = 900 
    set prm = cmd.CreateParameter("@FID",adVarChar, adParamInput, 20, fid) 
    cmd.Parameters.Append prm 
    rs.CursorLocation = adUseClient 
    rs.Open cmd, , adOpenForwardOnly, adLockReadOnly 
    Set GetFacilityByFID = rs 

On Error GoTo 0 
End Function