0

セキュリティで保護された支払いソリューションとの HTTPS 接続を開始するスクリプトを Web サーバーに持っています。支払いソリューションでは、ユーザーがクレジット カードの資格情報を保存できるため、スクリプトの整合性が必須です。

スクリプトは、Web から、および iPhone アプリケーションによる Web ブラウザーの起動から呼び出されます。エントリにはいくつかの POST 値が必要です。

  • ユーザーID
  • 価値
  • 通貨…など

支払いソリューションで最初のリクエストを生成します。

私の目標は、攻撃を回避するためにスクリプトに送信される POST 値を可能な限り保護することです。これは基本的に、単純な Firebug を使用してエントリに含まれる POST 変数を誰でも見ることができるためです。

スクリプトは HTTPS プロトコル経由で到達します。これは、コンテンツ データを保護するために私が思いついたものです。

if (!empty($_POST)) {

    $uid = $_POST['uid'];
    $nonce = $_POST['nonce'];
    $request_timestamp = $_POST['time'];

    //other useful values ...
}

/*
 * Test 1 : is the nonce correct ? (Example of possible hash)
 */
if (strcmp(md5($uid . $request_timestamp . 'mygrE4TpassPhraZ'), $nonce) !== 0) {
    echo 'Bad nonce';
    exit;
}

/*
 * Test 2 : is the timestamp value acceptable ? 10 seconds maximum here.
 */
if (time() - $request_timestamp > 10) {
    echo 'Request too old';
    exit;
}

/*
 * Test 3 : is this request is the first valid one that I receive with those credentials for this user ?
 */
if (strcmp(User::getOnGoingNonce($uid), $nonce) === 0) {
    echo 'Request already registered';
    exit;
}

//direct database access
User::setOnGoingNonce($uid,$nonce);

/*
 * Finally, chat granted with the payment solution ...
 */

これで十分安全だと思いますか? よりクリーンなソリューションはありますか?

ご意見をお待ちしております。よろしくお願いいたします。

4

1 に答える 1

2

すべてのユーザー入力をサニタイズしてフィルタリングすることは、開発者にとって良い習慣です。その目的のための特別な PHP 関数があり、プログラマーの生活を楽にするために利用できます。といいfilter_var()ます。配列を使用する場合は、filter_var_array(). 詳細はこちらをご覧ください。

したがって、コードの実用的な解決策は次のようになります。

$uid = filter_var($_POST['uid'], FILTER_SANITIZE_NUMBER_INT);
$nonce = filter_var($_POST['nonce'], FILTER_SANITIZE_STRING);
$request_timestamp = filter_var($_POST['time'], FILTER_SANITIZE_STRING);

「uid」は整数で、他の変数は文字列だと思います。ただし、必要なフィルターを選択できます。フィルターの種類についてはこちらをご覧ください。

ユーザー入力をサニタイズするときは、スクリプトが SQL インジェクション攻撃 (XSS 攻撃など) を許可しないことを確認します。

于 2012-05-10T13:18:12.703 に答える