私は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は()ここでは、より適切であろうが、のは、例のために、このに固執しましょう知っていますか)?彼らは間違っているか、私たちは両方とも間違っていますか?
信頼できないパラメータ(ほとんどすべて)をバインドする必要があります。 – JimL
あなたは完全に正しいです。また、入力が信頼されていても、sqlを破る文字が含まれている可能性があるので、常に準備文を使用して値をプレースホルダにバインドする必要があります。 – jeroen
私はクラスで問題を提起した、彼らは私が正しいと言ったが、これは単なる実例であり、コースの目的はWebセキュリティの20時間を持つ目的ではないため問題ではない。私は彼らが非常に間違っていると思う学生に完全に間違ったと安全でない例を与える。 PDOの 'prepared statements'を利用しない場合は、mysql_ *やmysqli_ *を使用した方が良いでしょう。 – bsteo