«двоичный сейф» означает, что любые байты можно безопасно сравнивать с strcmp
, а не только действительными символами в некотором наборе символов. Быстрый тест подтверждает, что strcmp
не защищены от атак синхронизации:
$nchars = 1000;
$s1 = str_repeat('a', $nchars + 1);
$s2 = str_repeat('a', $nchars) . 'b';
$s3 = 'b' . str_repeat('a', $nchars);
$times = 100000;
$start = microtime(true);
for ($i = 0; $i < $times; $i++) {
strcmp($s1, $s2);
}
$timeForSameAtStart = microtime(true) - $start;
$start = microtime(true);
for ($i = 0; $i < $times; $i++) {
strcmp($s1, $s3);
}
$timeForSameAtEnd = microtime(true) - $start;
printf("'b' at the end: %.4f\n'b' at the front: %.4f\n", $timeForSameAtStart, $timeForSameAtEnd);
Для меня это печатает что-то вроде 'b' at the end: 0.0634 'b' at the front: 0.0287
.
Многие другие строковые функции в PHP, вероятно, страдают от подобных проблем. Работа вокруг этого сложна, особенно на PHP, где вы фактически не знаете, что на самом деле выполняет множество функций на физическом уровне.
Одна из возможных тактик - это просто случайное время ожидания в коде, прежде чем вы вернете ответ вызывающему/потенциальному злоумышленнику. Еще лучше, измерьте, сколько времени потребовалось, чтобы проверить входные данные (например, с microtime
), а затем дождаться случайного времени минус это количество времени. Это не на 100% безопасно, но делает атакующей систему намного сложнее, потому что, как минимум, злоумышленнику придется многократно проверять каждый вход, чтобы отфильтровать случайность.
Я думаю, что эти атаки являются реальными и могут быть выполнены, но для планирования атаки требуется много времени, найти нужные вам данные и т. Д. Я думаю, что большинство PHP-скриптов, или, может быть, у PHP есть ошибки, которые легче использовать, чем измерять 5 дней, чтобы получить целочисленное дешифрование.Но вы всегда должны сравнивать строки с '===', а не с '=='. – TiMESPLiNTER
Мы пишем приложение, которое ловит обратный вызов из другого приложения и дает пользователю несколько монет. Этот URL-адрес может быть найден злоумышленником, чтобы он мог использовать этот URL-адрес для получения мошеннических монет. Эти монеты тогда могут быть сняты, поэтому 5 дней - это хороший сценарий для злоумышленника) В нашем приложении есть некоторая защита, но я не знаю, должен ли я использовать защиту от временной атаки или нет –
Я думаю, что двоичный сейф не имеет никакого отношения к хронологии: http://en.wikipedia.org/wiki/Binary-safe – Kyborek