9

重複の可能性:
最高の PHP 入力サニタイズ関数は何ですか?

htmlspecialchars() を入力/出力の HTML サニタイズに使用していますか? MySQL データベースの設計が悪いのですか?

代わりに、これらの「危険な」兆候を許可しないでください。これは、b-tag、i-tag などを引き続き表示するためですか? そして、どうやってそうするのですか?

ウィキhttp://en.wikipedia.org/wiki/HTML_sanitizationに書いてあるので聞いています

「HTML サニタイズは、ユーザーが送信した HTML コードをサニタイズすることで、クロスサイト スクリプティングや SQL インジェクション攻撃から保護するために使用できます。」

そのため、PDO プリペアド ステートメントを使用する以外に、SQL インジェクションを防ぐために、すべての入力と出力にこの htmlspecialchars を使用したいと考えています。しかし、多分私は何か他のものを使うべきですか?

たとえば、これは挿入ステートメントを実行する良い方法ですか?:

$type= htmlspecialchars($_POST['animaltype']);
$name= htmlspecialchars($_POST['animalname']);
$age= htmlspecialchars($_POST['animalage']);        
$descr= htmlspecialchars($_POST['animaldescription']);
$foto= htmlspecialchars($_POST['animalfotourl']);
$date=htmlspecialchars($_POST['animalhomelessdate']);



$sqlquery  = "INSERT INTO animals_tbl(animaltype, animalname, animalage, animaldescription, animalfotourl, animalhomelesssince) VALUES (':type',':name',':age',':descr', ':foto', ':date')";


$stmt = $conn->prepare($sqlquery);
$stmt->bindParam(':type',$type, PDO::PARAM_STR);
$stmt->bindParam(':name',$name, PDO::PARAM_STR);
$stmt->bindParam(':age',$age, PDO::PARAM_INT);
$stmt->bindParam(':descr',$descr, PDO::PARAM_STR);
$stmt->bindParam(':foto',$foto, PDO::PARAM_STR);
$stmt->bindParam(':date',$date, PDO::PARAM_STR);

$stmt->execute();
4

2 に答える 2

17

htmlspecialchars()ブラウザのテキストをエスケープするには十分です。これにより、他のサイト ユーザーが XSS 攻撃から保護されます。

ただし、データを表示するときにのみこの関数を実行します。エスケープされたコンテンツをデータベースに保存することは、私には貧弱な設計のように思えます。データベースには、変更されたコンテンツではなく、実際のコンテンツを保存する必要があります。各レイヤーで必要に応じてエスケープします。


これが悪い考えである理由を説明するために、JSON 駆動型 API の実装に取り​​組んでいる Web サイトを考えてみましょう。HTML でエンコードされたデータをデータベースに保存している場合、2 つの選択肢があります。(a) JSON 応答に HTML でエンコードされたデータを含める (これは意味がありません)、または (b) JSON の前に HTML を元の形式にデコードします。 -それをエンコードします。どちらの選択も最適ではありません。

データはデータベースに入れられ、JSON 文字列は JSON ドキュメントに入れられ、HTML エンコードされたデータは HTML ドキュメントに入れられます。それらを混ぜないでください!

于 2013-01-03T23:25:33.273 に答える
-2

適切に使用された準備済みステートメントを使用して PDO を使用する場合、入力をサニタイズする必要はありません。ただし、XSS 攻撃を受けないようにするために、DB に入れる前に htmlspecialchars を使用します。

于 2013-01-03T23:24:30.670 に答える