0

エスケープ文字列を使用したり、変数をバインドしたりするなど、3 つの変数を保護するために何かする必要がありますか? これを正しく行ったかどうかはわかりませんが、人々は準備済みステートメントの使用を推奨しているだけなので、それらを理解しようとしています。

$order = $_POST['order'];
$heading = $_POST['heading'];
$content = $_POST['content'];    
try {
$dbh = new PDO("mysql:host=$hostname;dbname=saintfiv_faq", $username, $password);
/*** echo a message saying we have connected ***/
echo 'Connected to database<br />';

/*** INSERT data ***/
$stmt = $dbh->prepare("INSERT INTO faq(`order`, `heading`, `content`) VALUES (:order, :heading, :content)");
$stmt->bindParam(':order', $order, PDO::PARAM_INT);
$stmt->bindParam(':heading', $heading, PDO::PARAM_STR, strlen($heading));
$stmt->bindParam(':content', $content, PDO::PARAM_STR, strlen($content));
/*** close the database connection ***/
$stmt->execute();
}
catch(PDOException $e)
{
echo $e->getMessage();
}
4

2 に答える 2

2

コードで準備済みステートメントを使用していません。準備されたステートメントは、次のようになります。

$stmt = $db->prepare("INSERT INTO foo (bar, baz) VALUES (?, ?);");

$stmt->bindValue(1, "Fez");
$stmt->bindValue(2, "Hat");
$stmt->execute();

サンプル コードは、変数を直接 SQL 文字列に挿入しているだけなので、SQL インジェクションに対して脆弱である可能性があります。準備されたステートメントを使用して値をバインドするか (これが推奨される解決策です)、またはすべての入力をexec()正しくエスケープするようにします。

exec()また、完全にハードコードされたステートメント (たとえば、$db->exec("SELECT foo FROM bar;");SQL がハードコードされているため、SQL インジェクションの可能性はない) には問題ないことにも言及する価値があるかもしれません。ただし、スタイルの問題として、代わりに常に使用するのが好きです。prepare

コードでクエリを具体的に実行するには、次のようにします。

$stmt = $db->prepare("INSERT INTO faq (`order`, `heading`, `content`) " .
    "VALUES (?, ?, ?);");

$stmt->bindValue(1, $order);
$stmt->bindValue(2, $heading);
$stmt->bindValue(3, $content);
$stmt->execute();

また、公式の PHP ドキュメントもお勧めします。同じことを行う他の方法がいくつか示されているためです (つまり、パラメーターをexecute()個別にバインドするのではなく、配列として渡すことができます): http://php.net/manual/en /pdo.prepare.php .

于 2013-06-27T22:42:33.723 に答える
1

絶対にそれらを保護する必要があります-そうしないと、誰かが「アマダノンの見出し」の見出しを入れる可能性があります-そして、アポストロフィはデータベースを閉じた引用として見ます. これは不注意な例です。データベースを攻撃しようとする人もいます。

これを行うための推奨される (1) 方法は、パラメーターを使用することです。を使用してVALUES(?,?,?)から、execute を呼び出すときに、そこに変数を渡します。

詳細については、PHP のマニュアルを読んで、例を確認してください。

私はバインドされた変数が好きではありません。どこで何が起こっているのかを理解するのは難しすぎます。

これは、(SQL ステートメントを使用して) カーソルを一度準備すれば、それをさまざまなパラメーターで何度も使用できることも意味します。

エスケープは許容されますが、どこにメリットがあるのか​​ わかりません。パラメーターはより明確です。

(1) 私が

于 2013-06-27T22:46:29.817 に答える