web-dev-qa-db-ja.com

フォーム検証-セキュリティおよび入力仕様

それで、私は登録フォームに取り組んでおり、名前、ユーザー名、電子メール、パスワードの4つのフィールドがあります。 jQueryでこれらのフィールドの値を取得し、すべてのフィールドが入力されているかどうかに応じて、ajaxを介してPHPスクリプトに渡します。フォームの検証では安全ですか?ユーザーがデータを操作するのが心配でした。

さらにPHPスクリプトで、投稿されたすべての値にデータが含まれているかどうかを確認します。その場合のみ、いくつかの検証を行います。検証は、それが最善ではなく、多くの欠陥があると心配している部分です。

$name = $_POST['name'];
$username = $_POST['username'];
$email = $_POST['email'];
$password = $_POST['password'];

if (!preg_match("/^[A-Za-z '-]+$/i", $name)) {
    $errors = "Please enter a valid name.";
} else if (!preg_match("/^[A-Za-z]+\s[A-Za-z]+$/", $name)) {
    $errors = "Please enter your first and last name.";
} else if (strlen($username) <= 3 || strlen($username) > 15) {
    $errors = "Please pick a username between 4 - 15 characters. Be creative.";
} else if (!preg_match("/^[A-Za-z][A-Za-z0-9_.-]{4,15}$/", $username)) {
    $errors = "Please pick an alphanumeric username between 4 - 15 characters.";
} else if (filter_var($email, FILTER_VALIDATE_EMAIL) === false) {
    $errors = "Please enter a valid email.";
} else if (strlen($username )< 6 || strlen($username) > 32) {
    $errors = "Your password must atleast be 6 characters.";
} else {
    echo "valid";
}

これらの検証手順は安全ですか?ユーザーがデータを操作できるループホールはありますか?

フィールドの要件は次のとおりです-私は自分のコードで頭にぶつかったかどうかはわかりません:

  • ユーザー名には、アンダースコア付きの英数字を使用する必要があります(オプション)
  • 名前には姓と名の両方が必要です
1
Elmer

上記のチェックでおそらくほとんどの攻撃をブロックしますが、その後データを安全なものとして扱うべきではありません。ここでの実際の問題は、上記の検証ではなく、この後のデータで何をするかです。

たとえば、この「検証済み」データをSQLステートメントで使用し、使用前に適切にエスケープしない限り、攻撃に対して開かれる$password varを単純に挿入する場合です。

さらに、過度に制限されています。ちなみに、私の名前に3つの部分がある場合は、仕様では無効になります。

補足:$usernameの代わりに$passwordを検証しています。

2
vollie