3

mysql_query()セキュリティ上の利点を利用するために、従来のパラメータ化されたクエリからPDOに切り替えています。いくつか質問があります。まず、magic_quotesに関して何かする必要がありますか?このWebアプリは、さまざまな構成のシステムにインストールされ、(残念ながら)オンになっているものとオフになっているものがあります。以前は、データの入力がオフになるまでifステートメント全体を実行していましたaddslashes()...次のようなPDOクエリで実行する必要があることは次のとおりです。

$dbh = new PDO("mysql:host=$db_server;dbname=$db_database", $db_username, $db_password);
$sth = $dbh->prepare("SELECT * FROM `users` WHERE `username` = :username ");
$sth->bindParam(':username', $_POST['username']);
$sth->execute();
if($row = $sth->fetch()){
    // Yup
}
$dbh = null;

また、最終的にデータベースハンドラーを閉じる必要はありますか?そうしないことの不利益は何ですか?PDOは、さまざまなサーバー設定にインストールされるCMSに適したオプションですか?PDOは、ほとんどのサーバーで有効になる場所で十分に普及していますか?

前もって感謝します!

4

2 に答える 2

4

このWebアプリは、さまざまな構成のシステムにインストールされ、(残念ながら)[マジッククォート]がオンになっているものとオフになっているものがあります。

別の回答へのコメントで述べたように、PHPマニュアルには、魔法の引用であるホラーへの対処に関するセクション全体があります。通常、.htaccessでローカルに無効にするか、入ってくるデータを修正することができます。私は個人的に、デフォルトで有効になっているホスティングプロバイダーとは取引しません。

addslashes()以前は、データの入力がオフになるまで、ifステートメント全体を実行していました。

うわぁ! 十分な保護addslashesではありません。古いMySQL拡張機能を使用する場合は、文字セット設定して から使用する必要があります。これを怠ると、大きな脆弱性にさらされる可能性がありますmysql_real_escape_string

...次のようなPDOクエリで実行する必要があること:

接続文字セットを設定する以外は何もありません!PDOは、可能な場合、実際に準備されたステートメントを使用します。これは、最初にプレースホルダーを含むクエリをサーバーに送信して処理できるようにし、その後、引数を個別に送信することを意味します。これにより、クエリはSQLインジェクションの影響を受けなくなります。

(一部のデータベースは、PDOを使用したプリペアドステートメントをサポートしていません。これらの場合、PDOはクエリを処理し、プレースホルダーを引用符で囲まれたエスケープされた値に置き換えます。結果は同じです。SQLインジェクションの影響を受けません。)

また、最終的にデータベースハンドラーを閉じる必要はありますか?そうしないことの不利益は何ですか?

他のPHPデータベースハンドラーと同様に、接続を閉じる必要はありません。スクリプトが終了すると、接続が閉じられます。(持続的接続についても考えないでください。)

PDOは、さまざまなサーバー設定にインストールされるCMSに適したオプションですか?PDOは、ほとんどのサーバーで有効になる場所で十分に普及していますか?

PDOはPHP5.1で標準になりましたが、それが常に利用可能であるとは限りません。ほとんどのLinuxディストリビューションは、PHPのすべてのデータベースアクセスオプションを分割しているため、それらをインストールすると必須ライブラリもインストールされます。時々、無能または経験の浅いホスティングプロバイダーは、他のデータベースアクセスオプションと一緒にPDOパッケージをインストールせず、彼らが何をしているかを理解していません。これは通常、PDOを有効にするように依頼し、望まない場合やできない場合は別のホストに切り替えることで修正されます。

最新のフレームワークの多くは、PDOの上に構築することを好みますが、他のオプションを利用できるようにします。たとえば、Zend FrameworkのZend_Dbには、PDO、mysqli、およびその他のいくつかのアダプターがあります。PDOが常に利用できるとは限らない場合は、アダプターレイヤーを使用するとうまくいく可能性があります。(ほとんどのZFコンポーネントと同様に、Zend_Dbは他のZFコンポーネントに大きく依存しないため、コードに簡単にバンドルできます。)

于 2011-04-22T18:24:23.410 に答える
3

私はあまり心配しませんmagic_quotes。PDOはPHP5.1で導入されましたが、これまでmagic_quotesにデフォルトでしばらくの間時間がオフになりました。PDOをサポートしているが、magic_quotesが有効になっているホストはごくわずかであるはずです。

それでもその小さな割合を処理したい場合は、$ _ GET、$ _ POST、および$ _COOKIEグローバル変数を変更し、magic_quotes追加されたスラッシュを削除することをお勧めします。または、それらを直接変更したくない場合は、ある種のRequestオブジェクトでそれらをラップします。

于 2011-04-22T08:03:50.067 に答える