2013-01-23 21 views
0

我發現,當我把\r\n放在鍵值從memcached服務器獲取值時,它可以用來注入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來減慢網站速度或爲其他用戶設置密碼緩存。

爲什麼客戶端庫不會去除這些非法字符?如何在我的代碼中正確地阻止它?

+2

你怎麼樣不讓你的用戶查詢任意鍵? – Carsten

+0

有時我需要使用slu as作爲獲取文章內容的關鍵。攻擊者可以在URL中放入'%0D%0A'。 – lqs

+3

那麼,過濾。或者說,只允許用戶給定的密鑰由絕對無害的字符組成。 – Carsten

回答

1

對用戶值(例如base64)進行編碼並將結果用作關鍵字或使用二進制協議。