Skip to content

Commit dfcbf45

Browse files
authored
Merge pull request #2 from sirdarckcat/isolate-scripts
Replace CSP support with Isolated Scripts
2 parents fc5161d + 6f3e2f3 commit dfcbf45

4 files changed

Lines changed: 41 additions & 31 deletions

File tree

‎app.yaml‎

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
runtime: python27
22
api_version: 1
33
threadsafe: true
4+
default_expiration: "0"
45

56
# [START handlers]
67
handlers:
@@ -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

‎guestbook.py‎

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff 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]
9697
class 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(

‎index.html‎

Lines changed: 2 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
<!DOCTYPE html>
2-
{% autoescape true %}
2+
{% autoescape false %}
33
<html>
44
<head>
55
<!-- [START css] -->
@@ -70,34 +70,7 @@
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 %}

‎js/app.js‎

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
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);

0 commit comments

Comments
 (0)