JSONとeval()関数の使い方を教えてくれるAJAXブックのガイダンスでAJAXチャットルームを作っています。このチャットルームには、通常のチャット機能とホワイトボード機能があります。通常のテキストメッセージがJSON形式のphpサーバーから送信される場合、ブラウザーの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];
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に変更した場合、メッセージ入力で、drawLine(200,345,222,333)の代わりにjavascriptコードの入力を開始し、redirectToMyVirusSite()を挿入します。eval()は、チャットルームの全員のブラウザで彼のためにそれを実行します。したがって、ご覧のとおり、チャットルームで他のクライアントからのコマンドをevalに実行させることは、明らかにハッカーの招待です。私がフォローした本は、機能の紹介にすぎないことを理解しています。実際の状況でJSONを使用して適切に行うにはどうすればよいですか?
たとえば、ハッカーが有効なjavascriptコードを他のクライアントのブラウザに送信してeval()にできないようにするために、javascriptencode / escapeにサーバー側のphpまたは.net関数がありますか?または、JSON eval()を使用しても安全ですか?それは強力ですが邪悪な関数のようです?
ありがとう、トム