XPath 표현식은 인젝션 공격에 취약하지 않아야 합니다.

 

URL 매개변수와 같이 사용자가 제공한 데이터는 항상 신뢰할 수 없고 오염된 것으로 간주해야 합니다. 공격자는 오염된 데이터에서 직접 XPath 표현식을 만들면 표현식 자체의 초기 의미를 변경하는 특수하게 조작된 값을 삽입할 수 있습니다. XPath 인젝션 공격에 성공하면 XML 문서에서 민감한 정보를 읽을 수 있습니다.

규칙을 어긴 코드

표준 xml 모듈(xml.etree.ElementTree)은 권장되지 않습니다:

from flask import request
import xml.etree.ElementTree as ET

tree = ET.parse('users.xml')
root = tree.getroot()

@app.route('/user')
def user_location():
    username = request.args['username']
    query = "./users/user/[@name='"+username+"']/location"
    elmts = root.findall(query) # 규칙을 어긴 코드
    return 'Location %s' % list(elmts)

규칙을 준수한 해결책

lxml module:

from flask import request
from lxml import etree

parser = etree.XMLParser(resolve_entities=False)
tree = etree.parse('users.xml', parser)
root = tree.getroot()

@app.route('/user')
def user_location():
    username = request.args['username']
    query = "/collection/users/user[@name = $paramname]/location/text()"
    elmts = root.xpath(query, paramname = username)
    return 'Location %s' % list(elmts)

같이보면 좋은 자료

If you like SONARKUBE, don’t forget to give me a star. :star2:

원문으로 바로가기

Star This Project