@@ -85,6 +85,78 @@ def template
8585 end
8686 end
8787
88+ with "naughty javascript link protocol with a hidden tab character" do
89+ view do
90+ def template
91+ a ( href : "\t javascript:alert(1)" ) { "XSS" }
92+ a ( href : "j\t avascript:alert(1)" ) { "XSS" }
93+ a ( href : "ja\t vascript:alert(1)" ) { "XSS" }
94+ a ( href : "jav\t ascript:alert(1)" ) { "XSS" }
95+ a ( href : "java\t script:alert(1)" ) { "XSS" }
96+ a ( href : "javas\t cript:alert(1)" ) { "XSS" }
97+ a ( href : "javasc\t ript:alert(1)" ) { "XSS" }
98+ a ( href : "javascr\t ipt:alert(1)" ) { "XSS" }
99+ a ( href : "javascri\t pt:alert(1)" ) { "XSS" }
100+ a ( href : "javascrip\t t:alert(1)" ) { "XSS" }
101+ a ( href : "javascript\t :alert(1)" ) { "XSS" }
102+ a ( href : "javascript:\t alert(1)" ) { "XSS" }
103+ end
104+ end
105+
106+ it "strips the javascript protocol" do
107+ expect ( output . scan ( "<a>" ) . size ) . to be == 12
108+ expect ( output . scan ( "href" ) . size ) . to be == 0
109+ end
110+ end
111+
112+ with "naughty javascript link protocol with a hidden newline character" do
113+ view do
114+ def template
115+ a ( href : "\n javascript:alert(1)" ) { "XSS" }
116+ a ( href : "j\n avascript:alert(1)" ) { "XSS" }
117+ a ( href : "ja\n vascript:alert(1)" ) { "XSS" }
118+ a ( href : "jav\n ascript:alert(1)" ) { "XSS" }
119+ a ( href : "java\n script:alert(1)" ) { "XSS" }
120+ a ( href : "javas\n cript:alert(1)" ) { "XSS" }
121+ a ( href : "javasc\n ript:alert(1)" ) { "XSS" }
122+ a ( href : "javascr\n ipt:alert(1)" ) { "XSS" }
123+ a ( href : "javascri\n pt:alert(1)" ) { "XSS" }
124+ a ( href : "javascrip\n t:alert(1)" ) { "XSS" }
125+ a ( href : "javascript\n :alert(1)" ) { "XSS" }
126+ a ( href : "javascript:\n alert(1)" ) { "XSS" }
127+ end
128+ end
129+
130+ it "strips the javascript protocol" do
131+ expect ( output . scan ( "<a>" ) . size ) . to be == 12
132+ expect ( output . scan ( "href" ) . size ) . to be == 0
133+ end
134+ end
135+
136+ with "naughty javascript link protocol with a hidden whitespace character" do
137+ view do
138+ def template
139+ a ( href : " javascript:alert(1)" ) { "XSS" }
140+ a ( href : "j avascript:alert(1)" ) { "XSS" }
141+ a ( href : "ja vascript:alert(1)" ) { "XSS" }
142+ a ( href : "jav ascript:alert(1)" ) { "XSS" }
143+ a ( href : "java script:alert(1)" ) { "XSS" }
144+ a ( href : "javas cript:alert(1)" ) { "XSS" }
145+ a ( href : "javasc ript:alert(1)" ) { "XSS" }
146+ a ( href : "javascr ipt:alert(1)" ) { "XSS" }
147+ a ( href : "javascri pt:alert(1)" ) { "XSS" }
148+ a ( href : "javascrip t:alert(1)" ) { "XSS" }
149+ a ( href : "javascript :alert(1)" ) { "XSS" }
150+ a ( href : "javascript: alert(1)" ) { "XSS" }
151+ end
152+ end
153+
154+ it "strips the javascript protocol" do
155+ expect ( output . scan ( "<a>" ) . size ) . to be == 12
156+ expect ( output . scan ( "href" ) . size ) . to be == 0
157+ end
158+ end
159+
88160 Phlex ::HTML ::EVENT_ATTRIBUTES . each_key do |event_attribute |
89161 with "with naughty #{ event_attribute } attribute" do
90162 naughty_attributes = { event_attribute => "alert(1);" }
0 commit comments