2011-11-26 2 views
2
나는 다음과 같은 정규식 HTML 코드를 확인하는 데 사용했다

이 정규식은 온 클릭 또는 온로드 어딘가에 속성을 가진 태그가 있는지 감지하도록되어정규식은 온 클릭으로 HTML 태그를 감지하거나 온로드 너무 욕심 속성

/<.+(onclick|onload)[^=>]*=[^>]+>/si 

을 HTML에서. 대부분의 경우 그렇습니다. 그러나 ". +"부분은 큰 텍스트에서 큰 성능 문제입니다 (그리고 너무 욕심 스럽기 때문에 일부 버그의 출처이기도합니다). 나는 그것을 수정하고 그것을 똑똑하게 만들려고하지만, 지금까지 실패했습니다 - "스마트는"한 몇 가지 예를 다음과 같이 그리워 :

<img alt="<script>" src="http://someurl.com/image.jpg"; onload="alert(42)" width="1" height="1"/> 

지금, 나는 정규 표현식에와 unmentionable horrors happen if I do와 HTML을 구문 분석하지 않아야 알고있다. 그러나이 특별한 경우에는 적절한 코드 (예 : 실제 HTML 파서)로 바꿀 수 없습니다. 이 정규식을 고칠 수 있습니까? 아니면 할 수있는 방법이 없습니다.

+0

다른 이벤트는 어떻습니까? '' – icktoofay

+0

위의 예에서 알 수 있듯이 실제 코드는 더 털이 많으며 모든 종류의 물건을 검사합니다. 그러나 이것은 문제가되는 부분입니다. – StasM

+0

greedy 수량 한정자 ('*','+')의 인스턴스를 lazy 수량 한정자로 바꾸려고 했습니까? ('*?','+?') – Nightfirecat

답변

2

regex 일치에 대한 대안을 연구 할 것을 강력히 권장합니다. onclick/load js 처리기 코드는 relops 또는 내부 js 주석으로 ><의 임의의 어커런스를 포함 할 수 있습니다. 이것은 onclick/load 핸들러 전후의 동일한 요소에있는 다른 js 핸들러의 코드에도 적용됩니다. 일치를 포함하는 전체 태그는 HTML 주석 내부에있을 수 있습니다 (이러한 발생을 일치 시키거나 HTML 주석을 제거하기를 원할 수도 있음).

그러나, 당신은 알고있는 것처럼 보입니다. 'html regex matching'에 대한 표준 면책 조항은 태그 내부에서만 일치해야하기 때문에 완전히 적용되지 않습니다.

on(click|load)[[:space:]]*=[[:space:]]*('[^']*'|"[^']*")

에 대한 스캐닝을 시도하고 바깥 쪽 태그에 대한 일치를 둘러싼 텍스트를 검색하는 일부 로직을 추가 할 수 있습니다. 당신이 용감 경우,이 하나를 시도해보십시오 :

<(([^'">]+(('[^']*'|"[^"']*")[^'">]+)*)|([^'">]+('[^']*'|"[^"']*"))+)on(click|load)[[:space:]]*=[[:space:]]*('[^']*'|"[^']*")

은 내부 텍스트의 순서를 교류하고, 태그 오프너 <과 온 클릭 /로드 속성 사이의 따옴표 쌍의 외부 일치합니다. 가장 바깥 쪽 대안은 닫는 따옴표와 onclick/load-attribute 사이에 공백이 없어지지 않는 특별한 경우를 충족시킵니다.

희망 하시겠습니까?

+0

이 정규식을 알고 전체적인 생각에는 문제가있다. 결국에는 적절한 해결책으로 바뀌 겠지만 지금 당장 가능한 생산 코드에 대한 간단한 수정이 필요하다. 너무 많이 바꾸지 마라. – StasM

+0

업데이트 된 것이 좋은 것처럼 보입니다 - 몇 가지 예에서 시도해 보았지만 지금까지는 모두 잘 통과했습니다. 감사! 업데이트 : 너무 빨리 말하면, 일부 브라우저에서 받아 들일 수있는 onload = alert (35) (따옴표 제외)와 같은 것을 잡을 수 없습니다. 그러나 나는 그것을 잡기 위해 그것을 수정할 수 있다고 생각한다. – StasM