Pruebe si la expresión javascript está bien formada antes de ejecutar

Tengo un script que toma la entrada del usuario, realiza algunas operaciones en esa entrada y luego ejecuta la entrada modificada.

Ejemplo:

El usuario ingresa 'vbscipt o javascript'

Mi script lo convierte en:

var searchtest = "mystring.search('vbscript')>=0 || mystring.search('javascript')>=0";

Y lo ejecuta usando eval(searchtest);

Sin embargo, si el usuario ingresa 'vbscript javascript'

Mi script lo convierte en

var searchtest = "mystring.search('vbscript')>=0 mystring.search('javascript')>=0";

(Tenga en cuenta la falta de ||) Lo que provocará un error cuando llamo a eval(searchtest);

¿Hay alguna manera de probar la cadena de prueba de búsqueda para determinar si es una expresión javascript válida antes de ejecutarla?

preguntado el 03 de mayo de 12 a las 11:05

2 Respuestas

¡La evaluación de JavaScript es malvada!

En lugar de transformar la entrada del usuario como lo está haciendo, ¿por qué no hacer algo como lo siguiente?

// list of values considered valid
myString = ['javascript', 'vbscript', 'perl', 'python'];

function search (x) {
  // Returns true if x is a value an array (passed as `this`)
  return this.indexOf (x) >= 0;
}

function searchTest (userInput, myString, search) { 'use strict';

  function orClause (clause) {
    // caluse is a series of values separated by `or`, return true
    // if any search returns true for any of the values.
    clause = clause.split (/\s+or\s+/i); // split on 'or'
    while (clause.length) { // for each value
      if (search.apply (myString, [clause.shift ()])) {
        return true;
      }
    }
    return false; // no matches....
  }        

  userInput = userInput.split (/\s+and\s+/i); // split on 'and'

  // userInput is now an array of clauses each is either a value or 
  // a series of values separated by `or`. We pass each clause to
  // the orCaluse function and return true only if ALL returns are true. 
  while (userInput.length) { 
    if (!orClause (userInput.shift ())) { 
       return false; // and fails
    }
  }

  return true;  // All true so return true.
}

searchTest ('fred or javascript and python', myString, search),

Supongo que su expresión puede ser una secuencia de ands y ors con andestá teniendo prioridad

contestado el 03 de mayo de 12 a las 16:05

Caramba, me va a tomar un tiempo entender eso. Aunque se ve bien. ¿Es algo que hayas usado antes? Supones correctamente. El enfoque que se me ocurrió permite cadenas de búsqueda complejas (a y b) o (c y d) aprovechando el procesamiento lógico incorporado de javascripts. Supongo que tu camino también (pero más seguro) - Derek

He usado este tipo de cosas muchas veces antes. Se llama analizador, una versión simplificada de lo que usan los compiladores. La idea de crear un idioma que sus usuarios puedan usar a menudo se denomina Idioma específico del dominio. Utilice Google para obtener más información. - HBP

He comentado el código para tratar de explicar su función, espero que ayude. - HBP

Lo haré. Gracias por tu ayuda. - Derek

Sí, puedes usar eval mismo y detectar excepciones de errores de sintaxis. ¡Pero no lo hagas! Transformar ciegamente la entrada del usuario y validar el código listo para ejecutar con eval es una puerta abierta para muchos ataques XSS. En lugar de validar la cadena transformada, debe validar estrictamente la entrada del usuario para asegurarse de que la transformación dará como resultado un código correcto limitado solo a las operaciones exactas que desea permitir.

contestado el 03 de mayo de 12 a las 11:05

¡Pensé que podrías decir eso! Esto no es para un sitio público, solo hay 4 usuarios y ninguno de ellos es programador, así que estoy preparado para correr el riesgo. ¡Gracias! - Derek

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.