2

ヘルプ!以下のコードに似たものを使用して、mySQL データベースを更新するコードをいくつか書いています。

$.post('http://myURL.com/vote.php?personID=' + personID + '&eventID=123');

vote.php コードはクエリ文字列の値を取得し、それらの値を含むレコードをデータベースに挿入します。

この種のコードは問題なく動作しますが、次のようなコードを入力するだけで問題が発生することに気付きました。

http://myURL.com/vote.php?personID=5&eventID=123

アドレスバーに入力し、本質的にアプリをスパムします...

これが起こらないようにする簡単な方法はありますか?私はこれらのテクノロジーにかなり慣れていないので、すべてがどのように機能するか、またはどのように適合するかはわかりませんが、すばやく学習しているので、ポインターは非常に役立ちます.

4

3 に答える 3

3

データベースに送られるデータに GET パラメータを使用することはお勧めできません。通常、URL に表示されない POST パラメーターを使用します。代わりに:

$.post('http://myURL.com/vote.php?personID=' + personID + '&eventID=123');

次のようにします。

$.post('http://myURL.com/vote.php', { "personID" : personID, "eventID" : 123 });

$_POSTPHP スクリプトでは、次のような配列を使用してデータにアクセスします。

$personID = $_POST['personID'];
$eventID = $_POST['eventID'];

ただし、データベースに保存する前に入力を適切にフィルタリングして、 SQL インジェクションなどの悪いことを防ぐことを忘れないでください。

これは特効薬ではありません。任意の HTTP クライアントが投稿リクエストをサイトに送信できるため、スパムの可能性は依然としてあります。あなたが見ることができるもう一つのことは、スパムに対する脆弱性をさらに少なくするためのセキュリティトークンです. または、リクエスト/分/ユーザーの数を制限するシステムを実装します...しかし、元の質問から遠すぎます。

于 2012-06-04T12:41:21.020 に答える
0

POST を使用しているか GET を使用しているかにかかわらず、 を使用してページ内の重要なフィールドに署名することを常に検討できますhash_hmac。これにより、他の誰も推測できない署名を追加することで、人々がその値を検出されずに変更することを防ぎます。

これはまた、CSRF をより困難にしますが、修正技術のために不可能ではありません。これは、「フィドラー」にとってより困難にするために配置できる、さらに別の手法です。

次の関数は、特定の人物 ID にソルトと署名を追加して、セキュリティで保護された文字列を形成します。

define('MY_SECRET', 'an unguessable piece of random text');

function getSecurePersonId($personId)
{
    $rnd = uniqid("$personId-", true);
    $sig = hash_hmac('sha1', $rnd, MY_SECRET);

    return "$rnd-$sig";
}

の出力getSecuredPersonId()を JavaScript に渡して、$.post()または$.get();のデータとして渡します。ところで投稿することをお勧めします。

フォームが送信されると、個人 ID はリクエスト方法に応じて$_GET['personID']またはになります。$_POST['personID']指定された値を検証するには、次の関数を実行します。

function validateSecurePersonId($securePersonId)
{
    if (3 != count($parts = explode('-', $securePersonId))) {
        return false;
    }
    // reconstruct the signed part
    $rnd = "{$parts[0]}-{$parts[1]}";
    // calculate signature
    $sig = hash_hmac('sha1', $rnd, MY_SECRET);

    // and verify against given signature
    return $sig === $parts[2] ? $parts[0] : false;
}

値が適切に署名されている場合、最初に使用した元の人物 ID が返されます。失敗した場合は を返しfalseます。

小さなテスト:

$securePersonId = getSecurePersonId(123);
var_dump($securePersonId);

if (false === validateSecurePersonId($securePersonId)) {
    // someone messed with the data
} else {
    // all okay
}
于 2012-06-04T13:07:48.307 に答える
0

$.post の正しい構文は

$.post(url,data_to_send,callback_function)

この方法を使用すると、ユーザーはサイトに損害を与えることができなくなります。

$.post('http://myURL.com/vote.php',{"personID":personID,"eventID":123);
于 2012-06-04T12:34:00.533 に答える