`
zhougaomin_007
  • 浏览: 11816 次
  • 性别: Icon_minigender_1
  • 来自: 北京
最近访客 更多访客>>
文章分类
社区版块
存档分类
最新评论

django 图片验证:使用加密的方法而非session

阅读更多
这里假定django已经安装,并且已经架设了media server(就是apache上有直接能够访问的图片,css以及js的目录,这样可以方便的将js等文件放在那里以供所需)。

假定media server中有一个js目录存放了jquery.js,这是用来作为ajax异步调用的。
Python插件假定安装了PIL图片处理库,安装了pycrpto(可以到http://www.voidspace.org.uk/python/modules.shtml#pycrypto下载)加密库。

工作流程我打算如此做:

1,客户端用户点击刷新按钮,则触发按钮click事件,在click事件中调用jquery的ajax调用,向服务器请求图片的字符窜,并注册异步回调函数等待服务器的应答。
2,服务器得到请求后生成随机字符窜,并在字符窜后面添加时间戳,然后使用pycrpto的DES加密算法进行加密,发送给用户。
3,用户在回调函数中收到了该加密字符窜以后立即设定自己的图片img对象的src属性,将其url后面的参数改成该加密字符窜,于是又触发一次向服务器的图片请求。
4,服务器的另外一个函数响应图片请求,它将解析url的参数,获得加密字符窜,并解密该加密字符窜,获得随机字符窜以及时间戳,判断时间戳超过5分钟(可以自己设定多少分钟图片过期,防止有人通过使用同样的加密字符窜和明文使验证永远有效)则无效,否则使用PIL的Image对象生成新图片,然后将随机字符窜加入该图片中(本来应该要进行一些加噪音处理的,可是挺麻烦,所以我没有做,这里只是一个demo,还需要完善),response给用户即可完成图片的刷新。
5,验证的过程其实同第4步骤,我没有实现,应该非常简单。验证的时候将验证码与图片img对象的src 属性中的参数(需解密)进行对比即可。

django的view代码如下:
#encoding=utf-8
# Create your views here.   
from django.http import HttpResponse   
  
#PIL   
import Image, ImageDraw,ImageFont   
import StringIO   
  
#DES and others   
from Crypto.Cipher import DES   
import time   
import binascii   
import random   

#内部加解密函数   
def des_alog(text,bencode):   
        obj = DES.new(binascii.a2b_hex('e9d0ada2cb37fba8'))   
        if bencode == True : 
            ciph = obj.encrypt(text)     
            b2a = binascii.b2a_hex(ciph)
            return b2a
        else:   
            ciph = binascii.a2b_hex(text)   
            msg  = obj.decrypt(ciph)   
            return msg  
#获取随机加密字符窜   
def getString(request):  

    t = time.time()   
    random.seed(t)   
    rstr = ''  
    rstr +=str(random.randrange(0,9))   
    rstr +=str(random.randrange(0,9))   
    rstr +=str(random.randrange(0,9))   
    rstr +=str(random.randrange(0,9))   
  
    #后面跟上时间戳   
    rstr +="&&" + str(int(t))   
    #加密   
    ciph = des_alog(rstr,True)   
  
    return HttpResponse(ciph)   
  
def validate(request):   

    mstream=StringIO.StringIO()   
    text = request.REQUEST["aid"]   
    #解密   
    text = des_alog(text,False)   
    text = text[0:4]
  
    font = ImageFont.truetype("c:/windows/fonts/arial.ttf",20)
    im = Image.new("RGBA", (50, 20),color=0)   
    draw = ImageDraw.Draw(im, "RGBA")   
    draw.ink = 255  
    draw.text((0,0), text,font=font)   
    im.save(mstream,"JPEG")   
       
    return HttpResponse(mstream.getvalue(),"image/jpg")  


django的模板代码如下:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"   
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">  
<html>  
    <head>  
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />  
        <title>Ajax Test</title>  
        <script type="text/javascript" src="http://localhost/static/js/jquery-1.2.1.pack.js"></script>  
     
  
    <script type="text/javascript" >  
  
$(document).ready(function() {   
  
$("#myreflash").click(function() {   
  
var url = "/validate/getString";    
  
$.get(url,{   
  content: ""   
},function(txt){   
  
$("img").each(function(){ this.src = "/validate/validate/?aid="+txt; });   
  
});   
});   

$("#myreflash").click();
});   
  
    </script>  
  
    </head>  
    <body>  
        <h1>  
            图片验证 演示   
        </h1>  
        <!--这里仅仅是演示,所以初始化的时候没有图片生成-->  
        <div id="imgshow"><img src="/validate/validate/?aid=----"/></div>  
        <input id="myreflash" type="button" value="刷新" />  
      
    </body>  
</html>  
分享到:
评论
1 楼 guotie 2007-12-19  
这样恶意注册用户只要知道这个流程,不久很容易破解吗?

相关推荐

    简单介绍django提供的加密算法

    在 Django 中,处理用户密码时,使用加密算法是至关重要的,因为这有助于保护用户的敏感信息,防止未授权的访问。 Django 的加密算法主要是通过 `django.contrib.auth.hashers` 模块实现的。在这个模块中,Django ...

    Django会员管理系统

    在本文中,我们将深入探讨如何使用Django框架构建一个会员管理系统。Django作为一个强大的Python Web开发框架,提供了许多内置的功能,如用户认证、权限管理等,使得开发人员能够快速高效地构建复杂的Web应用。 ...

    Python-DjangoREST框架的无密码验证

    5. **邮件/短信发送**:在Django中,可以使用`django.core.mail`模块发送邮件,或者集成第三方服务如Twilio发送短信,将令牌发送到用户设备。 6. **安全性考虑**:虽然无密码验证简化了用户体验,但也需要额外的...

    基于Django实现的微信小程序登录以及资源上传的API接口.zip

    开发者可能使用了Django的内置认证系统来管理用户身份验证和权限。 2. 微信小程序登录接口: 要实现在微信小程序中登录,开发者通常会利用微信开放平台提供的SDK,通过OAuth2.0协议进行授权。用户在小程序中点击...

    基于Django的网站平台系统源码

    Django可以集成第三方库如django-simple-captcha来生成和验证随机图片验证码,防止机器人自动提交表单,增强网站安全性。 7. **前端分页**: 使用Django的分页器(paginator)功能,可以轻松实现数据集的分页显示...

    python Django web 联通用户管理系统实训代码

    1. 高度集成化:Django包含了很多常用功能,如自动化ORM系统、Form系统、Cache系统、Routing、Middleware、Template系统等,这样就能够很方便的使用这些功能,不需要自己来实现这些底层的功能。 2. 自动化Admin管理...

    Django中的session用法详解

    然后在其他视图中检查Session: ```python def protected_view(request): user = request.session.get('user') if user: # 显示受保护的内容 else: # 跳转到登录页面 ``` 五、Session的最佳实践 1. 仅存储必要...

    day21丁智杰基于session的登录验证.zip

    Django默认使用加密的cookie来存储session ID,但开发者还需要考虑防止session hijacking(会话劫持)和session fixation(会话固定)等攻击。 5. **配置设置**:Django的session配置允许开发者调整session的存储...

    Django cookie 与 session

    在Django中,使用`request.session`来操作Session: ```python # 设置Session request.session['key'] = value # 获取Session value = request.session.get('key') # 删除Session del request.session['key'] ```...

    python Django web 实训项目的实验报告

    - **登录模块**: 包括用户登录验证,采用随机图片验证码和Cookie/Session进行安全控制。 - **部门模块**: 管理员可增删查改部门信息,可能涉及Ajax无刷新更新。 - **用户模块**: 实现用户账户的管理,包括增删查改、...

    网络验证系统的简单实现

    3. 安全通信:使用HTTPS协议确保数据在传输过程中的安全。 4. 会话管理:定期刷新session ID,防止会话劫持。 5. 零信任原则:即使验证成功,系统也应对每个请求进行权限验证。 五、技术选型 开发网络验证系统时,...

    用django连接mongo的购物网站.zip

    【标题】:使用Django与MongoDB构建购物网站 在当今的Web开发中,Django作为Python的一个流行框架,常用于构建高效、安全且易于维护的Web应用。而MongoDB则是一款非关系型数据库(NoSQL),以其灵活性、可扩展性和...

    PythonWeb开发基础教程-第2章-Django配置.pptx

    - `INSTALLED_APPS`:此列表包含了项目中使用的所有应用,包括Django的内置应用,如管理后台(`django.contrib.admin`)、认证(`django.contrib.auth`)、内容类型(`django.contrib.contenttype`)、会话(`django....

    Django框架会话技术实例分析【Cookie与Session】

    对于使用Django框架进行开发的应用程序而言,掌握如何有效地利用Cookie和Session来进行会话管理至关重要。下面,我们将深入探讨这两个概念,并结合具体的示例来解析它们的使用技巧与注意事项。 #### 1. Cookie **...

    Django组件cookie与session的具体使用

    Django中使用Session的配置需要在settings.py中设置SESSION_ENGINE和SESSION_COOKIE_AGE等参数。在视图函数中,可以通过`request.session`对象来读写Session数据。 总结一下,Django中的Cookie和Session都是用来...

    基于Django完成的酒店管理系统与预定系统论文.docx

    - **高效开发**:Django内置了大量的实用工具和功能,使得开发者能够专注于业务逻辑而非基础架构。 - **安全性**:框架内置了多种安全特性,如SQL注入防护、跨站脚本攻击防护等。 - **可扩展性**:通过插件和自定义...

    django中账号密码验证登陆功能的实现方法

    request.session['user_id'] = user.id return JsonResponse({"status": "success", "message": "登录成功"}) else: return render(request, 'login.html') ``` 在上述代码中,首先检查用户是否存在,并对密码...

Global site tag (gtag.js) - Google Analytics