2013-09-02 5 views
2

В моем UI, пользователи могут создавать некоторые JavaScript объекты, такие как:Проверка объектов JavaScript в PHP

var box = { 
    "width": "100px", 
    "height": "200px", 
    "click": function() { 
     alert("You clicked the box"); 
    } 
}; 

Это действительный объектов JavaScript. Теперь, я хочу, чтобы проверить это на php. Я могу использовать json_encode/json_decode, но это не сработает "function() ..." вещь. Есть ли у вас предложения?

+1

Какую проверку вы хотите достичь? Вы можете вытащить целое через JavaScript eval, возможно, в качестве первой оценки синтаксической корректности. – mvw

+0

@mvw Проверка синтаксиса, я думаю, я хочу убедиться, что когда этот объект используется insinde JavaScript, это не приведет к ошибке. Да, я могу использовать eval и поймать исключение, но мне нужен метод проверки php, проверка должна быть внутри php. – keepwalking

+0

, возможно, посмотрите на http://stackoverflow.com/questions/6473473/where-can-i-find-the-jslint-js-validation-parser-written-in-php –

ответ

2

Я предполагаю, что вы пытаетесь проверить объект, построенный с пользовательского ввода. Поскольку писать полный парсер JavaScript в PHP будет сложно, я предлагаю следующий подход: после ввода всех данных запросите объект JavaScript из скрипта PHP через Ajax. Затем вы можете сделать eval на стороне клиента, чтобы узнать, есть ли какие-либо ошибки.

Более общий совет: не смешивайте исполняемый код и данные! Просто обменивайте легко проверяемые объекты JSON между клиентом и сервером и напишите статический код JavaScript, обрабатывающий объекты JSON. Это также защитит вас от кодовых инъекций с пользовательского ввода.

+0

Спасибо, я приму это как лучший ответ для моей проблемы. Другие хороши, но выполнение на стороне сервера пользовательских входных данных - это не очень хорошая идея. еще раз спасибо – keepwalking

2

PHP может только подтвердить часть кода JSON. Если вы хотите, чтобы на стороне сервера использовались nodejs. Простой запуск кода через узел code.js и проверьте, нет ли каких-либо ошибок. Итак, я предполагаю, что вы должны получить код, сохранить его в файл и запустить узел против него.

4

Для быстрого, грязного и небезопасного решения вы можете установить на сервере и позвонить exec() PHP для проверки кода.

Из документации, Exec определяется как:

string exec (string $command [, array &$output [, int &$return_var ]]) 

и с узлом, мы можем оценить строку JavaScript путем использования -e флага. Пример использования командной строки:

> node -e 'invalid javascript' 
SyntaxError: Unexpected identifier 
> $? 
-bash: 8: command not found # <-- return status! 

Связывание вместе с Exec РНР, вы могли бы иметь что-то вроде этого:

<? php 
$userJavaScript = getUserJavaScriptSomehow(); 
exec("node -e '" + $userJavaScript + "'", $output, $return_var); 
if ($return_var !== 0) { 
    // something went wrong with parsing it. 
} 
?> 

Заметьте, что это ужасное решение. Вам лучше проверить JavaScript на стороне клиента и забыть делать валидацию на стороне сервера все вместе, учитывая, что пользователь может выполнить любой произвольный код. Вам нужно будет защититься от доступа к файлам, бесконечных циклов и т. Д.

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