我的网络服务器上有一个脚本,它启动与安全支付解决方案的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 ...
*/
你认为这足够安全吗?你有更清洁的解决方案吗?
非常感谢输入,谢谢你提前。
答案 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攻击。