如何正确防止memcached“协议注入”?
我发现当我在获取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这种方式),然后把编码后的结果当作密钥使用,或者使用二进制协议。