0

人々から電子メール アドレスと Web サイトの URL の両方を収集する次のフォームを作成しました。データベースでは、電子メールと Web サイトの URL が一意になるように設定されているため、同じ電子メールと Web サイトを 2 回入力することはできません。

ただし、PHP は初めてなので、フォームに悪意のあることを実行できるような重大な問題がフォームに含まれていないこと、および/または悪用される可能性のある検証の問題がないことを再確認したいと思います。また、ポストバックでフォームを非表示にしたいが、エラーのために再度表示したいので、フォームを複製してしまいましたが、これは理想的ではありませんが、この状況では簡単なフォームであるため大したことではありません。主な要因は、検証がかなり強力であり、フォームにサーバー/SQL 攻撃に関して穴が存在しないことを確認することです。

<?php

if($_SERVER['REQUEST_METHOD'] == 'POST')
{
    // DATABASE CONNECTION HERE

    $email = mysql_real_escape_string($_POST['EMAIL']);
    $website = mysql_real_escape_string($_POST['WEBSITE']);

    if ( $email == '' || $website == '' || !filter_var($website, FILTER_VALIDATE_URL) || !filter_var($email, FILTER_VALIDATE_EMAIL) )
    {
        echo '<p style="color:red;">You must fill out all fields correctly and duplicate emails/websites are not permitted!</p>';

    ?>
        <form action="./" method="post">

            <label for="EMAIL">Email Address</label>
            <input type="email" value="" name="EMAIL" id="EMAIL" required>
            <label for="WEBSITE">Website URL</label>
            <input type="url" value="" name="WEBSITE" id="WEBSITE" required>
            <input type="submit" value="Join" name="join">

        </form>

    <?php

    }
    else
    {
        $query = "INSERT INTO list VALUES (NULL, '$email','$website')";

        $result = mysql_query($query);
        echo '<p>THANKS!</p>';
    }
}
else
{

?>

<form action="./" method="post">

    <label for="EMAIL">Email Address</label>
    <input type="email" value="" name="EMAIL" id="EMAIL" required>
    <label for="WEBSITE">Website URL</label>
    <input type="url" value="" name="WEBSITE" id="WEBSITE" required>
    <input type="submit" value="Subscribe" name="subscribe">

</form>

<?php } ?>
4

2 に答える 2

0

実際のエスケープやURLと電子メールの検証などの重要な機能を使用している限り、これはうまく機能するはずです。がんばり続ける

Thnx

于 2012-08-19T16:04:51.653 に答える
0

これらの検証フィルターを使用して値を検証できます。この手順については、こちらを参照してください

クロス サイト スクリプティングや同様の攻撃ベクトルを防ぐには、検証されていない限り、電子メールや URL をデータベースに挿入しないでください。

于 2012-08-19T15:52:31.657 に答える