0

INSERT INTOを使用してMySQLクエリを実行し、本番DBにデータを格納するPHPフォームを作成するのはこれが初めてです。これは「安全」に合格するのでしょうか、それともやり過ぎですか?

$orderText = $mysqli->real_escape_string(stripslashes(htmlentities((!isset($_POST["order_text"])?"undefined":$_POST["order_text"]))));
$stmt = $mysqli->prepare("INSERT INTO testtable (order_text) VALUES (?)");
$stmt->bind_param('s',$orderText);
$stmt->execute();

SELECT *の欠如が、私が直面しているリスクの量にどのように影響するかはわかりませんが、INSERTのみを使用するスクリプトの方が安全なようです。本当ですか?

4

4 に答える 4

2

3行目で行う可変バインディングは、一般的なインジェクション攻撃を防ぐのに十分です。バインドは良い考えであり、私の意見では、常に実行する必要があります。セキュリティ上の利点があるだけでなく、パフォーマンスも向上します。

1行目で追加の解析を実行することは実際には不利であると私は主張します。それは複雑さを増し、一部の攻撃は既知のデータ変換を利用しますが、バインディングを使用するとそれらも軽減されます。

于 2012-02-07T00:56:39.350 に答える
2

あなたの質問には多くの誤った仮定があります。

  1. 確かにやり過ぎです。非常に読みにくい無数のネストされた演算子ステートメント
    を調べてみましょう。

    • 「未定義」という単語を保存しても意味がありません。データベースには、未定義フィールド用の特別なマーク (NULL 値) があります。または、単に空の文字列で十分です。
    • 無条件のストリップスラッシュはセキュリティには何も追加しませんが、データを台無しにする可能性があります。
    • htmlentities は SQL セキュリティとは何の関係もありませんが、他の側面でサイトのセキュリティに役立つ可能性があり、同様にデータを台無しにする可能性があります。
    • エスケープはセキュリティに何も追加せず、データを台無しにします。
  2. あなたは間違った方向から問題を取り上げています。
    主な目標は、クエリを適切にフォーマットすることです。架空の「攻撃者」から防御するのではなく、最も正直なデータで誤動作を防ぎます。適切にフォーマットされたクエリは、副作用としてさまざまな攻撃に対して無防備になります。
    たとえば、real_escape_string はセキュリティとは何の関係もありません。文字列をフォーマットするためだけに使用されます。クエリには文字列 (引用符で囲まれたデータ) はありません。したがって、この関数はまったく役に立ちません (さらには有害です)。

  3. 実際、INSERT によるインジェクションは、SELECT によるインジェクションと同じくらい悲惨です。

最後に、正しいコードは次のようになります

$stmt = $mysqli->prepare("INSERT INTO testtable (order_text) VALUES (?)"); 
$stmt->bind_param('s',$_POST["order_text"]); 
$stmt->execute(); 

注文テキストをサイトに印刷するときは、htmlspecialchars()

それで全部です。

于 2012-02-07T03:04:22.983 に答える
1

私は、クライアント、あなたの訪問者から来るすべてのものを脅威として扱うことをお勧めします。リラックスせず、一部のSQLクエリのみに焦点を当てます。良い習慣を身につけることには制限がありません。

于 2012-02-07T00:54:27.470 に答える
1

チャールズに同意します.paramをバインドすることで、変数を適切にエスケープしてSQLインジェクション攻撃の可能性を排除しています.1行目の複雑さはやり過ぎです. PDOにジャンプすると、これが明らかになります。特定の $dbo->escape() 呼び出しがないためです。エスケープ作業は prepare() / bind() 呼び出しで既に完了しているためです。

于 2012-02-07T01:07:11.557 に答える