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}'");
함수 호출은 이름 열이 사용자가 지정한 이름과 일치하는 사용자 테이블에서 레코드를 검색해야합니다. 정상적인 상황에서는$nameilia 문자열과 같은 영숫자와 공백 만 포함합니다. 그러나이 경우 $ name에 완전히 새로운 쿼리를 추가하면 데이터베이스 호출이 재앙이됩니다. 삽입 된 DELETE 쿼리는 사용자의 모든 레코드를 제거합니다.
단일 함수 호출에서 쿼리 스택 또는 여러 쿼리 실행을 허용하지 않는 데이터베이스 인터페이스가 있습니다. 쿼리를 스택하려고하면 호출이 실패하지만 SQLite와 PostgreSQL은 즐겁게 스택 쿼리를 수행하고 하나의 문자열로 제공된 모든 쿼리를 실행하고 심각한 보안 문제를 만듭니다.
SQL 주입 방지
PERL 및 PHP와 같은 스크립팅 언어에서 모든 이스케이프 문자를 현명하게 처리 할 수 있습니다. 프로그래밍 언어 PHP가 제공하는 기능string sqlite_escape_string() SQLite에 특수한 입력 문자를 이스케이프합니다.
if (get_magic_quotes_gpc()) {
$name = sqlite_escape_string($name);
}
$result = @$db->query("SELECT * FROM users WHERE username = '{$name}'");
인코딩으로 인해 데이터를 안전하게 삽입 할 수 있지만 간단한 텍스트 비교 및 LIKE 이진 데이터가 포함 된 열에 대해 쿼리의 절을 사용할 수 없습니다.
Note − addslashes()SQLite 쿼리에 대한 문자열을 인용하는 데 사용해서는 안됩니다. 데이터를 검색 할 때 이상한 결과를 초래합니다.