2009-08-08 10 views
3

I read that you do not need to validate or sanitize user's inputを理解する。プリペアドステートメントを使用する場合は、準備済みステートメントのユーザーデータの妥当性を理解するために

しかし、これは次の例で私には分かりません。

ユーザーが電子メールアドレスを指定します。

私は通常、この

検証コード

// to validate data 
if (!filter_var($_POST['email'], FILTER_VALIDATE_EMAIL)) { 
    header("Location: index.php"); 
    die("Wrong email-address"); 
} 
を実行する文がなくて

コードを次のように我々は、我々が準備された文を使用している場合、データを検証する必要がないと言う

検証コード

// to get email-address nad passhash from the db 
$result = pg_prepare($dbconn, "query2", 'SELECT email, passhash_md5 
    FROM users WHERE email = $1 
    AND passhash_md5 = $2;'); 
$result = pg_execute($dbconn, "query2", array($_POST['email'], $_POST['password'])); 
if(!$result) { 
    echo "An error occurred"; 
    exit; 
} 

pg_preparepg_executeを使用しているため、検証コードが必要かどうかはわかりません。

プリペアドステートメントを使用する場合は、ユーザーの入力の検証とサニタイズを検討する必要がありますか?

+0

ありがとうございました! –

答えて

6

データを検証する必要がありますが、データをサニタイズする必要はありません。

プリペアドステートメントを使用すると、悪質なコードが挿入されることはなくなりますが、そのフォームが意味を成立するかどうかはチェックされません。

3

プリペアドステートメントは悪意のある意図を処理しますが、ユーザーが期待していることを入力しているかどうかは、依然としてあなた次第です。

例:電話番号を要求するフォームがある場合、「jkl; asdgfjkladg」と入力したユーザーはデータベースに何の影響も与えませんが、そのデータは役に立たないものです。

あなたがしなければならないことをユーザーが信じてはいけません。ユーザーからの入力を受け入れる場合は、正しいことを確認するために検証します。

4

検証と除外を区別することが重要です。

妥当性検査は、ユーザーが正しいタイプまたはデータ形式を入力していることを確認しています。たとえば、Webフォームでは、選択した入力の応答をハッキングして、指定した選択肢に表示されない値を送信できます。妥当性を検証することでこのエラーが発生し、適切なエラーメッセージがユーザーに返されます。また、ユーザーは、数値を必要とするフィールドに文字列を入力することもできます。クエリを実行する前にこれをチェックしないと、クエリが失敗し、原因を特定してユーザーにエラーメッセージを提供するのが難しくなります。

サニタイズは、データベースに追加された(または後でウェブサイトに表示され、XSS攻撃などの原因で)データが損害を与えないことを確認しています。クエリINSERT INTO people (names) VALUES('$name')は、$name = "O'Reilly"の場合は失敗しますが、パラメータとして文字列をバインドするときに、プリペアドステートメントが自動的に一重引用符をエスケープします。異なる文字セットを使用する場合は、問題を引き起こす可能性のある引用符とスラッシュ文字以外にも、SQLインジェクション攻撃を可能にすることがあるため、これは特に重要です。

実際に電子メールアドレスを入力していることを確認するには、検証コードを保持する必要があります.PostgreSQLは、入力されたデータが電子メールアドレスであるとは考えておらず、それに。

関連する問題