Django 安全

May 17, 2015


安全是在进行项目开发时需要处处注意的问题,下面就总结下Django常见的安全问题的解决方法


sql注入

  • 为了防止sql注入,Django总是对输入进行自动转义

  • 当直接使用sql语句时,注意使用sql占位符

    
     def user_contacts(request):
         user = request.GET['username']
         sql = "SELECT * FROM user_contacts WHERE username = %s"
         cursor = connection.cursor()
         cursor.execute(sql, [user])
     
    • execute有第二个参数,包含若干占位符,来对sql语句中的占位符赋值,过程中会自动转义

跨站点脚本xss

  • 在url中进行修改,比如http://example.com/hello/?name=Jacob 会返回<h1>Hello, Jacob!</h1>, 因此可以在url中写上jquery语句来操作数据库

  • 为此,django总是自动转义


伪造跨站点请求csrf

  • 在登陆信任网站且没退出时访问危险网站,导致cookie被盗用,比如在危险网站中插入 <img src=http://www.mybank.com/Transfer.php?toBankId=11&money=1000> 这个get/post请求,只要点击银行账户就少钱了!

  • 为此,django添加了csrf中间键

    • 只针对post请求,get请求需要设计者自己保证没有副作用

    • django.contrib.csrf.middleware.CsrfMiddleware放在中间件中,且在session之后在 GZipMiddleware 之前

    • 只有 Content‐Type头部标记为text/html ,application/xml+xhtml的页面才会被保护

    • 向所有post表单增加隐藏字段,名称为csrfmiddlewaretoken,值为当前会话id加秘钥

    • 对传入的post检查csrfmiddlewaretoken,如不正确或不存在则403

    • 仅限于常规方法创建的表单


邮件头部注入

  • 在构建邮件sunject时加上hello\ncc:spamvictim@example.com”(\n是换行符) 就会变成:

    To: hardcoded@example.com Subject: hello

    cc: spamvictim@example.com

    从而利用了别人的邮箱来发送了信息

  • 为此,django自带的django.core.mail 中不允许出现换行符,且总是自动转义


暴露错误消息

  • Django的出错页面总是很详尽的列出出错的原因和代码,容易将内部代码很容易的暴露出去

  • 关闭debug


伪造会话

  • 中间人攻击:监听所有网络

  • 伪造会话:利用会话id将自己伪造成用户

    • 解决:django会话id存在哈西表中,且用户去访问不存在的会话id时会生成新会话id)
  • 伪造cookie和会话滞留:获取url中的session来进行盗用

    • 解决:首先不要再url中包含session(django自带,只有映射用的session id),不在cookie存数据