모든 입력은 위조될 수 있다. - 사용자의 입력을 신뢰하지 말아라.
변조 가능한 모든 데이터들:
: Web Application에 피해를 입히는 가장 유명하고 널리 알려진 방법
Input Message를 이용해서 Web Page에 공격자의 Form 또는 Javascript를 삽입하여 공격하는 방법
* 대응책 : 사용자가 제공한 모든 데이터는 인코딩을 통해 출력한다.
* Html.Encode(string message)를 통해 ASP .NET MVC에서 가능하다. MVC2에서는 <%: %>으로 간단히 표현 가능하다.
* ASP .NET에서 제공되는 ValidationRequest를 이용하는 방법
- HTML, Javascript와 유사한 모든 입력을 차단한다.
- 사용자의 입력이 매우 제한되기 때문에 추천되지 않는 방법이다.
Session Hijacking
: Session ID cookie(ASP.NET_ SessionID로 만들어진다.)를 저장하고, 자체 브라우저를 이용해서 신원을 위장 가능하다.
* 대응책
- Client IP를 Session의 값에 같이 저장해서, Session을 발급한 Client를 재확인하는 절차를 거친다.
- HttpOnly flag를 설정한다. 이 경우, Cookie를 javascript를 이용해서 Hijacking 하는 것이 불가능하게 된다.
CSRF
: 사용자가 정상적인 로그인을 거친 이후에 다른 사이트에 Session이 유지된 상태로 이동한 이후 타 사이트에서 값을 넘기는 것으로 사용자의 정보를 훔쳐갈 수 있다.
* 대응책
- 사용자에게 특화된 토큰이 보안적인 요청안에 포함되도록 한다. ASP .NET MVC에서는 이러한 기법을 이미 사용하고 있다.
SQL Injection
: SQL Query문을 Query String 또는 POST 데이터에 넣어서 데이터를 위변조한다.
* 대응책
- 입력을 Encoding해서 방어
- 매개변수를 사용하는 Query를 이용해서 방어
- ORM Mapping을 이용해서 방어 (LINQ SQL, ASP .NET Entity Framework, NHibernate etc..)
변조 가능한 모든 데이터들:
- GET QueryString
- POST로 전송 가능한 Data
- Cookie
- HTTP Header에 저장된 데이터
: Web Application에 피해를 입히는 가장 유명하고 널리 알려진 방법
Input Message를 이용해서 Web Page에 공격자의 Form 또는 Javascript를 삽입하여 공격하는 방법
* 대응책 : 사용자가 제공한 모든 데이터는 인코딩을 통해 출력한다.
* Html.Encode(string message)를 통해 ASP .NET MVC에서 가능하다. MVC2에서는 <%: %>으로 간단히 표현 가능하다.
* ASP .NET에서 제공되는 ValidationRequest를 이용하는 방법
- HTML, Javascript와 유사한 모든 입력을 차단한다.
- 사용자의 입력이 매우 제한되기 때문에 추천되지 않는 방법이다.
Session Hijacking
: Session ID cookie(ASP.NET_ SessionID로 만들어진다.)를 저장하고, 자체 브라우저를 이용해서 신원을 위장 가능하다.
* 대응책
- Client IP를 Session의 값에 같이 저장해서, Session을 발급한 Client를 재확인하는 절차를 거친다.
- HttpOnly flag를 설정한다. 이 경우, Cookie를 javascript를 이용해서 Hijacking 하는 것이 불가능하게 된다.
CSRF
: 사용자가 정상적인 로그인을 거친 이후에 다른 사이트에 Session이 유지된 상태로 이동한 이후 타 사이트에서 값을 넘기는 것으로 사용자의 정보를 훔쳐갈 수 있다.
* 대응책
- 사용자에게 특화된 토큰이 보안적인 요청안에 포함되도록 한다. ASP .NET MVC에서는 이러한 기법을 이미 사용하고 있다.
<%using(Html.BeginForm()) { %>
<%= Html.AntiForgeryToken() %>
<%}%>
[AcceptVerbs(HttpVerbs.Post)][ValidateAntiForgeryToken]
public ActionResult SubmitUpdate()
<%= Html.AntiForgeryToken() %>
<%}%>
[AcceptVerbs(HttpVerbs.Post)][ValidateAntiForgeryToken]
public ActionResult SubmitUpdate()
SQL Injection
: SQL Query문을 Query String 또는 POST 데이터에 넣어서 데이터를 위변조한다.
* 대응책
- 입력을 Encoding해서 방어
- 매개변수를 사용하는 Query를 이용해서 방어
- ORM Mapping을 이용해서 방어 (LINQ SQL, ASP .NET Entity Framework, NHibernate etc..)