-3

通常の古典的な「mysql_query」よりも安全な PDO を使用していますか? または、mysql db からデータをインポートおよびエクスポートするための他のより安全な方法はありますか

PDO を使用すると問題が発生する可能性があると聞きましたが、そうですか?

4

3 に答える 3

1

使用している関数名には本質的に安全なものはありません。

これは、それらを安全に使用できる (または安全ではない) 方法です。mysql_query を PDO よりも安全にすることができます。逆に、不適切に使用すると、PDO は簡単に「問題を引き起こす可能性があります」。

したがって、mysql クエリ (データベースではない) でデータを処理する最も安全な方法は次のとおりです。

  1. すべての動的リテラルは、プレースホルダーのみを介してクエリに追加する必要があります
  2. plcaceholder を使用できない場合 - 値は、許可された値のハードコードされたリストに対してホワイトリストに登録する必要があります

PDO はすぐに使えるプレースホルダーのサポートを提供するため、一般的に mysql_query よりも優先されます。ただし、このサポートは非​​常に制限されており、完全な保護が必要な場合は、独自のソリューションを作成するか、SafeMySqlなどの既製のライブラリを使用する必要があります

于 2013-04-06T13:20:51.283 に答える
1

単純な mysql_query ではなく、パラメーター バインドを使用して PDO を使用します。これにより、プロジェクトで SQL インジェクションの問題に対処する必要がなくなります。

php.net docs から取った簡単な例を次に示します。

<?php
/* Execute a prepared statement by binding PHP variables */
$calories = 150;
$colour = 'red';
$sth = $dbh->prepare('SELECT name, colour, calories
    FROM fruit
    WHERE calories < :calories AND colour = :colour');
$sth->bindParam(':calories', $calories, PDO::PARAM_INT);
$sth->bindParam(':colour', $colour, PDO::PARAM_STR, 12);
$sth->execute();
?>

この方法で pdo を使用する方が確実に安全です。また、変数のキャストも処理します。現在のすべてのphpプロジェクトでPDO(追加の抽象化レベルを備えた低レベル)を使用していますが、問題はありませんでした。

于 2013-04-06T13:18:53.873 に答える
1

mysql_query一般に、データベースからのデータのインポート/エクスポートは、PDO ラッパーではなく使用する場合、多かれ少なかれ安全ではありません。注意する必要がある重要なことは、安全でないデータ ソースを保護することです。一般に、GET、POST、COOKIE などのメカニズムを介してユーザーから送信され、コードのパラメーターとして使用されるものはすべて信頼しないでください。すべての悪意のあるデータを考慮し、最初に期待する形式に検証します。

PDO は、SQL クエリを簡単にパラメータ化し、通常最も一般的な Web 攻撃である SQL インジェクション タイプの攻撃を回避できるという意味で「より安全」です。例えば:

<?php
$id = (isset(_$GET['id']))? _$GET['id'] : ''; // Possibly unsafe data from user
$dbh = new PDO('mysql:host='.$host.';dbname='.$name, $user, $pass);
$sth = $dbh->prepare("SELECT * FROM `table` WHERE `id`=?");
$sth->execute(array($id));
?>

上記のようなパラメータ化されたクエリを使用して、プレースホルダー?が特定のデータ クエリに置き換えられると、SQL インジェクションの発生を効果的に防ぐことができます。これは、PDO が取得し_$GET['id']たデータを、クエリ文字列の一部ではなく単なる「データ」と見なすためです (これは、SQL インジェクションを引き起こすために使用される可能性があります)。

たとえば、次のGETようにクエリに追加してデータを直接挿入する場合:

$query = "SELECT * FROM `table` WHERE `id`=".$_GET['id'];

これにより、SQL インジェクションが容易に発生する可能性があります。そんなことは絶対にしないでください。_$GETSQL の最後の部分は、変数が検証またはフィルター処理されていない場合に実行するつもりのなかった追加の SQL を挿入するために、あらゆる種類の方法で使用できます。上記の例で、user が次の文字列を指定した場合_$GET['id']-これにより、ユーザーが含まれる"1;DROP TABLE table;"テーブルが実質的に削除されます - これは意図したことではありませんが、結果のクエリは次のようになります。

"SELECT * FROM `table` WHERE `id`=1;DROP TABLE table;"

たとえば、整数が期待される場合は、最初に無効なデータを取得しないようにできる限りのことを行う必要があります。

$id = (isset(_$GET['id']))? _$GET['id'] : ''; // Possibly unsafe data from user
$id = intval($id);  // Make sure the data is integer at all times
if ($id < 0) $id = 0; // Make sure it is positive integer at all times

そうすれば、データが期待どおりの形式であることを確認できます。

最初にデータを検証し、次にパラメーター化されたクエリを使用してデータベースに挿入することにより、データベース内の無効なエントリと無効なコードの動作を取り除くのに役立つ多層セキュリティを確保します。以下のコメントの「あなたの常識」で示唆されているように、すべての種類の攻撃に対して完全に安全になるわけではありませんが、その可能性は大幅に減少します.

intvalそれを助けることができる唯一の機能ではありません、あなたも調べることができます:

http://php.net/manual/en/function.filter-var.php

PDO に関するどのような問題について言及していますか?

于 2013-04-06T13:19:11.873 に答える