2012-11-29 8 views
3

내 페이지에 HTML 입력 필드 인 텍스트 영역이 있습니다. 사용자가 특정 작업을 수행 한 후 사용자의 브라우저에 표시 될 확인 HTML을 등록 할 수 있습니다. 당신이 뭔가를 지불하고 페이팔 (paypal)을 확인한 것으로 상상할 수 있습니다. "pay for your purchase"라는 웹 사이트로 리디렉션됩니다. 이것은 이미 구현되었지만 이제는 사용자의 보안 (XSS/SQL Injection)에 대해 생각하고 있습니다.html을 데이터베이스에 안전하게 저장하는 방법

내가 알고 싶은 것은 <script> <embed> <object>과 같은 특정 html 태그를 내 컨트롤러 작업 내에서 안전하게 필터링하는 방법입니다. 따라서 HTML 내에 악성 HTML가 있음을 감지하면 저장 전에 실행을 중지합니다.

[CustomHandleError] 
[HttpPost] 
[ValidateAntiForgeryToken] 
[AccessDeniedAuthorize(Roles = "Admin,CreateMerchant")] 
public ActionResult Create(MerchantDTO merchantModel) 
{ 
    if (ModelState.IsValid) 
    { 
     if (!IsSafeConfirmationHtml(merchantModel.ConfirmationHtml)) 
     { 
     ModelState.AddModelError("ConfirmationHtml", "Unallowed HTML tags inputted"); 
     return View("Create", merchantModel); 
     } 
     . 
     . 
     . 
    } 
} 

private bool IsSafeConfirmationHtml(string html) 
{ 
    if (html.ToLower().Contains("<script") || html.ToLower().Contains("<embed") || html.ToLower().Contains("<object")) 
    { 
     return false; 
    } 
    return true; 
} 

이 할 수있는 스마트 청소기 방법이 있나요 나의 IsSafeConfirmationHTML 정의됩니다 : 지금은 이런 식으로하고 있는가? 내 말은, "객체", "스크립트"등의 단어를 차단하는 잘못된 반응을 원하지는 않지만 ""을 "% 3C"또는 그와 같이 번역하는 인코딩에 속지 않기를 바랍니다. ..

Ontopic : 태그 안의 간격은 작동합니까? 예 : <script> alert("1"); </script >?

답변

1

인코딩 공격을 물리 치기 위해 할 수있는 한 가지 방법은 UrlDecodeHtmlDecode입니다 (html 디코딩은 아마도 불필요하지만 스크립트로하는 작업에 따라 달라질 수 있습니다).

검사를 빠르게하는 또 다른 방법은 미리 컴파일 된 정규식으로 전환하는 것입니다.

private static Regex disallowedHtml = new Regex(@"script|embed|object", 
    RegexOptions.IgnoreCase); 

private bool IsSafeConfirmationHtml(string html) 
{ 
    Match match = disallowedHtml.Match(html); 
    return !match.success; 
} 

정적 정규식 인스턴스는 별도의 포함 3을 실행하는 것보다 훨씬 빨리 정규 표현식 매치를 만들고, 모든 실행하지만, 첫 번째에 대한 정규식의 오버 헤드의 대부분을 잘라냅니다. 정규식을 복잡하게 만들면 여는 괄호, HTML 엔티티 및 URL 인코딩 된 문자를 검색하고 해당 문자와 ​​실제 태그 이름 사이의 공백을 일치시킬 수 있습니다. Microsoft regex info은 오랜 세월 동안 상당히 좋아졌습니다.

귀하의 사이트 방문자에 대한 XSS 또는 주사 공격을 실행하는 사용자 (업 로더? 고객? 비즈니스 모델에 따라 올바른 단어가 달라질 수 있습니다)로부터 100 % 안전하다고 말할 수는 없습니다. 그들은 mime-type x-application이나 그와 같은 것을 반환하는 이미지 나 CSS 파일을 가리킬 수 있습니다. HTML은 요즘 꽤 빠르게 변하고 있습니다. 이를 방지하는 가장 좋은 방법은 인간도 승인 절차에 참여하게하는 것이지만 인간은 실수를하고 컴퓨터는 속일 수 있으며이 두 가지 사건이 동시에 발생할 수 없다는 법은 없습니다. 그러나 당신은 적절한 안전 장치를 두는 것이 옳습니다.

관련 문제