2020년 3월 25일 보안정보 스크래핑

2020년 3월 25일 보안정보 스크래핑 3월 25일 보안정보 스크래핑 ==================================================================== + 주요 취약점 - 메일전송 프로토콜을 이용한 원격 명령어 실행 주의 권고 외 1건 1. 메일전송 프로토콜을 이용한 원격 명령어 실행 주의 권고 최근 OpenSMTPD* 취약점이 발견되는 등 메일전송 프로토콜에서 원격 명령어 실행이 가능하여 주의를 권고함 공격자는 취약점을 악용하여 피해를 발생시킬 수 있으므로, 해결방안을 참고하여 조치 필요 - https://www.krcert.or.kr/data/secNoticeView.do?bulletin_writing_sequence=35302 2. Django 제품 SQL Injection 취약점 보안 업데이트 권고 최근 Django*에서 SQL Injection취약점(CVE-2020-9402)을 악용할 수 있는 개념증명코드(Proof of concept, PoC)가 인터넷상에 공개되어 사용자의 보안 업데이트 필요 - https://www.krcert.or.kr/data/secNoticeView.do?bulletin_writing_sequence=35301 ==================================================================== + 취약점 - Apple Safari 취약점 1. Apple Safari 취약점 Apple Safari security bypass CVE-2020-3885 - https://exchange.xforce.ibmcloud.com/vulnerabilities/178339 Apple Safari security bypass CVE-2020-3887 - https://exchange.xforce.ibmcloud.com/vulnerabilities/178338 Apple Safari inform...

Django Project - user 관리

Django Project - user 관리

dj_user - user 관리용 django app

project tree

dj_user ├── admin.py ├── apps.py ├── forms.py ├── models.py ├── templates │ ├── base.html │ ├── home.html │ ├── login.html │ └── register.html ├── urls.py └── views.py

MTV 패턴

MTV - M : models.py

from django.db import models class Djuser(models.Model): objects = models.Manager() username = models.CharField(max_length = 64, verbose_name = "아이디") useremail = models.EmailField(max_length = 128, verbose_name = "이메일") password = models.CharField(max_length = 64, verbose_name = "비밀번호") registerd_dttm = models.DateTimeField(auto_now_add = True, verbose_name = "등록일시") def __str__(self): return self.username class Meta: db_table = "djuser" verbose_name = "사용자관리" verbose_name_plural = "사용자관리" # EOF

MTV - T : templates

templates/base.html → 웹 페이지 테마는 bootstrap 에서 무료 테마를 가져옴. → base.html 을 기반으로 다른 html 에서 base.html 을 가져다 씀

{% block contents %} {% endblock %}

templates/home.html

{% extends "base.html" %} {% block contents %} 홈페이지 {% if request.session.user %} 로그아웃 {% else %} 로그인 회원가입 {% endif %} {% endblock %}

templates/login.html

{% extends "base.html" %} {% block contents %} 로그인 {{ error }} {% csrf_token %} {% for field in form %} {{ field.label }} {% if field.errors %} {{ field.errors }} {% endif %} {% endfor %} 로그인 {% endblock %}

templates/register.html

{% extends "base.html" %} {% block contents %} 회원가입 {{ error }} {% csrf_token %} 사용자 이름 사용자 이메일 비밀번호 비밀번호 등록 {% endblock %}

MTV - V : views.py

from django.shortcuts import render, redirect from .models import Djuser from django.contrib.auth.hashers import make_password, check_password from .forms import LoginForm def home(request): return render(request, "home.html") def register(request): if request.method == "GET": return render(request, "register.html") elif request.method == 'POST': username = request.POST.get('username', None) useremail = request.POST.get('useremail', None) password = request.POST.get('password', None) re_password = request.POST.get('re-password', None) res_data = {} if not (username and useremail and password and re_password): res_data['error'] = '모든 값을 입력해야합니다.' elif password != re_password: res_data['error'] = '비밀번호가 다릅니다.' # 아이디 중복 체크 구현 필요 else: djuser = Djuser( username = username, useremail = useremail, password = make_password(password) ) djuser.save() return redirect("/home") return render(request, 'register.html', res_data) def login(request): if request.method == "POST": form = LoginForm(request.POST) if form.is_valid(): request.session['user'] = form.user_id return redirect('/home/') else: form = LoginForm() return render(request, 'login.html', {'form': form}) def logout(request): if request.session.get('user'): del(request.session['user']) return redirect('/home/') # EOF

그외

forms.py : login에 사용하는 LoginForm

from django import forms from .models import Djuser from django.contrib.auth.hashers import check_password class LoginForm(forms.Form): username = forms.CharField( error_messages = {'required' : '아이디를 입력해주세요.'}, max_length = 32, label = "사용자이름") password = forms.CharField( error_messages = {'required' : '비밀번호 입력해주세요.'}, widget = forms.PasswordInput, label = "비밀번호") def clean(self): cleaned_data = super().clean() username = cleaned_data.get('username') password = cleaned_data.get('password') if (username and password): try: djuser = Djuser.objects.get(username = username) except Djuser.DoesNotExist: self.add_error('username', '아이디가 없습니다.') return if not check_password(password, djuser.password): self.add_error('password', '비밀번호가 틀렸습니다.') else: self.user_id = djuser.id # EOF

admin.py - admin 페이지에 보여질 항목들

from django.contrib import admin from .models import Djuser class DjuserAdmin(admin.ModelAdmin): list_display = ('username', 'useremail', 'password', 'registerd_dttm') admin.site.register(Djuser, DjuserAdmin)

urls.py - views.py 에서 만든 함수들을 연결할 url

from django.urls import path, include from . import views urlpatterns = [ path('register/', views.register), path('login/', views.login), path('logout/', views.logout) ]

from http://rond-o.tistory.com/47 by ccl(A)

댓글

이 블로그의 인기 게시물

엑스브레인(XBrain) 기업 정보

django 설치 방법

[aws] deploy Angular app with s3 | AWS S3로 angular 앱 배포하기