db_insert는 안전합니까?


15

Drupal 7 메소드 db_insert 를 사용하여 Drupal 데이터베이스의 사용자 정의 테이블에 데이터를 삽입합니다. 나는 이것이 선호되는 방법이라는 것을 읽었지만 코드와 doco를 살펴 보았고 값을 구문 분석하는 곳을 볼 수 없거나 이러한 값이 안전하다는 것을 알 수 없습니다.

일부 값은 사용자가 제공하므로 SQL Injection 공격을 확인해야합니다.

이것은 Drupal 6이 값을 구문 분석하고 drupal 7 버전은 그렇지 않은 내가 읽은 예제입니다.

<?php
// Drupal 6 version
db_query('INSERT INTO {vchess_games} 
   (gid, timestamps, white, black, state, board_white, board_black) ' . "VALUES ('%s', '%s', '%s', '%s', '%s', '%s', '%s')", 
   $gid, $timestamps, $game['white'], $game['black'], $state, $board_white, $board_black);

// Drupal 7 version
db_insert('vchess_games')
  ->fields(array(
    'gid' => $gid,
    'timestamps' => $timestamps,
    'white' => $game['white'],
    'black' => $game['black'],
    'state' => $state,
    'board_white' => $board_white,
    'board_black' => $board_black
  ))
  ->execute();
?>

답변:


13

Drupal 데이터베이스 계층은 PDO를 감싸고 준비된 명령문을 사용하므로 삽입 명령문이 삭제되고 SQL 주입 공격으로부터 보호됩니다.

Prepared Statements 문서 에서 인용 한 내용은 다음과 같습니다.

준비된 명령문에 대한 매개 변수는 인용 할 필요가 없습니다. 드라이버가 자동으로 처리합니다. 애플리케이션이 준비된 명령문을 독점적으로 사용하는 경우, 개발자는 SQL 삽입이 발생하지 않을 것을 확신 할 수 있습니다 (단, 쿼리의 다른 부분이 이스케이프되지 않은 입력으로 빌드되는 경우에도 SQL 주입이 가능합니다).

동일 드루팔 7 (의 데이터베이스 기능을 모두 마찬가지이다 db_select, db_delete등). 여전히 안전하지 않은 유일한 것은 db_query()전달하는 임의의 문자열을 실행하는 것입니다. 그럼에도 불구하고 db_query()검색어를 안전하게 사용할 수 있도록 매개 변수를 전달할 수 있습니다.

데이터베이스 추상화 계층의 문서는 좀 더 많은 정보가 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.