注1:ファイルアップロードコードKindEditorのModelFormサブクラスAjaxのフルセット
要約: モデル -データベース操作 -検証 クラスA(モデル): ユーザー= メールに= PWD = Form1の - LoginFormクラス(をForm1): メールfields.EmailField =()で ユーザー= PWD = - IS_VALID - >正則各フィールド(通常のフィールド内蔵)+ clean_フィールド- >クリーン(__ all__) - > _post_clean - cleand_data -エラー -------->推奨<--------- 、のModelFormの 参考ブログ: HTTP:/ /www.cnblogs.com/wupeiqi/articles/6229414.html モデルをForm1 = +> +検証データベース操作 -クラスLoginModelForm(XXXXX): model.Aのフィールドを使用して 1はHTMLタグを生成する:メタ-クラス:... 2デフォルト値(エディタ)を生成:MF = xxxModelForm(インスタンスを= ModelObj) 3.追加のラベル(無料ログ]チェックボックス)、is_rmb = Ffields.CharField(= Fwidgets.CheckboxInputウィジェット()) 4.さまざまな認証IS_VALID() - > ...さまざまなフッククリーン 5. mf.save( ) #ビューソースコード解析: #または インスタンス= mf.save(偽) instance.save() mf.save_m2m() しっかりと小さなプログラムに適したフォームと結合6.model、大きなプログラムはそれを使用しません。 二、Ajaxの 参考ブログ: http://www.cnblogs.com/wupeiqi/articles/5703697.html ネイティブ jQueryの 擬似Ajaxの動作 タイミング: 送信されたデータは、[通常]の場合- > jQueryの、XMLHttpRequestを、IFRAME 第三に、ファイルのアップロード(プレビュー) -フォーム提出 - Ajaxのファイルをアップロードする タイミング: あなたは、[ファイル]を送信した場合- > IFRAME、jQueryの(いるFormData) 、XMLHttpRequestを(いるFormData)、 4つの画像認証コードセッション+ -セッション - check_code.py(依存:まくらモジュールとフォントファイル) http://127.0.0.1:8000/backend/base-info.html ? - src属性の後ろにプラス ファイブ、CKEditorバージョン、UEEditor、TinyEditor、KindEditor (***) 参考ブログ: http://www.cnblogs.com/wupeiqi/articles/6307554.html -基本的な使用 -ファイルのアップロード、複数ファイルのアップロード、ファイルスペース管理 - XSS攻撃(フィルタ機能またはクラス)、次のレッスン...言った :仕事 のマスター: http://127.0.0.1:8000/ブログホーム http://127.0.0.1:8000/zhaofan/ 1.html誰かのブログ 個人的なブログ: http://127.0.0.1:8000/zhaofan.html誰かのブログ http://127.0.0.1:8000/zhaofan/tag/python.html誰かのブログスクリーニング http://127.0.0.1:8000/zhaofan/catetory/mvc.html誰かのブログのスクリーニング スクリーニングhttp://127.0.0.1:8000/zhaofan/date/2011-11.html誰かのブログ の管理人を: http://127.0.0.1:8000/backend/tag.html http://127.0.0.1:8000/backend/category.html http://127.0.0.1:8000/backend/article.html http://127.0.0.1:8000/backend/add-article.html
検証コード
URLを:
#必要な書類: #(1)check_code.py(2)Monaco.ttfフォントファイル(3)HTMLファイルの URL( '^チェックコードの$'、views.checkcode)、 URLページ#ユーザアクセス(単体コード新しいURL ) URL( '^ radom_code'、views.radom_code)、 #は、遠位POSTコードの検証URLを提出しました
ビュー:
###################################コードする例示的な############ ###################は、 メモリから読み出されたIO#インポートBytesIOから utils.check_codeインポートcreate_validate_codeのから :DEFチェックコード(要求) "" " コード :PARAM要求: :リターン: "" " 。#= オープンデータ( '静的/ IMGS /アバター/ 20130809170025.png'、 'RB')(読み) 位のHttpResponse(データ)が返す ファイル#の方法を読んで-感謝の思考の中心 #1インストール画面枕を作成PIP3の #2は、画像内のランダムな文字列を書き込みます 。#OBJ =オブジェクト() 画像ファイルを定式化するために書かれている#3 の内容を読んで、オープンディレクトリのファイルを策定#4。を #5。のHttpResponseを(データ) '' ' IMG、コード= create_validate_code() #のimg.save('ファイルハンドル''フォーマット」) ファイルへの書き込み# オープン= F( 'utilsパッケージ/ uson_checkcode.png'、 'WB') img.save(F 'PNG') f.close() レンダリング(要求、 'radom_code.html')を返す# #は、ファイルの読み込み リターンのHttpResponseを(オープン( 'のutilsの/ uson_checkcode.png'、 'RB')。読み取る()) '' ' #メモリ記憶方法 メモリから読み出されたストリーム= BytesIO()# IMG、コード= create_validate_code()#ページユーザアクセス、作成そして、ユーザに画像や文字列を生成する img.save(ストリーム、「PNG」) #のサフィックスは、メモリに格納された画像オブジェクトPNG形式ます ますrequest.session [「チェックコード」] =コード位、セッションに格納されている、とユーザーの入力整合性を確認するためにポストを提出する リターンのHttpResponse(stream.getvalue())#をメモリからの画像は、ユーザーに返却を受ける入力されたユーザ#名に)入力:check_code code.upper IF()==)(ますrequest.session [ 'チェックコード'上部を行う.: デフradom_code(リクエスト): request.method == 'POST'の場合: コード= request.POST.get( 'check_code') #の入力は、ユーザ入力された名前である:check_codeの 印刷(「コードが正しい」) 他: プリント(「エラーコード」) (要求、「day24-app06 / radom_code.html」)レンダリングを返します
HTML:
<!DOCTYPE HTML> <HTML LANG = "EN"> <HEAD> <メタ文字コード= "UTF-8"> <タイトル>タイトル</ TITLE> <スタイル> .checkcode { 幅:130px; 高さ:33px; 国境:1pxの固体赤。 } </スタイル> </ head> <body> <DIV CLASS = "チェックコード"> <IMG SRC = "/ cohui /チェックコード"のonclick = "changeCheckCode(この);"> </ div> <スクリプト> 関数changeCheckCode( THS){ // ths.src = "/ cohui /チェックコード" + '?'。 </スクリプト> </ HTML>
check_code.py:
#!は/ usr / binに/ envをPythonの # - * -コーディング:UTF-8 - * - インポートランダム #PIP3は枕をインストール PILイメージのインポート、ImageDraw、ImageFont、のImageFilterから _letter_cases = "abcdefghjkmnpqrstuvwxy" #小文字、可能な干渉を取り除きますI、L、O、Z _upper_cases _letter_cases.upper =()#大文字の _numbers = '' .join(マップ( STR、範囲(3,10)))# デジタル init_chars = '' .join((_ letter_cases、_upper_cases、 _numbers)) DEF create_validate_code(サイズ=(120、30)、 文字の=のinit_chars、 img_type = "GIF"、 MODE = "RGB"、 BG_COLOR =(255、255、255)、 fg_color =(0、0、255)、 FONT_SIZE = 18であり、 フォント#1に依存font_type = "utilsの/ Monaco.ttf"、 #1 font_type = "Monaco.ttf"、 長さ= 4、 draw_lines =真、 n_line =(1、2)、 draw_points =真、 point_chance = 2) : "" " @todo:検証画像生成 @paramサイズ:画像サイズ、形式(幅、高さ)を、デフォルト(120、30) @paramの文字:使用できる文字のセット、フォーマットストリング @paramのimg_type:画像GIFのための任意のGIF、JPEG、TIFFにフォーマットのデフォルトを保存し、PNGは モード@param:画像モードを、デフォルトのRGBのある @paramのBG_COLOR:背景色、デフォルトは白です フォアグラウンド色、文字色コード:@paramのfg_colorデフォルトでは青#0000FFです @paramのFONT_SIZE:コードのフォントサイズ @paramのfont_type:フォントコード、デフォルトae_AlArabiya.ttf @param長さ:文字コードの数が draw_linesを@param:干渉ドローラインかどうか @paramのn_lines:記事干渉回線番号の範囲、タプル形式、デフォルト(1、 2)、真draw_linesにのみ有効である @param draw_points:ビデオ干渉の点かどうか @paramのpoint_chance:干渉点の発生確率、範囲[0、100]の大きさ @return:[0]:PIL画像例の @return:[1] :キャプチャ画像列 "" " 幅、高さ=幅と高さのサイズ# #は、グラフィックス作成 = Image.new(MODE、サイズ、BG_COLOR)IMGを 描く= ImageDraw.Draw(IMG)#ブラシ作成 )(デフget_charsました: 「」「」「生成された文字列は、所与の長さのために、リスト形式返す」 を返すrandom.sample(文字、長さ) :DEFのcreate_lines() 「」「」「ライン干渉を描く」を 干渉線のLINE_NUM = random.randint(* n_line)#番号 Iがで(LINE_NUM)レンジ用: #出発 =(random.randint(0、サイズ開始 [1])[0])、random.randint(0、サイズを) #終点 端=(random.randint(0、サイズ[0])、random.randint(0、サイズ[1])) draw.line([開始、終了] =(0、0、0を埋めます) ) DEF create_points(): "" "" "干渉点描画" チャンス=分(100、MAX(0、INT(point_chance)))#サイズ制限[0、100] の範囲(幅)にWの場合: 時間(高さ)の範囲: TMP = random.randint(0、100) TMP> 100 IF -チャンス: draw.point((W、H)は、塗りつぶし=(0、0、0)) create_strsはDEF(): "" "文字コードを描画" "" c_chars = GET_CHARS() それぞれの後に空白文字で区切らSTRを= '%S' % '' .join(c_chars)# フォント= ImageFont.truetype(font_type 、FONT_SIZE) font_width、font_height = font.getsize(のSTR) draw.text(((幅- font_width)/ 3、(高- font_height)/ 3) のSTR、フォント=フォント、= fg_color塗りつぶし) リターン'' .join (c_chars) IF draw_lines: create_lines() IF draw_points: create_points() のSTR create_strs =() #パターン歪みパラメータ 1のparams =を- (。、random.randint(1 2))フロート/ 100、 0、 0、 0、 1 -フロート(random.randint(1、10)。)/ 100、 フロート/ 500、(random.randint(1、2)。) 0.001から、 フロート(random.randint(1、2))/ 500 ] IMG = img.transform(サイズ、Image.PERSPECTIVE、paramsは) # 歪み作成 IMG = img.filter(ImageFilter.EDGE_ENHANCE_MORE)#フィルタを、境界(閾値以上)強化 戻りIMGを、#1 IMGをSTRS:画像オブジェクト、STRS:確認コードを弦
検証コードファイル:クリック
フォントファイルに依存:クリック
注2:XSS攻撃シングルトントランザクション操作
XSSフィルタの特別なラベル
依存プロセス: 1つの PIP3インストールbeautifulsoup4
XSS例:
#!は/ usr / binに/のenv pythonの # - * -コーディング:UTF-8 - * - BS4輸入BeautifulSoupのから クラスXSSFilter(オブジェクト): __instance =なし デフ__init __(自己): #XSS白名单 self.valid_tags = { "フォント":[ '色'、 'サイズ'、 '顔'、 'スタイル']、 'B':[]、 'DIV':[]、 "スパン":[]、 "表":[ 'ボーダー' 、 'CELLSPACING'、 'CELLPADDING' ]、 '番目':[ 'COLSPAN'、 'ROWSPAN' ]、 'TD':【 'COLSPAN'、 'ROWSPAN' ]、 "A":[ 'のhref'、 '目標'、 '名前']、 "IMG":[ 'SRC'、 'ALT'、 'タイトル']、 'P':[ '整列' ]、 "前": [ 'クラス']、 "時間":[ 'クラス']、 '強い':[] } @classmethod DEFインスタンス(CLS): CLSない場合.__インスタンス: OBJ =のCLSは、() .__インスタンスをCLS =はobj CLSを返します。 __instanceの DEF処理(自己、コンテンツ): スープ= BeautifulSoup(コンテンツ、 'lxmlの') すべてのHTMLタグを通じて#ループ soup.find_allでタグのため(これ=真を再帰的): #はホワイトリストにタグ名かどうかを判断します ないself.valid_tagsでtag.name場合: tag.hidden =真 :tag.nameない[ 'HTML'、 '体']であれば tag.hidden = Trueの tag.clear() 続ける #当前标签的所有属性白名单 attr_rules = self.valid_tags [tag.name] キー=リスト(tag.attrs.keys()) :キーでキーの キーでないattr_rulesであれば: ・デル・タグ[キー] リターンsoup.renderContentsを() 場合__name__ ==「__main__ 「: HTML = "" "<Pクラス="タイトル"> <B>ヤマネの物語</ B> </ P> <Pクラス=「物語」> <div要素名=「ルート」> むかしむかし3人の妹がありました。そしてそれらの名前がなかった <HREF =「http://example.com/elsie」クラス=「姉妹C1」スタイル=「色:赤;背景色:緑;」ID = "リンク1"> <! -エルシー- > </a>の <a href="http://example.com/lacie" class="sister" id="link2">レイシー</a>と <a href="http://example.com/tillie" class="sister" id="link3"> Tilffffffffffffflieする</a>。 彼らは井戸の底に住んでいました。 <スクリプト>警報(123)</スクリプト> </ div> </ P> <Pクラス= "物語"> ... </ P> ""」 V = XSSFilter.instance()。工程(HTML) 印刷(V)
単一-__ new__に基づく例示的な実施の形態
#!は/ usr / binに/のenv pythonの # - * -コーディング:UTF-8 - * - BS4輸入BeautifulSoupのから クラスXSSFilter(オブジェクト): __instance =なし デフ__init __(自己): #XSS白名单 self.valid_tags = { "フォント":[ '色'、 'サイズ'、 '顔'、 'スタイル']、 'B':[]、 'DIV':[]、 "スパン":[]、 "表":[ 'ボーダー' 、 'CELLSPACING'、 'CELLPADDING' ]、 '番目':[ 'COLSPAN'、 'ROWSPAN' ]、 'TD':【 'COLSPAN'、 'ROWSPAN' ]、 "A":[ 'のhref'、 '目標'、 '名前']、 "IMG":[ 'SRC'、 'ALT'、 'タイトル']、 'P':[ '整列' ]、 "前": [ 'クラス']、 "時間":[ 'クラス']、 '強い':[] } DEF __new __(CLS、* argsを、** kwargsから): ""」 单例模式 :PARAM CLS: :PARAM引数: :PARAM kwargsから: :リターン :""」 .__インスタンスをCLSない場合: OBJ =オブジェクト.__新しい__(CLS、* argsを、** kwargsから) CLS .__インスタンスは=はobj CLS .__インスタンスを返します プロセスDEF(セルフ、コンテンツ): スープはBeautifulSoup(コンテンツ、「lxmlのを」)= すべてのHTMLタグを横断# soup.find_allでタグのために(これがTrue =再帰的): #は、ホワイトリストにタグ名かどうかを決定する tag.nameないであればself.valid_tags: = Trueのtag.hidden tag.nameは、[ 'HTML'、 '体']にされていない場合: tag.hidden = trueを tag.clear() を続け 、現在のラベルホワイトリスト#のすべての属性 attr_rules = self.valid_tagsを[ tag.name] キー=リスト(tag.attrs.keys()) キーキーで用: IFないattr_rulesにおけるキー: デルタグ[キー] soup.renderContents()を返し ます。if __name__ == '__main__' のhtml = "" "<Pクラス="タイトル"> <B>ヤマネの物語</ B> </ P> <Pクラス="物語"> < div要素名=「ルートは」> 昔3人の妹があった、と自分の名前であった <のhref =「http://example.com/elsie」クラス=「姉妹C1」スタイル= '色:赤、背景-color:緑;」ID = "リンク1"> <! -エルシー- > </a>の <のhref = "http://example.com/lacie"クラス= "姉妹" <a href="http://example.com/tillie" class="sister" id="link3"> Tilffffffffffffflieする</a>。 彼らは井戸の底に住んでいました。 <スクリプト>警報(123)</スクリプト> </ div> </ P> <Pクラス= "物語"> ... </ P> ""」 OBJ = XSSFilter() V = obj.process(HTML) 印刷(V)