0

初めて PDO を使用しようとしていますが、自分が行っていることがどれほど安全かを知りたいだけです。PHP も初めてです。

ユーザーが自分のページに渡されると、ページが GET を使用して変数を取得して実行するというクエリがあります。

PHP では、常に mysql_real_escape を使用して変数をサニタイズしてきました。

誰でもこれでセキュリティ上の欠陥を見ることができますか?

// Get USER ID of person
$userID = $_GET['userID'];

// Get persons
$sql = "SELECT * FROM persons WHERE id =$userID";
$q = $conn->query($sql) or die($conn->error());
while($r = $q->fetch(PDO::FETCH_LAZY)){
    echo '<div class="mis-per">';
    echo '<span class="date-submitted">' . $r['date_submitted'] . '</span>';
   // MORE STUF
    echo '</div>';
}
4

4 に答える 4

4

クエリを使用せず、準備を使用します。

http://php.net/manual/de/pdo.prepare.php

$userID = $_GET['userID'];

$sql = "SELECT * FROM persons WHERE id = :userid";

$q = $conn->prepare($sql)
$q->execute(array(':userid' => $userID ));

while($r = $q->fetch(PDO::FETCH_ASSOC)){ 
    echo '<div class="mis-per">'; 
    echo '<span class="date-submitted">' . $r['date_submitted'] . '</span>'; 
   // MORE STUF 
    echo '</div>'; 
} 

SQL ステートメントには、0 個以上の名前付き (:name) または疑問符 (?) パラメーター マーカーを含めることができます。これらのパラメーター マーカーは、ステートメントの実行時に実際の値に置き換えられます。

于 2012-07-12T10:47:58.810 に答える
2

何を使うにしても、を使うかではなく、どのように使うかが重要です。適切に使用する限り、PDO 自体は非常に安全であると私は主張します。

$sql = "SELECT * FROM persons WHERE id =$userID";

良くないね *。より良い :

$sql = "SELECT * FROM persons WHERE id = " . $conn->quote($userID);

より良い :

$q = $conn->prepare('SELECT * FROM persons WHERE id = ?')->execute(array($userID));

* これは悪いことです。これは、 が の場合$userID"1 OR 1"クエリSELECT * FROM persons WHERE id =1 OR 1が常にpersonsテーブル内のすべての値を返すようになるためです。

于 2012-07-12T10:47:01.323 に答える
1

次のように調整します(特に複数のパラメーターがある場合は、最初のものがより明確になると思いますが、Tom van der Woerdt が示唆するように、:userIdまたは単純に使用できます):?

$sql = "SELECT * FROM persons WHERE id =:userID";
$q = $conn->prepare( $sql );
    $q->bindValue( ":userID", $userID, PDO::PARAM_INT ); // or PDO::PARAM_STR, it depends
    $q->execute();
    $r = $st->fetch();
...
...
于 2012-07-12T10:51:27.427 に答える
1

コメントが言うように: Atm SQLI に対するセキュリティはまったくありません。PDO は、(データベース ドライバーがサポートしている場合 (mysql がサポートしている場合)) Prepared Statementsを提供します。これは、コンパイルされて dbms に渡され、後で値が入力されるクエリ テンプレートのようなものと考えてください。使用例を次に示します。

$sql = 'SELECT name, colour, calories
  FROM fruit
  WHERE calories < :calories AND colour = :colour';

 //Prepare the Query

$sth = $dbh->prepare($sql);

     //Execute the query with values (so no tainted things can happen)
$sth->execute(array(':calories' => 150, ':colour' => 'red'));
$red = $sth->fetchAll();
于 2012-07-12T10:49:28.473 に答える