2014-09-25 3 views
4

그래서 현재 CF11 및 CFWheels 1.1을 사용하고 있습니다. "Global Script Protection"(GSP) 서버 기능은 XSS 기반을 다루는 끔찍한 일을합니다. JS에 대한 모든 태그/벡터를 데이터베이스에 삽입하지 못하도록 블록을 확장하고 싶습니다.모든 쿼리 나 입력을 건드리지 않고도 전체 사이트에 적용 할 수있는 CF11의 견고한 XSS 보호를받을 수 있습니까?

CF11은 application.cfc에 지정된 xml 정책 파일을 적용하는 getSafeHTML() 함수를 통해 antiSamy 보호 기능을 제공하지만 애플리케이션에서 모든 단일 varchar cfqueryparam을 올바르게 수정해야합니다.

GSP 기능과 비슷한 방식으로 안티 기능 기능 서버 또는 응용 프로그램을 활성화 할 수있는 CF11을 얻는 방법이 있습니까? 내가 의미하는 바는 GSP가 모든 쿼리/양식 작업을 수정하지 않고도 앱에 제출 된 입력에서 태그를 자동으로 제거한다는 것입니다. 같은 방식으로 antisamy 정책 파일이나 getSafeHTML()을 적용하는 방법을 원합니다.

감사합니다.

+2

무엇이든 출력 할 때 나는 출력하는 내용에 따라 다음 함수 중 하나를 사용하는 경향이 있습니다 :'h()'('HtmlEditFormat()'의 CFWheels 별칭),'NumberFormat()',''DateFormat '. 이것이 garbage-in-garbage-out 문제를 해결하지 못한다는 것을 알았지 만 HTML을 이스케이프하기 위해 뷰 템플릿을주의해야합니다 (물론 HTML을 출력하고 싶을 때 제외). –

+0

아마도이 대답의 또 다른 가능성 - http://stackoverflow.com/a/26060722/1636917 - CFlib.org [isXss] (http://www.cflib.org/index.cfm?event=)에 UDF가 있습니다. page.udfbyid & udfid = 2116) 값을 검사하여 xss인지 확인합니다. –

답변

8

왜 모든 제품에 적용해야합니까? 삽입 할 때만 string (varchar) 입력에 대해서만 수행하면됩니다. 그리고 그때도 어디서나 사용하지 않을 것입니다. 예를 들어, 내 이름과 약력을 묻는다면 내 이름으로 html, 심지어 "좋은"html을 원할 이유가 없습니다. 그래서 당신은 이미 모든 HTML을 탈출하거나 단순히 그것을 모두 제거하기 위해 이미 거기에 뭔가를 사용 확신합니다. bio와 같은 필드의 경우에만 getSafeHTML을 사용합니다.

유효성 검사가 필요합니다. 당신은 (일반적으로) "일제"해결책을 원하지 않습니다. 그냥 총알을 물고 그것을해라.

수행하려는 경우 onRequestStart를 사용하여 양식의 모든 키와 URL 범위를 자동으로 처리 할 수 ​​있습니다. 이것은이 오타를 가질 수 있도록 메모리가 쓴, 그러나 여기에서 예이다 : 나는 레이에 동의

function onRequestStart(string req) { 
    for(var key in form) { form[key] = getSafeHTML(form[key]); } 
    for(var key in url) { url[key] = getSafeHTML(url[key]); } 
} 
+0

글자 그대로 수천 개의 varchar 입력이 앱에 있습니다. 나는 각 분야에서 그것을하고 싶지 않습니다. 그리고 우리는 실제로 HTML을 전혀 피하지 않습니다. 요점은이 응용 프로그램은 거대하고 XSS를 방지하기 위해 잠글 수있는 유일한 응용 프로그램 아니에요. 이 작업을 수행하는 조직에는 이와 같이 수십 개의 앱이 있습니다. 조직의 모든 varchar 입력 필드로 이동하여 새 유효성 검사 규칙을 적용하는 것은 적합하지 않습니다. – gnarbarian

+1

당신은 HTML을 탈출하지 않습니까? 그래서이 모든 수천 개의 분야에서 html을 원하십니까? 그럴 것 같지 않습니다. 그러나 이론적으로 FORM 및 URL 범위를 구조로 처리하고 각 필드를 반복하며 모든 필드에서 getSafeHTML을 실행할 수 있습니다. onRequestStart에서이 작업을 수행 할 수 있습니다. 나는 그것을하는 것이 좋습니다. 열심히하는 것이 좋습니다. 하지만 그건 당신을 위해 그것을 자동화 할 것입니다. –

+0

우리의 앱 중 하나 예. 일부 CMS 기능이 포함되어 있으므로 HTML을 원합니다. 이 특정 앱에서는 HTML/태그가 DB에 들어 가지 않아야하지만 현재 DB에 태그가 삽입되지 않도록 보호되지 않습니다. onRequestStart 옵션은 나에게 아주 좋게 들립니다. 양식 vars를 반복 한 다음 getSafeHTML을 적용하여 URL 매개 변수를 반복합니다. 그것은 바퀴 달기 플러그인으로 구현하거나 param 구조체를 통해 하나의 루프를 수행하지만 다른 응용 프로그램과 같이 이식성이 떨어집니다. – gnarbarian

2

, 검증 작업이며, 그것은 매우 중요한 일이다. 서버 와이드 설정을 할 수 있다면 모든 상황에 맞게 일반화 할 수 있습니다. 특정 필드에 대한 유효성 검사를 수행 할 때 공격 범위를 좁힐 수 있습니다. 예를 들어, 세 개의 필드가있는 양식이 있다고 가정합니다. 이름, 신용 카드 번호, 사회 보장 번호. 하나의 서버 와이드 설정을 사용하면 세 가지 유형의 입력을 모두 허용 할 정도로 충분히 일반적이어야합니다. 자신의 유효성 검사를 통해 각 필드에 대해 매우 구체적 일 수 있으며 특정 문자 집합 만 허용 할 수 있습니다. 이름 - 알파벳 문자 및 공백 만 허용, 신용 카드 번호 - 숫자, 공백, 대시 만 허용하고 mod 규칙, 사회 보장 번호를 준수해야 함 - 3-2-4 형식의 숫자 및 대시 만 허용합니다. 그 밖의 것은 허용되지 않습니다.

즉, 나는 "글로벌 스크립트 보호"규칙을 사용자 정의 할 수 있다는 점을 지적하고자했습니다. 이 설정은 서버 구성의 cf_root/lib/neo-security.xml 파일 또는 JEE 구성의 cf_root/WEB-INF/cfusion/lib/neo-security.xml 파일에 정의 된 정규 표현식을 변수 값에 적용하여 작동합니다. CrossSiteScriptPatterns 변수의 정규 표현식을 수정하여 ColdFusion이 대체하는 패턴을 사용자 정의 할 수 있습니다.

기본적으로 의미
<var name='CrossSiteScriptPatterns'> 
    <struct type='coldfusion.server.ConfigMap'> 
     <var name='&lt;\s*(object|embed|script|applet|meta)'> 
      <string>&lt;InvalidTag</string> 
     </var> 
    </struct> 
</var> 

, 글로벌 스크립트 보호 메커니즘은 <object 또는 <embed 또는 <script 또는 <applet 또는 <meta을 포함하는 문자열을 찾고 <InvalidTag로 대체된다

기본 정규 표현식은 다음과 같이 정의된다 . 원하는 경우 더 많은 사례를 찾기 위해 정규식을 향상시킬 수 있습니다.

는 cfwheels 1.1 응용 프로그램을 구현으로 Protecting variables from cross-site scripting attacks section on this page

+0

neo-security.xml에 대한 정보 주셔서 감사합니다. 이 응용 프로그램은 문자 그대로 수천 개의 varchar 입력 필드를 가지고 있습니다.이 응용 프로그램은 잠글 필요가있는 유일한 응용 프로그램이 아닙니다. – gnarbarian

0

솔루션을 참조하십시오 :

<cfcomponent output="false"> 
    <cfset this.security.antisamypolicy="antisamy-slashdot-1.4.4.xml">  
    <cfinclude template="wheels/functions.cfm">  
</cfcomponent> 

이를 :이 application.cfc 간다 https://code.google.com/p/owaspantisamy/downloads/list

에서 Slashdot의 파일을 사용

/ProjectRoot/events/onrequeststart.cfm 파일

에 있습니다.3210
function xssProtection(){ 
var CFversion = ListToArray(SERVER.ColdFusion.productversion); 
if(CFversion[1]GTE 11){ 
    for(var key in form) { 
     if(not IsJSON(form[key])){ 
      form[key] = getSafeHTML(form[key]); 
     } 
    } 
    for(var key in url) { 
     if(not IsJSON(url[key])){ 
      url[key] = getSafeHTML(url[key]); 
     } 
    } 
} 

} xssProtection();