문제

우리의 파트너는 Token이라는 매개 변수를 포함하는 웹 서비스를 호출하고 있습니다. Token은 두 숫자의 MD5 해시의 결과이며 파트너 시스템을 사용하여 사용자를 인증하는 데 도움이됩니다. 당사의 파트너는 사용자에게 두 개의 문자열을 요청하고, 연결하고, MD5를 통해 실행 한 다음 웹 서비스를 호출합니다. MD5의 결과는 토큰이며 문자열로 제출됩니다.

우리는 유효한 토큰을 DB에 저장 - SQL Server를 사용하여 끝에 토큰을 계산하기 때문에 SQL은 토큰을 Varbinary로 저장하는 가장 행복한 것처럼 보였습니다. 이는 MD5 계산의 기본 결과입니다.

우리는 동일한 작업을 시도하는 두 가지 코드가 있습니다. 제출 된 토큰을 기반으로 값을 끌어내는 선택 쿼리를 실행합니다. 하나는 동적 쿼리 (문제)를 사용하지만 작동합니다. 다른 하나는 매개 변수화 된 (안전한) 방식으로 동일한 일을하려고 시도합니다. 작동하지 않습니다. 토큰을 찾을 수 없습니다.

두 가지 경쟁 시도는 다음과 같습니다. 먼저, 실패한 매개 변수화 된 버전 :

byteArrayToken = System.Text.UnicodeEncoding.Unicode.GetBytes(stringToken)
scSelectThing.CommandText = "select thing from tokenstable where token=@token"
Dim param As SqlParameter = scSelectThing.Parameters.Add("@token", SqlDbType.VarBinary)
param.Value = byteArrayToken
lbOutput2.Text = scSelectThing.ExecuteScalar()

둘째, 작동하는 동적 쿼리 문자열 버전 :

Dim scSelectThing As New SqlCommand
 scSelectThing.CommandText = "select thing from tokenstable where token=convert(varbinary, " + stringToken + " )"
lbOutput2.Text = scSelectThing.ExecuteScalar()

SQL 프로파일 러를 실행할 때 이것은 실제로 DB에 대해 실행되는 것입니다.

exec sp_executesql N'select thing from tokenstable where token=@token',N'@token varbinary(68)',@token=0x3000780046003800380034004100450036003400430038003300440033004100380034003800460046004300380038004200390034003400330043004200370042004600

이것은 나에게 옳지 않은 것처럼 보이지 않습니다. 마치 우리가 스택에 무언가가 어딘가에 잘못 변환하기 위해 무언가를 이끌어내는 무언가를하고있는 것처럼 보입니다.

그게 무슨 생각이 있습니까? 동적 쿼리로 시작하는 것은 분명히 허용되지 않습니다.

편집하다:

문자열은 MD5 해시 결과입니다. 쿼리 분석기에서 작동하기 위해 다음을 수행합니다.

select * from tokenstable where 
token=convert(varbinary, 0xF664AE32C83D3A848FFC88B9443CB7BF )

인용문이 부족하여 인용하면 쿼리가 실패합니다. 우리가 비교하는 필드는 Varbinary이며, SQL Server가 MD5 계산 결과를 우리의 목적으로 저장 한 Varbinary입니다.

도움이 되었습니까?

해결책

문제는 문자열-> 이진 변환이 다른 인코딩을 사용하고있을 가능성이 높습니다. 사용해보십시오 System.Text.Encoding.ASCII 대신에 Unicode 그리고 그것이 당신을 위해 트릭을 수행하는지 확인하십시오. 내 생각은 그게 다 convert() 당신의 문자열을 고려하고 있습니다 varchar 대신 nvarchar 그리고 자체 문자열-> 이진 변환을 위해 유니 코드 대신 ASCII를 사용하고 있습니다.

편집하다

또한이 문자열은 해시와 동등한 실제 이진입니까, 아니면 16 진수 표현입니까?

편집 2

그런 다음 문제는 이진 데이터의 16 진수 표현의 이진 표현을 전달한다는 것입니다. 그게 충분히 혼란 스럽습니까?

16 진수를 변환하면됩니다 string a byte 배열을 매개 변수의 값으로 추가하기 전에 배열. 답에서 가져온 다음 코드로 그렇게 할 수 있습니다. 이 질문 (그리고 vb.net으로 번역) :

Public Shared Function StringToByteArray(ByVal hex As String) As Byte()
    Dim NumberChars As Integer = hex.Length

    Dim bytes(NumberChars / 2) As Byte

    For i As Integer = 0 To NumberChars - 1 Step 2
        bytes(i / 2) = Convert.ToByte(hex.Substring(i, 2), 16)
    Next

    Return bytes
End Function

그래서 당신의 코드는 다음과 같이 보일 것입니다 ...

byteArrayToken = StringToByteArray(stringToken)
scSelectThing.CommandText = "select thing from tokenstable where token=@token"
Dim param As SqlParameter = scSelectThing.Parameters.Add("@token", SqlDbType.VarBinary)
param.Value = byteArrayToken
lbOutput2.Text = scSelectThing.ExecuteScalar()
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top