Always awake

2024.03.13 본문

개발일지

2024.03.13

죠. 2024. 3. 14. 23:32

개발

  • 유저 id, 파일 id로 주고받는게 위험하진 않을까? 어떻게 주고받지? File Path 우회에는 공격당하지 않나?

  • FastAPI에서 이메일로 인증코드를 주는 것은 어떻게 구현할까?

    • fastapi-mail이라는 기능은 있는거같은데.. SMTP 서버가 필요하다...
    • SMTP란? Simple Mail Transfer Protocol
  • Alembic 업데이트하는데, Nullable하지 않은 컬럼을 추가하려고 했더니 원래 있던 행들때문에 추가가 안됐다!

    • 기본 값을 지정해주면 좋을텐데...
    • 이와 같이 server_default = 를 지정해서 마이그레이션하자.
      op.add_column(
      "user_list",
      sa.Column("is_valid",
            sa.Boolean(),
            nullable=False,
            server_default=sa.false()),
      schema="MAIN",
      )
  • SMTP는 구글이 지원해주더라! 내 구글계정으로 일단 해봤다.

  • 기본적인 구현방식은, 일단 가입한 유저는 db에 등록되지만, is_valid는 False로 등록된다. 이후, /api/user_list/valid/{valid_code}로 접속해야하는데, 해당 코드를 이메일로 보내준다. 해당 코드를 만드는 타이밍에 레디스에 {valid_code: email} 꼴로 저장하고, valid요청이 오면 이를 검사해 validation해준다.

  • 이메일을 보낼 때에는 body에 html 형식으로 넣으면 된다. 코드가 길어질 수 있으므로 html은 따로 파일로 뺐고, 이는 정적이므로 static폴더를 만들어 넣어주었다.

    • 아래와 같은 코드를 이용해 동적으로, html의 특정 부분만을 바꿀 수 있다. 동적으로 이름과 링크를 전달하는데 아주 유리하다.
      with open("./backend/static/email_template.html", "r", encoding="utf-8") as file:
      html = file.read().format(username=_user_list_create.name, link=link)
  • 이 html에 이용한 이미지 소스를 서버 컴퓨터에서 뺐더니 이미지가 로드되지 않았다. 아마도 아직은 내부망을 이용했기에 보안상의 이유로 네이버 메일 혹은 브라우저가 공개하지 않은 것으로 보인다. 이를 수정하기 위해 구글 드라이브에 올리고도 해봤는데 잘 안된다... 어떻게 해야 공유 가능한 이미지 url을 가질 수 있을지 고민해보자.

알고리즘

이분 매칭으로 룩 / 나이트의 움직임의 최대 매칭을 계산할 수 있는데, 시도해보자!

  • 그래프
    • 이분 매칭
      • https://boj.kr/1017 소수 쌍 (P3)
        • 소수 쌍 이분매칭으로 구하기.. 미리 한개 고정해놓고 하는 느낌? 얘는 구현 하면 그냥 바로 되네
      • https://boj.kr/9525 룩 배치하기 (P3)
        • 룩의 움직임은 결국 가로먹기 + 세로먹기의 이분 매칭이다.. 미친 풀이.. 진짜 개똑똑하다 사람들. 구현을 어떻게 할지가 고민되긴 하네..
        • 깔끔하게 쪼개려고하면 조금 신경쓸게 있었지만, 그냥 앞끝 / 뒤끝만 신경면서 가로로 순회한번, 세로로 순회한번 돌면 처리되는 영역이었다.
        • 근데 그거조차 귀찮아서 그냥 다음줄 넘어갈때 / X 만날때 번호 1씩 계속 늘려줘서, 최대 MX는 5000에서 10000으로 두배쯤 커졌지만, 시간에는 문제 없이 돌아가네.
        • 다행히 가로줄과 세로줄이 겹치는 경우가 없어서, 있는지 없는지 판별이라든지 안해주고 그냥 매칭만 해버려도 됐다. 그 뒤는 일반 이분탐색과 동일. 아이디어 떠올리는거는 진짜 어려울듯.
    • 탐색
      • https://boj.kr/1525 퍼즐 (G2)
        • 처음 봤을때 상당히 당황했다. 대충 최대 25~30번은 움직일거같은데, 대충 3^25번의 경우의수?!?! 이러면서.. 슬라이딩퍼즐이 막 A*알고리즘 써가면서 어렵게 증명된다는 사실을 알았던게 독이 된듯.
        • 근데 생각해보니까, 3*3 퍼즐이면 결국 경우의수는 9! = 36만개정도밖에 없다! 이정도면 넣을만 하지. 저장은 어떻게하지? 편하게하겠다고 순열, 비트마스킹 쓰다보면 배보다 배꼽이 더 커지는듯.
        • 그러면? 그냥 해시맵 박아버리자! 그러면 그냥 BFS돌리면 된다. C++에서 해시맵을 돌리는게 익숙하지 않아서 조금 걸렸지만. 구현은 할만했고 한번에 돌아갔다. C++는 string에서도 swap이 된다는걸 배웠다. 파이썬은 string이 불변이라 그런거 안되는데.

보안

  • Session 키가 유출된다면, cookie를 수정해서 탈취할지도. 공개 안되게 잘 막자.
  • f스트링과 같은것에서 url/{file_id}라면 file_id를 "../../main.py"와 같이 파일 우회가 가능할지도. 조심하자.
  • ping과 같이 실제로 리눅스 명령어를 쏘는 상태에서, "원래칠것"; 치고싶은것;" 과 같이 한줄에 인라인으로 여러개를 써버리면 큰일날지도!!
  • Console에서 자바스크립트 명령어, 함수들도 실행할 수 있다.
  • 콘솔창에서 막는다면, 직접 fetch명령어를 받아다가 콘솔창에서 실행시킬수도?
  • 늘 그렇듯 브루트포스는 조심하자.

'개발일지' 카테고리의 다른 글

2024.03.14  (0) 2024.03.15