SQLite 주입
귀하의 사이트에서 사용자가 웹 페이지를 통해 입력하고 입력 내용을 SQLite 데이터베이스에 삽입하도록 허용하는 경우 SQL 삽입이라는 보안 문제에 직면하게 됩니다. 이 섹션에서는 이러한 일이 발생하지 않도록 방지하고 스크립트 및 SQLite 문의 보안을 보장하는 방법을 보여줍니다.
삽입은 일반적으로 사용자에게 이름을 입력하도록 요구하는 등 사용자 입력을 요청할 때 발생하는데, 사용자가 SQLite 문을 입력하고 이 문이 자신도 모르게 데이터베이스에서 실행됩니다.
사용자가 제공한 데이터를 절대 신뢰하지 않으며 검증을 통과한 데이터만 처리합니다. 이 규칙은 패턴 일치를 통해 수행됩니다. 아래 예에서 사용자 이름 사용자 이름은 영숫자 또는 밑줄로 제한되며 길이는 8~20자 사이여야 합니다. 필요에 따라 이 규칙을 수정하십시오.
if (preg_match("/^\w{8,20}$/", $_GET['username'], $matches)){ $db = new SQLiteDatabase('filename'); $result = @$db->query("SELECT * FROM users WHERE username=$matches[0]"); }else{ echo "username not accepted"; }
문제를 설명하려면 다음 발췌문을 고려하세요.
$name = "Qadir'; DELETE FROM users;"; @$db->query("SELECT * FROM users WHERE username='{$name}'");
함수 호출은 사용자가 지정한 이름에 해당하는 사용자 테이블에서 이름 열을 검색하는 것입니다. 일반적으로 $name에는 문자열 ilia와 같은 영숫자 문자 또는 공백만 포함됩니다. 그러나 여기서는 새로운 쿼리가 $name에 추가되고 데이터베이스에 대한 이 호출은 치명적인 문제를 야기합니다. 삽입된 DELETE 쿼리는 사용자의 모든 레코드를 삭제합니다.
쿼리 스택을 허용하지 않거나 단일 함수 호출에서 여러 쿼리를 실행하는 것을 허용하지 않는 데이터베이스 인터페이스가 이미 있지만 쿼리를 스택하려고 하면 호출이 실패하지만 SQLite 및 PostgreSQL은 여전히 스택 쿼리를 수행합니다. 즉, 모든 쿼리를 문자열로 제공을 실행하면 심각한 보안 문제가 발생합니다.
SQL 삽입 방지
PERL 및 PHP와 같은 스크립트 언어에서는 모든 이스케이프 문자를 영리하게 처리할 수 있습니다. 프로그래밍 언어 PHP는 SQLite에 특수한 입력 문자를 이스케이프하기 위해 문자열 함수 sqlite_escape_string()을 제공합니다.
if (get_magic_quotes_gpc()) { $name = sqlite_escape_string($name); } $result = @$db->query("SELECT * FROM users WHERE username='{$name}'");
인코딩을 사용하면 데이터를 안전하게 삽입할 수 있지만 이진 데이터가 포함된 열에 LIKE 절을 사용할 수 없는 쿼리에서 간단한 텍스트 비교가 렌더링됩니다.
addlashes()는 SQLite 쿼리에서 문자열을 인용하는 데 사용하면 안 됩니다. 데이터를 검색할 때 이상한 결과가 발생할 수 있습니다.