2014-10-02 5 views
6

사용자로부터 도착한 문자열을 CSS 파서를 사용하여 큰 CSS 블록에 삽입합니다.CSS 값 컨텍스트에서 벗어날 수없는 문자는 무엇입니까?

CSS 이스케이프는 \C (C는 문자), \HexOfC  (공백 포함) 또는 \6DigitHexOfC으로 수행 할 수 있습니다.

일반적으로 모든 문자를 안전하게 이스케이프 할 수 있으며 CSS는 여전히 예상대로 실행됩니다. 다음 작품 :

div { 
 
    background: \23 f66; 
 
}
<div>Test</div>

그러나 나는 아직도 내가 원하기 때문에, 예를 들어, 깨끗하게 URL 및 규칙을 볼 수 있도록, CSS의 속성이 가능한 "깨끗한"로되고 싶어 사찰 관에게.


분명히 나쁜 문자가 있습니다. {};\*은 모두 현재 규칙에서 벗어날 수 있으므로 모두 이스케이프해야합니다. 나는 허용 된 것을 제외하고 화이트리스트를 관리하고있다. (허용되지 않는 것을 제외한 모든 것이 허용되는 블랙리스트와는 대조적으로). 현재 허용 된 허용 된 문자는

'#', ',', '.', '(', ')', '-', '%', '+', '=', '/', ' ', ':', '\'', '"', '\n', '\r' 

여기에 위험한 문자가 있습니까? 규칙에서 벗어나 나머지 CSS 블록에 영향을 줄 수있는 모든 것. 불필요하게 도주를 당할 수있는 문자가 여기에 있습니까? 영숫자 문자는 기본적으로 이스케이프되지 않습니다.

답변

1

입력을 살균하는 대신 요소를 전송할 수 있습니다.

기본적으로 클라이언트 생성 structur 파일 : 당신은 그냥 파일을 만들어야합니다이 경우

[ 
    MyDiv: { # Key 
     background: "#FFFFFF" # Element 
    } 
] 

.

더미 코드 :

StringBuilder sb = new StringBuilder(); 
foreach(String key: structure.getKeys()) { 
    final List<Element> e = structure.getElements(key); 
    sb.append(".") // This may be changed of course 
     .append(key) // ID or class based on type above 
     .append("{") 
     // Append Elements 
     .append("}"); 
} 

생성 요소는 쉽게해야합니다.

각 요소는 단지

S : = 요소 키 : 요소 값입니다.

그러면 특수 명령도 허용 할 수 있습니다. 당신은 살균 유지하고자하는 경우

, 여기 좀 봐 : http://www.w3.org/TR/CSS21/grammar.html#scanner

+0

어떻게 그 날을 도움이 되나요? 사용자가 사악한 CSS를 삽입하는 것을 어떻게 막을 수 있습니까? –

+0

그는 어떻게해야합니까? element-key를 필터링하여 원하는 모든 요소를 ​​허용/거부 할 수 있습니다. div, 요소 키 및 요소 값 자체는 A-Z, a-z, 0-9, # 및 "일 필요가 있습니다. 각 요소를 직접 변환하면 고급 필터링을 피할 수 있습니다. – manf