2016-06-14 10 views
0

誰かが私の質問に手伝ってもらえますか?PDO select querysによるセキュリティ?

私は現在PDOを使用するために私のすべての古いPHPコードを変換しています。 私はquerysの準備機能をいつ使う必要があるのでしょうか?

私は現在このクエリを持っています。

$sql = "SELECT deckName FROM decks WHERE deleted = '0' ORDER by deckName"; 

削除された列とは別に、動的なものはありません。 私は以下を使用してデータを画面に再表示しています。

foreach($DBH->query($sql) as $row){ echo $row['deckName']?> } 

私はこれをまだ良い習慣として使用していますか、それとも十分ですか?

$sth = $DBH->prepare("SELECT deckName FROM decks WHERE deleted = '0' ORDER by deckName"); 

行からデータを再入力するときにfetch文を正しく使用する方法がわかりませんか?

事前に感謝:) ヘイリー

+5

[クエリで変数を使用しない場合は、PDO :: query()メソッドを使用できます。](https://phpdelusions.net/pdo#query) –

+0

バインドする必要があるときに準備を使用しますクエリ内のユーザーデータ、それ以外の場合は最初の例に行くことができます。 –

+0

私はあなたの常識をあなたのリンクをチェックアウトします。良いリソースのように見えます。 – HybridHaylee

答えて

0

データベースに一定の文字列を送信し、「信頼できない入力」に混ぜ決してない場合は、セキュリティ上の懸念は、私の経験では無関係です、そして唯一の潜在的なパフォーマンスの側面が残って基礎となるデータベースに依存します。高価な解析クエリの準備ステップが、最初の実行の後にすべての呼び出しの実行フェーズ(準備、バインド=ここでは実行)に対してスペアされている場合。

タグから推測して、mysqlを使用し、memcachedなどを中間層として使用しないと、パフォーマンスを測定したい場合もあれば、直接クエリに移行することもできます。

"Project"は後で(例えばネットワークからの信頼できない入力に基づいて)クエリの変数のパラメータ化を必要とするときには、準備をして注入攻撃を防御する必要があります。多分、行からデータを繰り返し返すときにfetch文を正しく使う方法を知ることは良いでしょう。

コメントからのクエリで変数を使うための答えを修正しています:

私にとって "これは決してそうではありません"の代わりに "信頼できない入力を受け取る"と書かれています。私の経験では、変数に関しては滑りやすい斜面があります。上の質問の$ sql変数の幅広いコンテキストを監査しないと、クエリ全体が潜在的に注射攻撃に夢中になります。 また、定数からクエリ文字列を構築する内部リファクタリングは、クエリとして機能する(より複雑な)文字列を構成するための変数を混在させる可能性があります。よりバランスのとれた/ギャップは、私がお勧めし硬化最小限に抑えるための

  1. アプリを実現するコードで言う「信頼境界」の特定のマップを文書化し、それに基づいて、いずれかの厳密な検証を強化これらの境界を横切る入力、すなわち値を横切る値を輸送する変数は、ほとんどの場合、効果的かつ効率的である。

  2. 階層的セキュリティ/懸念の分離の常識概念を追加すると、「そのような入力」(境界を越えた)がパラメータとして「注入」されるときに、準備されたステートメントを使用することに自然につながります。

私は、DBベースのWebアプリケーションは通常どおり1は、アプリケーションスタックのようなscyscraperを扱う際に、セキュリティの楽観的な感覚を与える簡単なレシピを配るには消極的です。

+0

あなたがテストするために提案するパフォーマンス上の問題は何ですか?同じ定数クエリを何度も何度も繰り返すことのパフォーマンスですか?私はこのクエリを1回だけ実行しなければならないというテストなしで、あなたに伝えることができます。したがって、テストすることはまったくありません。 –

+0

パラメタリゼーションといえば、「信頼できない入力」の話は重大な妄想です。 1つは、データの起源を気にする必要はありませんが、無条件にパラメータを使用してください。 –

+0

まあ、それは、一般的に編集された簡略化されたクエリかもしれません、または読書の容易さ、OPだけが知っている、そして、それが測定することができ、ギャップを避けるようなセキュリティ - そうではありません。そして、信頼できない入力はすべてそれについてです。それがそこになければ、大丈夫ですが、忘れるのは簡単です。プロセスの後半で変数を許可するとき。 – Dilettant

関連する問題