국제 표준 데이터베이스 쿼리 문으로서, SQL 문은 다양한 프로그래밍 환경에서 널리 사용되어 왔습니다. 성숙하고 안정적인 시스템으로서 사용자 로그인과 비밀번호 인증은 필수적입니다. 일상적인 프로그래밍 작업에서 많은 프로그래머들이 SQL 문장을 사용해 사용자 비밀번호를 다음과 같은 문장으로 확인하는 것을 발견했습니다:
sql="name = "+name+"' and password='"+password+"'' 사용자 테이블에서 * 선택하세요"
이름과 비밀번호는 사용자가 입력한 사용자 이름과 비밀번호이며, 위의 문장들은 사용자와 비밀번호가 정당하고 정당한지 검증하기 위해 실행됩니다. 하지만 분석을 통해 위 진술들에는 치명적인 허점이 있음을 알 수 있습니다. 사용자 이름에 다음 문자열을 입력한 후 비밀번호를 아무렇지 않게 입력하면 aaaa로 설정합니다. 변수가 교체된 후 SQL 문은 다음과 같은 문자열이 됩니다:
sql="name ='111' 또는 '1=1' 그리고 password='aaaa'
우리는 모두 알고 있습니다. select 문이 쿼리 조건을 판단할 때, 또는 (또는 ) 연산을 만날 때 다음 및 (and) 연산을 무시하며, 위 문장에서 1=1 값이 항상 참임을 의미합니다. 즉, 비밀번호에 어떤 값을 입력하든 위 비밀번호 검증을 통과할 수 있다는 뜻입니다! 이 문제에 대한 해결책은 매우 간단하며, 여러 방법이 있습니다. 가장 일반적으로 사용되는 방법은 검증 전에 사용자가 입력한 비밀번호와 사용자의 정당성을 판단하는 것이고, 싱글 따옴표나 등호와 같은 특수 문자는 허용되지 않습니다.
위의 문제들은 단순해 보일 수 있지만 실제로 존재합니다. 예를 들어, 인터넷의 유명한 온라인 게임 "Smiling Proud Jianghu" 초기 버전에는 이런 문제가 있었고, 저자는 이 게임에 대한 취약점 보고서를 읽고 이전에 작성한 프로그램들을 면밀히 분석해 보니 많은 허점이 있었습니다. 이게 정말 우리의 관심거리야. 이는 저자를 포함한 젊은 프로그래머들의 프로그래밍 경험과 보안 인식 부족을 드러낸다. 동시에, 프로그래머는 프로그램 설계 시 프로그램의 보안을 충분히 고려해야 하며, 부실하게 행동해서는 안 되며, 겉보기에는 작은 누락이 심각한 결과를 초래할 수 있음을 상기시켜 줍니다.
|