2016-05-14 7 views
0

私はWeb開発コースを利用しています。彼らはこれを行うためのワークショップで私たちを教えるPHP PDOのMySQLでの作業:PHP PDO MySQL count()prepared statement

function countUsers($search) { 
    $and = ''; 
    if ($search != '') { 
     $and = " AND user_name LIKE '%".$search."%'";  
    } 
    $total = $this->db->query("SELECT COUNT(id) as rows FROM users WHERE valid = 1" . $and)->fetch(PDO::FETCH_OBJ); 
    return $total->rows; 
} 

私の視点から、これは完全に間違っている、ステートメントが準備されたものではなく、つながることができ、検証せずにユーザー入力から直接渡されます

function countUsers($search) { 
    $and = ''; 
    $sqlSearch = "%$search%"; 

    if ($search != '') { 
     $and = " AND user_name LIKE :username"; 
    } 

    $sql = "SELECT COUNT(id) as rows FROM users WHERE valid = 1" . $and; 
    $sth = $this->db->prepare($sql); 
    if ($search != '') { 
     $sth->bindParam(':username', $sqlSearch, PDO::PARAM_STR); 
    } 
    $sth->execute(); 
    $total = $sth->fetch(PDO::FETCH_OBJ); 
    return $total->rows; 
} 

は私が間違っている:SQLインジェクションに、私はトレーナーにこれを提案した(私はfetchColumnは()ここでは、より適切であろうが、のは、例のために、このに固執しましょう知っていますか)?彼らは間違っているか、私たちは両方とも間違っていますか?

+3

信頼できないパラメータ(ほとんどすべて)をバインドする必要があります。 – JimL

+2

あなたは完全に正しいです。また、入力が信頼されていても、sqlを破る文字が含まれている可能性があるので、常に準備文を使用して値をプレースホルダにバインドする必要があります。 – jeroen

+0

私はクラスで問題を提起した、彼らは私が正しいと言ったが、これは単なる実例であり、コースの目的はWebセキュリティの20時間を持つ目的ではないため問題ではない。私は彼らが非常に間違っていると思う学生に完全に間違ったと安全でない例を与える。 PDOの 'prepared statements'を利用しない場合は、mysql_ *やmysqli_ *を使用した方が良いでしょう。 – bsteo

答えて

4

はい、あなたは正しいです。

ただし、コードが最適ではありません。事実、準備文はコードをクリーナーにすることを意図しています。私はクリーンアップの

function countUsers($search) { 
    $sql = "SELECT COUNT(id) FROM users WHERE valid = 1 AND user_name LIKE ?"; 
    $sth = $this->db->prepare($sql); 
    $sth->execute(["%$search%"]); 
    return $sth->fetchColumn(); 
} 

一部は単なるトリックです - あなたはいつもLIKE '%%'を検索し(USER_NAMEはしかしnullであるものを除く)すべての行を一致させることができますよう。

しかし、残りはちょうどPDOの適切な使用が備わっています:あなたは常に位置プレースホルダ

  • を使用することができます

    • をあなたは常に(bindParamを回避することができます)あなたは適切なフェッチモード
    • を使用する必要があります
    • を呼び出します
  • +1

    それは配列パラメータでなければなりません: ' - > execute("%$ search% ");' – hjpotter92

    +0

    はい、私のトレーナーの例はバグがありません。 – bsteo

    +0

    @あなたの常識、あなたの 'PDOに関する唯一の正しいガイドは、私をPDOの適切な使用について非常に重要なものにしました。 – bsteo

    関連する問題