0

マスターの皆さん、こんばんは。私が使用している古い「友達に知らせる」PHP スクリプトのスパム セキュリティを強化する方法を探しています。先週は、1 分以内に 60 回も使用され、サーバーに過負荷がかかるスパム ボットの被害者でした。私の質問は、おそらくIPを保存するか、Cookieを使用して、最も簡単または最も簡単な方法で変更する方法です。たとえば、同じユーザーが1分以内に3回以上使用できないようにするか、またはより良い提案があれば、それは大歓迎です;]

これは、スクリプトをロードする HTML ページです: (HTML も古くなっています。私はそれに取り組んでいます)

<html>
<head>
    <title>Tell a Friend</title>
    <meta name="robots" content="noindex, nofollow" />
    <script language="javascript">
    function reset() {
        document.tellafriend.name.value="";
        document.tellafriend.email.value="";
        document.tellafriend.fmail1.value="";
        document.tellafriend.fmail2.value="";
        document.tellafriend.fmail3.value="";
    }
    function validate() {
        if (document.tellafriend.fmail1.value.length==0) {
            alert("Oops! you'll need to enter a friend's email address");
            return false;
        }
        if (document.tellafriend.email.value.length==0) {
            alert("Oops! you forget to enter your email address");
            return false;
        }
        if (document.tellafriend.name.value.length==0) {
            alert("Oops! you forgot to enter your name");
            return false;
        }
        document.tellafriend.submit()
        return true;
    }
    </script>
</head>
<body onLoad="reset()"> 
    <table>
        <tr>
            <td>
                <span>Complete the details below to send this link to a friend:</span>
                <? $refurl = $_SERVER['HTTP_REFERER']; ?>
                <span><? print $refurl;?></span>
                <form name="tellafriend" action="tellafriend.php" method="post" onSubmit="return checkfields()">
                    <table>
                        <tr>
                        <td> Your name*:</td>
                            <td>
                                <input name="name" size="30" maxlength="45">
                            </td>
                        </tr>
                        <tr>
                            <td>Your email*:</td>
                            <td>
                                <input name="email" size="30" maxlength="45">
                            </td>
                        </tr>
                        <tr>
                            <td colspan="2">
                                <p align="center">Enter your friend's email addresses:</p>
                            </td>
                        </tr>
                        <tr>
                            <td>Email 1*:</td>
                            <td>
                                <input name="fmail1" class="bordesolid1" size="30" maxlength="50">
                            </td>
                        </tr>
                        <tr>
                            <td>Email 2*:</td>
                            <td>
                                <input name="fmail2" size="30" maxlength="50">
                            </td>
                        </tr>
                        <tr>
                            <td>Email 3*:</td>
                            <td>
                                <input name="fmail3" size="30" maxlength="50">
                            </td>
                        </tr>
                        <tr>
                            <td colspan="2">
                                <p align="center">
                                <span>This message will contain your name &amp; email address.</span><br>
                                <input onclick="validate();" type="button" value="click once to send">
                                <input type=hidden name=refurl value="<? print $refurl;?>"> 
                            </td>
                        </tr>
                    </table>
                </form>
            </td>
        </tr>
    </table>
</body>
</html>

これは PHP スクリプト (tellafriend.php) です。

<?php
if(count($_POST)) {
    foreach(array('fmail1','fmail2','fmail3','email','name') as $key) $_POST[$key] = strip_tags($_POST[$key]);
    if(!is_secure($_POST)) {
        die("Peace People! Stop Spamming!");
    }
    $emailto = "admin@domain.com"; 
    $esubject = "Recommendation form submission"; 
    $emailtext = "$_POST[name] has used your recommendation form using an email address of $_POST[email].
    The people the recommendation has been submitted to are:
    $_POST[fmail1]
    $_POST[fmail2]
    $_POST[fmail3]
    The page recommended:
    $_POST[refurl]";
    @mail("$emailto", $esubject, $emailtext, "From: $_POST[email]");
    $thankyoupage = "thankyou.htm"; 
    $tsubject = "A web page recommendation from $_POST[name]";
    $ttext = "Hi, $_POST[name], whose email address is $_POST[email] thought you may be interested in this web page. 
    $_POST[refurl];
    @mail("$_POST[fmail1],$_POST[fmail2],$_POST[fmail3]", $tsubject, $ttext, "FROM: $_POST[email]");
    header("Location: $thankyoupage");
    exit;
}
function is_secure($ar) {
    $reg = "/(Content-Type|Bcc|MIME-Version|Content-Transfer-Encoding)/i";
    if(!is_array($ar)) {
        return preg_match($reg,$ar);
    }
    $incoming = array_values_recursive($ar);
    foreach($incoming as $k=>$v) if(preg_match($reg,$v)) return false;
    return true;
}
function array_values_recursive($array) {
    $arrayValues = array();
    foreach ($array as $key=>$value) {
        if (is_scalar($value) || is_resource($value)) {
            $arrayValues[] = $value;
            $arrayValues[] = $key;
        }
        elseif (is_array($value)) {
            $arrayValues[] = $key;
            $arrayValues = array_merge($arrayValues, array_values_recursive($value));
        }
    }
    return $arrayValues;
}
?>

ミリオン様、ご協力ありがとうございます。誰かが私に、より優れたセキュリティを備えた別の(シンプルな)ものを勧めてくれれば、それも素晴らしいでしょう.

4

1 に答える 1

0

1)メールアドレス(送信者と受信者の両方)が有効であることを検証する必要があります(それを確認するために利用できる正規表現はたくさんあります)-防弾ではありませんが、それはステップです.

2) 単純なしきい値: 送信者の IP アドレスと紹介メール リクエストが送信された日付を追跡する DB テーブルを作成します。リクエストを承認する前に、過去 Y 分間に同じ IP を持つ X 行がテーブルにないことを確認してください

3) 送信者が人間であることを検証するためのキャプチャを追加します (スパムを送信するには、より多くの労力が必要です)。

より複雑なソリューションでは、スパマーのパターンを追跡および分析する必要があります。さまざまな IP アドレスが多数あり、ブロックできる特定の国から来ている可能性があります。多くの送信者の類似した電子メール アドレスですか? 等。

于 2013-10-06T17:56:07.037 に答える