2017-11-15 3 views
-1

NVD CVE를 다운로드하려고합니다. 여기 내 pythoncode은 다음과 같습니다NVD - JSON에서 CSV로 파이썬

import requests 
import re 

r = requests.get('https://nvd.nist.gov/vuln/data-feeds#JSON_FEED') 
for filename in re.findall("nvdcve-1.0-[0-9]*\.json\.zip",r.text): 
    print(filename) 
    r_file = requests.get("https://static.nvd.nist.gov/feeds/json/cve/1.0/" + filename, stream=True) 
    with open("nvd/" + filename, 'wb') as f: 
     for chunk in r_file: 
      f.write(chunk) 

지금은이 형식의 모든 JSON-파일 INA CSV 파일을 작성하려면 :

Name, Value, Description, ..., ... 
Name, Value, Description, ..., ... 

누군가가 나를 도울 수 있습니까?

답변

1

당신에게 두 개의 열, ID, VendorName , 설명 and VendorValues`주고, 당신이 시작 가야 다음

import requests 
import re 
import zipfile 
import io 
import json 
import csv 

with open("nvdcve-1.0-2017.json") as f_json: 
r = requests.get('https://nvd.nist.gov/vuln/data-feeds#JSON_FEED') 

with open('output.csv', 'w', newline='') as f_output: 
    csv_output = csv.writer(f_output) 
    csv_output.writerow(['ID', 'VendorName', 'Description', 'VersionValues']) 

    for filename in re.findall("nvdcve-1.0-[0-9]*\.json\.zip", r.text): 
     print("Downloading {}".format(filename)) 
     r_zip_file = requests.get("https://static.nvd.nist.gov/feeds/json/cve/1.0/" + filename, stream=True) 
     zip_file_bytes = io.BytesIO() 

     for chunk in r_zip_file: 
      zip_file_bytes.write(chunk) 

     zip_file = zipfile.ZipFile(zip_file_bytes) 

     for json_filename in zip_file.namelist(): 
      print("Extracting {}".format(json_filename)) 
      json_raw = zip_file.read(json_filename).decode('utf-8') 
      json_data = json.loads(json_raw) 

      for entry in json_data['CVE_Items']: 
       try: 
        vendor_name = entry['cve']['affects']['vendor']['vendor_data'][0]['vendor_name'] 
       except IndexError: 
        vendor_name = "unknown" 

       try: 
        url = entry['cve']['references']['reference_data'][0]['url'] 
       except IndexError: 
        url = '' 

       try: 
        vv = [] 

        for pd in entry['cve']['affects']['vendor']['vendor_data'][0]['product']['product_data']: 
         for vd in pd['version']['version_data']: 
          vv.append(vd['version_value']) 

        version_values = '/'.join(vv) 
       except IndexError: 
        version_values = '' 

       csv_output.writerow([ 
        entry['cve']['CVE_data_meta']['ID'], 
        url, 
        vendor_name, 
        entry['cve']['description']['description_data'][0]['value'], 
        version_values]) 

이 메모리에 ZipFile를 다운로드합니다. 그런 다음 모든 파일을 한 번에 하나씩 메모리로 추출하고 json.loads()을 사용하여 json을 Python 데이터 구조로 변환합니다. CVE_Items의 각 항목에 대해 두 개의 필드를 추출하여 CSV 파일에 씁니다.

JSON 데이터의 구조가 매우 복잡하므로 CSV 파일의 모든 필드를 나타내는 방법을 고려해야합니다. 현재 두 개의 "유용한"필드를 추가하여 저장합니다.

또는 대신 자신의 CSV를 만드는 당신이 팬더와 함께 일할 수 :

df = pd.read_json(json_raw) 
df.to_csv(f_output) 

csv_output 줄을 제거합니다. 그러나 형식을 지정하는 방법을 결정하려면 추가 작업이 필요합니다.

+0

안녕하세요, 귀하의 답변에 감사드립니다. 나는 팬더로 이것을 시도했지만, "0", { 'cve': { 'data_type': 'CVE', 'data_format': ... "사용자 정의 옵션이 있기 때문에 첫 번째 해결책이 더 좋습니다. 필자와 비슷한 해결책이 있었지만 for 루프에서 키워드를 실수로 사용했습니다. – TigerClaw

+0

헤더에'ID'를 추가하고'csv_output.writerow()'의 목록에 새로운 첫 번째 항목을 추가하기 만하면됩니다. 나는 이것을 보여주기 위해 스크립트를 업데이트했으며, 추출하려는 대상에 따라이 접근법이 매우 유연하다는 데 동의합니다. –

+0

이 코드를 사용하는 경우 엔트리 [ 'cve'] [ 'references'] [ 'reference_data'] [0 ] [ 'url'] 오류 "목록 색인 범위를 벗어났습니다." – TigerClaw