2016-09-22 1 views
1

私はPDOを使用する前にすべての変数をフィルタリングしています。その時、私は通常弦を逃げてその長さを調べます。値が整数または他の数値であれば、値が実際に必要な型と値であることを理解しようとします。PHP:PDOを使用すると本当に安全ですか?古い方法の衛生措置や脱出がなくても?

しかし、PDOを使用した後に、セキュリティのために私が唯一のものであり、PDOが設定:: PARAM_ *以下のようなオプションを結合として..

$stmt = $this->db->prepare("select * from $dbSessionTableName where acntid = ? and end > now()"); 
    $stmt->bindValue(1, $_SESSION['account_id'], PDO::PARAM_INT); 
    $stmt->execute(); 

が、これは本当に安全ですか?

+1

これは答えることができません。はい - SQLインジェクションに対して安全です。しかし、あなたのユーザーは、リプレイ攻撃やハイジャックなどのセッションベースの攻撃に対して脆弱である可能性があります。 – max

+1

関心のあるポイント、 '$ _SESSION ['account_id']'はサーバのvarであり、値は設定する前に既に消されていなければなりません。特にこれがデータベースからの直接的な値であり、信頼できるものであれば、準備する必要はなく、[query()](http://php.net/manual/en/pdo.query.php)を使うことができます) 直接。 – Xorifelse

+0

私がデータベース接続について研究していたとき、私が変数を消毒しなければならないことがわかった唯一の理由は、注射を防ぐことにあります。この観点から、私はPDOを使用する際のセキュリティについて本当に信頼しています。私は正しい? ..または多分私はこの主題についてあまりにも心配している.. – GatesPlan

答えて

2

質問には2つの回答があります。結合パラメータの

  1. いえば、ははい、それはSQLインジェクションに対する完全に安全であると、他の検証を必要としません。また、バインディングオプションとしてPDO :: PARAM_ *を設定する必要はありません。次のようにあなたは、単にあなたのコードを作ることができますし、それは同様に確保されます:SQLインジェクションに関連するすべての古いスタイルの「サニタイズ」の実践が必要ではなく、むしろ有害ではないだけではなく、避けるべきであることを

    $stmt = $this->db->prepare("select * from table where acntid = ? and end > now()"); 
    $stmt->execute([$_SESSION['account_id']]); 
    

    ノート。

  2. しかし、$dbSessionTableName変数については、まだ安全ではありません他の方法でも可能です。そして検証されなければならない。
+0

非常に役に立ちます。私はあなたの答えに大きなことを学びました。 – GatesPlan

+1

新しいことを学んだことをうれしく思います。私のuserinfoをチェックすることができます。私が最近書いたPDOチュートリアルへのリンクがあります。あなたはもっと学ぶべきことがたくさんあります。 :)特に素晴らしいPDOがどれくらいあるのか –

+0

なぜ 'dbSessionTableName'が安全でないのかという理由で私は熱心です。変数がクライアントから渡されない場合でも、それでも危険ですか? – GatesPlan

関連する問題