用户
搜索
  • TA的每日心情
    奋斗
    前天 15:40
  • 签到天数: 170 天

    连续签到: 1 天

    [LV.7]常住居民III

    版主

    pypy

    Rank: 7Rank: 7Rank: 7

    28

    主题

    670

    帖子

    1543

    魔法币
    收听
    3
    粉丝
    22
    注册时间
    2015-11-12

    i春秋签约作者

    发表于 2017-5-3 12:06:22 1111952
    本帖最后由 xiaoye 于 2017-5-5 21:25 编辑
    难易程度:★★★
    阅读点:linux;python;python web;
    文章作者:xiaoye
    文章来源:i春秋
    关键字:网络渗透技术,django实现渗透测试系统

    前言
    w8ay表哥曾经用flask实现过一个在线渗透测试系统,小弟也有这个想法,python web里重量级的选手django算一个,于是就用django重写了下,(其实是因为不懂flask,,,,感觉这两个框架还是有不小的差别),因为百度高精度ip没法用了,只能退而求其次来个普通ip定位了,在这个过程中我会讲解下django的一些基础,大牛勿喷

    一、django的基本结构
    我们切换到相应的目录下,tree /f
    1.PNG

    [Python] 纯文本查看 复制代码
    │  db.sqlite3
    │  manage.py
    │
    ├─tool
    │  │  admin.py
    │  │  admin.pyc
    │  │  apps.py
    │  │  ipapi.py
    │  │  ipapi.pyc
    │  │  models.py
    │  │  models.pyc
    │  │  tests.py
    │  │  views.py
    │  │  views.pyc
    │  │  __init__.py
    │  │  __init__.pyc
    │  │
    │  ├─migrations
    │  │      __init__.py
    │  │      __init__.pyc
    │  │
    │  └─templates
    │      └─tool
    │              1.gif
    │              ip.html
    │
    └─webtool
            settings.py
            settings.pyc
            urls.py
            urls.pyc
            wsgi.py
            wsgi.pyc
            __init__.py
            __init__.pyc


    django是基于MVC的一个python框架,模型M,视图V和控制器C。
    重要文件

    setting.py
    一些基本的设置及配置,比如自行开发的应用/允许的主机ip都可以在这设置

    urls.py
    在django里,控制着url与view函数的“映射”,对于django来说,用户访问一个url,总有一个视图函数来控制此url页面的展示。
    举个栗子:
    urls.py里我们这样写:
    [Python] 纯文本查看 复制代码
    from tool import views as tool_views
    urlpatterns = [
        url(r'^admin/', admin.site.urls),
            #url(r'^tool1/$', tool_views.tool1),
            url(r'^tool/ip/$', tool_views.ip_api),
    ]

    当我们访问http://mysite/tool/ip/时,页面的展示取决于tool/views.py里的ip_api函数,函数里要是写上helloword,那么此url对应的页面就返回helloword,记
    访问网址就对应一个函数

    views.py
    就是一些自定义的视图函数,控制页面返回效果

    models.py
    与数据库操作相关,存入或读取数据时用到

    templates 文件夹
    views.py 中的函数渲染templates中的Html模板,得到动态内容的网页,渲染方式一般用render()

    二、开启django的简易小项目之旅
    基础的概念大家可以去百度或者django菜鸟教程/自强学堂去看,咱们直接来做
    urls.py
    [Python] 纯文本查看 复制代码
    from tool import views as tool_views
    
    urlpatterns = [
        url(r'^admin/', admin.site.urls),
            #url(r'^tool1/$', tool_views.tool1),
            url(r'^tool/ip/$', tool_views.ip_api),
    ]

    前面解释过了

    views.py
    [Python] 纯文本查看 复制代码
    from __future__ import unicode_literals
    from django.http import HttpResponse
    from tool import ipapi
    
    from django.shortcuts import render
    
    # Create your views here.
    
    def ip_api(request):
            #ip = request.GET['ipval']
            ip = request.GET.get('ipval', '')
            c, px, py = ipapi.ipapi(ip)
            ima = ipapi.getmap(px, py)
            return render(request, 'tool/ip.html', {'city':c,'px':px,'py':py,'ima':ima})

    在这里我们定义了一个函数ip_api,它控制着访问/tool/ip时的页面返回,在这里我们当然需要它来展示一个html页面,有让我们输入ip的输入框,有展示地址,经纬度的表格,所以我们用一个render()来让它渲染ip.html

    ip.html
    [Python] 纯文本查看 复制代码
    <html>
    <head>
    <title></title>
    </head>
    <body>
    <script>
    function check(){
            if (ip.ipval.value == ''){
                    alert('empty');
                    return false;
            }else{
                    return true;
            }
    }
    </script>
    <center>
    <form action='http://127.0.0.1:8080/tool/ip/' method='get' name='ip' onsubmit='return check();'>
    <input type='text' name='ipval' style="font-size:30px" size="30">
    <input type='submit' value='定位 ip' name='submit'>
    </form>
    </center>
    <center>
    <br>
    <br>
    <p>定位结果及百度地图</p>
    <table border='1'>
        <thead>
            <tr>
                <th>信息</th>
                <th>内容</th>
            </tr>
        </thead>
        <tbody>
            <tr>
                            <td>城市</td>
                            <td>{{city}}</td>
            </tr>
        <tr>
                <td>所在经度</td>
                <td>{{px}}</td>
        </tr>
        <tr>
                <td>所在纬度</td>
                <td>{{py}}</td>
        </tr>
       
         <tr>
                <td>静态地图</td>
                <td><img src="{{ ima }}" /></td>
         </tr>
        </tbody>
    </table>
    </center>
    </body>
    </html>
    

    图方便,就自己写了个简单的html,很简陋,不过不会影响核心功能

    注意views.py里面还有一个模块叫ipapi,这个是我们自己编写的模块,用百度api来获取与地址相关的json数据并解析
    [Python] 纯文本查看 复制代码
    #coding: utf-8
    import json
    import requests
    
    def ipapi(ip):
            url = 'http://api.map.baidu.com/location/ip?ak=xxxxxxxxx&coor=bd09ll&ip=' + ip
            headers = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64; rv:50.0) Gecko/20100101 Firefox/50.0'}
            r = requests.get(url, headers=headers, timeout=6)
            jsdic = json.loads(r.content)
            if jsdic.has_key('content'):
                    city = jsdic['content']['address']
                    pointx = jsdic['content']['point']['x']
                    pointy = jsdic['content']['point']['y']
            return city, pointx, pointy
            
    def getmap(x, y):
            im = 'http://api.map.baidu.com/staticimage/v2?ak=xxxxxxxxx&mcode=666666¢er=' + x + ',' + y + '&width=500&height=300&zoom=11'
            return im
    '''if __name__ == '__main__':
            ipapi(ip)'''

    url中的ak是自己在百度开发者平台去申请的密钥,去申请一个写上吧

    三、效果展示以及梳理思路
    [Python] 纯文本查看 复制代码
    python manage.py runserver 0.0.0.0:8080

                                                                                2.PNG
    整体的思路是:
    1.核心代码编写,利用表单api获取位置信息相关的json数据(ipapi.py),将其当作模块供其他文件调用
    2.指定url,并且确定对应的views.py中的函数
    3.编写views.py中的函数,用render渲染一个所需要的html文件(ip.html)
    4.当ip.html中的ip被提交后,调用ipapi.py进行解析,再返回数据给ip.html,结果展示

    四、总结
    很多有用的脚本都能做成模块,放在django中进行调用,后面有时间自己也会做一些东西,放在github上
    本次实验的代码目前已放置百度云盘:http://pan.baidu.com/s/1qXUuyrq
    稍后会上传到github,感谢w8ay表哥的思路。
    有什么错误请指出,django初学者,大牛轻喷
    -----------------------------------------
    更新:
    源码已经放置:https://github.com/xiaoyecent/django-webtool
    里面还有下次文章要写的在线字典生成相关代码,具体等下篇文章哦,很快会有,不足之处欢迎表哥们指出
    求star,求fork。。


    http://blog.163.com/sy_butian/欢迎交流
    小爱_Joker 版主 成大事者 不拘小节 楚 积极活跃奖 i春秋签约作者 爱心勋章
    沙发
    发表于 2017-5-3 12:38:24
    我小叶媳妇厉害了
    使用道具 举报 回复
    yyyxy 管理员 六国战旗移动展示平台! 秦 楚 燕 魏 齐 赵
    板凳
    发表于 2017-5-3 14:56:12
    前排支持小叶爱将
    欢迎加入i春秋QQ群大家庭,每人只能任选加入一个群哦!投稿请加我QQ:286894635。
    i春秋-楚:533191896
    i春秋-燕:129821314
    i春秋-齐:417360103
    i春秋-秦:262108018
    使用道具 举报 回复
    发表于 2017-5-3 15:51:38
    yyyxy 发表于 2017-5-3 14:56
    前排支持小叶爱将

    谢谢蛋总
    http://blog.163.com/sy_butian/欢迎交流
    使用道具 举报 回复
    可以用include方法把project下的urls.py指向tool这个app下  否则一旦项目功能多了 写在一个urls里面岂不是很乱
    使用道具 举报 回复
    恩  还有view里面最后render返回的可以用locals()  这样更可以更简单些
    使用道具 举报 回复
    xiaoye 来自手机 版主 pypy i春秋签约作者
    6#
    发表于 2017-5-4 00:09:54
    a207426719 发表于 2017-5-3 20:05
    恩  还有view里面最后render返回的可以用locals()  这样更可以更简单些

    谢谢表哥指点,我刚刚学django没多久
    使用道具 举报 回复
    xiaoye 来自手机 版主 pypy i春秋签约作者
    7#
    发表于 2017-5-4 00:13:53
    有不足之处欢迎大家指出,谢谢表哥们指点^ω^
    使用道具 举报 回复
    xiaoye 发表于 2017-5-4 00:09
    谢谢表哥指点,我刚刚学django没多久

    我也不咋会  O(∩_∩)O
    使用道具 举报 回复
    yyyxy 管理员 六国战旗移动展示平台! 秦 楚 燕 魏 齐 赵
    9#
    发表于 2017-5-8 16:52:56
    文章奖励介绍及评分标准:http://bbs.ichunqiu.com/thread-7869-1-1.html,如有疑问请加QQ:286894635!
    奖金
    点评
    0
    非安全类型

    欢迎加入i春秋QQ群大家庭,每人只能任选加入一个群哦!投稿请加我QQ:286894635。
    i春秋-楚:533191896
    i春秋-燕:129821314
    i春秋-齐:417360103
    i春秋-秦:262108018
    使用道具 举报 回复
    发表于 2017-5-11 10:36:59
    高精度ip定位的api已经关了...有办法用其他高精度定位嘛?
    使用道具 举报 回复
    发表于 2017-5-11 19:00:25
    spanuitree 发表于 2017-5-11 10:36
    高精度ip定位的api已经关了...有办法用其他高精度定位嘛?

    是关了,所以文章用的是百度普通ip定位,,,回头我找找看有没有其他高精度的吧
    http://blog.163.com/sy_butian/欢迎交流
    使用道具 举报 回复
    发新帖
    您需要登录后才可以回帖 登录 | 立即注册