如何正确防止memcached“协议注入”?

1 投票
1 回答
1352 浏览
提问于 2025-04-17 13:24

我发现当我在获取memcached服务器的值时,把 \r\n 放在键里,可以用来注入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 个回答

2

把用户输入的值进行编码(比如用base64这种方式),然后把编码后的结果当作密钥使用,或者使用二进制协议。

撰写回答