0

まず第一に、はい、私はこれを見てきましたSQL インジェクションを防ぐのに十分な PDO プリペアド ステートメントですか? 、しかし、私は別のやり方をしているので、私の質問に答えるには十分ではありません.

次のようなコードがあるとします。

$userid = $_SESSION['data']['id'];
$query = "SELECT * FROM table WHERE userid='$userid'";
$action = $db->prepare($query);
$action->execute();

ユーザーが に影響を与えることができないため、技術的に安全$useridですよね? 私がこれについて間違っているかどうか言ってください。

しかし、コードが次のようになったらどうでしょう。

$userid = $_GET['id'];
$query = "SELECT * FROM table WHERE userid='$userid'";
$action = $db->prepare($query);
$action->execute();

もう安全ですか?これについて、白地に黒を表示するドキュメントが見つかりません。

4

3 に答える 3

2

を使用した場合でも、クエリをパラメータ化していないためPDO、コードは脆弱です。値をクリーンアップするには、クエリをパラメータ化する必要があります。SQL INjection

$userid = $_GET['id'];
$query = "SELECT * FROM table WHERE userid=?";
$db->setAttribute( PDO::ATTR_EMULATE_PREPARES, false );
$action = $db->prepare($query);
$action->bindParam(1, $userid);
$action->execute();
于 2013-03-10T11:45:13.623 に答える
1

2番目のステートメントは安全ではありません。

代わりに、次のようなことを行う必要があります

$stmt = $db->prepare('SELECT * FROM table WHERE userid=:id');
$stmt->bindParam(':id', $userid);
$stmt->execute();

ソース

于 2013-03-10T11:46:13.067 に答える
0

ユーザーは $userid に影響を与えることができないので、技術的に安全ですよね? 私がこれについて間違っているかどうか言ってください。

あなたはそれが間違っています。セッション データは外部データであるため、注意して扱う必要があります。これは次の理由によるものです。

  • SessionID と SessionName は、リクエストで直接指定されます。これらの値は簡単に操作できるため、さまざまなデータがアプリケーションのメモリに格納されます。
  • 持続性。セッション データは永続化レイヤーで変更できるため、常に入力データとして認定されます (!)。

あなたはおそらく整数値を期待しているので、それを1にしてください:

$userid = (int) $_SESSION['data']['id'];

特に、変数を SQL クエリに直接代入する場合。

将来、安全かどうかは考えないでください。別の層で何かを見逃したとしても (セッションを介した入力など)、アプリケーションのデータフローを壊さないように、安全な方法で物事を行うことを検討してください。

$pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);

...

$userid = (int) $_SESSION['data']['id'];

...

$query = "SELECT column FROM table WHERE userid = ?";

$stmt = $pdo->prepare($query);
$stmt->bindParam(1, $userid);
$stmt->execute();
于 2013-03-10T11:56:16.567 に答える