¿Cómo usar C#para desinfectar la entrada en una página html?
html-sanitizing antixsslibrary (6)
¿Hay una biblioteca o un método aceptable para desinfectar la entrada a una página html?
En este caso, tengo un formulario con solo un nombre, número de teléfono y dirección de correo electrónico.
El código debe ser C #.
Por ejemplo:
"<script src=''bobs.js''>John Doe</script>"
debería convertirse en "John Doe"
¿Qué pasa con el uso de Microsoft Anti-Cross Site Scripting Library ?
Esta es una pregunta anterior, pero aún relevante.
Estamos utilizando la biblioteca HtmlSanitizer .Net, que:
- es de código abierto (MIT) - HtmlSanitizer
- se mantiene activamente
- no tiene los problemas como la biblioteca Microsoft Anti-XSS ,
- Se prueba la unidad con el OWASP XSS Filter Evasion Cheat Sheet
- está especialmente diseñado para esto (en contraste con HTML Agility Pack , que es un analizador sintáctico, no un desinfectante)
- No usa expresiones regulares (¡HTML no es un idioma normal!)
También en NuGet
Parece que tiene usuarios que envían contenido, pero no puede confiar plenamente en ellos y, sin embargo, aún desea presentar el contenido que proporcionan como un código HTML extremadamente seguro. Aquí hay tres técnicas: HTML codifica todo, HTML codifica y / o elimina solo las partes malvadas, o utiliza una DSL que compila en HTML con la que te sientes cómodo.
¿Debería convertirse en "John Doe"? Yo codificaría HTML esa cadena y le permitiría al usuario, "John Doe" (si es que ese es su verdadero nombre ...), tener el estúpido nombre
<script src=''bobs.js''>John Doe</script>
. No debería haber incluido su nombre en etiquetas de guiones o etiquetas en primer lugar. Este es el enfoque que uso en todos los casos a menos que exista un buen caso comercial para una de las otras técnicas.Acepte HTML del usuario y desinféctelo (en el resultado) utilizando un enfoque de lista blanca como el método de desinfección mencionado por @Bryant. Hacer esto bien es (extremadamente) difícil, y difiero en llevarlo a mentes más grandes. Tenga en cuenta que algunos desinfectantes codificarán HTML mal donde otros habrían eliminado completamente los bits ofensivos.
Otro enfoque es usar una DSL que "compila" en HTML. Asegúrate de whitehat tu compilador DSL porque algunos (como MarkdownSharp ) permitirán HTML arbitrario como etiquetas
<script>
y atributos malignos sin codificar (lo que por cierto es perfectamente razonable pero puede no ser lo que necesitas o esperas). Si ese es el caso, deberá usar la técnica n. ° 2 y desinfectar los resultados de su compilador.
Pensamientos de cierre:
- Si no hay un caso comercial sólido para la técnica n. ° 2 o la n. ° 3, reduzca el riesgo y ahórrese el esfuerzo y el uso de las preocupaciones, siga con la técnica n. ° 1.
- No asuma su seguridad porque usó una DSL. Por ejemplo: la implementación original de Markdown permite el paso de HTML, sin codificar. "Para cualquier marcado que no esté cubierto por la sintaxis de Markdown, simplemente use HTML. No hay necesidad de prefabricarlo o delimitarlo para indicar que está cambiando de Markdown a HTML; simplemente usa las etiquetas".
- Codifica cuando salgas. También puede codificar la entrada pero hacerlo puede ponerlo en un aprieto. Si codificó incorrectamente y guardó eso, ¿cómo recuperará la entrada original para que pueda volver a codificar después de corregir el codificador defectuoso?
Según el comentario que hizo a esta respuesta, puede encontrar información útil en esta pregunta:
https://.com/questions/72394/what-should-a-developer-know-before-building-a-public-web-site
Aquí hay un ejemplo de consulta parametrizada. En lugar de esto:
string sql = "UPDATE UserRecord SET FirstName=''" + txtFirstName.Text + "'' WHERE UserID=" + UserID;
Hacer esto:
SqlCommand cmd = new SqlCommand("UPDATE UserRecord SET FirstName= @FirstName WHERE UserID= @UserID");
cmd.Parameters.Add("@FirstName", SqlDbType.VarChar, 50).Value = txtFirstName.Text;
cmd.Parameters.Add("@UserID", SqlDbType.Integer).Value = UserID;
Editar: Como no hubo inyección, eliminé la parte de la respuesta relacionada con eso. Dejé el ejemplo de consulta parametrizada básica, ya que puede ser útil para cualquier persona que lea la pregunta.
--Joel
Si por desinfección se entiende eliminar REMOVE las etiquetas por completo, el ejemplo de RegEx al que hace referencia Bryant es el tipo de solución que desea.
Si solo quiere asegurarse de que el código NO se meta con su diseño y lo represente al usuario. ¡Puedes usar el método HttpUtility.HtmlEncode para evitar eso!