91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Django開發與攻防測試是怎樣的

發布時間:2022-01-17 17:25:21 來源:億速云 閱讀:147 作者:柒染 欄目:安全技術

這篇文章的內容主要圍繞Django開發與攻防測試是怎樣的進行講述,文章內容清晰易懂,條理清晰,非常適合新手學習,值得大家去閱讀。感興趣的朋友可以跟隨小編一起閱讀吧。希望大家通過這篇文章有所收獲!

一、Django基礎開發

以前搭博客用的是1.8.2,還在機子上裝著沒卸,順便拿過來用,當然新版本會修復很多bug,盡可能還是要去學習新一些的版本,此篇權當入門篇。

1、下載安裝與啟動

# 下載django
pip install django==1.8.2 -i https://pypi.mirrors.ustc.edu.cn/simple/
# 創建文件夾并啟動虛擬環境
virtualenv django_demo
cd django_demo
source bin/activate
# 創建存放django文件的文件夾
mkdir learn_django
cd learn_django
# 創建項目
python django-admin.py startproject django_web
# 創建應用
python manage.py startapp django_app
# 編輯django_web中的settings.py文件,將django_app加入到apps中

Django開發與攻防測試是怎樣的

這樣就完成了最基礎的搭建

Django開發與攻防測試是怎樣的

運行服務看一下    

Django開發與攻防測試是怎樣的

2、Django框架中的MVC與MTV

MVC是眾所周知的模式:model(模型)、view(視圖)、controller(控制器)    

用戶在頁面輸入url,轉交給url控制器,然后根據url匹配相應的視圖函數,viwe會去到models取數據,然后models在數據庫中取得數據后返回給視圖,視圖把要展示的數據返回給模版,然后就輸出到頁面上。    

Django開發與攻防測試是怎樣的

Django也是一個MVC框架,但是在Django中,控制器接受用戶輸入的部分由框架自行處理,所以django更加關注的是 模型(model)、view(視圖)、templates(模版),也就是MTV模型。    

請求一個url后,匹配相應的view區,view去models(一個托管數據的層級)查找我們要的數據,然后將數據裝載到templates層,然后呈獻給我們。Django開發與攻防測試是怎樣的

兩者很像,可以說MTV基于MVC。    

3、靜態Web開發

創建模版層

當然,要是只想讓簡單的數據顯示在Web頁面中,不需要創建模版,直接在views函數中相應回去就可以了,但是還是正規化一點。

在learn_django中創建templates文件夾(如果是IDE創建的django項目會自動創建),這就是我們的模版文件夾,來添加一個可視化的模版index.html    

<!DOCTYPE html>
<html>
<head>
    <title>Django Learning</title>
</head>
<body>
    <h2>Hellow,Django!</h2>>
</body>
</html>

創建視圖層

視圖層通常來說是一個視圖函數,與url進行匹配返回傳入對應的Web頁面

from django.shortcuts import render
# Create your views here.
def index(request):
    return render(request,'index.html')

創建url層

創建url層,根據傳入的url來找到我們的視圖函數,從而將渲染的模版返回    

from django.conf.urls import include, url
from django.contrib import admin
from django_app.views import index
urlpatterns = [
    url(r'^admin/', include(admin.site.urls)),
# 用正則去對url進行匹配,然后將視圖函數匹配給相應的url
    url(r'^index/',index),

運行服務,默認在8000端口

python manage.py runserver

Django開發與攻防測試是怎樣的

到這一步有一部分同學會有一些小問題,那就是并不能返回模版,可能Windows和linux情況各不相同,linux需要把templates目錄放在app目錄下才可以找到。

原因就在于settings.py中模版路徑設置問題,如果templates目錄是放在項目根目錄,在settings中將templates路徑加入就可以了。

Django開發與攻防測試是怎樣的

Django開發與攻防測試是怎樣的

4、動態web開發

前邊是說靜態頁面,如果需要實現動態,那就不得不說與數據庫存儲的交互問題,需要對models進行對應的編寫來取得數據。

mysql + django

安裝對應的數據庫接口驅動,這里大致有三種:mysqldb、pymysql、mysqlclient。

默認使用web根目錄下的sqlite3數據庫    

Django開發與攻防測試是怎樣的

將其修改為相應的mysql信息    

Django開發與攻防測試是怎樣的

創建mysql數據庫,指定字符集為UTF-8    

Django開發與攻防測試是怎樣的

models層    

Django開發與攻防測試是怎樣的

創建模型的對象和數據庫字段的對應關系    

Django開發與攻防測試是怎樣的

字段定義中的特殊屬性    

Django開發與攻防測試是怎樣的

from django.db import models
# Create your models here.
class DjangoTest(models.Model):
    text = models.CharField(max_length=20)

生成遷移文件并執行遷移
python manage.py makemigrations
python manage.py migrate

Django開發與攻防測試是怎樣的

查看創建的信息    
Django開發與攻防測試是怎樣的

建立一些測試數據    
Django開發與攻防測試是怎樣的

在去創建views層之前,我們先對models層進行測試,看是否提取出了數據    

可以用兩種方法:    

1、直接在models中填寫提取數據    

也可以寫在view層,這個無所謂

Django開發與攻防測試是怎樣的

運行后可能會出現,因為在項目中單獨運行python文件,需要搜索環境變量,而并沒有指定,所以需要進行設置    

django.core.exceptions.ImproperlyConfigured: Requested setting DEFAULT_INDEX_TABLESPACE, but settings are not configured. You must either define the environment variable DJANGO_SETTINGS.....        

pycharm解決方法:https://blog.csdn.net/u011013781/article/details/52155761

2、使用django shell    

# 打開django shell
python manage.py shell
import django
django.setup()
from django_app.models imoort DjangoTest as dj
# 添加數據,結果見下方圖片
a = dj(text="django shell test")
a.save()
# 查詢數據,get查詢單個數據,filter查詢多個模型,all查詢
dj.objects.all()

Django開發與攻防測試是怎樣的

django admin可以幫我們快速管理后臺數據    

# 創建管理員
python manage.py createsuperuser
```
![](http://oxrfjovwk.bkt.clouddn.com/18-6-29/76119583.jpg)

將我們的模型注冊到admin中,打開admin.py

Django開發與攻防測試是怎樣的

將我們的模型注冊到admin中,打開admin.py    

from django.contrib import admin
# Register your models here.
from models import DjangoTest
admin.site.register(DjangoTest)

這樣就可以在管理員界面管理模型    

Django開發與攻防測試是怎樣的

view與url層    

當用戶請求django站點上的某個頁面時,django會使用路由解析模塊來解析路由,默認是app目錄下的urls.py。    

django加載該路由解析模塊,并尋找可用的urlpatterns,這是一個python列表,然后django依次匹配列表中每個url模式,在遇到第一個與請求相匹配的模式時停下來,然后調用對應的視圖,視圖是一個python函數(或者是一個基于類的視圖)。    

一個簡單的路由選擇模塊示例:    

from django.conf.urls import url
from . import views
urlpatterns = [
    url(r'^articles/2003/$', views.special_case_2003),
    url(r'^articles/([0-9]{4})/$', views.year_archive),
    url(r'^articles/([0-9]{4})/([0-9]{2})/$', views.month_archive),
    url(r'^articles/([0-9]{4})/([0-9]{2})/([0-9]+)/$', views.article_detail),
]

與之對應的請求的例子:    

對/articles/2005/03/ 的請求將匹配列表中的第三個模式。Django 將調用函數views.month_archive(request, '2005', '03')。

/articles/2005/3/ 不匹配任何URL 模式,因為列表中的第三個模式要求月份應該是兩個數字。

/articles/2003/ 將匹配列表中的第一個模式不是第二個,因為模式按順序匹配,第一個會首先測試是否匹配。請像這樣自由插入一些特殊的情況來探測匹配的次序。

/articles/2003 不匹配任何一個模式,因為每個模式要求URL 以一個斜線結尾。

/articles/2003/03/03/ 將匹配最后一個模式。Django 將調用函數views.article_detail(request, '2003', '03', '03')。

根據url后邊的數值,賦予相應的參數:id

urls.py

from django.conf.urls import include, url
from django.contrib import admin
from django_app.views import index
urlpatterns = [
    url(r'^admin/', include(admin.site.urls)),
    url(r'^index/(?P<id>[0-9])/$', index),
]

將對于的id參數代入查詢獲取數據列表中指定索引的值(忽略這的一點小細節錯誤)    

views.py

from django.shortcuts import render
from django_app.models import DjangoTest
# Create your views here.
def index(request,id):
    text = DjangoTest.objects.all()
    iden = int(id)
    context = {'text':text[iden]}    
    return render(request,'index.html',context)

模版層

模版層語法參考

Django開發與攻防測試是怎樣的

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Django test</title>
</head>
<body>
        <h2>ID: {{ text.id }}</h2>
        <h2>Hello:{{ text.text }}
</body>
</html>

實際運行效果

Django開發與攻防測試是怎樣的Django開發與攻防測試是怎樣的

二、Django開發中的Web攻防(部分)

1、格式化字符串漏洞

修復前

from django.shortcuts import render
from django.contrib.auth import authenticate, login
import django
django.setup()
# Create your views here.
def index(request):
    if request.method == 'GET':
        return render(request,'index.html')
    else:
        username = request.POST['username']
        password = request.POST['password']
        user = authenticate(username=username,password=password)
        if user is not None:
            if user.is_active:
                login(request, user)
                template = 'Hello {user}! , You can set your email is:' + request.POST.get('email')
                return render(request, 'index.html', {"value": template.format(user=request.user)})
            else:
                info = "The password is valid, but the account has been disabled!"
                return render(request, 'index.html', {"value": info})
        else:
            info = "The username and password were incorrect."
            return render(request, 'index.html', {"value": info})

Django開發與攻防測試是怎樣的

在原來的代碼上變動了一下,如果不增加認證選項,返回的用戶永遠是匿名用戶。    

在前邊我已經創建了一個超級用戶(admin admin),所以直接用這個用戶來進行認證。    

認證之后返回登錄用戶的用戶名,我們可以自己通過post方法傳入一個郵箱地址上去作為臨時地址,如果用戶名信息出現任何錯誤,返回相應的錯誤信息。    

使用django認證系統    

User對象是認證系統的核心,默認user的基本屬性有username、password、email.....        

代碼中郵箱信息直接通過format拼接在了字符串中,然后展示在頁面里,我們可以通過以下payload來獲取敏感數據,將user變量中的password屬性 作為變量信息進行拼接,從而進行獲取    

payload:  {user.password}    

Django開發與攻防測試是怎樣的

修復后

index.html

將其他的文本信息直接存放在模版中    

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Django test</title>
</head>
<body>
    <h2>Hello, Django!</h2>
    <h3>hello {{ user }}, You can set your email is:{{ value }}</h3>
</body>
</html>

views.py
.....
email = request.POST.get('email')
return render(request, 'index.html', {"value": email})
...

2、XSS

測試與修復前

只是簡單的接收post參數值,然后讓其顯示在頁面上 

views.py

def index(request):
    if request.method == 'GET':
        return render(request,'index.html')
    else:
        info = request.POST.get('info')
        return render(request,'index.html',{"value":info})

index.html


    <h2>Hello, Django!</h2>
    <h3>{{ value }}</h3>

Django開發與攻防測試是怎樣的當鍵入payload時,并沒有預想的彈窗,因為django自動為開發者提供了escape功能,讓html代碼在render之前先進行轉義,然后再顯示出來。    

除了自動開啟的escape,還有safe、autoescape、make_Safe等    

autoescape測試    

    {% autoescape off %}
    <h3>{{ value }}</h3>
    {% endautoescape %}

當其值為off時,即存在xss漏洞    

Django開發與攻防測試是怎樣的

safe測試    

    <h2>Hello, Django!</h2>
    <h3>{{ value | safe }}</h3>

通過safe關閉了模版的安全機制,出現XSS漏洞    

Django開發與攻防測試是怎樣的

還有幾種情況也可能存在XSS:    

1、var mystr = "\{ \{ value | escapejs \} \}"

2、safe、make_safe、autoescape

3、DOM型XSS

4、HttpResponse返回動態內容

修復后    

import cgi
# Create your views here.
def index(request):
    if request.method == 'GET':
        return render(request,'index.html')
    else:
        info = request.POST.get('info')
        info = cgi.escape(info)
        return render(request,'index.html',{"value":info})

Django開發與攻防測試是怎樣的

使用cgi模塊需要注意:    

Django開發與攻防測試是怎樣的

設為True,讓其轉義盡可能多的導致逃逸的字符。

3、SQL注入

Django QuerySet    

查看django queryset執行的SQL    

from django_app.models import DjangoTest as dj
print dj.objects.all().query

得到
SELECT `django_app_djangotest`.`id`, `django_app_djangotest`.`text` FROM `django_app_djangotest` 
簡化之后就是
SELECT id,text FROM django_app_djangotest; 

Django開發與攻防測試是怎樣的

extra實現別名、條件、排序等    

以select為例:    

tag = dj.objects.all().extra(select={"tag_id":'id'})    

Django開發與攻防測試是怎樣的

以where為例:

extra里的允許當前的where參數可以使用原聲的sql語句進行查詢。    

條件為id=1,結果即查詢出了一條數據    

Django開發與攻防測試是怎樣的

raw方法實現原生的SQL語句查詢    

a = dj.objects.raw('SELECT id,text FROM django_app_djangotest ')

raw()方法支持索引訪問(a[0])

也可以打印當前賦予的這個變量a都有哪些方法    

Django開發與攻防測試是怎樣的Django開發與攻防測試是怎樣的

直接利用API來查詢數據    

django.connection    

Django開發與攻防測試是怎樣的

MySQL API    

諸如mysqldb、pymysql、mysqlclient,在views層寫好sql語句,根據傳入的參數值來查詢,得出結果后返回給模版就可以了    

修復前

views.py

from django.shortcuts import render
from django_app.models import DjangoTest as dj
# Create your views here.
def index(request):
    if request.method == 'GET':
        return render(request,'index.html')
    else:
        id = request.POST.get('id')
        tag = dj.objects.extra(where={'id={}'.format(id)})[0].text
        return render(request,'index.html',{"value":tag})

接下來就可以進行愉快的測試了

Django開發與攻防測試是怎樣的

測試篇

a = dj.objects.extra(where={'id=1'})

SELECT `django_app_djangotest`.`id`, `django_app_djangotest`.`text` FROM `django_app_djangotest` WHERE (id=1asdasdad)

先輸入payload查看django傳遞回數據庫的sql語句是什么

Django開發與攻防測試是怎樣的

更改后的payload

Django開發與攻防測試是怎樣的Django開發與攻防測試是怎樣的后邊又構造測試了幾個,SQL語句是正確,但是django傳入SQL語句時會提示里邊的語法問題,并且就算語法正確,也返回不了數據。(這其實有點問題,后邊做完一想,沒拿到mysql shell里邊去測,終端里邊測對了,再拿過來,這里有點懶沒再弄)

又因為id的值,從而在頁面中顯示不出來,所以這時候想到了延時注入

Django開發與攻防測試是怎樣的

在這里調用a的時候會延時3秒

Django開發與攻防測試是怎樣的

我們在Web頁面中進行測試

Django開發與攻防測試是怎樣的Django開發與攻防測試是怎樣的

關于這里的秒數是成倍關系,以前看到過一篇帖子,說是當時間滿足出現成倍的關系時,應該是查詢出了多條數據,每一個row執行一次延時。

接下來就好辦了

x = dj.objects.extra(where={"id=1 and if(substr((select user()),1,1)='r',sleep(3),1)"})

Django開發與攻防測試是怎樣的

后邊的步驟跟著盲注的流程走就OJBK了。

有時候不要直接在django shell中執行,先去mysql命令行把命令敲對了,也確實可以執行payload時候再回來測試,確保第一步先正確。

Django開發與攻防測試是怎樣的

剛才說了的只是extra中的where子句,其他類型的數據提取方法在前邊也有說過了,具體案例具體分析

修復后

views.py

from django.shortcuts import render
from django_app.models import DjangoTest as dj
# Create your views here.
def index(request):
    if request.method == 'GET':
        return render(request,'index.html')
    else:
        id = request.POST.get('id')
        tag = dj.objects.extra(where=['id=%s'],params=id)
        info = tag[0].text
        return render(request,'index.html',{"value":info})

用戶發送的請求再匹配到視圖函數進行處理時,視圖函數的相關機制會對敏感信息進行處理,導致一些惡意語句被過濾

現在測試就不會了

Django開發與攻防測試是怎樣的

感謝你的閱讀,相信你對“Django開發與攻防測試是怎樣的”這一問題有一定的了解,快去動手實踐吧,如果想了解更多相關知識點,可以關注億速云網站!小編會繼續為大家帶來更好的文章!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

东莞市| 沂水县| 台湾省| 泰顺县| 双柏县| 广丰县| 侯马市| 赫章县| 开原市| 绥德县| 龙泉市| 酒泉市| 南陵县| 岳阳市| 墨竹工卡县| 乌审旗| 嘉兴市| 庆云县| 临颍县| 上思县| 越西县| 兴海县| 洛南县| 普定县| 儋州市| 齐河县| 泽州县| 临沧市| 南溪县| 随州市| 津南区| 八宿县| 汤原县| 女性| 桃江县| 烟台市| 铁岭市| 射洪县| 洞头县| 胶州市| 华蓥市|