2012-08-13 34 views
0

我有以下代碼:如何從url段安全地構建路徑?

app.get('/games/:id/log', function (req, res) { 
    fs.readFile('logs/' + req.params.id +'.log', 'utf8', function (err, data) { 
     res.send(data.split('\n').join('\<br />')); 
    }); 
}); 

允許訪問mysite.com/games/somename/log擔任了./logs/somename.log。不過,我擔心req.params.id最終可能會變得像../..一樣邪惡,讀取我不希望看到的文件。

這可能嗎?如果是這樣,我該如何解決這個安全問題?

回答

0

我會創建一個白色的字符列表,你會允許在你的ID。我的猜測是你的ID只能是字母字符。因此,運行測試將允許您拒絕所有其他值。

var id = req.params.id.match(/[A-Z]+/i 
    id = id[0] || null 

if (id) { 
    // read file `id` 
} 

這將清理您的輸入只允許大寫和小寫字母字符。您也可以測試輸入的有效字符,而不是僅僅清理它。

var reg = /^[A-Z]+$/i 


if (reg.test(req.params.id)) { 
    // read file `req.params.id` 
} 

另外請注意:你將永遠無法得到../..的值id,因爲這不符合你的路由。

你可以通過你的路線req.route

例看到有關路由的詳細信息將是:

{ path: '/games/:id/log', 
    method: 'get', 
    callbacks: [ [Function] ], 
    keys: [ { name: 'id', optional: false } ], 
    regexp: /^\/games\/(?:([^\/]+?))\/log\/?$/i, 
    params: [ id: 'asd' ] } [ id: 'asd' ] 
} 

http://expressjs.com/api.html#req.route

+0

「_You將永遠無法得到../ ..爲一個值爲id,因爲它不會匹配你的路由。「 - 可以'id'匹配任何不安全的呢?如果沒有,是否記錄在案? – Eric 2012-08-13 18:56:15

+0

請參閱編輯:您可以通過req.route查看有關路由的更多信息 – travis 2012-08-13 18:56:37