2009-06-29 2 views
1

웹 응용 프로그램을 쿼리 문자열 조작으로부터 보호하기 위해 모든 다른 쿼리 문자열 매개 변수 & 값의 SHA1 해시를 저장하는 모든 URL에 쿼리 문자열 매개 변수를 추가 한 다음 모든 요청에 ​​대해 해시를 확인했습니다.해시를 추가하여 쿼리 문자열 조작을 방지 하시겠습니까?

이 메서드는 쿼리 문자열 값의 사용자 조작에 대한 강력한 보호를 제공합니까? 이 작업을 수행 할 때 다른 단점이나 부작용이 있습니까?

저는이 개인 웹 응용 프로그램에 대한 '못생긴'URL에 대해 특별히 신경 쓰지 않습니다. 해시가 항상 동일한 쿼리 문자열 인수에 대해 동일하므로 URL의 '북마크 가능'상태가 유지됩니다.

이것은 ASP.NET 응용 프로그램입니다.

+1

에서

가 왜 그냥 실제 보안/인증을 사용? – tster

답변

7

나는 이것이 어떤 종류의 보안을 제공하는지 모르겠습니다. man-in-the-middle 공격자가 매개 변수를 변경하려면 쿼리 문자열을 변경하고 SHA-1 해시를 다시 계산하여 해당 요청을 서버로 보내야합니다.

예를 들어, 브라우저에 의해 전송되는 URL이 될 수 있습니다

:

http://www.example.com/addUser.html?parameterA=foo&hash=SHA1

공격자를 차단하면이, 그는이 방법으로 편집 할 수 있습니다 ("parameterA가 foo는 =") http://www.example.com/adduser.html?parameterA=bar&hash=SHA1 ("parameterA = bar")

정말이 사실은 매개 변수 자체만큼만 해시를 신뢰할 수 있다는 사실로 귀결됩니다.

이 문제를 해결할 수있는 한 가지 방법은 사용자가 자신과 서버 만 알고있는 암호가있는 경우 공격자가 매개 변수를 변경하면 해시를 다시 계산할 수 없다는 것입니다. 예를 들어 :

http://www.example.com/addUser.html?parameterA=foo&hash=SHA1 ("parameterA = foo는"+ "theuserpassword")

그러나 URL :에있는 매개 변수의 하나로서 암호를 넣지 마십시오

는 것이 중요합니다 이것은 두 당사자간에 전달되는 메시지의 무결성을 검증하는 최첨단 기술이 아닙니다. 오늘날 사용되는 것은 해시 기반 메시지 인증 코드 (HMAC) 알고리즘의 한 형태이며, 이는 HMAC에 잘 설명되어 있으며 RFC2104FIPS Pub 198-1으로 명확히 정의되어 있습니다.

+6

조작/man-in-the-middle 등을 방지하기 위해 해시를위한 소금을 간단히 가질 수 있습니다. –

+2

/etc/passwd 염과 같은 소금을 의미한다면, 이들은 mitm 공격에 안전하지 않습니다. 소금은 일반적으로 널리 알려져 있으며 무차별 대입 공격을 사용하여 해시를 역전하기가 더 어려워집니다. 공격자가 다이제스트를 변경하고 다시 계산할 수 없도록하려면 '소금'(실제로는 키가있는 해시의 키)이 비밀이어야합니다. 이것은 기본적으로 인증 스키마입니다. 일반적으로 공유 비밀 정보가 필요합니다. –

+0

나는 소금이 매우 무작위이고 비밀로 유지되는 한 이것이 받아 들일 수있는 해결책이라고 생각한다. – saille

0

다른 모든 매개 변수의 해시가있는 매개 변수를 추가하는 것이 좋습니다. 그것은 querystring 조작을 근본적으로 방지하지만 응용 프로그램의 다른 페이지에서 해당 URL을 사용하여 URL을 공용으로 보내거나 인쇄 된 방식으로 사용하는 문제에 대해 생각해야합니다. 페이지를 동적으로 만들지 않거나 이러한 URL을 수동으로 추가해야하는 경우 주문할 수있는 아주 좋은 방법이 필요합니다.

다른 문제는 발생하지 않습니다. 어떤 사람들은 해시를 계산할 수 있다고 말할 수도 있지만, 다른 해시를 얻고 추측하기가 매우 어려운 매개 변수의 순서로 재생할 수 있습니다.

1

당신은이 작은 오픈 소스 라이브러리를 사용하는 것이 좋습니다 :

http://www.codeproject.com/KB/aspnet/Univar.aspx

그것은 각 클라이언트 컴퓨터에 대한 고유 키를 사용하여 다른 많은 케이크와 함께 제공됩니다.

0

자바 스크립트는 페이지에 연결하기 위해 자바 스크립트가 클라이언트 측 SHA 계산을 수행해야하지만, JS의 사용량에 따라 달라 지지만 get 인수로 생각하면 반대로해서는 안됩니다. pageNo = 1을 포함 할 수 있으며 '페이지로 이동'입력 상자를 사용하려면 해시를 추가하는 경우이 작업이 어려워 질 수 있습니다. 당신은 정말로 조작하고 싶지 않은 것을 세션 (서버 측)에 저장할 수 있습니다.

2

없는 해시 쿼리 문자열 조작을 방지하기 위해 내 솔루션 : Global.asax 파일

protected void Application_AuthenticateRequest(Object sender, EventArgs e) 
{ 
    // I take the url referer host. (manipulating the query string this value is null or your local address) 
    string strRefererHost = Request.UrlReferrer == null ? string.Empty : Request.UrlReferrer.Host; 

    // This is the host name of your application 
    string strUrlHost = Request.Url.Host; 

    // I read the query string parameters 
    string strQSPars = Request.Url.Query ?? string.Empty; 

    // If the referer is not the application host (... someone manipulated the qs)... 
    // and there is a query string parameter (be sure of this otherwise nobody can access the default page of your site 
    // because this page has always a local referer...) 
    if (strRefererHost != strUrlHost && strQSPars != string.Empty) 
     Response.Redirect("~/WrongReferer.aspx"); // your error page 

} 
+0

하지만 http 헤더가 네트워크를 통해 일반 텍스트로 전송 된 이후로 깨기 쉽습니다. – Ravia