Django如何实现防止XSS攻击

作者:py鱼 时间:2022-04-13 10:52:39 

一、什么是XSS攻击

xss攻击:----->web注入

xss跨站脚本攻击(Cross site script,简称xss)是一种“HTML注入”,由于攻击的脚本多数时候是跨域的,所以称之为“跨域脚本”。

我们常常听到“注入”(Injection),如SQL注入,那么到底“注入”是什么?注入本质上就是把输入的数据变成可执行的程序语句。SQL注入是如此,XSS也如此,只不过XSS一般注入的是恶意的脚本代码,这些脚本代码可以用来获取合法用户的数据,如Cookie信息。

PS: 把用户输入的数据以安全的形式显示,那只能是在页面上显示字符串。

django框架中给数据标记安全方式显示(但这种操作是不安全的!):

  • - 模版页面上对拿到的数据后写上safe. ----> {{XXXX|safe}}

  • - 在后台导入模块:from django.utils.safestring import mark_safe

把要传给页面的字符串做安全处理 ----> s = mark_safe(s)

二、测试代码

实施XSS攻击需要具备两个条件:

一、需要向web页面注入恶意代码;

二、这些恶意代码能够被浏览器成功的执行。

解决办法:

1、一种方法是在表单提交或者url参数传递前,对需要的参数进行过滤。

2、在后台对从数据库获取的字符串数据进行过滤,判断关键字。

3、设置安全机制。

django框架:内部机制默认阻止了。它会判定传入的字符串是不安全的,就不会渲染而以字符串的形式显示。如果手贱写了safe,那就危险了,若想使用safe,那就必须在后台对要渲染的字符串做过滤了。所以在开发的时候,一定要慎用安全机制。尤其是对用户可以提交的并能渲染的内容!!!

这里是不存在xss漏洞的写法,因为django已经做了防攻击措施

index.html


<!DOCTYPE html>
<html lang="en">
<head>
 <meta charset="UTF-8">
 <title>Title</title>
</head>
<body>

<h1>评论</h1>
{% for item in msg %}
{#  <div>{{ item|safe }}</div>#} #这里被注释的,是因为,|safe 加了这个就认为是安全的了,写入 <script> alert(123)</script> 就会恶意加载
 <div>{{ item}}</div>
{% endfor %}

</body>
</html>

conment.html


<!DOCTYPE html>
<html lang="en">
<head>
 <meta charset="UTF-8">
 <title>Title</title>
</head>
<body>

<form action="/comment/" method="POST">
 <input type="text" name="content">
 <input type="submit" value="提交">
</form>
</body>
</html>

views.py


from django.shortcuts import render,HttpResponse

# Create your views here.
msg = []

def comment(request):
 if request.method == "GET":
   return render(request,"comment.html")
 else:
   v = request.POST.get("content")
   msg.append(v)
   return render(request,"comment.html")
def index(request):
 return render(request,"index.html",{"msg":msg})########################################################
def test(request):
 from django.utils.safestring import mark_safe
 temp = "<a href='http://www.baidu.com'>百度</a>"
 newtemp = mark_safe(temp)  #这里相当于加了 |safe ,把字符串认为是安全的,执行代码,如果不加 test.html里面 {{ temp }} 就只会显示出字符串,而不是 a 标签
 return render(request,'test.html',{'temp':newtemp})

urls.py


from app01 import views
urlpatterns = [
 url(r'^admin/', admin.site.urls),
 url(r'^index/', views.index),
 url(r'^comment/',views.comment),
]

------------------------------------######################_-------------------------------

以下是做了用户输入判断,检测是否有特殊字符

views.py


from django.shortcuts import render,HttpResponse

# Create your views here.
msg = []

def comment(request):
 if request.method == "GET":
   return render(request,"comment.html")
 else:
   v = request.POST.get("content")
   if "script" in v:
     return render(request, "comment.html",{'error':'小比崽子'})
   else:
     msg.append(v)
     return render(request,'comment.html')
def index(request):
 return render(request,"index.html",{"msg":msg})


index.html


<!DOCTYPE html>
<html lang="en">
<head>
 <meta charset="UTF-8">
 <title>Title</title>
</head>
<body>

<h1>评论</h1>
{% for item in msg %}
 <div>{{ item|safe }}</div>
{#  <div>{{ item}}</div>#}
{% endfor %}

</body>
</html>


comment.html


<!DOCTYPE html>
<html lang="en">
<head>
 <meta charset="UTF-8">
 <title>Title</title>
</head>
<body>

<form action="/comment/" method="POST">
 <input type="text" name="content">
 <input type="submit" value="提交">{{ error }}
</form>
</body>
</html>

来源:https://www.cnblogs.com/pyyu/p/7453823.html

标签:Django,XSS
0
投稿

猜你喜欢

  • 磁盘缓存专题之一 缓存命中和缓存未命中&缓存与缓冲间的差异

    2012-10-07 11:02:46
  • 浅谈Python浅拷贝、深拷贝及引用机制

    2023-01-03 10:28:23
  • opencv转换颜色空间更改图片背景

    2023-12-20 19:01:29
  • Python实现位图分割的效果

    2021-09-05 11:13:15
  • 浅谈 Mousewheel 事件

    2010-08-16 12:37:00
  • 编写python程序的90条建议

    2022-04-30 00:36:22
  • php获取通过http协议post提交过来xml数据及解析xml

    2023-11-14 15:43:36
  • win10 64bit下python NLTK安装教程

    2023-04-05 19:49:40
  • Python下调用Linux的Shell命令的方法

    2023-08-10 01:43:17
  • 在python下读取并展示raw格式的图片实例

    2022-07-02 18:47:56
  • python 绘图模块matplotlib的使用简介

    2023-08-09 19:09:01
  • asp如何刪除客户端的Cookies?

    2010-05-18 18:25:00
  • linux系统使用python获取内存使用信息脚本分享

    2022-10-14 07:50:53
  • js+ajax实现获取文件大小的方法

    2023-08-12 00:22:07
  • 如何禁止搜索引擎收录你的网站

    2008-10-20 12:57:00
  • Python实现自动发送邮件功能

    2021-04-01 14:41:55
  • python实现网站用户名密码自动登录功能

    2021-07-05 09:48:13
  • 讲解Python中运算符使用时的优先级

    2022-12-28 14:40:17
  • SQL行号排序和分页(SQL查询中插入行号 自定义分页的另类实现)

    2012-07-21 14:45:15
  • python爬虫抓取时常见的小问题总结

    2023-03-18 07:34:07
  • asp之家 网络编程 m.aspxhome.com