4

重複の可能性:
PDOプリペアドステートメントはSQLインジェクションを防ぐのに十分ですか?

私が数日間取り組んできた新しいAPIの展開に関する私の主な関心事は、セキュリティです。

私はPDOの使用法の初心者ですが、主な構造を知っています。しかし、SQLInjectionからクエリを保護する方法がわかりません。

私のコードは以下のとおりです。

<?php
    $Start = new Db();
    class Db 
    {
        private $dbh = null;

        public function __construct()
        {
            $this->dbh = new PDO('mysql:host=localhost;dbname=pdo', 'root', 'xxxxx');
        }

        public function PDOFetch($Var)
        {
            $sth = $this->dbh->prepare("$Var");
            $sth->execute();
            $result = $sth->fetchAll();
            return $result; 
        }

        public function PDONumb ($Var)
        {
            $sth = $this->dbh->prepare("$Var");
            $sth->execute();
            $count = $sth->rowCount();
            return $count;
        }

        public function PDODel ($Var)
        {
            $Delete = $this->dbh->exec("$Var");
            return $Delete;
        }

        public function PDOQuery ($Var)
        {
            $Query = $this->dbh->query("$Var");
            return $Query;
        }
    }
?>

SQLインジェクションやその他の脆弱性から保護するにはどうすればよいですか?

編集:

APIに渡されるクエリは、たとえば「index.php」ページから実行されます。

行は次のようになります。

    $Num = $Start->PDONumb("SELECT * FROM news");

しかし後で、私がこれで私のトラックをカバーしたとき。これを使用してさらに高度に進みたいので、ユーザーが定義する変数を渡します(したがって、SQLインジェクションの質問)

ただし、現時点では、渡されるクエリは管理者によって定義されています。

4

1 に答える 1

4

渡されているSQLを見ないとわかりません。信頼できないデータを使用して安全でないSQLステートメントを作成している場合は、それらがPDOで実行されるかどうかは関係ありません。あなたはまだSQLインジェクションにオープンです。

たとえば$userid、Webから取得してビルドする場合、次のようになります。

$sql = "SELECT * FROM users WHERE userid=$userid";

そのSQLステートメントはSQLインジェクションに対して開かれています。これは、の値が$userid、の場合、0; DROP TABLE users;作成するSQLは次のようになるためです。

SELECT * FROM users WHERE userid=0; DROP TABLE users;

PDOを介して実行するかどうかは関係ありません。悪意のあるユーザーから送信されたコードを実行していることになります。

PDOを適切に使用するには、パラメータをバインドする必要があります。


あなたの質問とは関係ありませんが、初心者がよく遭遇する重要なポイント:単一の変数を二重引用符で囲む必要はありません。あなたのコード

$Delete = $this->dbh->exec("$Var");

次のように書く方が良いでしょう

$Delete = $this->dbh->exec($Var);
于 2012-12-02T15:55:46.483 に答える