2009-05-18 1 views
4

HTTP 'Get'보안 모범 사례는 무엇입니까?HTTP 'Get'Security

언제 HTTP를 사용해야합니까? querystring 값을 가릴 수 있습니까?

편집 - 내가 상속 한 응용 프로그램은 모두 쿼리 문자열 매개 변수 XOR이 '암호화 됨'입니다. 또한 쿼리 문자열에 AccountID와 같은 것을 전달합니다. 그래서 이것이 훌륭한 관행인지 궁금해하며, 그렇지 않은 경우 어떻게 수정해야하는지 궁금합니다.

편집 -

한 가지 방법 I (이것은 의사 코드 그냥) 기본 클래스를 생성하는 것이 문제를 해결하는 데 사용할 수있는 : 나는 것 응용 프로그램의 각 페이지에 대해 다음


public mustinherit class QSBase 

    public shared Unique as long = 0 
    private m_ID as string 

    public readonly property ID 
    get 
     return m_ID 
    end get 
    end property 

    public sub new() 
    m_ID = Unique 'somehow get a unique value for this querystring 
    Unique += 1 
    end sub 

    public function IDQueryString() as string 
    return "ID=" & m_ID 
    end function 

end class 

각 쿼리 문자열 값에 대한 속성을 사용하여 파생 클래스를 만듭니다. 나는 팝업 또는 다른 페이지로 I 인스턴스 관련 클래스를 쿼리 문자열을 통과 할 때


public class QSPage1 
    inherits QSBase 

    private m_AccountID as string 

    public readonly property AccountID as string 
    get 
     return m_AccountID 
    end get 
    end property 

    public sub new(byval _AccountID as string) 
    m_AccountID = _AccountID 
    end sub 

end class 

그런 다음 세션에 저장하고 페이지 I 내에서 쿼리 문자열


Dim qs as new QSPage1("123456") 
Session(qs.ID) = qs 
Server.Transfer("Page1.aspx?" & qs.IDQueryString()) 
'or 
CreatePopup("Page1.aspx?" & qs.IDQueryString()) 

에 고유 ID를 전달 고유 한 ID를 가져 와서 저장된 세션 값을 참조하여 값에 액세스하십시오.


AccountID = CType(Session(Request.QueryString("ID")), QSPage1).AccountID() 

물론 페이지의 함수 또는 클래스에 넣을 수 있습니다. 이 방법의

일부 이점은 다음과 같습니다 쿼리 문자열의

  • 없음 관련이없는 ID를 제외하고 표시되지 않습니다.
  • 이미 기존 코드에서 구현하는 것이 매우 쉽습니다.

단점 중 일부은 다음과 같습니다

  • 가 긴 세션이 축적 될 수있는 고유 ID가 해당 세션
은 "독특한"할 필요가
  • 이 쿼리 문자열 오브젝트의 많은

    누구든지 애플리케이션을 다시 작성하는 것 외에 다른 이점/단점 또는 더 나은 방법을 생각할 수 있습니까?

    편집 - HTTPS 및 POST를 사용하는 말을 모든 사람에게

    감사합니다. 불행히도, 나는 'GET'만을 사용하여 해답을 찾고 있습니다. (QueryString, Session 또는 Javascript를 사용하지 않고 팝업에 데이터를 게시하는 방법을 설명 할 수 없다면)

  • +0

    호기심에서, 어떤 종류의 정보가 가려져 야한다고 생각합니까? –

    +1

    이 질문은 매우 일반적인 것 같습니다. 무엇을 확보하고 싶습니까? 왜 당신은 HTTP GET을 특별히 요구합니까? –

    +0

    남자 ... 왜이 질문에 투표하는 사람이 있습니까? 나는 그것에 아무 문제도 보지 않는다! – razenha

    답변

    7

    내가 모호한 점이 있다면 HTTPS 및 HTTP를 덤프하는 것이 좋습니다.

    일반적으로 고객, 공급 업체 또는 주문 식별자와 관련된 내용은 쿼리 문자열에 넣지 않습니다. 그러나 그것은 나입니다.

    +0

    예, 감사합니다. 다른 http 'get'보안 우수 사례가 있습니까? – user79755

    3

    아마 당신은 당신이 성취하려는 것을 확장 할 수 있습니까? 일반적으로 중요한 정보 (예 : 로그인 자격 증명)를 URL에 넣지 마십시오. URL은 "유출"되는 습관이 있습니다.

    일반적인 조언 : robots.txt를 설정하여 Google에서 이러한 페이지를 색인에 추가하지 않도록하고 로그인 토큰 (또는 무엇이든)을 한 번만 사용하십시오.

    편집 : 약한 XOR "암호화"를 사용하지 않을 것을 제안합니다. URL 매개 변수를 변경하는 사람들이 걱정되면 보안 해시를 추가하십시오. 쿼리에 포함 된 정보를 숨기고 실제로 암호화해야하는 경우 자신의 약한 알고리즘을 롤백하지 마십시오.

    4

    나는 GET 매개 변수를 모호하게하지 말아야한다고 생각한다.

    탐색 모음에서 쿼리 문자열의 매개 변수를 숨겨야하는 경우 게시물을 사용해야합니다.

    스니퍼가 매개 변수 데이터를 가져 오는 것을 막으려면 HTTPS를 사용하십시오. 몇 가지 마음에 와서

    +3

    POST는 GET보다 안전하지 않습니다. –

    +1

    그것은 보안에 관한 것이 아니라 탐색 모음의 쿼리 문자열에서 매개 변수를 숨기는 것에 관한 것이 아닙니다. – razenha

    +0

    POST 쿼리는 북마크 할 수 없으며 Google에서 직접 색인을 생성 할 수 없습니다. Google은 "숨겨진"페이지를 찾을 수있는 뛰어난 능력을 가지고 있습니다. – Eli

    0

    은 ...

    • 인증 및 권한 부여가 요청되는 내용에 따라 필요할 수 있습니다.

    • 쿼리 매개 변수 데이터를 소비하고 사용하는 방법을 고려해 볼 가치가 있습니다. 매개 변수 데이터가 옵션 세트의 선택 이외의 다른 방식으로 사용되고 잠재적으로 신뢰할 수없는 소스에서 오는 경우 매개 변수 값의 유효성을 검사 할 수 있습니다.

    • 오류 코드를 반환하는 데주의하십시오. 공격자는 사이트의 지형을 학습 가능 공격 경로를 결정하는 오류 코드를 사용할 수 있습니다 단가 등

    0

    당신은 사용할 수 HttpModule을 어느 자원이 존재하지 않는 경우 반환 또는 매개 변수가 나쁜 무엇 HTTP를 암호화 할 수있는 .net - HttpModule for query string encryption. 또한 SessionId를 암호화/설명의 키로 사용하면 각 세션에 대해 쿼리 문자열을보다 안전하게 유지할 수 있습니다. 그러나 100 % 안전하지는 않으며 높은 보안 웹 사이트에는 권장하지 않습니다.

    'JD'가 제안 했으므로 HTTPS를 사용하여 서버와 클라이언트 간의 통신을 보호하는 것이 좋습니다. 그러나 클라이언트는 브라우저에서 매개 변수 값을 쉽게 변경할 수 있습니다. /showinvoice.aspx?id=1000 to /showinvoice.aspx?id=1001

    페이지를 실행하기 전에 서버 측에서 각 매개 변수 값의 유효성을 검사하는 것이 좋습니다. 그러면 유효하지 않은 요청 실행이 중지됩니다.

    2

    GET 요청에 정보를 저장하지 마십시오. 이러한 요청은 웹 서버에 의해 직접 기록됩니다. 따라서 제 3자가 원하는 경우 검토하고 해독 할 수 있도록 일반 텍스트 형식으로 정보를 사용할 수 있습니다.

    자격 증명을 전달해야하는 경우 쿠키를 사용하여 상태 정보를 저장하고 SSL을 통해 모든 것을 계층화하십시오.

    +0

    Get 요청은 웹 서버에서 기록하는 것 외에도 로컬 브라우저 기록에 저장됩니다. –

    +0

    매우 사실! 사이에있는 투명한 프록시를 더한 것입니다. – sybreon

    0

    보안을 강화하려면 POST를 사용 하시겠습니까?

    쿼리 문자열에 계정 정보를 전달하지 않아야합니다.

    +0

    거친, 완전하게 부름받은 아우. –

    +1

    * 반드시 부탁드립니다. 사실 downvote가 요구됩니다. 이 게시물은 전체 OP 또는 다른 응답을 읽지 않고 커프 스탯에서 벗어난 것입니다. – user79755

    0

    정직한 대답은 데이터가 정말로 민감한 경우 (예 : 암호 또는 신용 카드 번호 등) "암호화"를 코딩 한 사람이 앱에서 적절한 인증/권한 부여가 부족한 부분을 은폐하려고했을 때입니다. .

    예를 들어 URL의 'accountId = 1'부분을 암호화하지 않으면 누군가가 'accountId = 2'로 위조하여 다른 사람의 계정을 볼 수 있다고 우려한다면 실제 앱의 결함은 상품을 전달하기 전에 계정의 소유권을 확인하지 않는다는 것입니다.

    암호화를 사용하여 이러한 권한 부여 검사를 수정하려고 시도하는 것이 가장 좋습니다. bandaids는 때로는 필요합니다.이 시점에서 다른 작업을 수행하는 것은 너무 어려울 수 있습니다. 그러나 우리는 여전히 그것이 무엇인지 인식해야합니다.

    관련 문제