Tengo una aplicación que envía una solicitud POST al software del foro VB e inicia sesión en alguien (sin configurar cookies ni nada).
Una vez que el usuario ha iniciado sesión, creo una variable que crea una ruta en su máquina local.
c: \ tempfolder \ date \ username
El problema es que algunos nombres de usuario arrojan una excepción de "caracteres ilegales". Por ejemplo, si mi nombre de usuario fuera mas|fenix
, arrojaría una excepción.
Path.Combine( _
Environment.GetFolderPath(System.Environment.SpecialFolder.CommonApplicationData), _
DateTime.Now.ToString("ddMMyyhhmm") + "-" + form1.username)
No quiero eliminarlo de la cadena, pero se crea una carpeta con su nombre de usuario a través de FTP en un servidor. Y esto lleva a mi segunda pregunta. Si estoy creando una carpeta en el servidor, ¿puedo dejar los "caracteres ilegales"? Solo pregunto esto porque el servidor está basado en Linux, y no estoy seguro de si Linux lo acepta o no.
EDITAR: Parece que la codificación de URL NO es lo que quiero ... Esto es lo que quiero hacer:
old username = mas|fenix
new username = mas%xxfenix
Donde% xx es el valor ASCII o cualquier otro valor que pueda identificar fácilmente al personaje.
Respuestas:
Editar: Tenga en cuenta que esta respuesta ahora está desactualizada. Vea la respuesta de Siarhei Kuchuk a continuación para una mejor solución
UrlEncoding hará lo que sugieres aquí. Con C #, simplemente usa
HttpUtility
, como se mencionó.También puede regexificar los caracteres ilegales y luego reemplazarlos, pero esto se vuelve mucho más complejo, ya que tendrá que tener alguna forma de máquina de estado (cambiar ... mayúsculas y minúsculas, por ejemplo) para reemplazar con los caracteres correctos. Como
UrlEncode
hace esto por adelantado, es bastante fácil.En cuanto a Linux frente a Windows, hay algunos caracteres que son aceptables en Linux que no están en Windows, pero no me preocuparía por eso, ya que el nombre de la carpeta puede devolverse decodificando la cadena Url, usando
UrlDecode
, para que pueda hacer un viaje de ida y vuelta. cambiosfuente
A potentially dangerous Request.Path value was detected from the client
.He estado experimentando con los diversos métodos que proporciona .NET para la codificación de URL. Quizás la siguiente tabla sea útil (como resultado de una aplicación de prueba que escribí):
Las columnas representan codificaciones de la siguiente manera:
UrlEncoded:
HttpUtility.UrlEncode
UrlEncodedUnicode:
HttpUtility.UrlEncodeUnicode
UrlPathEncoded:
HttpUtility.UrlPathEncode
EscapedDataString:
Uri.EscapeDataString
EscapedUriString:
Uri.EscapeUriString
HtmlEncoded:
HttpUtility.HtmlEncode
HtmlAttributeEncoded:
HttpUtility.HtmlAttributeEncode
HexEscaped:
Uri.HexEscape
NOTAS
HexEscape
solo puede manejar los primeros 255 caracteres. Por lo tanto, arroja unaArgumentOutOfRange
excepción para los caracteres latinos A-Extended (por ejemplo, Ā).Esta tabla se generó en .NET 4.0 (vea el comentario de Levi Botelho a continuación que dice que la codificación en .NET 4.5 es ligeramente diferente).
EDITAR:
Agregué una segunda tabla con las codificaciones para .NET 4.5. Vea esta respuesta: https://stackoverflow.com/a/21771206/216440
EDITAR 2:
Como la gente parece apreciar estas tablas, pensé que les gustaría el código fuente que genera la tabla, para que puedan jugar con ustedes. Es una aplicación de consola C # simple, que puede apuntar a .NET 4.0 o 4.5:
fuente
Uri.EscapeUriString
, pero cuidado, no admitenull
argumentos.UrlPathEncode
. Entonces, básicamente, reemplaceUrlPathEncode
conUri.EscapeUriString
.Debe codificar solo el nombre de usuario u otra parte de la URL que podría ser inválida. La codificación de una URL puede generar problemas, ya que algo como esto:
Rendirá
Obviamente, esto no va a funcionar bien. En su lugar, debe codificar SOLO el valor del par clave / valor en la cadena de consulta, así:
Espero que eso ayude. Además, como mencionó teedyay , aún deberá asegurarse de que se eliminen los caracteres ilegales de nombre de archivo o de lo contrario el sistema de archivos no le gustará la ruta.
fuente
?
(ya que supone que la cadena de consulta ya está codificada). En el ejemplo de Dan Herbert, parece que está fingiendo queExample
es el texto que requiere codificación, porHttpUtility.UrlPathEncode("http://www.google.com/search?q=Example");
lo que no funcionará. Pruébelo con?q=Ex&ple
(donde está el resultado deseado?q=Ex%26ple
). No funcionará porque (1) UrlPathEncode no toca nada después?
, y (2) UrlPathEncode no codifica de&
todos modos.&
, porque lo necesita para delimitar sus parámetros de cadena de consulta. Pero hay momentos en los que también quieres símbolos codificados.La mejor manera es usar
Uri.EscapeUriString
no hacer referencia al perfil completo de .net 4.
fuente
Uri.EscapeDataString
NOUri.EscapeUriString
Leer este comentario, me ayudó.Desde .NET Framework 4.5 y .NET Standard 1.0 debe usar
WebUtility.UrlEncode
. Ventajas sobre alternativas:Forma parte de .NET Framework 4.5+, .NET Core 1.0+, .NET Standard 1.0+, UWP 10.0+ y todas las plataformas Xamarin también.
HttpUtility
, aunque está disponible en .NET Framework anteriormente (.NET Framework 1.1+), está disponible en otras plataformas mucho más tarde (.NET Core 2.0+, .NET Standard 2.0+) y todavía no está disponible en UWP (consulte la pregunta relacionada ).En .NET Framework, reside en él
System.dll
, por lo que no requiere referencias adicionales, a diferencia deHttpUtility
.Se escapa correctamente los caracteres para las URL , a diferencia de
Uri.EscapeUriString
(ver comentarios a la respuesta de drweb86 ).No tiene ningún límite en la longitud de la cadena , a diferencia de
Uri.EscapeDataString
(vea la pregunta relacionada ), por lo que puede usarse para solicitudes POST, por ejemplo.fuente
Levi Botelho comentó que la tabla de codificaciones que se generó anteriormente ya no es precisa para .NET 4.5, ya que las codificaciones cambiaron ligeramente entre .NET 4.0 y 4.5. Así que he regenerado la tabla para .NET 4.5:
Las columnas representan codificaciones de la siguiente manera:
HttpUtility.UrlEncode
HttpUtility.UrlEncodeUnicode
HttpUtility.UrlPathEncode
WebUtility.UrlEncode
Uri.EscapeDataString
Uri.EscapeUriString
HttpUtility.HtmlEncode
HttpUtility.HtmlAttributeEncode
WebUtility.HtmlEncode
Uri.HexEscape
NOTAS
HexEscape solo puede manejar los primeros 255 caracteres. Por lo tanto, arroja una excepción ArgumentOutOfRange para los caracteres latinos A-Extended (por ejemplo, Ā).
Esta tabla se generó en .NET 4.5 (consulte la respuesta https://stackoverflow.com/a/11236038/216440 para las codificaciones relevantes para .NET 4.0 y versiones posteriores).
EDITAR:
fuente
(Net4.0) ? %3f................................
(Net4.5) ? %3f ..................................
La codificación de URL es fácil en .NET. Utilizar:
Si se decodifica para obtener el nombre de la carpeta, aún deberá excluir los caracteres que no se pueden usar en los nombres de carpeta (*,?, /, Etc.)
fuente
Si no puede ver System.Web, cambie la configuración de su proyecto. El marco de destino debe ser ".NET Framework 4" en lugar de ".NET Framework 4 Client Profile"
fuente
La implementación de .NET
UrlEncode
no cumple con RFC 3986.Algunos caracteres no están codificados pero deberían estarlo. Los
!()*
caracteres se enumeran en la sección 2.2 del RFC como caracteres reservados que deben codificarse, pero .NET no puede codificar estos caracteres.Algunos caracteres están codificados pero no deberían estarlo. Los
.-_
caracteres no se enumeran en la sección 2.2 del RFC como un carácter reservado que aún no debe codificarse .NET codifica erróneamente estos caracteres.El RFC especifica que para ser consistentes, las implementaciones deben usar HEXDIG en mayúsculas, donde .NET produce HEXDIG en minúsculas.
fuente
Creo que la gente aquí se desvió por el mensaje de UrlEncode. URLEncoding no es lo que desea: desea codificar cosas que no funcionarán como un nombre de archivo en el sistema de destino.
Suponiendo que desea algo de generalidad: siéntase libre de encontrar los caracteres ilegales en varios sistemas (MacOS, Windows, Linux y Unix), unirlos para formar un conjunto de caracteres para escapar.
En cuanto a la fuga, un HexEscape debería estar bien (Reemplazar los caracteres con% XX). Convierta cada carácter a bytes UTF-8 y codifique todo> 128 si desea admitir sistemas que no hacen unicode. Pero hay otras formas, como usar barras diagonales "\" o codificación HTML "" ". Puede crear la suya propia. Todo lo que tiene que hacer cualquier sistema es 'codificar' el carácter incompatible. Los sistemas anteriores le permiten recrear el nombre original, pero también funciona algo así como reemplazar los caracteres malos con espacios.
En la misma tangente que la anterior, la única para usar es
- Codifica todo lo que se necesita para OAuth, no codifica las cosas que OAuth prohíbe la codificación, y codifica el espacio como% 20 y no + (también en la especificación OATH) Ver: RFC 3986. AFAIK, este es el última especificación de URI.
fuente
He escrito un método C # que codifica url TODOS los símbolos:
fuente
Idealmente, estos irían en una clase llamada "FileNaming" o tal vez simplemente cambien el nombre de Encode a "FileNameEncode". Nota: estos no están diseñados para manejar rutas completas, solo los nombres de carpeta y / o archivo. Idealmente, primero dividiría ("/") su ruta completa y luego comprobaría las piezas. Y, obviamente, en lugar de una unión, puede agregar el carácter "%" a la lista de caracteres no permitidos en Windows, pero creo que es más útil / legible / real de esta manera. Decode () es exactamente el mismo pero cambia el Reemplazar (Uri.HexEscape (s [0]), s) "escapado" con el carácter.
¡Gracias @ simon-tewsi por la muy útil tabla de arriba!
fuente
Path.GetInvalidFileNameChars()
Además de la respuesta de @Dan Herbert, generalmente deberíamos codificar solo los valores.
Split tiene el parámetro params Split ('&', '='); expresión dividida en primer lugar entre & luego '=' para que los elementos impares sean todos los valores que se codificarán a continuación.
fuente