Как правильно предотвратить memcached "внедрение протокола"?

Я обнаружил, что когда я положил \r\n в ключе, чтобы получить значение с сервера memcached, его можно использовать для ввода протокола memcached для запуска другой команды. Ниже приведен пример кода,

В PHP:

<?php
$m = new Memcached();
$m->addServer('localhost', 11211);

$key = "foo\r\nset bar 0 10 10000\r\n";

echo $m->get($key);
echo $m->get($key); // <- hang here
?>

В Python:

import pylibmc

mc = pylibmc.Client(['127.0.0.1:11211'])

key = 'foo\r\nset bar 0 10 10000\r\n';
print mc.get(key)
print mc.get(key) # <- hang here

Если key читается от пользователя, пользователь может выполнять произвольные команды на сервере memcached, например, для запуска flush_all замедлить работу сайта или установить кеш паролей для другого пользователя.

Почему клиентская библиотека не удаляет эти недопустимые символы? Как правильно предотвратить это в моем коде?

1 ответ

Закодируйте пользовательское значение (например, base64) и используйте результат в качестве ключа или используйте двоичный протокол.

Другие вопросы по тегам