ホームページ >バックエンド開発 >PHPチュートリアル >PDO アンチ SQL インジェクションの問題について
PHP はまだ初心者です。私は最近 PDO に切り替えたばかりです
mysql_real_escape_string
を使用していることは知っていましたが、最近、PDO は mysql_connect ( )使用できます
また、前処理と連携するには、bindParam やその他の書き込みメソッドを使用する必要があることもわかっています
$stmt = $dbh->prepare ("INSERT INTO user (firstname, lastname) VALUES (:f- name, :s-name)");
$stmt ->bindParam(':f-name', 'John');
$stmt ->bindParam(':s-name', 'Smith');
$stmt -> ;execute();
bindingParam が十分に安全かどうかを尋ねたいのですが
質問 2
mysql_real_escape_string? mysql_real_escape_string の処理後... ..データベースに書き込むとき
Tom's Book は PHP では Tom's Book として表示されます
ただし、データベースに書き込むときは Tom's Book のみが保存されます
表示されると非常に便利ですフォアグラウンドでは、結局のところ、純粋な SELECT なので、セキュリティの問題はないはずです...
しかし、ここで問題が発生します
bindingParam は自動的にエスケープされ、データベースにも保存されるため、フロントエンドでstripslashes()が必要な場所を知っていますか? この関数の難易度はあらゆる場所で増加していますか?
この質問には 3 つの可能性しかありませんね
1. PDO には SQL インジェクションを防ぐ他の方法がありますか?保存するときに「」記号を保存する必要がありますか?
2. 設定ファイルに何か追加する必要がありますか? サイト全体にstripslashes() を追加するのは不可能だと思いますか?
3. 正直に言うと、日付またはカテゴリ ID を 1 つずつ追加してください
また、アドバイスをお願いします
$stmt = $dbh->prepare ("INSERT INTO user (firstname, lastname) VALUES (:f-name? , :s-name)");
$stmt ->bindParam(':f-name', 'John');
$stmt ->bindParam(':s-name', 'Smith');
$stmt ->execute();
"?" を使用する場合を除いて、このタイプの記述は妥当ですか?
また、公式は PDO を使用し、5.3.6 にアップグレードする必要があると示唆しています。 5.4 に直接アクセスする必要がありますか?
ディスカッションへの返信 (解決策)
私は本当に初心者で、PDO::quote メソッドの存在をまだ知りません
PDO は 5.3.6 まで実用的な価値がないため、PDO を使用するには 5.3.6 にアップグレードする必要があります。以前のバージョンにはすべて、さまざまな深刻な問題があります
prepare prepare php には、magic_quotes_gpc が渡されます外部データをエスケープするかどうかを決定するために使用されます
PHP 5.3.6 以降はデフォルトで無効になります
PHP 5.4.0 以降はその存在を無視します
言い換えると、セキュリティの問題はユーザー自身の問題であり、PHP はそれを行うつもりはありませんあなた
使用した
prepare
bindingParam
十分ではありませんか
そこで聞きたいのですが
quote replace prepare を使用しないのですか
前処理またはバッチ挿入はできませんか? ?
前処理後に実行する方法と直接クエリを使用する方法があります。
前処理された実行は暗黙的に自動的に実行されます。
前処理後は、execute と direct を使用する 2 つの方法があります
quote はエスケープであり、前処理された実行は暗黙的に自動的に実行されます
わかりました
でも。 ...
$stmt = $pdo->prepare($sql);
$stmt->bindParam( ':name', $name);