PHP codeigniter SQLインジェクション(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攻撃にも言及していると思います。その場合、2つのオプションがあります。これは、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

ActiveRecordクラスを参照しています。独自のクエリビルダーがあり、ボックスからのSQLインジェクションからユーザーを保護することを想定しています。

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

あなたはXSS攻撃について言及していると思います。許容されるタグを除くすべてのタグを取り除くことがベストプラクティスだと思います。htmlspecialchars出力を逆変換する場合、ここではあまり意味がないと思います。