File tree Expand file tree Collapse file tree
Expand file tree Collapse file tree Original file line number Diff line number Diff line change 11runtime : python27
22api_version : 1
33threadsafe : true
4+ default_expiration : " 0"
45
56# [START handlers]
67handlers :
@@ -11,6 +12,11 @@ handlers:
1112- url : /bootstrap
1213 static_dir : bootstrap
1314
15+ - url : /js
16+ static_dir : js
17+ http_headers :
18+ Isolated-Script : " true"
19+
1420- url : /tasks/.*
1521 script : guestbook.app
1622 login : admin
Original file line number Diff line number Diff line change @@ -81,20 +81,23 @@ def get(self):
8181
8282 template_values = {
8383 'user' : user ,
84- 'guestbook_name' : urllib . quote_plus ( guestbook_name ) ,
84+ 'guestbook_name' : guestbook_name ,
8585 'url' : url ,
8686 'url_linktext' : url_linktext ,
8787 'nonce' : nonce ,
8888 }
8989
9090 template = JINJA_ENVIRONMENT .get_template ('index.html' )
91- self .response .headers .add ("Content-Security-Policy" ,"script-src 'nonce-%s'; object-src 'none'" % nonce )
91+ self .response .headers .add ("X-XSS-Protection" ,"0" )
92+ self .response .headers .add ("Set-Cookie" ,"__isolatedScript-foo=1;httpOnly;secure" )
9293 self .response .write (template .render (template_values ))
9394# [END main_page]
9495
9596# [START guestbook]
9697class Guestbook (webapp2 .RequestHandler ):
9798 def get (self ):
99+ if not self .request .cookies .get ('__isolatedScript-foo' ):
100+ return
98101 guestbook_name = self .request .get ('guestbook_name' ,
99102 DEFAULT_GUESTBOOK_NAME )
100103 greetings_query = Greeting .query (
Original file line number Diff line number Diff line change 11<!DOCTYPE html>
2- {% autoescape true %}
2+ {% autoescape false %}
33< html >
44 < head >
55 <!-- [START css] -->
7070
7171 < a href ="{{ url|safe }} "> {{ url_linktext }}</ a >
7272 </ div >
73- < script nonce ="{{ nonce }} ">
74- var submit = document . getElementById ( "gbsubmit" ) ;
75- var name = document . getElementById ( "gbname" ) ;
76- var form = document . getElementById ( "gbform" ) ;
77- var row = document . getElementById ( "gbrow" ) ;
78- var rows = [ ] ;
79- var table = row . parentNode ;
80- function updateGuestbook ( ) {
81- var url = "?guestbook_name=" + encodeURIComponent ( gbname . value ) ;
82- submit . elements . guestbook_name . value = gbname . value ;
83- history . pushState ( null , "" , url ) ;
84- // Remove old rows.
85- rows . forEach ( r => r . parentNode . removeChild ( r ) ) ;
86- rows = [ ] ;
87- fetch ( "/guestbook" + url , { credentials : "include" } ) . then ( r => r . json ( ) ) . then ( j => {
88- j . forEach ( m => {
89- var elem = table . insertBefore ( row . cloneNode ( true ) , table . firstChild ) ;
90- rows . push ( elem ) ;
91- // Note this is an XSS.
92- elem . getElementsByTagName ( "blockquote" ) [ 0 ] . innerHTML = m . content ;
93- } ) ;
94- } ) . catch ( e => {
95- alert ( "Error loading guestbook comments" ) ;
96- } ) ;
97- return false ;
98- }
99- gbform . onsubmit = window . onload = updateGuestbook ;
100- </ script >
73+ < script src ="js/app.js "> </ script >
10174 </ body >
10275</ html >
10376{% endautoescape %}
Original file line number Diff line number Diff line change 1+ var submit = document . getElementById ( "gbsubmit" ) ;
2+ var name = document . getElementById ( "gbname" ) ;
3+ var form = document . getElementById ( "gbform" ) ;
4+ var row = document . getElementById ( "gbrow" ) ;
5+ var rows = [ ] ;
6+ var table = row . parentNode ;
7+ function updateGuestbook ( ) {
8+ var url = "?guestbook_name=" + encodeURIComponent ( gbname . value ) ;
9+ submit . elements . guestbook_name . value = gbname . value ;
10+ history . pushState ( null , "" , url ) ;
11+ // Remove old rows.
12+ rows . forEach ( r => r . parentNode . removeChild ( r ) ) ;
13+ rows = [ ] ;
14+ fetch ( "/guestbook" + url , { credentials : "include" } ) . then ( r => r . json ( ) ) . then ( j => {
15+ j . forEach ( m => {
16+ var elem = table . insertBefore ( row . cloneNode ( true ) , table . firstChild ) ;
17+ rows . push ( elem ) ;
18+ // Note this is an XSS.
19+ elem . getElementsByTagName ( "blockquote" ) [ 0 ] . innerHTML = m . content ;
20+ } ) ;
21+ } ) . catch ( e => {
22+ alert ( "Error loading guestbook comments" ) ;
23+ } ) ;
24+ return false ;
25+ }
26+ gbform . onsubmit = updateGuestbook ;
27+
28+ setTimeout ( updateGuestbook , 1 ) ;
You can’t perform that action at this time.
0 commit comments