JSONとeval()関数を使用するように教えてくれたAJAXの本の案内でAJAXチャットルームを作っています。 このチャットルームは通常のチャット機能とホワイトボード機能を備えています。 通常のテキストメッセージがJSON形式のPHPサーバから来た場合、ブラウザのJavaScriptはこれを行います:Javascript json eval()injection
ホワイトボードコマンドなし--------------------- ----------------------
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));
} ...
ホワイトボードの描画コマンドが「SVR_CMDと呼ばれる特別なユーザー名でJSON形式でサーバーによって送信されます"、今すぐjavascriptが少し変更されます:
ホワイトボードコマンドで---------------------------------- ----------------
今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コードを入力し始める、drawLine(200345222333)のinsdead、彼は)(redirectToMyVirusSiteを注入されます。 eval()はチャットルームの全員のブラウザで彼のために実行します。 これから明らかなように、evalにチャットルーム内の他のクライアントからのコマンドを実行させることは、明らかにハッカーの招待です。私が従った本は機能の紹介であることを理解しています。 JSONを実際の状況で正しく行うにはどうすればよいですか?
ハッカーが他のクライアントのブラウザに有効なjavascriptコードをeval()に送ることができないようにjavascriptencode/escapeにサーバー側のPHPまたは.net関数がありますか?または、JSON eval()を使用することは安全ですか?それは強力ですが悪い機能のようですか?
ありがとう、 トム
この本を投げ捨ててください。 –
それは私がWeb開発の本について嫌いなものです。彼らはウェブで変わることはできません。 'eval()' = evil – iambriansreed