웹 사이트를 과거 연구실 선배님들이 만들었기에 현재는 유지 및 보수를 진행하고 있습니다.
제가 직접 짠게 아니라 전체적인 코드에 대해서는 잘 모르고 있는 상황입니다
얼마전부터 저희 연구실 홈페이지의 세미나 게시물이 삭제된다는 것을 알게되었습니다.
그래서 해결 해야겠다고 마음먹고 몇가지 추측과 확을 했습니다.
추측1. 스케줄링을 이용한 기한 후 자동삭제 기능
처음에는 스케줄링을 이용하여 기한 후 자동삭제 기능이 있나 확인하였습니다.
찾아본 결과 해당 기능은 없었습니다
추측2. DB에 해커가 침투했나?
예전에 MongoDB를 포트를 열어놓고 사용하다가 해커가 DB를 삭제한 적이 있어서 이번에도 의심해봤었습니다.
하지만 저희는 Django 기본DB인 sqlite3를 사용하고 있기 때문에 ORM으로만 조작이 가능하므로 배제하였습니다.
추측3. 누군가 삭제했나?
Django models.py에는 on_delete=on_cascade 속성이 있는데 특정 FK를 삭제하면 연관되어있는 것들도 삭제되기에 로그를 확인했습니다. Django admin 계정이 하나 뿐이라 admin 계정 로그를 확인하였지만 삭제한 기록은 없었습니다.
이렇게 3개의 추측을 갖고 확인을 해봤지만 소득이 없었습니다.
그래서 게시물 삭제 함수를 확인했습니다.
def DeleteSeminar(request,pk):
db = Seminar.objects.get(pk=pk)
db.delete()
return redirect('/Seminar/View/')
확인해보니 위와 같이 HTTP프로토콜을 이용한 조건문도 없고, 로그인인증도 없어서 URL만 접속하면 누구나 지울수 있게끔 되있더라구요..
그래서 누가 방문하는지 확인해보려고 이 함수를 실행하면 IP로그가 남게끔 수정했습니다
(추측4. 이때 뭔가 구글 봇이 크롤링을 위해 방문하여 지울것 같다고 생각했습니다)
def get_client_ip(request):
x_forwarded_for = request.META.get('HTTP_X_FORWARDED_FOR')
if x_forwarded_for:
ip = x_forwarded_for.split(',')[0]
else:
ip = request.META.get('REMOTE_ADDR')
return ip
def DeleteSeminar(request, pk):
logger.info(f'{get_client_ip(request)}이 삭제함')
db = Seminar.objects.get(pk=pk)
db.delete()
return redirect('/Seminar/View/')
위와 같이 코드를 수정하고 테스트 게시물을 만들었습니다.
시간이 지나고 게시물이 없어지며 로그가 남았습니다.
IP를 검색하니 구글이 맞았네요...후
DB가 많이 날라갔지만 그래도 찾아냈습니다!!!
def DeleteSeminar(request,pk):
user_id = request.session.get('user_id')
if not user_id :
return redirect('/login')
logger.info(f'{get_client_ip(request)}이 삭제함')
db = Seminar.objects.get(pk=pk)
db.delete()
return redirect('/Seminar/View/')
마지막으로 로그인이 되어있지 않다면 삭제 못하게끔 수정하고 log남기는것도 그대로 놔두었습니다.
해당 사건을 빌미로 다른 함수들도 확인하니까 다 기존과 같이 짜놨더라구요... 모두 수정했습니다
그리고 DB Table들을 각각 PK순으로 정렬해서 보니까 많이 비어있는걸 확인했습니다.
전체 복구는 현재 멤버가 아닌 사람들도 있기에 어쩔수 없이 못하네요
예전에는 이러지 않았는데 어쩌다가 구글 검색엔진의 눈에 들어서ㅜㅜ
앞으로 구글 크롤링봇의 작동 매커니즘을 알아 볼것이고, 웹사이트 코드 리팩토링의 필요를 느꼈습니다.
앞으로 천천히 수정해야겠습니다.
'python, 파이썬' 카테고리의 다른 글
Django "Reverse for ‘password_reset_confirm’ not found" Error (3) | 2024.09.14 |
---|---|
Github Action을 이용한 CI/CD (0) | 2024.06.30 |
JWT (2) | 2024.04.09 |
Django session 로그인 연장 기능(feat. ajax) (0) | 2023.08.10 |