Javascript секретный вопрос / Использование eval () - PullRequest
3 голосов
/ 05 августа 2011

Я вижу код в следующей форме - такое использование eval () безопасно?

function genericTakeAction(frm_name,id,pagenum,action)
{
    var rset=eval("document."+frm_name);

    var x=eval("document."+frm_name+".edit_key");
    var y=eval("document."+frm_name+".cAction")
    if(x)
        x.value=id;
    if(y)
        y.value=action;

    page_list(pagenum);
}

Используется как:

  <a href="javaScript:;" onClick="genericTakeAction('frmSearch',
  '<?php echo $rec_id;?>','<?php echo $pagenum?>','makeOpen')" 
  class='link6'>Make Open</a>

Ответы [ 3 ]

5 голосов
/ 05 августа 2011

Правильно это или нет, это излишне сложно.

function genericTakeAction(frm_name,id,pagenum,action)
{
    var rset = document[frm_name];

    var x = rset.edit_key;
    var y = rset.cAction;

    if(x)
        x.value=id;
    if(y)
        y.value=action;

    page_list(pagenum);
}

Это работает, потому что в JavaScript вы можете получить доступ к свойствам объекта одним из двух способов: используя точечный синтаксис и буквальный идентификатор, например, x = obj.foo; или с использованием синтаксиса в скобках и строкового идентификатора, например x = obj["foo"];. (Обратите внимание, что foo не было в кавычках в первом, но было в кавычках для второго; но оба делают точно то же самое. это строка во втором случае, вы можете использовать любое выражение, которое приводит к строке, поэтому y = "f"; x = obj[y + "oo"]; также работает.)

P.S. Это неправильно

1 голос
/ 05 августа 2011

Даже если это может показаться немного запутанным, как уже упоминали другие, с точки зрения чистой безопасности, вы должны убедиться, что параметр 'frm_name' функции genericTakeAction () никогда не может содержать предоставленные пользователем данные.

В вашем примере параметр 'frm_name' содержит жестко запрограммированный литерал 'frmSearch'. Так что все в порядке, пока эта функция genericTakeAction () не вызывается где-либо еще с предоставленными пользователем данными для параметра 'frm_name'.

См. http://en.wikipedia.org/wiki/Cross-site_scripting#Traditional_versus_DOM-based_vulnerabilities

1 голос
/ 05 августа 2011

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

Однако в среде браузера это не проблема, поскольку на самом деле любой пользователь можетeval() любой код, который они хотели, используя такие инструменты, как Firebug и т. Д.

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

eval() обычно используется, как вы показали, для запуска кода JSON, возвращаемого с сервера,побочный запрос.Более новые браузеры могут импортировать JSON более безопасно, используя выделенную функцию JSON parse(), но более старые браузеры не имеют этой функции и вынуждены использовать для этого eval().По этой причине большинство библиотек JSON содержат в своем коде eval() где-то, но обычно проводят некоторую очистку входных данных перед тем, как пропустить их через eval().

...