Django框架安全解析

(一)XSS漏洞
XSS的全称是Cross Site Scripting,意思是跨站脚本。第一个单词Cross为什么缩写成X呢?因为CSS是层叠样式表(Cascading Style Sheets)的缩写。
XSS的原理也就是往HTML中注入脚本!HTML指定了脚本标记<script></script>。如我们在某个资料表单提交内容,表单提交内容包含完整脚本标记,例如
<script>alert('XSS');</script>
<!-结果形成了如下的代码,这里和SQL注入很相似!-->
<A HREF=""><script>alert('XSS');</script>
即便没有表单, 我们可以用其它标记,例如<img>,
<img src=" http://safe.it168.com /xss.gif">
我们知道img标签通过src来获取图片,而浏览器会不会检测src属性所赋的值。这就留下了漏洞,javascript有一个URL伪协议,可以使用“javascript:”这种协议说明符加上任意的js代码,当浏览器装载这样的URL时,便会执行其中的代码.于是我们就得出了一个经典的XSS示例:
<img src="javascript:alert('XSS');"> 
此外,img标记有一个可以利用的onerror()事件,当img标记内含有一个onerror()事件,图片没有正常输出便会触发这个事件,而事件中可以加入任意的脚本代码,其中的代码也会执行.现在我们又得到了另外一个经典的XSS示例:
<img src=" http://xss.jpg" onerror=alert('XSS')>
综合这一部分,我们知道XSS的触发条件包括:1)完整无错的脚本标记2)访问文件的标记属性3)触发事件。
鬼仔的博客提供了更丰富的内容!

当使用Django框架时,服务器返回的url地址可能被劫持形成xss漏洞
from django.http import HttpResponse

def say_hello(request):
    name = request.GET.get('name', 'world')
    return HttpResponse('<h1>Hello, %s!</h1>' % name)
在这种最简单的函数中,当用户提交的request中包含"name"=<script>js.code<script/>这样的字符时,浏览器会返回这样的页面。
<h1>Hello, <script>js.code</script>!</h1>
Django的解决方案:总是转义可能来自某个用户的任何内容。Django的模板系统自动转义所有的变量值。我们只要使用如下的代码
# views.py
from django.shortcuts import render_to_response

def say_hello(request):
    name = request.GET.get('name', 'world')
    return render_to_response('hello.html', {'name': name})

# hello.html
<h1>Hello, {{ name }}!</h1>
模版会将其渲染成如下的情况
<h1>Hello, &lt;i&gt;js.code&lt;/i&gt;!</h1>
posted @ 2012-09-02 09:48  蟒蛇  阅读(667)  评论(0编辑  收藏  举报