XSSAuditor should strip formaction attributes from input and button elements.
[WebKit-https.git] / Source / WebCore / html / parser / XSSAuditor.h
1 /*
2  * Copyright (C) 2011 Adam Barth. All Rights Reserved.
3  *
4  * Redistribution and use in source and binary forms, with or without
5  * modification, are permitted provided that the following conditions
6  * are met:
7  * 1. Redistributions of source code must retain the above copyright
8  *    notice, this list of conditions and the following disclaimer.
9  * 2. Redistributions in binary form must reproduce the above copyright
10  *    notice, this list of conditions and the following disclaimer in the
11  *    documentation and/or other materials provided with the distribution.
12  *
13  * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
14  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
15  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
17  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
18  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
19  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
20  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
21  * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
22  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
23  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
24  */
25
26 #ifndef XSSAuditor_h
27 #define XSSAuditor_h
28
29 #include "HTMLToken.h"
30 #include "HTTPParsers.h"
31 #include "KURL.h"
32 #include "SuffixTree.h"
33 #include "TextEncoding.h"
34 #include <wtf/PassOwnPtr.h>
35
36 namespace WebCore {
37
38 class Document;
39 class HTMLDocumentParser;
40 class HTMLSourceTracker;
41 class XSSInfo;
42
43 struct FilterTokenRequest {
44     FilterTokenRequest(HTMLToken& token, HTMLSourceTracker& sourceTracker, bool shouldAllowCDATA)
45         : token(token)
46         , sourceTracker(sourceTracker)
47         , shouldAllowCDATA(shouldAllowCDATA)
48     { }
49
50     HTMLToken& token;
51     HTMLSourceTracker& sourceTracker;
52     bool shouldAllowCDATA;
53 };
54
55 class XSSAuditor {
56     WTF_MAKE_NONCOPYABLE(XSSAuditor);
57 public:
58     XSSAuditor();
59
60     void init(Document*);
61     PassOwnPtr<XSSInfo> filterToken(const FilterTokenRequest&);
62     bool isSafeToSendToAnotherThread() const;
63
64 private:
65     static const size_t kMaximumFragmentLengthTarget = 100;
66
67     enum State {
68         Uninitialized,
69         Initialized
70     };
71
72     enum AttributeKind {
73         NormalAttribute,
74         SrcLikeAttribute,
75         ScriptLikeAttribute
76     };
77
78     bool filterStartToken(const FilterTokenRequest&);
79     void filterEndToken(const FilterTokenRequest&);
80     bool filterCharacterToken(const FilterTokenRequest&);
81     bool filterScriptToken(const FilterTokenRequest&);
82     bool filterObjectToken(const FilterTokenRequest&);
83     bool filterParamToken(const FilterTokenRequest&);
84     bool filterEmbedToken(const FilterTokenRequest&);
85     bool filterAppletToken(const FilterTokenRequest&);
86     bool filterIframeToken(const FilterTokenRequest&);
87     bool filterMetaToken(const FilterTokenRequest&);
88     bool filterBaseToken(const FilterTokenRequest&);
89     bool filterFormToken(const FilterTokenRequest&);
90     bool filterInputToken(const FilterTokenRequest&);
91     bool filterButtonToken(const FilterTokenRequest&);
92
93     bool eraseDangerousAttributesIfInjected(const FilterTokenRequest&);
94     bool eraseAttributeIfInjected(const FilterTokenRequest&, const QualifiedName&, const String& replacementValue = String(), AttributeKind treatment = NormalAttribute);
95
96     String decodedSnippetForToken(const HTMLToken&);
97     String decodedSnippetForName(const FilterTokenRequest&);
98     String decodedSnippetForAttribute(const FilterTokenRequest&, const HTMLToken::Attribute&, AttributeKind treatment = NormalAttribute);
99     String decodedSnippetForJavaScript(const FilterTokenRequest&);
100
101     bool isContainedInRequest(const String&);
102     bool isLikelySafeResource(const String& url);
103
104     KURL m_documentURL;
105     bool m_isEnabled;
106     ContentSecurityPolicy::ReflectedXSSDisposition m_xssProtection;
107
108     String m_originalURL;
109     String m_originalHTTPBody;
110     String m_decodedURL;
111     String m_decodedHTTPBody;
112     OwnPtr<SuffixTree<ASCIICodebook> > m_decodedHTTPBodySuffixTree;
113
114     State m_state;
115     String m_cachedDecodedSnippet;
116     unsigned m_scriptTagNestingLevel;
117     KURL m_reportURL;
118     TextEncoding m_encoding;
119 };
120
121 }
122
123 #endif