XSS(Cross-site Scripting) 공격(Java)을 포착하는 최고의 정규식은 무엇입니까?
문제
Jeff는 실제로 이에 대해 게시했습니다. HTML을 삭제하세요.하지만 그의 예는 C#에 있고 저는 실제로 Java 버전에 더 관심이 있습니다.더 나은 Java 버전이 있는 사람이 있나요?그의 예는 C#에서 Java로 직접 변환하기에 충분합니까?
[업데이트] 제가 질문했을 때 SO가 오늘만큼 인기가 없었기 때문에 이 질문에 포상금을 걸었습니다(*).보안과 관련된 모든 것은 더 많은 사람들이 조사할수록 좋습니다!
(*) 사실 아직 클로즈베타였던거 같아요
해결책
정규식으로는 이 작업을 수행하지 마세요.유효한 HTML에 대해서만 보호하는 것이 아니라는 점을 기억하십시오.웹 브라우저가 생성하는 DOM으로부터 보호하고 있습니다.브라우저는 유효하지 않은 HTML로부터 유효한 DOM을 생성하도록 속일 수 있습니다.
예를 들어 다음 목록을 참조하세요. 난독화된 XSS 공격.실제 공격을 방지하기 위해 정규식을 맞춤화할 준비가 되셨습니까? 야후와 핫메일 IE6/7/8에서?
<HTML><BODY>
<?xml:namespace prefix="t" ns="urn:schemas-microsoft-com:time">
<?import namespace="t" implementation="#default#time2">
<t:set attributeName="innerHTML" to="XSS<SCRIPT DEFER>alert("XSS")</SCRIPT>">
</BODY></HTML>
IE6에서 작동하는 이 공격은 어떻습니까?
<TABLE BACKGROUND="javascript:alert('XSS')">
이 사이트에 나열되지 않은 공격은 어떻습니까?Jeff의 접근 방식의 문제점은 주장된 대로 화이트리스트가 아니라는 것입니다.누군가로서 그 페이지 적절하게 메모:
그것의 문제는 HTML이 깨끗해야한다는 것입니다.해킹 된 HTML을 통과 할 수있는 경우가 있으며 일치하지 않으며,이 경우 해킹 된 HTML 문자열을 대체 할 것이 없으므로 반환합니다.이것은 엄격하게 화이트리스트가 아닙니다.
나는 다음과 같은 목적으로 만들어진 도구를 제안하고 싶습니다. 안티사미.실제로 HTML을 구문 분석한 다음 DOM을 탐색하고 DOM에 없는 항목을 제거하는 방식으로 작동합니다. 구성 가능 화이트리스트.가장 큰 차이점은 잘못된 형식의 HTML을 정상적으로 처리하는 능력입니다.
가장 좋은 점은 위 사이트의 모든 XSS 공격에 대해 실제로 단위 테스트를 수행한다는 것입니다.게다가 이 API 호출보다 더 쉬울 수 있는 것은 무엇입니까?
public String toSafeHtml(String html) throws ScanException, PolicyException {
Policy policy = Policy.getInstance(POLICY_FILE);
AntiSamy antiSamy = new AntiSamy();
CleanResults cleanResults = antiSamy.scan(html, policy);
return cleanResults.getCleanHTML().trim();
}
다른 팁
OWASP (Open Web Application Security Project) 에는 입력 내용을 삭제하기위한 몇 가지 제안이 있습니다.예를 들어 :
정규 표현식을 사용하는 것이 모든 의심스러운 코드를 찾는 가장 좋은 방법이라고 확신하지는 않습니다.정규 표현식은 깨진 HTML을 다룰 때 특별히 속이기 쉽습니다.예를 들어 Sanitize HTML 링크에 나열된 정규식은 요소 이름과 속성 'href'사이에 속성이있는 모든 'a'요소를 제거하지 못합니다.
나는 NoScript 최고의 Anti-XSS 애드온에서 추출했으며 다음은 Regex입니다. 완벽한 작업 : 라코 디스
테스트 : http://regex101.com/r/rV7zK8
정기적으로 업데이트되는 애드온 인 NoScript의 일부이기 때문에 XSS를 99 % 차단한다고 생각합니다
문자, 숫자, 공백 및 <br>
태그의 유효성을 검사합니다.
더 많은 위험을 원한다면 다음과 같은 태그를 더 추가 할 수 있습니다.
라코 디스
jeffs 코드를 사용하는 가장 큰 문제는 현재 사용할 수없는 @입니다.
필요한 경우 jeffs 코드에서 "원시"정규식을 가져 와서 붙여 넣을 것입니다.
http : //www.cis.upenn.edu / ~ matuszek / General / RegexTester / regex-tester.html
탈출이 필요한 것을 탈출하여 사용하는 것을보세요. <시간>
이 정규식의 사용법을 염두에두고 저는 개인적으로 제가 무엇을하고 있었는지, 성공하지 못하면 왜 그리고 어떤 결과가 발생할지 정확히 이해했는지 확인하고 복사 / 붙여 넣기 전에 다른 답변이 도움이되는 것처럼.
(복사 / 붙여 넣기에 대한 적절한 조언입니다.)
[\s\w\.]*
.일치하지 않으면 XSS입니다.아마도.이 표현식은 문자, 숫자 및 마침표 만 허용합니다.XSS에 대한 두려움 때문에 모든 기호 (유용한 기호까지 포함)를 피합니다.&를 허용하면 걱정이됩니다.그리고 모든 & 인스턴스를 &
로 바꾸는 것만으로는 충분하지 않습니다.신뢰하기에는 너무 복잡합니다 : P.분명히 이것은 많은 합법적 인 텍스트를 허용하지 않을 것입니다 (일치하지 않는 모든 문자를! 또는 다른 것으로 바꿀 수 있습니다).하지만 XSS를 죽일 것이라고 생각합니다.
HTML로 구문 분석하고 새 HTML을 생성하는 것이 더 좋습니다.
오래된 스레드이지만 다른 사용자에게 유용 할 수 있습니다.PHP에 대한 유지 관리 보안 계층 도구가 있습니다. https://github.com/PHPIDS/ 여기에서 찾을 수있는 정규식 집합 :
https://github.com/PHPIDS/PHPIDS/blob / master / lib / IDS / default_filter.xml
이 질문은 계산 이론 연구의 훌륭한 적용을 완벽하게 보여줍니다. 계산 이론은 컴퓨터의 수학적 표현을 생성하는 데 초점을 맞춘 분야입니다.
계산 이론에서 가장 심오한 연구 중 일부는 다양한 언어의 관계를 보여주는 증명입니다.
계산 이론가들이 입증 한 일부 언어 관계는 다음과 같습니다.
이것은 문맥 자유 언어가 일반 언어보다 더 강력하다는 것을 보여줍니다. 따라서 언어가 명시 적으로 문맥이없는 경우 (문맥이없고 정규적이지 않음) 모든 정규 표현식이이를 인식 할 수 없습니다.
JavaScript는 최소한 컨텍스트가 자유롭기 때문에 모든 XSS를 포착 할 수있는 정규식 (regex)을 설계하는 것은 불가능한 작업이라는 것을 100 % 확실하게 알고 있습니다.