ホームページ >バックエンド開発 >PHPチュートリアル >PDO アンチ SQL インジェクションの問題について

PDO アンチ SQL インジェクションの問題について

WBOY
WBOYオリジナル
2016-06-23 13:55:33903ブラウズ

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
bindingParam バインドパラメータ

これは、各ラウンドでクエリ文字列を組み立てる必要がなく、SQL を複数回使用できるように準備されています (パラメータのみが異なります)

php には、magic_quotes_gpc が渡されます外部データをエスケープするかどうかを決定するために使用されます
PHP 5.3.6 以降はデフォルトで無効になります
PHP 5.4.0 以降はその存在を無視します
言い換えると、セキュリティの問題はユーザー自身の問題であり、PHP はそれを行うつもりはありませんあなた

使用した
prepare
bindingParam

十分ではありませんか

PDO::quote を使用する必要がありますか


そこで聞きたいのですが

quote replace prepare を使用しないのですか
前処理またはバッチ挿入はできませんか? ?

前処理後に実行する方法と直接クエリを使用する方法があります。
前処理された実行は暗黙的に自動的に実行されます。


前処理後は、execute と direct を使用する 2 つの方法があります
quote はエスケープであり、前処理された実行は暗黙的に自動的に実行されます

クエリの場合は自分で明示的に実行する必要があります

わかりました

でも。 ...

$sql = "INSERT INTO foo (id,name) VALUES ('',:name)";

$stmt = $pdo->prepare($sql);


$stmt->bindParam( ':name', $name);

$name = $pdo->quote($_POST["name"]);


たとえば、次のように入力すると: ピーターの本

でも、なぜ「ピーターの本」として保存されるのですか

これは正常ですか?

出力に何らかの処理を行う必要がありますか?
声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。