Nonce和时间戳,最好保护POST值?

时间:2012-05-10 12:59:47

标签: php security post https md5

我的网络服务器上有一个脚本,它启动与安全支付解决方案的HTTPS连接。支付解决方案允许用户存储其信用卡凭证,因此脚本的完整性是强制性的。

该脚本是从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 ...
 */

你认为这足够安全吗?你有更清洁的解决方案吗?

非常感谢输入,谢谢你提前。

1 个答案:

答案 0 :(得分:2)

清理和过滤每个用户输入是一个很好的开发人员实践。为此目的有一个特殊的PHP函数,可以使程序员的生活更轻松。它被称为filter_var()。 如果使用数组,则可以使用filter_var_array()。 有关详细信息,请参阅here

因此,代码的实际解决方案应该是这样的:

$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'是整数,其他变量是字符串。但是你可以选择你需要的任何过滤器。有关过滤器的类型,请参阅here

在清理用户输入时,请确保您的脚本不允许SQL注入攻击,例如XSS攻击。