salt (.. sha/md5 ..) , ( ).
, , , , , , , .
:
define('SUPER_SECRET_KEY', 'foobar123'); // our 007 secret key to hash requests against
function generateToken($storeID, $clientID, $orderID) {
return hash('sha256', SUPER_SECRET_KEY . "/{$storeID}/{$clientID}/{$orderID}");
}
function validateToken($token, $storeID, $clientID, $orderID) {
return generateToken($storeID, $clientID, $orderID) === $token;
}
, , . salt , - (, - /clientID/storeID/orderID ).
, nonce salt.
nonces, :
function generateNonce() {
return hash('sha512', mt_rand() . time());
}
function generateLookup($storeID, $clientID, $orderID) {
return hash('sha256', "{$storeID}/{$clientID}/{$orderID}");
}
function generateToken($nonce, $storeID, $clientID, $orderID) {
$lookup = generateLookup($storeID, $clientID, $orderID);
$db->query("INSERT INTO ... (nonce,lookup,expired) VALUES ('$nonce','$lookup','N')");
return hash('sha256', "{$nonce}/$storeID/$clientID/$orderID");
}
function validateToken($token, $storeID, $clientID, $orderID) {
$lookup = generateLookup($storeID, $clientID, $orderID);
$rows = $db->query("SELECT nonce FROM ... WHERE lookup = '$lookup' AND expired = 'N'");
if (count($rows) !== 0) {
$nonce = $rows[0]['nonce'];
$db->query("UPDATE ... SET expired = 'Y' WHERE $lookup = '$lookup' AND nonce = '$nonce'");
return generateToken($nonce, $storeID, $clientID, $orderID) === $token;
}
return false;
}
:
GET
$data =
$token = generateToken(generateNonce(), $data['storeID'], $data['clientID'], $data['orderID']);
POST
if (validateToken($_POST['token'], $_POST['storeID'], $_POST['clientID'], $_POST['orderID'])) {
}
else {
echo "Back, ye filthy hacker!";
}