CodeIgniter는 SQL 입력을 자동으로 방지 할 수 있습니까?
마지막 개발자가 떠났기 때문에 프로젝트를 상속 받았습니다. 이 프로젝트는 Code Igniter를 기반으로합니다. 나는 전에 Code Igniter와 함께 일한 적이 없습니다.
코드를 지금부터 만나고 다음과 같이 컨트롤러에서 호출을 확인했습니다.
$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는 이를 수행하는 데 도움 이되는 세 가지 방법 이 있습니다.
$ 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의 문서에 따르면 프레임 워크는 컨트롤러 구성에서 POST를 필터링합니다. 또한 선택적으로 함수를 수동으로 호출하거나 전역 구성을 설정하여 XSS 필터링을 수행합니다.
나는 CI를 가지고 노는 것 외에는 CI를 사용할 적이 있기 때문에 믿을 수 있을지 모르겠습니다.
그것은 아무것도 피할 수 없습니다. 바인드 구문 또는 활성 레코드 구문으로 변경하는 것이 좋습니다.
$ this-> input-> post, 쿼리 바인딩 및 활성 레코드를 사용하여 더 안전한 데이터를 확보 한 다음 테스트 테스트를 통해 확실히해야합니다.
안전하고 쉬운 코딩을 위해 활성 레코드 사용 :
대신 :
$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');
고통 스러울 수있는 쿼리를 활성 레코드로 변환해야합니다.
저는 CodeIgniter 매뉴얼에서 다음과 같이 복사하고 있습니다. "단순함을 넘어서 Active Record 기능 을 사용할 때의 주요 이점 은 쿼리 구문이 각 데이터베이스 어댑터에 의해 생성되기 때문에 데이터베이스 인 응용 프로그램을 만들 수있는 것입니다. 또한 더 안전한 쿼리를 허용합니다., 값은 시스템에 의해 자동으로 이스케이프되기 입니다. "
그리고 일부 사람들이 이미 말했듯 이이 코드는 SQL 배치에 부담합니다.
두 번째 사후 조건 변수 (TRUE)로 최적화되어 입력 레벨에서 XSS를 필터링합니다.
$this->db->where('username',$this->input->post('user_name', TRUE);
$dbResult = $this->db->get('users');
큰 빨간색 상자에 (적어도) 2.2 상태에 대한 문서 :
Active Record는 사용자가 입력 한 필드 및 테이블 이름을 인용하기 위해 최선을 다하지만 임의의 사용자 입력으로 작동하도록 설계되지 않습니다. 삭제되지 않은 사용자 데이터를 제공하지 않습니다.
이 프로그래머에게 " 아무것도 인용하기 위해 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);?>
참고 URL : https://stackoverflow.com/questions/1615792/does-codeigniter-automatically-prevent-sql-injection
'ProgramingTip' 카테고리의 다른 글
루비 : 같은 객체를 가리 키지 않고 어떻게 변수를 복사 할 수 있습니까? (0) | 2020.12.04 |
---|---|
ASP.Net MVC에서 TempData 대 세션을 사용하는 경우 (0) | 2020.12.04 |
MongoDB 연결에 대한 .NET 모범 사례? (0) | 2020.12.04 |
Python에서 jquery와 같은 HTML 구문 분석? (0) | 2020.12.04 |
생성자에서 setter 호출 (0) | 2020.12.04 |