문제

마지막 개발자가 떠났기 때문에 프로젝트를 물려 받았습니다. 이 프로젝트는 코드 점화기로 구축되었습니다. 나는 전에 코드 점화기와 함께 일한 적이 없습니다.

코드를 간단히 살펴 보았고 다음과 같은 컨트롤러에서 데이터베이스 호출을 볼 수 있습니다.

$dbResult = $this->db->query("SELECT * FROM users WHERE username = '".$_POST['user_name']."'");

또는 다음과 같은 호출 :

$dbResult = $this->db->query("SELECT * FROM users WHERE username = '".$this->input->post('username')."'");

코드 점화기가 SQL 주입을 방지하기 위해 이러한 쿼리를 자동으로 소독합니까?

도움이 되었습니까?

해결책

Codeigniter는 사용할 때 지나가는 변수를 피합니다. $this->db->query 방법. 그러나 변수를 바인딩으로 전달할 때만 다음과 같습니다.

$dbResult = $this->db->query("SELECT * FROM users WHERE username = '?'", array($this->input->post('username')));

또한 기억하십시오 $_POST 선호해서는 안됩니다 $this->input->post 오류를 방지하기 위해 변수가 존재하는지 확인하기 때문에.

다른 팁

CodeIgniter는 데이터베이스 계층에서 몇 가지 문자열 탈출 기능을 제공합니다.

발췌 CI 매뉴얼:

데이터를 데이터베이스에 제출하기 전에 데이터를 탈출하는 것은 매우 좋은 보안 관행입니다. CodeIgniter에는 세 가지 방법이 있습니다 이 작업을 수행하는 데 도움이됩니다.

  1. $ this-> db-> Escape () 이 기능은 데이터 유형을 결정하여 문자열 데이터 만 탈출 할 수 있습니다. 또한 데이터 주위에 단일 따옴표를 자동으로 추가하므로 다음과 같습니다.

    $sql = "INSERT INTO table (title) VALUES(".$this->db->escape($title).")";
    

다른 두 예제를 게시했지만 매뉴얼을 읽는 데있어 모든 재미를 얻고 싶지는 않습니다.

아니요, 게시 한 코드는 SQL 주입에 취약합니다. 사용해야합니다 쿼리 바인딩 SQL 쿼리를 구성합니다. CI DB 라이브러리를 사용하는 경우 이와 같은 내용을 코딩합니다 (사용자 안내서의 예).

$sql = "SELECT * FROM some_table WHERE id = ? AND status = ? AND author = ?";

$this->db->query($sql, array(3, 'live', 'Rick')); 

아니요, Codeigniter는 이와 같이 구축 된 쿼리를 마술처럼 소독하지 않습니다.

CI의 문서에 따르면 여기, 프레임 워크 필터는 컨트롤러 구성에 게시됩니다. 또한 선택적으로 함수를 호출하거나 전역 구성을 설정하여 XSS 필터링을 수행합니다.

나는 단지 그것을 가지고 놀기 위해 CI를 사용한 적이 없으므로, 내가 이것을 얼마나 멀리 믿을지 확신 할 수 없습니다.

그것은 아무것도 탈출하지 않습니다. 당신은 그것을 바인드 구문 또는 활성 레코드 구문

$ this-> input-> post, Query 바인딩 및 활성 레코드를 사용하여 더 안전한 데이터를 사용한 다음 여전히 테스트 테스트를 테스트해야합니다.

안전 및 더 쉬운 코딩을 위해 활성 레코드를 사용하십시오.

대신 :

  $dbResult = $this->db->query("SELECT * FROM users WHERE username'".$_POST['user_name']."'");

사용 (동일한 결과) :

$this->db->where('username',$this->input->post('user_name');
$dbResult = $this->db->get('users');

고통 일 수 있지만 쿼리를 활성 레코드로 변환해야합니다.

CodeInger Manual에서 복사하고 있습니다. "단순성을 넘어서 활성 기록 특징은 각 데이터베이스 어댑터에서 쿼리 구문이 생성되므로 데이터베이스 독립 응용 프로그램을 만들 수 있다는 것입니다. 또한 시스템에 의해 값이 자동으로 피해 지므로 더 안전한 쿼리를 허용합니다.."

그리고 어떤 사람들은 이미 말했듯이,이 코드는 SQL 주입에 취약합니다.

입력 레벨에서 XSS를 필터하기 위해 두 번째 게시물 파라 (true)로 최적화 :

$this->db->where('username',$this->input->post('user_name', TRUE);
$dbResult = $this->db->get('users');

라이브러리/input.html

문서 큰 빨간 상자에 (적어도) 2.2 상태 :

Active Record는 피드를 제공하는 필드 및 테이블 이름을 올바르게 인용하기 위해 최선을 다하지만 임의의 사용자 입력과 함께 작동하도록 설계되지 않았습니다. 비자니화되지 않은 사용자 데이터를 공급하지 마십시오.

이 프로그래머에게 "능동 기록에 의존하지 마십시오. 아무것".

CI의 주입에 탈출 기능을 사용합니다

<?php $username = $this->input->post('username');
$query = 'SELECT * FROM subscribers_tbl WHERE user_name = '.$this->db->escape($email);
$this->db->query($query);?>
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top