PHP codeigniter SQL Injection (MSSQL) [중복]

Oct 27 2020

내 쿼리에 SQL 주입이 있음을 보여주는 보고서를 받았는데 문제를 확인하는 데 도움이 필요합니다.

  1. 나는 이것을 삽입 문으로 사용하고 있었다.
  function insert($table_name, $insert_data)
    {
        $this->db->set($insert_data);
        if ($this->db->insert($table_name)) {
            return TRUE;
        } else {
            return FALSE;
        }
    }

예를 들어 :

$name = 'iamklll'; $status = 1;

  $insert_data = array( 'name' => $name,
                'status' => $status, ); $this->model->insert('table', $insert_data);  

이런 종류의 방법은 SQL 주입을 막을 수 없습니까? 이것이 가장 좋은 방법은 쿼리 바인딩을 막을 수 없다면?

  1. $ POST [ 'column']이 배열 인 경우 SQL 주입을 어떻게 방지합니까?

  2. 사람이 삽입하는 것처럼 데이터를 저장하는 방법은 test"><h1>eee</h1>무엇입니까? htmlspecialchars데이터베이스에 저장 하는 데 사용해야합니까 ?

답변

marcogmonteiro Oct 27 2020 at 18:13

귀하의 경우 쿼리 작성기 $ this-> db-> insert ()를 사용하면 제공 한 데이터를 기반으로 삽입 문자열이 생성되고 쿼리가 실행됩니다. 함수에 배열이나 객체를 전달할 수 있습니다. 모든 값은 자동으로 이스케이프되어 보다 안전한 쿼리를 생성합니다.

이것은 실제로 내 의견으로는 최선의 선택입니다. 쿼리 바인딩을 사용하는 것보다 낫습니다. 특히 장기적으로는 MSSQL에서 mySQL 또는 다른 엔진으로 변경해야 할 수 있고 코드에서 아무것도 변경할 필요가 없기 때문입니다.

codeigniter 3을 사용하고 있으므로 데이터를 삽입하기 전에 데이터의 유효성을 검사해야합니다.

이를 위해 양식 유효성 검사를 사용하십시오. https://codeigniter.com/userguide3/libraries/form_validation.html?highlight=form%20validation

귀하의 예에서 xxs 공격을 언급하고 있다고 생각합니다. 그렇다면 두 가지 옵션이 있으며 XSS 규칙을 사용하여 양식 유효성 검사로 데이터를 유효성 검사하는 동안이를 수행 할 수 있습니다. 또는 application / config / config.php에서 전역 적으로 활성화 할 수 있습니다.

$config['global_xss_filtering'] = true;

앱 보호에 대해 이야기하고 있으므로 codeigniter에서 csrf 설정 사용을 고려할 수도 있습니다. config.php 파일에서도이 작업을 수행 할 수 있습니다.

/*
|--------------------------------------------------------------------------
| Cross Site Request Forgery
|--------------------------------------------------------------------------
| Enables a CSRF cookie token to be set. When set to TRUE, token will be
| checked on a submitted form. If you are accepting user data, it is strongly
| recommended CSRF protection be enabled.
|
| 'csrf_token_name' = The token name
| 'csrf_cookie_name' = The cookie name
| 'csrf_expire' = The number in seconds the token should expire.
| 'csrf_regenerate' = Regenerate token on every submission
| 'csrf_exclude_uris' = Array of URIs which ignore CSRF checks
 */
$config['csrf_protection'] = true; $config['csrf_token_name'] = 'csrf_test_name';
$config['csrf_cookie_name'] = 'csrf_cookie_name'; $config['csrf_expire'] = 7200;
$config['csrf_regenerate'] = true; $config['csrf_exclude_uris'] = array();

따라서 귀하의 경우 쿼리 빌더를 사용하면 실제로 찾고있는 SQL 주입을 방지 할 수 있습니다.

Yevgen Oct 27 2020 at 18:05

Active Record 클래스를 참조하고 있습니다. 자체 쿼리 작성기가 있으며 상자에서 SQL 삽입으로부터 사용자를 보호한다고 가정합니다.

How to store the data as if the person insert test"><h1>eee</h1>

XSS 공격을 언급하고있는 것 같습니다. 허용되는 태그를 제외한 모든 태그 를 제거하는 것이 가장 좋은 방법이라고 생각 합니다 . 나는 htmlspecialchars당신이 출력을 역변환하는 동안 여기에서 그다지 의미 가 없다고 생각 합니다.