- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
$hash = md5($eshopId."::".
$orderId."::".
$_REQUEST["serviceName"]."::".
$_REQUEST["eshopAccount"]."::".
$_REQUEST["recipientAmount"]."::".
$_REQUEST["recipientCurrency"]."::".
$_REQUEST["paymentStatus"]."::".
$_REQUEST["userName"]."::".
$_REQUEST["userEmail"]."::".
$_REQUEST["paymentData"]."::".
$secretKey);
if (strtoupper($_REQUEST["hash"]) != strtoupper($hash)) {
die('Err: wrong hash.');
}
......
bormand 11.08.2012 04:44 # +2
P.S. Разве что на implode("::", array(..тут все поля...)) заменить.
bormand 11.08.2012 04:53 # 0
Sulik78 11.08.2012 06:21 # −2
ну или хотя бы уже
implode('::', $_REQUEST)
dev6alexander 11.08.2012 07:26 # +2
Elvenfighter 11.08.2012 10:52 # +2
bormand 11.08.2012 13:25 # 0
Ну авторы платежной системы указали в документации, что считать его нужно именно так. И обсуждать "почему именно так" бессмысленно. Это требование платежной системы. Да и по опыту работы с одной из них скажу - та же хрень, только в профиль, поля немного другие.
> implode('::', $_REQUEST)
Ни в коем случае. В хеше важен порядок, и некоторые поля (да тот же $secretKey) в реквесте не размещены.
bormand 11.08.2012 13:41 # +3
Данная схема - типичный MAC (http://en.wikipedia.org/wiki/Message_authentication_code) основанный на хэш функции. $secretKey известен только данному серверу и серверу платежной системы. Злоумышленник не знает $secretKey, поэтому он не сможет сформировать поддельное сообщение.
P.S. Смысла упрощать данный код не вижу. В данном состоянии (если причесать отступы, и сделать implode("::", array(...)) вместо конкатенации) он вполне читаем и верифицируем.
Lowezar 12.08.2012 23:02 # +1
1. порядок полей;
2. даже если лишних параметров не пришлют - сюда же попадёт присланный $_REQUEST['hash'], с которым, собственно, сравнить надо;
3. не видно, какие поля должны использоваться.
...Я мог, наверное, промолчать и дать разобраться "зачем?" самому, но у нас как раз на днях тоже так "оптимизировали" не подумав. За день до релиза.
Работает - не трожь. ©
Sulik78 13.08.2012 21:34 # −2
имел ввиду сформированный "ручками" массив вместо $_REQUEST.
Sulik78 14.08.2012 02:24 # −1
ну а раз уж modx то вообще надо в массив обернуть функцию и засунуть туда класс.
bormand 14.08.2012 05:36 # +2
Плюс ко всему - этот вариант "поедает" предупреждения интерпретатора - в оригинальном коде, если бы мы опечатались или платежники убрали поле, в лог бы выдалось предупреждение, здесь же мы предупреждения не получим, и код молча прохеширует имя поля вместо его значения.