4
5

More than 5 years have passed since last update.

FuelPHP1.7のDB検索時、クエリビルダーを使わないパターンのセキュリティ対策

Last updated at Posted at 2015-01-06

クエリビルダー内でSQLインジェクション対応している

FuelPHPのDB検索時、クエリビルダーを使用するとSQLインジェクション対策をフレームワーク側でやってくれるので安心です。以下Fuelドキュメントページからの抜粋

Fuel は、Database クラスのメソッドの1つに渡されるすべての値をエスケープすることにより、SQLインジェクションから保護します。 これは Fuel の中心となるクエリビルダーのレベルで起こるため、クエリビルダーを使うすべてのコード、Fuel の ORM パッケージを含みます、は自動的にエスケープされます。

但し、クエリビルダーから対応しきれないクエリは別途対策が必要

UNIONなどはクエリビルダーの機能から存在しません。
http://fuelphp.jp/docs/1.7/classes/database/qb_select.html

検索クエリでUNIONを使用してテーブルを統合するかつ、ブラウザからのキーワードなどがSQLに使用される場合は、必ず別途対策が必要です。

どうやるの?

  • mysqli prepare ステートメントを使用する。以下PHPドキュメントから抜粋
<?php
$mysqli = new mysqli("localhost", "my_user", "my_password", "world");

/* 接続状況をチェックします */
if (mysqli_connect_errno()) {
    printf("Connect failed: %s\n", mysqli_connect_error());
    exit();
}

$city = "Amersfoort";

/* プリペアドステートメントを作成します */
if ($stmt = $mysqli->prepare("SELECT District FROM City WHERE Name=?")) {

    /* マーカにパラメータをバインドします */
    $stmt->bind_param("s", $city);

    /* クエリを実行します */
    $stmt->execute();

    /* 結果変数をバインドします */
    $stmt->bind_result($district);

    /* 値を取得します */
    $stmt->fetch();

    printf("%s is in district %s\n", $city, $district);

    /* ステートメントを閉じます */
    $stmt->close();
}

/* 接続を閉じます */
$mysqli->close();
?>
  • ブラウザから入力された検索キーワードをエスケープする。 PHPのバージョン5.5以上からmysqlクラスは非推奨になってます。mysqliクラスの使用をおすすめします。
<?php
$link = mysqli_connect("localhost", "my_user", "my_password", "world");
$keyword = mysqli_real_escape_string($link, $keyword);
mysqli_close($link);
?>

そのほかにも対応策はいろいろありますが、重要なのはFuelPHPクエリビルダーを使用しない場合は別途セキュリティの対策が必要だということです。

4
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
5