0

CMSにフィルタードロップダウンを設定しようとしています。モデルは次のようになります。

public function load($sort,$order,$key,$value)
{ //        $key='listening'; //        $value="1";
            //configure pagination
    $config=array(
      'base_url'=>base_url().'/index.php/companies/index',
      'total_rows'=>$this->db->get('company')->num_rows(),
      'per_page'=>$this->settings_model->get_per_page(),
      'num_links'=>20
    );

    $this->pagination->initialize($config);



    $this->db->select('company.id, 
                       company.name, 
                       company.logo, 
                       company.status_id, 
                       company.listening',FALSE);
    $this->db->select('company_category.name as category,
                       company_category.id as category_id',FALSE);

    $this->db->select('complain_status.cs_status as status',false);
    $this->db->from('company');
    $this->db->join('company_category','company_category.id = company.category_id');
    $this->db->join('complain_stastus', 'complain_status.cs_id = company.status_id');



    if(isset($_POST['key']))
    {
       $value=  str_replace('&nbsp', ' ', $_POST['value']);
        var_dump($value);
        if($value!='0')
            $this->db->having ($_POST['key'], mysql_real_escape_string($value) );

    }
    if($sort!='' || $sort!=NULL)
        $this->db->order_by ($sort, $order);

    $this->db->limit($config['per_page'], $this->uri->segment(3));

    $result=$this->db->get();
    if(!isset($_POST['key']))
        $this->filter->set_filters_list($result->result_array());

    return $result->result();
}

以下のクエリを生成します

SELECT company.id, company.name, company.logo, company.status_id, company.listening, company_category.name as category, company_category.id as category_id, complain_status.cs_status as status
FROM (`company`)
JOIN `company_category` ON `company_category`.`id` = `company`.`category_id`
JOIN `complain_status`  ON `complain_status`.`cs_id` = `company`.`status_id`
HAVING `category` =  'Health & recreation'
LIMIT 20

ご覧のとおり、カテゴリが特殊文字を含む文字列と等しい場合に問題がHealth & recreation発生します。CIによって生成されたクエリを試しても、MYSQLで正常に機能し、結果が得られます。

注:このデータはオプションにスペースがあると失敗するselect html要素からのものであるため、スペースを置き換えて $value= str_replace('&nbsp', ' ', $_POST['value']);います。そのため、後でバックエンドコードで解析して削除する必要がありました。

前もって感謝します

4

2 に答える 2

2

コードイグナイターはおそらくアンパサンドをhtml_encodingしているので、html値として読み取られます。プロファイラーをオンにして、この行をコントローラーのコンストラクターに追加するか、クエリを実行するモデルを作成することで、これを確認できます。

$this->output->enable_profiler(TRUE);

私が正しければ、あなたのクエリは、あるべき&場所のようなものに置き換えられます。&

プロファイラーが表示&するのに注意してください。$this->db->last_query()&

于 2012-11-14T19:29:06.010 に答える
0

データベースにシンボルを挿入するには、最初に値をエスケープする必要があります。PHPでは、通常、次を使用します。mysql_real_escape_string()

データベースに特殊文字を挿入する方法は?

ただし、CodeIgniterでこれを行っているため、データを自動的にエスケープするには、クエリバインディングを使用する必要があります。

$category = $this->input->post('category');
$status = $category = $this->input->post('status');
$status_id = $category = $this->input->post('status_id');

$sql = "SELECT * FROM company WHERE category = ? AND status = ?"; 

$this->db->query($sql, array($category, $status));

http://ellislab.com/codeigniter/user_guide/database/queries.html(クエリバインディングの下)

CodeIgniterはSQLインジェクションを自動的に防ぎますか?

元の質問の一部ではありませんが、コードには、フィルタリングなしで$_POST['value']を使用するという欠陥があります。誰かがあなたのフォームをSQLで挿入するのを止めるものは何もありません。

PHPでSQLインジェクションを防ぐにはどうすればよいですか?

于 2012-11-14T19:33:24.327 に答える