我正在製作一個AJAX聊天室,指導我使用JSON和eval()函數。 這個聊天室具有正常的聊天功能和白板功能。 當一個正常的文本消息來自JSON格式的PHP服務器時,瀏覽器中的javascript會這樣做:Javascript json eval()注入
沒有白板命令--------------------- ----------------------
function importServerNewMessagesSince(msgid) {
//loadText() is going to return me a JSON object from the server
//it is an array of {id, author, message}
var latest = loadText("get_messages_since.php?message=" + msgid);
var msgs = eval(latest);
for (var i = 0; i < msgs.length; i++) {
var msg = msgs[i];
displayMessage(escape(msg.id), escape(msg.author), escape(msg.contents));
} ...
白板繪製命令是由服務器JSON格式被稱爲「SVR_CMD特殊的用戶名發送「,現在JavaScript稍作修改:
With Whiteboard Command ---------------------------------- ----------------
function importServerNewMessagesSince(msgid) {
//loadText() is going to return me a JSON object from the server
//it is an array of {id, author, message}
var latest = loadText("get_messages_since.php?message=" + msgid);
var msgs = eval(latest);
for (var i = 0; i < msgs.length; i++) {
var msg = msgs[i];
if (msg.author == "SVR_CMD") {
eval(msg.contents); // <-- Problem here ...
//I have a javascript drawLine() function to handle the whiteboard drawing
//server command sends JSON function call like this:
//"drawLine(200,345,222,333)" eval() is going to parse execute it
//It is a hacker invitation to use eval() as someone in chat room can
//insert a piece of javascript code and send it using the name SVR_CMD?
else {
displayMessage(escape(msg.id), escape(msg.author), escape(msg.contents));
}
} ...
現在,如果黑客改變他的用戶名SVR_CMD腳本,然後在消息輸入開始鍵入javascript代碼,insdead的drawLine的(200345222333),他被注射redirectToMyVirusSite()。 eval()將在聊天室中的每個人的瀏覽器中爲他運行。 因此,正如你所看到的,讓評估者從聊天室中的其他客戶端執行命令顯然是黑客邀請。我瞭解我所遵循的這本書只是爲了介紹這些功能。在真實情況下,我們如何正確使用JSON來做到這一點?
例如是否有一個服務器端PHP或.NET功能javascriptencode /逃生,以確保沒有黑客可以發送一個有效的JavaScript代碼塊到其他客戶端的瀏覽器是eval()?或者可以安全地使用JSON eval(),它似乎是一個強大但邪惡的功能?
謝謝 湯姆
把那本書扔掉。 – 2012-04-18 14:20:30
這就是我討厭網頁開發書籍的原因。他們無法通過網絡進行更改。 'eval()'=邪惡 – iambriansreed 2012-04-18 14:22:56