sourcecode

Perl의 DBI를 사용하여 SQL 주입 공격을 방지하려면 어떻게 해야 합니까?

copyscript 2023. 10. 6. 21:54
반응형

Perl의 DBI를 사용하여 SQL 주입 공격을 방지하려면 어떻게 해야 합니까?

Perl에서 MySQL db에 입력하기 전에 입력을 검사하는 데 사용할 수 있는 기능이 있습니까?제가 regex를 잘 몰라서 직접 기능을 만들기 전에 이미 만들어진 것이 있는지 궁금합니다.

데이터베이스에 삽입하기 위해 데이터를 검사하는 적절한 방법은 SQL 문자열에 삽입할 모든 변수에 대해 자리 표시자를 사용하는 것입니다.즉, 절대로 이 작업을 수행하지 마십시오.

my $sql = "INSERT INTO foo (bar, baz) VALUES ( $bar, $baz )";

대신 사용?자리 표시자:

my $sql = "INSERT INTO foo (bar, baz) VALUES ( ?, ? )";

그런 다음 쿼리를 실행할 때 대체할 변수를 전달합니다.

my $sth = $dbh->prepare( $sql );
$sth->execute( $bar, $baz );

이러한 작업을 일부 DBI 편의 방법과 결합할 수 있으며, 위의 내용도 작성할 수 있습니다.

$dbh->do( $sql, undef, $bar, $baz );

자세한 내용은 DBI 문서를 참조하십시오.

"사용 자리 표시자" 답변에 대한 사소한 (그리고 인정하건대 현학적인) 부록: 매개 변수화된 쿼리는 엄밀하게 말해서 "위생"이 아닙니다.이들은 데이터를 안전하게 만들기 위해 어떤 방식으로든 데이터를 하지 않습니다.대신 쿼리 구조(명령어)와 데이터를 별도의 채널로 전송하여 SQL 주입으로부터 보호합니다.

제가 이 구분이 중요하다고 생각하는 이유는 데이터를 검사/인용/회피하는 것과 매개 변수화된 쿼리를 동일한 것으로 사용하는 것은 데이터가 상호 교환 가능하거나 기껏해야 매개 변수가 위험한 문자를 인용하는 더 나은 방법일 뿐이라는 것을 의미하기 때문입니다.그러니 자리 표시자를 찾는 대신 인용만 고집한다면 큰 문제가 아닙니다.

사실, 그것들은 전혀 다른 수준의 신뢰성을 가진 완전히 다른 기술들입니다.인용은 주입에 대한 탁월한 보호 기능을 제공할 수 있지만, 결정된 공격자가 인용 알고리즘을 깨거나 통과하여 SQL 주입을 성공적으로 수행할 수 있는 일부 코너 케이스를 발견할 가능성은 항상 있습니다.반면 매개 변수화된 쿼리는 SQL 주입에 대한 절대적인 보호 기능을 제공합니다.명령어와 데이터가 따로 전송되기 때문에 데이터베이스 엔진을 속여서 데이터를 명령어로 실행할 수는 없습니다.

언어 또는 데이터베이스 엔진에서 쿼리에 매개 변수를 사용할 수 없는 경우가 아니라면 SQL 주입에 대한 보호로 사용자 입력을 인용/회피/위생하지 마십시오.매개 변수화된 쿼리를 사용할 수 있는 경우 항상 이 목적으로 사용합니다.

그리고 필수 링크: http://bobby-tables.com/ 에는 Perl을 포함한 여러 언어에서 매개 변수화된 쿼리를 사용하는 방법의 예가 있습니다.

다른 답변에서 설명한 것처럼 자리 표시자를 사용할 수 없는 경우는 매우 드물습니다.그러나 이러한 드문 경우에도 데이터는 잠재적인 버그가 발생할 수 있으므로 혼자서 데이터를 조작해서는 안 됩니다.DBI를 사용하는 것이 좋습니다.quote그리고.quote_identifier방법들. RDBMS또한 코드를 특정 RDBMS 에 덜 의존하게 만듭니다에 덜 .

면책 사항.다음은 더미 예시이며 제가 언급한 매우 드문 경우를 설명하기 위한 것은 아닙니다.

$dbh->do('INSERT INTO ' . $dbh->quote_identifier($table) . ' (id, name) VALUES '
    '(NULL, ' . $dbh->quote($name) . ')');

데이터베이스를 어떻게 부르십니까?

DBI플레이스홀더를 사용하여 작성된 명세서를 지원합니다.DBIx 둘 다:클래스로즈::DB:: 각 라이브러리에서 제공하는 "find" 메서드를 사용하면 개체가 자동으로 값을 검사합니다.

답변: SQL 자리 표시자(?)를 사용합니다.

이유: SQL 문의 구조와 자리 표시자가 나타내는 데이터 값이 완전히 별개로 데이터베이스로 전송되기 때문에 데이터 값을 SQL 명령어로 해석할 수 있는 방법은 절대 없습니다.

언급URL : https://stackoverflow.com/questions/2300765/how-can-i-protect-against-sql-injection-attacks-using-perls-dbi

반응형