Ⅰ 如何使用python語言實現用戶登錄系統
1、使用python3執行程序。按提示輸入1或2,登錄或退出程序
2、輸入用戶名後,如果用戶名被鎖定及無效用戶名,程序會退出,請確保輸入正確。
3、輸入用戶名正確後,輸入密碼。用戶名正確的情況下,密碼連續輸錯三次,用戶將被鎖定,禁止登錄系統
Ⅱ 風變編程里南科大的python技術應用認證證書含金量高嗎
python技術應用認證證書含金量非常高。
將本地系統教研資源與標准化測評開發流程融合,與前沿編程能力發展理論研究成果保持一致;2018年全國計算機等級考試,經委員會決定取消「Visual FoxPol資料庫程序設計」科目,新增「Python語言程序設計」科目。
「Python技術應用工程師」職業技術課程是由工業和信息化部教育與考試中心和泰迪智能研究院聯合推出的標准化課程體系,是一套專業化,科學化,系統化的人才考核標准,涉及在互聯網、零售、金融、電信、醫學、旅遊等行業專門從事數據採集、數據分析、機器學習、人工智慧並能製作業務報告、提供決策的新型數據分析人才所需要的技能。
「Python技術應用工程師認證」是對在數據分析、人工智慧領域中使用Python作為主要分析工具從業者的全面認證,分為初級,中級,高級三個等級。
Ⅲ 如何利用Python做簡單的驗證碼識別
1摘要
驗證碼是目前互聯網上非常常見也是非常重要的一個事物,充當著很多系統的防火牆功能,但是隨時OCR技術的發展,驗證碼暴露出來的安全問題也越來越嚴峻。本文介紹了一套字元驗證碼識別的完整流程,對於驗證碼安全和OCR識別技術都有一定的借鑒意義。
然後經過了一年的時間,筆者又研究和get到了一種更強大的基於CNN卷積神經網路的直接端到端的驗證識別技術(文章不是我的,然後我把源碼整理了下,介紹和源碼在這裡面):
基於python語言的tensorflow的『端到端』的字元型驗證碼識別源碼整理(github源碼分享)
2關鍵詞
關鍵詞:安全,字元圖片,驗證碼識別,OCR,Python,SVM,PIL
3免責聲明
本文研究所用素材來自於某舊Web框架的網站完全對外公開的公共圖片資源。
本文只做了該網站對外公開的公共圖片資源進行了爬取,並未越權做任何多餘操作。
本文在書寫相關報告的時候已經隱去漏洞網站的身份信息。
本文作者已經通知網站相關人員此系統漏洞,並積極向新系統轉移。
本報告的主要目的也僅是用於OCR交流學習和引起大家對驗證安全的警覺。
4引言
關於驗證碼的非技術部分的介紹,可以參考以前寫的一篇科普類的文章:
互聯網安全防火牆(1)--網路驗證碼的科普
裡面對驗證碼的種類,使用場景,作用,主要的識別技術等等進行了講解,然而並沒有涉及到任何技術內容。本章內容則作為它的技術補充來給出相應的識別的解決方案,讓讀者對驗證碼的功能及安全性問題有更深刻的認識。
5基本工具
要達到本文的目的,只需要簡單的編程知識即可,因為現在的機器學習領域的蓬勃發展,已經有很多封裝好的開源解決方案來進行機器學習。普通程序員已經不需要了解復雜的數學原理,即可以實現對這些工具的應用了。
主要開發環境:
python3.5
python SDK版本
PIL
圖片處理庫
libsvm
開源的svm機器學習庫
關於環境的安裝,不是本文的重點,故略去。
6基本流程
一般情況下,對於字元型驗證碼的識別流程如下:
准備原始圖片素材
圖片預處理
圖片字元切割
圖片尺寸歸一化
圖片字元標記
字元圖片特徵提取
生成特徵和標記對應的訓練數據集
訓練特徵標記數據生成識別模型
使用識別模型預測新的未知圖片集
達到根據「圖片」就能返回識別正確的字元集的目標
7素材准備
7.1素材選擇
由於本文是以初級的學習研究目的為主,要求「有代表性,但又不會太難」,所以就直接在網上找個比較有代表性的簡單的字元型驗證碼(感覺像在找漏洞一樣)。
最後在一個比較舊的網站(估計是幾十年前的網站框架)找到了這個驗證碼圖片。
原始圖:
然後就將圖片素材特徵化,按照libSVM指定的格式生成一組帶特徵值和標記值的向量文
Ⅳ 我在使用python下的flask框架 但是我要怎麼實現sso登錄
單點登錄跟登錄其實差不多,理解了登錄也可以搞出單點登錄
回顧
在前面的系列章節中,我們創建了一個資料庫並且學著用用戶和郵件來填充,但是到現在我們還沒能夠植入到我們的程序中。 兩章之前,我們已經看到怎麼去創建網路表單並且留下了一個實現完全的登陸表單。
在這篇文章中,我們將基於我門所學的網路表單和資料庫來構建並實現我們自己的用戶登錄系統。教程的最後我們小程序會實現新用戶注冊,登陸和退出的功能。
為了能跟上這章節,你需要前一章節最後部分,我們留下的微博程序。請確保你的程序已經正確安裝和運行。
在前面的章節,我們開始配置我們將要用到的Flask擴展。為了登錄系統,我們將使用兩個擴展,Flask-Login 和 Flask-OpenID. 配置如下所示 (fileapp\__init__.py):
import os
from flaskext.login import LoginManager
from flaskext.openid import OpenID
from config import basedir
lm = LoginManager()
lm.setup_app(app)
oid = OpenID(app, os.path.join(basedir, 'tmp'))
Flask-OpenID 擴展為了可以存儲臨時文件,需要一個臨時文件夾路徑。為此,我們提供了它的位置。
重訪我們的用戶模型
Flask-Login擴展需要在我們的User類里實現一些方法。除了這些方法以外,類沒有被要求實現其它方法。
下面是我們的User類 (fileapp/models.py):
class User(db.Model):
id = db.Column(db.Integer, primary_key = True)
nickname = db.Column(db.String(64), unique = True)
email = db.Column(db.String(120), unique = True)
role = db.Column(db.SmallInteger, default = ROLE_USER)
posts = db.relationship('Post', backref = 'author', lazy = 'dynamic')
def is_authenticated(self):
return True
def is_active(self):
return True
def is_anonymous(self):
return False
def get_id(self):
return unicode(self.id)
def __repr__(self):
return '<User %r>' % (self.name)
is_authenticated方法是一個誤導性的名字的方法,通常這個方法應該返回True,除非對象代表一個由於某種原因沒有被認證的用戶。
is_active方法應該為用戶返回True除非用戶不是激活的,例如,他們已經被禁了。
is_anonymous方法應該為那些不被獲准登錄的用戶返回True。
最後,get_id方法為用戶返回唯一的unicode標識符。我們用資料庫層生成唯一的id。
用戶載入回調
現在我們通過使用Flask-Login和Flask-OpenID擴展來實現登錄系統
首先,我們需要寫一個方法從資料庫載入到一個用戶。這個方法會被Flask-Login使用(fileapp/views.py):
@lm.user_loader
def load_user(id):
return User.query.get(int(id))
記住Flask-Login里的user id一直是unicode類型的,所以在我們把id傳遞給Flask-SQLAlchemy時,有必要把它轉化成integer類型。
登錄視圖函數
接下來我們要更新登錄視圖函數(fileapp/views.py):
from flask import render_template, flash, redirect, session, url_for, request, g
from flaskext.login import login_user, logout_user, current_user, login_required
from app import app, db, lm, oid
from forms import LoginForm
from models import User, ROLE_USER, ROLE_ADMIN
@app.route('/login', methods = ['GET', 'POST'])
@oid.loginhandler
def login():
if g.user is not None and g.user.is_authenticated():
return redirect(url_for('index'))
form = LoginForm()
if form.validate_on_submit():
session['remember_me'] = form.remember_me.data
return oid.try_login(form.openid.data, ask_for = ['nickname', 'email'])
return render_template('login.html',
title = 'Sign In',
form = form,
providers = app.config['OPENID_PROVIDERS'])
注意到我們導入了一些新的模塊,其中有些後面會用到。
跟上個版本的變化很小。我們給視圖函數添加了一個新的裝飾器:oid.loginhandler。它告訴Flask-OpenID這是我們的登錄視圖函數。
在方法體的開頭,我們檢測是是否用戶是已經經過登錄認證的,如果是就重定向到index頁面。這兒的思路是如果一個用戶已經登錄了,那麼我們不會讓它做二次登錄。
全局變數g是Flask設置的,在一個request生命周期中,用來存儲和共享數據的變數。所以我猜你已經想到了,我們將把已經登錄的用戶放到g變數里。
我們在調用redirect()時使用的url_for()方法是Flask定義的從給定的view方法獲取url。如果你想重定向到index頁面,你h很可能使用redirect('/index'),但是我們有很好的理由讓Flask為你構造url。
當我們從登錄表單得到返回數據,接下來要運行的代碼也是新寫的。這兒我們做兩件事。首先我們保存remember_me的布爾值到Flask的session中,別和Flask-SQLAlchemy的db.session混淆了。我們已經知道在一個request的生命周期中用Flask的g對象來保存和共享數據。沿著這條線路Flask的session提供了更多,更復雜的服務。一旦數據被保存到session中,它將在同一客戶端發起的這次請求和這次以後的請求中永存而不會消亡。數據將保持在session中直到被明確的移除。為了做到這些,Flask為每個客戶端建立各自的session。
下面的oid.try_login是通過Flask-OpenID來執行用戶認證。這個方法有兩個參數,web表單提供的openid和OpenID provider提供的我們想要的list數據項。由於我們定義了包含nickname和email的User類,所以我們要從找nickname和email這些項。
基於OpenID的認證是非同步的。如果認證成功,Flask-OpenID將調用有由oid.after_login裝飾器注冊的方法。如果認證失敗那麼用戶會被重定向到login頁面。
Flask-OpenID登錄回調
這是我們實現的after_login方法(app/views.py)
@oid.after_login
def after_login(resp):
if resp.email is None or resp.email == "":
flash('Invalid login. Please try again.')
redirect(url_for('login'))
user = User.query.filter_by(email = resp.email).first()
if user is None:
nickname = resp.nickname
if nickname is None or nickname == "":
nickname = resp.email.split('@')[0]
user = User(nickname = nickname, email = resp.email, role = ROLE_USER)
db.session.add(user)
db.session.commit()
remember_me = False
if 'remember_me' in session:
remember_me = session['remember_me']
session.pop('remember_me', None)
login_user(user, remember = remember_me)
return redirect(request.args.get('next') or url_for('index'))
傳給after_login方法的resp參數包含了OpenID provider返回的一些信息。
第一個if聲明僅僅是為了驗證。我們要求一個有效的email,所以一個沒有沒提供的email我們是沒法讓他登錄的。
接下來,我們將根據email查找資料庫。如果email沒有被找到我們就認為這是一個新的用戶,所以我們將在資料庫中增加一個新用戶,做法就像我們從之前章節學到的一樣。注意我們沒有處理nickname,因為一些OpenID provider並沒有包含這個信息。
做完這些我們將從Flask session中獲取remember_me的值,如果它存在,那它是我們之前在login view方法中保存到session中的boolean類型的值。
然後我們調用Flask-Login的login_user方法,來注冊這個有效的登錄。
最後,在最後一行我們重定向到下一個頁面,或者如果在request請求中沒有提供下個頁面時,我們將重定向到index頁面。
跳轉到下一頁的這個概念很簡單。比方說我們需要你登錄才能導航到一個頁面,但你現在並未登錄。在Flask-Login中你可以通過login_required裝飾器來限定未登錄用戶。如果一個用戶想連接到一個限定的url,那麼他將被自動的重定向到login頁面。Flask-Login將保存最初的url作為下一個頁面,一旦登錄完成我們便跳轉到這個頁面。
做這個工作Flask-Login需要知道用戶當前在那個頁面。我們可以在app的初始化組件里配置它(app/__init__.py):
lm = LoginManager()
lm.setup_app(app)
lm.login_view = 'login'
全局變數g.user
如果你注意力很集中,那麼你應該記得在login view方法中我們通過檢查g.user來判斷一個用戶是否登錄了。為了實現這個我們將使用Flask提供的before_request事件。任何一個被before_request裝飾器裝飾的方法將會在每次request請求被收到時提前與view方法執行。所以在這兒來設置我們的g.user變數(app/views.py):
@app.before_request
def before_request():
g.user = current_user
這就是它要做的一切,current_user全局變數是被Flask-Login設定的,所以我們只需要把它拷貝到更容易被訪問的g變數就OK了。這樣,所有的請求都能訪問這個登錄的用戶,甚至於內部的模板。
index視圖
在之前的章節中我們用假代碼遺留了我們的index視圖,因為那個時候我們系統里並沒有用戶和博客文章。現在我們有用戶了,所以,讓我們來完成它吧:
@app.route('/')
@app.route('/index')
@login_required
def index():
user = g.user
posts = [
{
'author': { 'nickname': 'John' },
'body': 'Beautiful day in Portland!'
},
{
'author': { 'nickname': 'Susan' },
'body': 'The Avengers movie was so cool!'
}
]
return render_template('index.html',
title = 'Home',
user = user,
posts = posts)
在這個方法中只有兩處變動。首先,我們增加了login_required裝飾器。這樣表明了這個頁面只有登錄用戶才能訪問。
另一個改動是把g.user傳給了模板,替換了之間的假對象。
現在可以運行我們的應用了。
當我們連接到你將會看到登陸頁面。記著如果你通過OpenID登錄那麼你必須使用你的提供者提供的OpenID URL。你可以下面URL中的任何一個OpenID provider來為你產生一個正確的URL。
作為登錄進程的一部分,你將會被重定向到OpenID提供商的網站,你將在那兒認證和授權你共享給我們應用的一些信息(我們只需要email和nickname,放心,不會有任何密碼或者其他個人信息被曝光)。
一旦登錄完成你將作為已登錄用戶被帶到index頁面。
試試勾選remember_me復選框。有了這個選項當你在瀏覽器關閉應用後重新打開時,你還是已登錄狀態。
注銷登錄
我們已經實現了登錄,現在是時候來實現注銷登錄了。
注銷登錄的方法灰常簡單(file app/views.py):
@app.route('/logout')
def logout():
logout_user()
return redirect(url_for('index'))
但我們在模板中還沒有注銷登錄的鏈接。我們將在base.html中的頂部導航欄添加這個鏈接(file app/templates/base.html):
<html>
<head>
{% if title %}
<title>{{title}} - microblog</title>
{% else %}
<title>microblog</title>
{% endif %}
</head>
<body>
<div>Microblog:
<a href="{{ url_for('index') }}">Home</a>
{% if g.user.is_authenticated() %}
| <a href="{{ url_for('logout') }}">Logout</a>
{% endif %}
</div>
<hr>
{% with messages = get_flashed_messages() %}
{% if messages %}
<ul>
{% for message in messages %}
<li>{{ message }} </li>
{% endfor %}
</ul>
{% endif %}
{% endwith %}
{% block content %}{% endblock %}
</body>
</html>
這是多麼多麼簡單啊,我們只需要檢查一下g.user中是否有一個有效的用戶,如果有我們就添加註銷鏈接。在我們的模板中我們再一次使用了url_for方法。
最後的話
我們現在有了一個全功能的用戶登錄系統。在下一章中,我們將創建用戶的個人資料頁,並顯示用戶的頭像。
Ⅳ Python網路編程6-使用Pysnmp實現簡單網管
簡單網路管理協議SNMP(Simple Network Management Protocol)用於網路設備的管理。SNMP作為廣泛應用於TCP/IP網路的網路管理標准協議,提供了統一的介面,從而實現了不同種類和廠商的網路設備之間的統一管理。
SNMP協議分為三個版本:SNMPv1、SNMPv2c和SNMPv3。
SNMP系統由網路管理系統NMS(Network Management System)、SNMP Agent、被管對象Management object和管理信息庫MIB(Management Information Base)四部分組成。
SNMP查詢是指NMS主動向SNMP Agent發送查詢請求,如圖1-3所示。SNMP Agent接收到查詢請求後,通過MIB表完成相應指令,並將結果反饋給NMS。SNMP查詢操作有三種:Get、GetNext和GetBulk。SNMPv1版本不支持GetBulk操作。
不同版本的SNMP查詢操作的工作原理基本一致,唯一的區別是SNMPv3版本增加了身份驗證和加密處理。下面以SNMPv2c版本的Get操作為例介紹SNMP查詢操作的工作原理。假定NMS想要獲取被管理設備MIB節點sysContact的值,使用可讀團體名為public,過程如下所示:
SNMP設置是指NMS主動向SNMP Agent發送對設備進行Set操作的請求,如下圖示。SNMP Agent接收到Set請求後,通過MIB表完成相應指令,並將結果反饋給NMS。
不同版本的SNMP Set操作的工作原理基本一致,唯一的區別是SNMPv3版本增加了身份驗證和加密處理。下面以SNMPv3版本的Set操作為例介紹SNMP Set操作的工作原理。
假定NMS想要設置被管理設備MIB節點sysName的值為HUAWEI,過程如下所示:
SNMPv1和SNMPv2c的Set操作報文格式如下圖所示。一般情況下,SNMPv3的Set操作信息是經過加密封裝在SNMP PDU中,其格式與SNMPv2c的Set操作報文格式一致。
SNMP Traps是指SNMP Agent主動將設備產生的告警或事件上報給NMS,以便網路管理員及時了解設備當前運行的狀態。
SNMP Agent上報SNMP Traps有兩種方式:Trap和Inform。SNMPv1版本不支持Inform。Trap和Inform的區別在於,SNMP Agent通過Inform向NMS發送告警或事件後,NMS需要回復InformResponse進行確認。
在Ensp中搭建網路環境,在R2上啟用SNMP作為SNMP agent,Linux主機作為NMS;為方便觀察SNMP報文格式,在R2使用SNMP的版本為v2c。
通過下面的Python腳本獲取R2的系統信息與當前的主機名
運行結果如下
在R2介面上抓包結果如下,Linux主機向R2的161埠發送SNMP get-request報文,可以看到SNMP使用的版本為v2c,設置的團體名為public,隨機生成了一個request-id,變數綁定列表(Variable bindings),即要查詢的OID,但Value為空;值得注意的是這些信息都是明文傳輸的,為了安全在實際環境中應使用SNMPv3。
通過下面的Python腳本獲取R2的介面信息。
運行結果如下:
在R2介面抓包結果如下,getBuikRequest相比get-request設置了一個max-repetitions欄位,表明最多執行get操作的次數。Variable bindings中請求的OID條目只有一條。
下面Python腳本用於設置R2的主機名為SNMPv2R2。
運行結果如下
在路由器上可以看到主機名有R2變為了SNMPv2R2。
get-response數據包內容與set-request中無異。
下面Python腳本用於接收,R2發送的Trap,並做簡單解析。
先運行該腳本,之後再R2上手動將一個介面shutdown,結果如下:
介面上抓包結果如下,此時團體名用的是public,data部分表明是trap。
由於Ensp中的通用路由器認證演算法只支持des56,而pysnmp不支持該演算法,因此使用AR路由器配置SNMPv3。
使用下面Python腳本發送snmpv3 get報文獲取設備系統信息。
抓包結果如下,首先發送get-resques進行SNMPv3認證請求,隨機生成一個msgID,認證模式為USM,msgflgs中Reportable置1要求對方發送report,其他為置0,表示不進行加密與鑒權;另外安全參數,認證參數、加密參數都為空,此時不攜帶get請求數據。
路由器給NMS回復report,msgID與resquest一致,Msgflgs中各位都置0,同時回復使用的安全引擎,認證與加密參數為空,不進行認證與加密,因此能看到data中的數據。
AR1收到請求後進行回復,數據包中msgflags標志位中除reportable外其他位都置1,表示不需要回復,同時進行加密與鑒權。同樣也可以看到認證用戶為testuser,認證參數與加密參數都有填充,data部分也是同樣加密。
參考:
什麼是SNMP - 華為 (huawei.com)
AR100-S V300R003 MIB參考 - 華為 (huawei.com)
SNMP library for Python — SNMP library for Python 4.4 documentation (pysnmp.readthedocs.io)
Ⅵ 怎麼用python登錄windows系統
# -*- coding:utf-8 -*-
#! python2
import wmi
def sys_version(ipaddress, user, password):
conn = wmi.WMI(computer=ipaddress, user=user, password=password)
for sys in conn.Win32_OperatingSystem():
print "Version:%s" % sys.Caption.encode("UTF8"),"Vernum:%s" % sys.BuildNumber #系統信息
print sys.OSArchitecture.encode("UTF8") # 系統的位數
print sys.NumberOfProcesses # 系統的進程數
if __name__ == '__main__':
sys_version(ipaddress="ip", user="用戶名", password="密碼")