0

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

该脚本是从 Web 和由 iPhone 应用程序启动的 Web 浏览器调用的。它在条目中需要几个 POST 值:

  • 用户身份
  • 价值
  • 货币...等

使用支付解决方案生成初始请求。

我的目标是尽可能保护发送到脚本的 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 回答