会员登录|免费注册|忘记密码|管理入口 返回主站||保存桌面|手机浏览|联系方式|购物车
Django+xadmin 打造线上教育平台
2024-12-27IP属地 湖北0

1)在一开始设计表类型结构时,有部分表字段定义的是文件或图片类型,会有一个上传路径,如:

 上传路径upload_to:org/%Y/%m是个相对路径,意思是上传到后台的图片/文件,放到org文件夹/Y(年份)文件夹/m文件夹下 , 但绝对路径没给,不知道具体放的实际位置是哪,

这个时候需要在django中配置静态文件的处理方式,在setting中配置: 上传的文件会自动存放到到/media/org/Y/m中

 

 

2)关于文件/图片从xadmin上传到django项目中指定的文件夹的问题已经解决,接下来说在HTML模板中使用这些文件/图片,一般有两种方式

  1. 简单操作的:直接用绝对路径,如:/media/org/2018/8/***.png
  2. 需要作配置,但比较灵活的,如:
    {{ MEDIA_URL }}{{ course_org.image }}  ,MEDIA_URL:是setting中设置的上传文件路径 ,course_org.image

用第二种方式需要配置:

1)setting配置:上述已说明,配置上传文件路径

2)setting中TEMPLATES下的OPTIONS要加入这一句:用于识别前端模板MEDIA_URL路径,直接转换成:/media/ ,实现 {{ MEDIA_URL }}{{ course_org.image }} → /media/org/2018/8/***.png 的转换

 

3)url.py的配置:配置静态文件,是因为前端根据(2)中转换成的 /media/org/2018/8/***.png 路径,到url中serve配置好的路径找对应MEDIA_ROOT(根路径)下的media文件夹,即找到media/org/2018/8/***.png,然后显示到页面

 

一般推荐第二种,方便维护


views.py:

 

app内新建templatetags包,在里面新建online_tag.py文件,用于自定义标签,返给HTML模板渲染:

 

HTML界面只需要一个导入跟一句代码便能实现分页功能:


 

1.1、创建Form类

1.2、views.py函数处理:

1.3、HTML页面:

 

1.4、自定义验证:

 1)clean_%s(self)  #clean_ + 要审查的那个字段

这种是验证单个字段的:

 2)c.clean(self)  # 重写clean方法

这种可以验证多个字段:

demo:


 

 2.1、创建ModelForm类:

ModelForm的自定义验证方法跟Form的自定义验证方法是一样的,内置字段名也基本一致,可以参考Form类的介绍,如:

 数据以字典形式存于cleaned_data中,错误以字典形式存于errors中

 ModelForm与Form的不同点:

 ModelForm:字段不需要自己写,与model中定义的数据表相通、一致;验证数据通过后可以通过 .save() 直接保存

 From:字段需要自己手动添加,只验证字段是否合法,数据保存之类需要手动保存

 


django项目,自定义404、500页面时,需要项目setting中配置:

 DEBUG=False ,

ALLOWED_HOSTS = ['*',](或ALLOWED_HOSTS = ['127.0.0.1','localhost','192.168.1.155']等),表示允许访问本项目的地址
配置完这两个,就可以自定义全局404 、500页面了

但,当DEBUG设置为False,此时setting中设置的静态文件路径,django均不会自动帮你配置,当HTML模板中需要用到setting中设置的静态文件路径时,一种是直接指定绝对路径:/static/image/xx.png ;另一种是手动配置静态文件

路径:

 首先,setting中配置是:

 然后需要在urls.py中配置:

  DEBUG=True时,static路径在url下不需要配置

 

好了,准备工作完成了,开始全局404 、500页面操作

1、404页面:

views:

 

urls:

 

HTML页面:

 

2、500页面:

views:

 

urls:

 

HTML页面:

 

注意:2.0版本,测试中发现:只要将debug设置为False,将自定义404 、 500(必须命名:404.html 、 500.html)页面导入到项目中的templates中,当url访问出错(404 、 500状态码)时,会自动调用404.html、500.html页面

 


 

sql注入的危害

  • 非法读取、篡改、删除数据库中的数据
  • 盗取用户的各类敏感信息,获取利益
  • 通过修改数据库来修改网页上的内容
  • 注入木马等

sql注入案例(使用原生sql语句):

 

当用户输入name值为 : ' or 1='1 时,上述select代码变成:

  select * from user where name = '' or 1='1'

此时判断逻辑是符合要求的。类似这种就是sql注入。

 

xss跨站脚本攻击(Cross Site Scripting)的危害

  • 盗取各类用户账号,如用户网银账号、各类管理员账号
  • 盗窃企业重要的具有商业价值的资料
  • 非法转账
  • 控制受害者机器向其他网站发起攻击、注入木马等等

xss攻击流程:

 

xss攻击防护

  • 首先代码里对用户输入的地方和变量都需要仔细检查长度和对<>;'等字符做过滤
  • 避免直接在cookie中泄漏用户隐私,例如email、密码等
  • 通过使cookie和系统ip绑定来降低cookie泄漏后的危险
  • 尽量采用POST而非GET提交表单

  普通文本xxs攻击防护:

    后端展示数据到前端时,第一种方式是在前面模板中不要使用 safe过滤器,如展示评论:{% for comment in all_comment|safe %} ,加了safe过滤器,会导致Django模板开启的自动转义被关闭,此时如果用户提交了一些js脚本等,展示到前端时就会被渲染成标签,进入执行js指定危害操作。

    第二种是在Django后台导入 escape 过滤器(from django.template.defaultfilters import escape) ,然后将前端用户提交上来的数据进行转义(假如包含js等脚本代码)再存入数据库中,这样js脚本等也都会被转义,再从数据库中取出,然后到前端展示,即使使用了safe过滤器也不会被渲染为js脚本执行。

  富文本xxs攻击防护:

    对于富文本提交的数据,肯定会包含一些html标签操作(如:字体颜色、字体样式等),这种要返回前端渲染展示时,就需要我们使用safe过滤器来将其标记为安全的,这样才能显示出富文本样式。这种情况就存在着xss脚本攻击的危险。但我们可以在后端对数据进行一些额为处理,比如:将需要的标签保留下来,把不需要的标签进行转义或移除掉。在python中,有一个库可以专门用来处理这个事情,具体解决方法如下:

    1)首先安装bleach库:pip install bleach

      bleach 库是用来清理包含 HTML 格式字符串的库。他可以指定哪些标签需要保留,哪些标签是需要过滤掉的,也可以指定标签上哪些属性是可以保留,哪些属性是不需要的。demo:

 

  ALLOWED_TAGS中,默认允许的标签:a 、abbr、acronym、b、blockquote、code、em、i、li、ol、ul、strong

  ALLOWEND_ATTRIBUTES中,默认允许的属性:a标签允许:href、title ;abbr标签允许:title  ; acronym标签允许:title

  demo中方法介绍:

    tag:表示允许哪些标签

    attributes:表示标签中允许哪些属性

    ALLOWED_TAGS:这个变量默认定义l一些允许的标签

    ALLOWEND_ATTRIBUTES中:这个变量默认定义了一些允许的属性 

    bleach.clean方法:对提交的数据进行过滤

 

 csrf跨站请求伪造(Cross-site request forgery)的危害

  • 以你的名义发送邮件
  • 盗取你的账号
  • 购买商品
  • 虚拟货币转账

 CSRF攻击流程:

CSRF攻击防范:

  在form里面加上 {% csrf_token %} 

 

 clickjacking 攻击又称点击劫持攻击,是一种在网页中将恶意代码等隐藏在看似无害的内容(如按钮)之下,并诱惑用户点击的手段。

 攻击场景:

  1、给用户发邮件,诱惑用户点开,当用户点开的时候其实链入的是一购物网站等等

  2、用户进入到一个网页中,里面包含一个非常有诱惑力的按钮A,但是这个按钮上面浮了一个透明的iframe标签,这个iframe标签加载的是另外一个网页,并且这个网页的某个按钮和原网页中的按钮重合。所以你在点击按钮A的时候,实际上点击的是通过iframe加载的另外一个网页的按钮。

 clickjacking防护:

  场景1的情形是无法避免的。而像场景2是可以避免的,只要设置该网站不允许使用iframe被加载到其他网页中就可以了。我们可以通过在响应头设置X-Framen-Option 来设置这种操作。X-Frame-Option 可以设置以下三个值:

  在Django 中,使用中间件 django.middleware.clickjacking.XFrameOptionsMiddleware 可以帮我们堵上这个漏洞,这个中间件设置了 X-Frame-Option 为 SAMEORIGIN ,也就是只有在自己的网站下才可以使用iframe 加载这个网页,这样就可以避免其他别有心机的网页去通过iframe加载我们的网页了。