相信大家一定有web应用被攻击的经历,数据库安全是一个网站的必须课。django有很好的orm,但sql注入,或其他方式的攻击都是无法完全屏蔽的。

所以一般数据库都会对用户数据,如text类型的数据进行压缩加密存储。

同时django框架很好的为我们提供了继承原生model,field的类方式。

今天我要描述的是进行 字段加密压缩,

def uncompress_string(s):
"""helper function to reverse django.utils.text.compress_string"""
import cStringIO, gzip
try:
val = s.encode('utf').decode('base64')
zbuf = cStringIO.StringIO(val)
zfile = gzip.GzipFile(fileobj=zbuf)
ret = zfile.read()
zfile.close()
except:
ret = s
return ret

class CompressedTextField(models.TextField):
"""transparently compress data before hitting the db and uncompress after fetching"""

def get_db_prep_save(self, value, connection,prepared=False):
if value is not None:
if isinstance(value, unicode):
value = value.encode('utf8')
value = compress_string(value)
value = value.encode('base64').decode('utf8')
return models.TextField.get_db_prep_save(self, value, connection=connection)

def _get_val_from_obj(self, obj):
if obj:
value = uncompress_string(getattr(obj, self.attname))
#if value is not None:
if value:
try:
value = value.decode('utf8')
except UnicodeDecodeError:
pass
return value
else:
return self.get_default()
else:
return self.get_default()

def post_init(self, instance=None, **kwargs):
value = self._get_val_from_obj(instance)
if value:
setattr(instance, self.attname, value)
else:
setattr(instance, self.attname, value)

def contribute_to_class(self, cls, name):
super(CompressedTextField, self).contribute_to_class(cls, name)
post_init.connect(self.post_init, sender=cls)

def get_internal_type(self):
return "TextField"

def db_type(self,connection):
from django.conf import settings
db_types = {'django.db.backends.mysql':'longblob', 'django.db.backends.sqlite3':'blob'}
try:
return db_types[settings.DATABASES['default']['ENGINE']]
except KeyError:
raise Exception, '%s currently works only with: %s'%(self.__class__.__name__,','.join(db_types.keys()))

def south_field_triple(self):
"""Returns a suitable description of this field for South."""
# We'll just introspect the _actual_ field.
from south.modelsinspector import introspector
field_class = "django.db.models.fields.TextField"
args, kwargs = introspector(self)
# That's our definition!
return (field_class, args, kwargs)

同样,使用这个作为model的字段,要注意几个问题,现在我还没有自己解决。

所有的取操作。如:user = User.objects.get(article='article')

compressedtext = user.压缩的字段

这样是没有问题的,但如果你使用了values等取数据操作,而非model对象的引用,压缩字段的读取是不会触发_get_val_from_obj()方法,那么你读取到的数据就是压缩的数据库加密数据。因为values方法,使得原本model对象变成了字典。

django进行model字段的自定义的更多相关文章

  1. django的model字段在保存的时候做预处理怎么办?

    django的model字段在保存的时候做预处理怎么办? 比如这个model: class Book(Model): publish_date = DateField() 但是在保存时,用户输入数据是 ...

  2. django中model字段与属性

    model field 类型1.AutoField     一个自增的IntegerField,一般不直接使用,Django会自动给每张表添加一个自增的primary key. 2.BigIntege ...

  3. 【Django】--Model字段

    参考地址:http://www.cnblogs.com/wupeiqi/articles/6216618.html 所有字段 AutoField(Field) --int自增列,必须填入参数prima ...

  4. Django之model字段操作

    # -*- coding: utf-8 -*- from __future__ import unicode_literals from django.db import models import ...

  5. 获取Django中model字段名 字段的verbose_name

    obj._meta.fields 为关键 obj为model类 推荐使用函数 from django.apps import apps def getmodelfield(appname,modeln ...

  6. django 取model字段的verbose_name值

    Django 模型中的verbose_name我们常常可能需要使用.比如将数据库里面的数据导出成csv文件,那么csv文件的表头的名字可以通过取每个字段的verbose_name来获取,数据可以通过q ...

  7. django使用model创建数据库表使用的字段

    Django通过model层不可以创建数据库,但可以创建数据库表,以下是创建表的字段以及表字段的参数.一.字段1.models.AutoField 自增列= int(11) 如果没有的话,默认会生成一 ...

  8. Django model 字段类型及选项解析---转载

    model field 类型1.AutoField() 自增的IntegerField,通常不用自己设置,若没有设置主键,Django会自动添加它为主键字段,Django会自动给每张表添加一个自增的p ...

  9. Django---ORM的常用字段和自定义字段,DjangoORM字段与数据库类型对应,字段参数和Meta的参数,Django的admin操作,13中orm操作方法,单标的双下方法

    Django---ORM的常用字段和自定义字段,DjangoORM字段与数据库类型对应,字段参数和Meta的参数,Django的admin操作,13中orm操作方法,单标的双下方法 一丶ORM常用字段 ...

随机推荐

  1. sqoop、flume 安装

    sqoop安装步骤 1.上传解压tar包 tar -zxvf  sqoop-1.4.6.bin__hadoop-2.0.4-alpha.tar.gz 2.修改配置文件 进入 sqoop/conf/ c ...

  2. Swift函数的定义

    //: Playground - noun: a place where people can play import Cocoa //基本的函数 //************************ ...

  3. CSS 日常问题总结

    1.关于文本多余部分用省略号代替: http://www.cnblogs.com/hellman/p/5755376.html

  4. IIS发布网站出现“未能加载文件或程序集“System.Data.SQLite”或它的某一个依赖项。”的解决方法

    未能加载文件或程序集“System.Data.SQLite”或它的某一个依赖项.试图加载格式不正确的程序.              说明: 执行当前 Web 请求期间,出现未经处理的异常.请检查堆栈 ...

  5. Sql Server如何新建计划任务

    打开Sql Server数据库,在管理中找到维护计划功能,右击维护计划选择维护计划向导.如图所示: 打开维护计划向导后,在第一个步骤下输入计划名称. 输入完计划名称后,点击右下角的更改按钮,这里是配置 ...

  6. Scala HandBook

    目录[-] 1.   Scala有多cool 1.1.     速度! 1.2.     易用的数据结构 1.3.     OOP+FP 1.4.     动态+静态 1.5.     DSL 1.6 ...

  7. The hierarchy of the type is inconsistent错误问题

    在springMVC的AOP 面向切面编程中,引用: package com.ah.aop; import java.lang.reflect.Method; import org.springfra ...

  8. Emacs 常用快捷键

    关闭欢迎界面:Q 保存:c-x c-s 退出:c-x c-c 暂时退出:c-z       屏幕滚动 移动到下一屏:c-v 移动到上一屏:m-v 将光标所在行置中:c-L       光标移动 上一行 ...

  9. Mybatis使用generator自动生成映射配置文件信息

     使用mybatis配置映射文件比较的麻烦,但是有自动生成jar工具,方便加速开发速度,下面主要是该工具的使用以及相关的配置. 1.下载相关的资源 我们需要下载mybatis-generator-co ...

  10. C/C++中的NULL讨论和总结

    代码如下 #include <stdio.h> int main(){ int *p; p = NULL; printf("p=0x%x\n",p); typedef ...