none
dejar que el usuario inyecte codigo html en un textbox pero validar que no sea codigo malicioso RRS feed

  • Pregunta

  • Necesito implementar un control textbox enriquecido donde el usuario pueda modificar el texto introducido pero validar a la vez que no sea un codigo malicioso.... encontre algo de ajaxcontroltoolkit pero no se como implementarlo en asp mvc
    miércoles, 25 de abril de 2012 17:15

Respuestas

  • MMmm...

    No termino de entender como HtmlEncode y Html.Raw le ayudan en este caso.  Es decir, con HtmlEncode conviertes una cadena HTML a algo seguro para mostrar en pantalla, para que no se ejecuten los scripts, ni los tags mientras con Html.Raw haces lo contrario (ya que Razor por defecto usa HtmlEncode). El tema viene que no creo que eso sea lo que pide Brayan. Para mi, que él quiere que se puedan meter tags "inofensivos" como <b> y evitar los "peligrosos" como <script>, y que el text se muestre en negrita.

    Se podría usar una expresión regular sobre el texto recibido que eliminase todos aquellos tags susceptibles de ser peligrosos.  El problema de las expresiones regulares es que son muy complejas y es fácil que o bien sean demasiado restrictivas o demasiado permisivas. Otra opción es echar un ojo a la WPL (http://wpl.codeplex.com/) pero no la he usado nunca, así que no te puedo decir...

    Yo, personalmente, buscaría otra aproximación. No guardar, ni permtir HTML, en su lugar guardar algún formato de texto propio, que use tags no-html y luego parsear esto para generar el HTML final. En muchos casos el uso de BBCode (http://es.wikipedia.org/wiki/BBCode) es más que suficiente y es totalmente seguro. A partir de una cadena BBCode, podrías obtener una HTML y entonces sí usar Html.Raw para mostrar esta cadena HTML en tu vista. Echa un vistazo a http://cyotek.com/blog/converting-bbcode-into-html-using-csharp

    Saludos!


    Eduard Tomàs Blog: http://geeks.ms/blogs/etomas -- Twitter: eiximenis

    • Marcado como respuesta Eder Costa lunes, 29 de octubre de 2012 12:09
    jueves, 26 de abril de 2012 6:39
  • Hola a todos.... pues investigando encontre una forma de hacer lo que queria, se trata de referenciar dos librerias a la solucion llamadas: AntiXss Library y HtmlSanitization Library
    • Marcado como respuesta Eder Costa lunes, 29 de octubre de 2012 12:09
    jueves, 26 de abril de 2012 23:22

Todas las respuestas

  • Hola,

    puedes usar 

    HttpUtility.HtmlEncode

    a la hora de guardar el texto introducido por el usuario. A la hora de mostrarlo usa

    @Html.Raw()

    en la vista.

    Aquí tienes una explicación similar a la que te he dado

    http://www.asp.net/mvc/tutorials/older-versions/security/preventing-javascript-injection-attacks-cs


    Atentamente, Sergio.

    Blog
    Twitter

    miércoles, 25 de abril de 2012 19:19
  • MMmm...

    No termino de entender como HtmlEncode y Html.Raw le ayudan en este caso.  Es decir, con HtmlEncode conviertes una cadena HTML a algo seguro para mostrar en pantalla, para que no se ejecuten los scripts, ni los tags mientras con Html.Raw haces lo contrario (ya que Razor por defecto usa HtmlEncode). El tema viene que no creo que eso sea lo que pide Brayan. Para mi, que él quiere que se puedan meter tags "inofensivos" como <b> y evitar los "peligrosos" como <script>, y que el text se muestre en negrita.

    Se podría usar una expresión regular sobre el texto recibido que eliminase todos aquellos tags susceptibles de ser peligrosos.  El problema de las expresiones regulares es que son muy complejas y es fácil que o bien sean demasiado restrictivas o demasiado permisivas. Otra opción es echar un ojo a la WPL (http://wpl.codeplex.com/) pero no la he usado nunca, así que no te puedo decir...

    Yo, personalmente, buscaría otra aproximación. No guardar, ni permtir HTML, en su lugar guardar algún formato de texto propio, que use tags no-html y luego parsear esto para generar el HTML final. En muchos casos el uso de BBCode (http://es.wikipedia.org/wiki/BBCode) es más que suficiente y es totalmente seguro. A partir de una cadena BBCode, podrías obtener una HTML y entonces sí usar Html.Raw para mostrar esta cadena HTML en tu vista. Echa un vistazo a http://cyotek.com/blog/converting-bbcode-into-html-using-csharp

    Saludos!


    Eduard Tomàs Blog: http://geeks.ms/blogs/etomas -- Twitter: eiximenis

    • Marcado como respuesta Eder Costa lunes, 29 de octubre de 2012 12:09
    jueves, 26 de abril de 2012 6:39
  • Hola Eduard,

    la verdad es que tiene razón y me lie al explicarlo. Creo que todo se reduce a usar HtmlEncode en la salida. El @Html.Raw haría lo que precisamente queremos evitar. Con esto

    <div>@Html.Encode("<b>Esto es una prueba</b>")</div>
    <div>@Html.Raw("<b>Esto es una prueba</b>")</div>

    En la primera salida tendrías el texto tal cual, aunque eso si, con los "molestos" &lt; y &gt;

    Con la segunda salida tendríamos el texto en negrita que es lo que queremos evitar.

    Supongo que lo mejor es la opción que das de eliminar los tags html o evitarlos completamente y permitir otras sintaxis como bbcode.


    Atentamente, Sergio.

    Blog
    Twitter

    jueves, 26 de abril de 2012 7:13
  • Hola a todos.... pues investigando encontre una forma de hacer lo que queria, se trata de referenciar dos librerias a la solucion llamadas: AntiXss Library y HtmlSanitization Library
    • Marcado como respuesta Eder Costa lunes, 29 de octubre de 2012 12:09
    jueves, 26 de abril de 2012 23:22
  • Hola Brayan, tengo el mismo problema que tuviste, podrias proporcionarme algunos codigos de ejemplo de como solucionaste el problema por favor. Agradezco tu respuesta.
    jueves, 28 de junio de 2012 20:15