Home

0

네트워크 - CSRF (Corss Site Request For Forgery)

CSRF (Corss Site Request Forgery) CSRF 란 사이트 간 요청 위조의 의미로, 사용자가 자신의 의지와 무관하게 공격자가 의도한 행동을 해 특정 웹페이지를 보안에 취약하게 하거나 수정, 삭제 들의 작업을 하게 만드는 공격 방법공격자가 특정 사용자의 권한을 탈취해 특정 행위 (수정, 삭제, 등록 등) 를 사이트에 요청하게 만드는 공격 CSRF 를 위한 조건 권한이 있는 사용자가 사이트(서비스) 에 접속해야 한다. 사용자가 공격자가 만든 피싱 사이트에 접속하게 되면 CSRF 공격이 성립된다. 2008년에 발생했던 옥션의 개인정보 유출 사건에서도 관리자 계정을 탈취하는데 이 CSRF 방법을 이용 옥션 관리자가 메일을 조회하면서 CSRF 공격할 수 있는 테그가 들어간 이메일을 열어 해커가 관리자 권한을 취득하게 됨 <img src="http://auction.com/changeUserAcoount?id=admin&password=admin" width="0" height="0"> 방어 방법1. Referrer 검증

0

네트워크 - XSS (Cross-Site Scripting)

![]/images/computer-science/network/http/xss.png) XSS (Cross-Site Scripting) 공격자가 보안이 취약한 웹 사이트에 악성 스크립트를 삽입하는 공격 기법 XSS 를 통해 C&C (좀비 PC에 명령을 내리거나 악성 코드를 제어하는 서버) 로 리다이렉하거나 사용자의 쿠키를 탈취해 Session 하이재킹 공격을 할 수 있다. Persistent XSS 공격자가 심어놓은 특정 스크립트가 서버에 저장돼 지속적으로 서비스를 제공하는 정상 페이지에서 공격자에게 스크립트가 노출되는 기법 Relected XSS 웹 어플리케이션의 파라미터를 사용할 때 발생하는 취약점을 이용한 공격 기법 쿼리 파라미터로 특정 스크립트를 보냈을 때 서버가 필터링을 거치지 않고 파라미터로 포함된 스크립트를 응답 페이지에 담아 전송할 때 문제가 발생

0

프로그래머스 - 문자열 압축 Python

https://programmers.co.kr/learn/courses/30/lessons/60057 프로그래머스 - 문자열 압축 Cpp 프로그래머스 - 문자열 압축 Python 문제 풀이간단한 구현 문제다. 주어진 문자열을 substr 해서 문자열 비교를 통해 같은 문자열의 개수를 찾아내 압축된 문자열 형태로 만들어준 다음 압축된 문자열의 길이를 반환해주면 되는 문제다. 문제 전체 소스def solution(s): answer = '' if len(s) == 1: return len(s) for i in range(1, len(s)//2 + 1): sentence = '' count = 0 word = s[:i] for j in range(0, len(s), i): if s[j:j+i] == word: count += 1 else: if count > 1: sentence += (str(count) + word) else: sentence += (word) word = s[j:j+i] count = 1 if count > 1: sentence += (str(count) + word) else: sentence += (word) if len(answer) == 0: answer = sentence elif len(answer) > len(sentence): answer = sentence print(answer) return len(answer)

0

프로그래머스 - 문자열 압축 Cpp

https://programmers.co.kr/learn/courses/30/lessons/60057 프로그래머스 - 문자열 압축 Cpp 프로그래머스 - 문자열 압축 Python 문제 풀이간단한 구현 문제다. 주어진 문자열을 substr 해서 문자열 비교를 통해 같은 문자열의 개수를 찾아내 압축된 문자열 형태로 만들어준 다음 압축된 문자열의 길이를 반환해주면 되는 문제다. 문자열 압축하기주어진 문자열을 스캔하면서 고려해야 하는 조건이 첫번째는 substr 하려는 범위가 주어진 문자열의 범위를 넘어서면 안된다는 것이다. 두번째는 substr 범위가 주어진 문자열의 범위를 넘어선 경우 압축된 문자열에 그대로 추가해줘야 한다는 것이다. int divideString(int length, string s) { string zipString = ""; int i = 0; // 문자열을 스캔하면서 substr 범위가 주어진 문자열을 넘는지 확인한다. for (i = 0; i < s.length() && i + length < s.length(); i = i + length) { int count = 0; bool isErase = false; string substr = s.substr(i, length); string cmpstr = s.substr(i, length); while (substr == cmpstr && s.length() > i) { count++; i += length; isErase = true; substr = s.substr(i, length); } if (isErase == true) { i -= length; } if (count == 1) { zipString += cmpstr; } else { zipString += to_string(count); zipString += cmpstr; } } // 남겨진 문자열을 압축된 문자열에 그대로 추가한다. for (int idx = i; idx < s.length(); idx++) { zipString += s[i]; } return zipString.length();} 문제 전체 소스#include <bits/stdc++.h>using namespace std;int divideString(int length, string s) { string zipString = ""; int count = 0; int i = 0; for (i = 0; i < s.length() && i + length < s.length(); i = i + length) { bool isErase = false; string substr = s.substr(i, length); string cmpstr = s.substr(i, length); while (substr == cmpstr && s.length() > i) { count++; i += length; isErase = true; substr = s.substr(i, length); } if (isErase == true) { i -= length; } if (count == 1) { zipString += cmpstr; } else { zipString += to_string(count); zipString += cmpstr; } count = 0; cmpstr = ""; } for (int idx = i; idx < s.length(); idx++) { zipString += s[i]; } return zipString.length();}int solution(string s) { int answer = 0; int minValue = s.length(); for (int i = 1; i <= s.length() / 2; i++) { int zipLength = divideString(i, s); minValue = min(zipLength, minValue); } answer = minValue; return answer;}

0

백준 13460 - 구슬 탈출 2

https://www.acmicpc.net/problem/13460 백준 13460 - 구슬 탈출 2 백준 13460 - 구슬 탈출 2문제스타트링크에서 판매하는 어린이용 장난감 중에서 가장 인기가 많은 제품은 구슬 탈출이다. 구슬 탈출은 직사각형 보드에 빨간 구슬과 파란 구슬을 하나씩 넣은 다음, 빨간 구슬을 구멍을 통해 빼내는 게임이다. 보드의 세로 크기는 N, 가로 크기는 M이고, 편의상 1×1크기의 칸으로 나누어져 있다. 가장 바깥 행과 열은 모두 막혀져 있고, 보드에는 구멍이 하나 있다. 빨간 구슬과 파란 구슬의 크기는 보드에서 1×1크기의 칸을 가득 채우는 사이즈이고, 각각 하나씩 들어가 있다. 게임의 목표는 빨간 구슬을 구멍을 통해서 빼내는 것이다. 이때, 파란 구슬이 구멍에 들어가면 안 된다. 이때, 구슬을 손으로 건드릴 수는 없고, 중력을 이용해서 이리 저리 굴려야 한다. 왼쪽으로 기울이기, 오른쪽으로 기울이기, 위쪽으로 기울이기, 아래쪽으로 기울이기와 같은 네 가지 동작이 가능하다. 각각의 동작에서 공은 동시에 움직인다. 빨간 구슬이 구멍에 빠지면 성공이지만, 파란 구슬이 구멍에 빠지면 실패이다. 빨간 구슬과 파란 구슬이 동시에 구멍에 빠져도 실패이다. 빨간 구슬과 파란 구슬은 동시에 같은 칸에 있을 수 없다. 또, 빨간 구슬과 파란 구슬의 크기는 한 칸을 모두 차지한다. 기울이는 동작을 그만하는 것은 더 이상 구슬이 움직이지 않을 때 까지이다. 보드의 상태가 주어졌을 때, 최소 몇 번 만에 빨간 구슬을 구멍을 통해 빼낼 수 있는지 구하는 프로그램을 작성하시오.

0

프로그래머스 - 신규 아이디 추천 (Java)

문제 링크 : https://programmers.co.kr/learn/courses/30/lessons/72410 프로그래머스 - 신규 아이디 추천 (Java) 프로그래머스 - 신규 아이디 추천 (Python) 문제 풀이주어진 조건에 맞춰 하나하나씩 구현하면 되는 문제다. 문자열 관련 정규 표현식을 이용하면 더욱 깔끔하게 문제를 해결 할 수 있다. 전체 소스class Solution { public String solution(String new_id) { String id = new_id.toLowerCase(); id = id.replaceAll("[^-_.a-z0-9]", ""); id = id.replaceAll("[.]{2,}", "."); id = id.replaceAll("^[.]|[.]$", ""); if (id.equals("")) { id += "a"; } if (id.length() >= 16) { id = id.substring(0, 15); id = id.replaceAll("[.]$", ""); } while (id.length() <= 2) { id += id.charAt(id.length() - 1); } return id; }}

0

프로그래머스 - 키패드누르기 Python

문제 링크 : https://programmers.co.kr/learn/courses/30/lessons/77484 프로그래머스 - 키패드누르기 Cpp 프로그래머스 - 키패드누르기 Python def solution(numbers, hand): answer = '' left_hands = [1, 4, 7] right_hands = [3, 6, 9] middle = [2, 5, 8, 0] key_pad = { 1: [0, 0], 2: [0, 1], 3: [0, 2], 4: [1, 0], 5: [1, 1], 6: [1, 2], 7: [2, 0], 8: [2, 1], 9: [2, 2], 0: [3, 1], } left_position = [3, 0] right_position = [3, 2] for key in numbers: if key in left_hands: left_position = key_pad[key] answer += 'L' elif key in right_hands: right_position = key_pad[key] answer += 'R' else: # print(key_pad[key][0]) left_dist = abs( left_position[0] - key_pad[key][0]) + abs(left_position[1] - key_pad[key][1]) right_dist = abs( right_position[0] - key_pad[key][0]) + abs(right_position[1] - key_pad[key][1]) if left_dist == right_dist: if hand == 'right': right_position = key_pad[key] answer += "R" else: left_position = key_pad[key] answer += "L" elif left_dist < right_dist: left_position = key_pad[key] answer += 'L' else: right_position = key_pad[key] answer += 'R' return answer

0

프로그래머스 - 로또의 최고 순위와 최저 순위 Python

문제 링크 : https://programmers.co.kr/learn/courses/30/lessons/77484 프로그래머스 - 로또의 최고 순위와 최저 순위 Cpp 프로그래머스 - 로또의 최고 순위와 최저 순위 Java 프로그래머스 - 로또의 최고 순위와 최저 순위 Python def ranking(cnt): if cnt == 6: return 1 elif cnt == 5: return 2 elif cnt == 4: return 3 elif cnt == 3: return 4 elif cnt == 2: return 5 else: return 6def cmp(lottos, win_nums): answer = [] cnt = 0 zeros = 0 for i in lottos: if i == 0: zeros += 1 elif i in win_nums: cnt += 1 answer.append(ranking(cnt+zeros)) answer.append(ranking(cnt)) return answerdef solution(lottos, win_nums): answer = cmp(lottos, win_nums) return answer

0

프로그래머스 - 로또의 최고 순위와 최저 순위 Java

문제 링크 : https://programmers.co.kr/learn/courses/30/lessons/77484 프로그래머스 - 로또의 최고 순위와 최저 순위 Cpp 프로그래머스 - 로또의 최고 순위와 최저 순위 Java 프로그래머스 - 로또의 최고 순위와 최저 순위 Python class Solution { private int findScore(int value) { if (value == 6) { return 1; } else if (value == 5) { return 2; } else if (value == 4) { return 3; } else if (value == 3) { return 4; } else if (value == 2) { return 5; } else { return 6; } } private int[] cmpStrings(int[] lottos, int[] win_nums) { int[] result = new int[2]; int length = lottos.length; int zeroCnt = 0; int sameCnt = 0; for (int i = 0; i < length; i++) { if (lottos[i] == 0) { zeroCnt++; continue; } for (int j = 0; j < length; j++) { if (lottos[i] == win_nums[j]) { sameCnt++; } } } result[0] = findScore(sameCnt + zeroCnt); result[1] = findScore(sameCnt); return result; } public int[] solution(int[] lottos, int[] win_nums) { int[] answer = new int[2]; answer = cmpStrings(lottos, win_nums); return answer; }}

0

프로그래머스 - 로또의 최고 순위와 최저 순위 Cpp

문제 링크 : https://programmers.co.kr/learn/courses/30/lessons/77484 프로그래머스 - 로또의 최고 순위와 최저 순위 Cpp 프로그래머스 - 로또의 최고 순위와 최저 순위 Java 프로그래머스 - 로또의 최고 순위와 최저 순위 Python #include <bits/stdc++.h>using namespace std;int findScore(int value) { if (value == 6) { return 1; } else if (value == 5) { return 2; } else if (value == 4) { return 3; } else if (value == 3) { return 4; } else if (value == 2) { return 5; } else { return 6; }}vector<int> cmpString(vector<int>& lottos, vector<int>& win_nums) { vector<int> result; int zeroCnt = 0; int sameCnt = 0; for (int i = 0; i < 6; i++) { if (lottos[i] == 0) { zeroCnt++; continue; } for (int j = 0; j < 6; j++) { if (lottos[i] == win_nums[j]) { sameCnt++; } } } result.push_back(findScore(sameCnt + zeroCnt)); result.push_back(findScore(sameCnt)); return result;}vector<int> solution(vector<int> lottos, vector<int> win_nums) { vector<int> answer; answer = cmpString(lottos, win_nums); return answer;}