Pruebe si la expresión javascript está bien formada antes de ejecutar
Frecuentes
Visto 623 veces
0
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?
2 Respuestas
2
¡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 and
s y or
s con and
está 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
0
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 javascript validation syntax or haz tu propia pregunta.
Posible duplicado: stackoverflow.com/questions/4923316/… - Alexander Pavlov