2015-06-02 39 views
0

我正在使用Node和node-mysql包構建網站。如何在使用LIKE運算符時防止SQL注入?

app.get('/api/tags', function(req, res) { 
    var term = req.query.term; 
    var query = 
    'SELECT \ 
    t.tagName \ 
    FROM tags t \ 
    JOIN screencastTags st \ 
    ON st.tagName = t.tagName \ 
    JOIN screencasts s \ 
    ON s.screencastId = st.screencastId \ 
    WHERE s.status = \'approved\' AND t.tagName LIKE \'%' + term + '%\' \ 
    GROUP BY t.tagName \ 
    LIMIT 5'; 
    connection.queryAsync(query).spread(function(tags) { 
    tags = tags.map(function(tag) { return tag.tagName }); 
    res.send(tags); 
    }) 
}) 

這裏我用從查詢字符串的值 - term - 返回的標籤列表。

我的問題是:當我使用LIKE運算符時,如何防止SQL注入?

我試圖

var query = 
    'SELECT \ 
    t.tagName \ 
    FROM tags t \ 
    JOIN screencastTags st \ 
    ON st.tagName = t.tagName \ 
    JOIN screencasts s \ 
    ON s.screencastId = st.screencastId \ 
    WHERE s.status = \'approved\' AND t.tagName LIKE \'%' + conneciton.escape(term) + '%\' \ 
    GROUP BY t.tagName \ 
    LIMIT 5'; 

但產生無效的SQL。

回答

1

儘量不要通過串聯構建sql請求。它確實總會增加SQL注入佔用空間的風險。

一個佔位符應該在LIKE條件下工作。

var sql = '... LIKE ? GROUP BY ...'; 
connection.query(sql, ['%' + term + '%'], function(err, res) {}) 

準備好的聲明甚至會更好的安全問題。你應該閱讀https://github.com/felixge/node-mysql/#escaping-query-values

+0

謝謝 - 我現在就測試一下。我在應用程序的其他地方使用'?',但我認爲以當前的形式進行檢查會更簡單。另外,'?'不等同於預先準備好的語句。 –