tag net asp asp.net sql tsql

asp.net - net - ¿Codificación HTML en T-SQL?



razor c# (10)

¿Hay alguna función para codificar cadenas HTML en T-SQL? Tengo una base de datos heredada que contiene caracteres esquivos, como ''<'', ''>'', etc. Puedo escribir una función para reemplazar a los personajes, pero ¿hay alguna forma mejor?

Tengo una aplicación ASP.Net y cuando devuelve una cadena contiene caracteres que causan un error. La aplicación ASP.Net está leyendo los datos de una tabla de base de datos. No escribe en la propia tabla.


Es un poco tarde, pero de todos modos, aquí las formas correctas:

Codificación HTML (codificación HTML = codificación XML):

DECLARE @s NVARCHAR(100) SET @s = ''<html>unsafe & safe Utf8CharsDon''''tGetEncoded ÄöÜ - "Conex"<html>'' SELECT (SELECT @s FOR XML PATH(''''))

Codificación HTML en una consulta:

SELECT FIELD_NAME ,(SELECT FIELD_NAME AS [text()] FOR XML PATH('''')) AS FIELD_NAME_HtmlENcoded FROM TABLE_NAME

Decodificación de HTML:

SELECT CAST(''<root>'' + ''&lt;root&gt;Test&amp;123'' + ''</root>'' AS XML).value(N''(root)[1]'', N''varchar(max)'');

Si desea hacerlo correctamente, puede utilizar un procedimiento almacenado CLR.
Sin embargo, se complica un poco, porque no puede usar System.Web-Assembly en los procedimientos almacenados de CLR (por lo que no puede hacer System.Web.HttpUtility.HtmlDecode (htmlEncodedStr);). Así que tienes que escribir tu propia clase HttpUtility, que no recomendaría, especialmente para la decodificación.

Afortunadamente, puede extraer System.Web.HttpUtility del código fuente mono (.NET para Linux). Entonces puedes usar HttpUtility sin hacer referencia a system.web.

Luego escribes este CLR-Procedimiento almacenado:

using System; using System.Collections.Generic; using System.Text; using Microsoft.SqlServer.Server; using System.Data.SqlTypes; //using Microsoft.SqlServer.Types; namespace ClrFunctionsLibrary { public class Test { [Microsoft.SqlServer.Server.SqlFunction] public static SqlString HtmlEncode(SqlString sqlstrTextThatNeedsEncoding) { string strHtmlEncoded = System.Web.HttpUtility.HtmlEncode(sqlstrTextThatNeedsEncoding.Value); SqlString sqlstrReturnValue = new SqlString(strHtmlEncoded); return sqlstrReturnValue; } [Microsoft.SqlServer.Server.SqlFunction] public static SqlString HtmlDecode(SqlString sqlstrHtmlEncodedText) { string strHtmlDecoded = System.Web.HttpUtility.HtmlDecode(sqlstrHtmlEncodedText.Value); SqlString sqlstrReturnValue = new SqlString(strHtmlDecoded); return sqlstrReturnValue; } // ClrFunctionsLibrary.Test.GetPassword //[Microsoft.SqlServer.Server.SqlFunction] //public static SqlString GetPassword(SqlString sqlstrEncryptedPassword) //{ // string strDecryptedPassword = libPortalSecurity.AperturePortal.DecryptPassword(sqlstrEncryptedPassword.Value); // SqlString sqlstrReturnValue = new SqlString(sqlstrEncryptedPassword.Value + "hello"); // return sqlstrReturnValue; //} public const double SALES_TAX = .086; // http://msdn.microsoft.com/en-us/library/w2kae45k(v=vs.80).aspx [SqlFunction()] public static SqlDouble addTax(SqlDouble originalAmount) { SqlDouble taxAmount = originalAmount * SALES_TAX; return originalAmount + taxAmount; } } // End Class Test } // End Namespace ClrFunctionsLibrary

Y registralo:

GO /* --http://.com/questions/72281/error-running-clr-stored-proc -- For unsafe permission EXEC sp_changedbowner ''sa'' ALTER DATABASE YOUR_DB_NAME SET TRUSTWORTHY ON GO */ IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N''[dbo].[HtmlEncode]'') AND type in (N''FN'', N''IF'', N''TF'', N''FS'', N''FT'')) DROP FUNCTION [dbo].[HtmlEncode] GO IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N''[dbo].[HtmlDecode]'') AND type in (N''FN'', N''IF'', N''TF'', N''FS'', N''FT'')) DROP FUNCTION [dbo].[HtmlDecode] GO IF EXISTS (SELECT * FROM sys.assemblies asms WHERE asms.name = N''ClrFunctionsLibrary'' and is_user_defined = 1) DROP ASSEMBLY [ClrFunctionsLibrary] GO --http://msdn.microsoft.com/en-us/library/ms345101.aspx CREATE ASSEMBLY [ClrFunctionsLibrary] AUTHORIZATION [dbo] FROM ''D:/username/documents/visual studio 2010/Projects/ClrFunctionsLibrary/ClrFunctionsLibrary/bin/Debug/ClrFunctionsLibrary.dll'' WITH PERMISSION_SET = UNSAFE --EXTERNAL_ACCESS --SAFE ; GO CREATE FUNCTION [dbo].[HtmlDecode](@value [nvarchar](max)) RETURNS [nvarchar](max) WITH EXECUTE AS CALLER AS -- [AssemblyName].[Namespace.Class].[FunctionName] EXTERNAL NAME [ClrFunctionsLibrary].[ClrFunctionsLibrary.Test].[HtmlDecode] GO CREATE FUNCTION [dbo].[HtmlEncode](@value [nvarchar](max)) RETURNS [nvarchar](max) WITH EXECUTE AS CALLER AS -- [AssemblyName].[Namespace.Class].[FunctionName] EXTERNAL NAME [ClrFunctionsLibrary].[ClrFunctionsLibrary.Test].[HtmlEncode] GO /* EXEC sp_CONFIGURE ''show advanced options'' , ''1''; GO RECONFIGURE; GO EXEC sp_CONFIGURE ''clr enabled'' , ''1'' GO RECONFIGURE; GO EXEC sp_CONFIGURE ''show advanced options'' , ''0''; GO RECONFIGURE; */

Después, puedes usarlo como funciones normales:

SELECT dbo.HtmlEncode(''helloäÖühello123'') AS Encoded ,dbo.HtmlDecode(''hello&auml;&Ouml;&uuml;hello123'') AS Decoded

Cualquiera que solo copie-pegue, tenga en cuenta que por razones de eficiencia, usaría

public const double SALES_TAX = 1.086; // http://msdn.microsoft.com/en-us/library/w2kae45k(v=vs.80).aspx [SqlFunction()] public static SqlDouble addTax(SqlDouble originalAmount) { return originalAmount * SALES_TAX; }

Si usaras esta función en producción.

Vea aquí para las clases mono editadas:
http://pastebin.com/pXi57iZ3
http://pastebin.com/2bfGKBte

Necesitas definir NET_2_0 en las opciones de compilación.


He estado tratando de hacer esto hoy en T-SQL, principalmente por diversión en este punto ya que mis requisitos cambiaron, pero me di cuenta de una salida. Puede usar una tabla de caracteres Unicode, creada a partir de la función NCHAR () o simplemente importarla, iterando de 0 a 65535 (o menos si solo necesita los primeros 512 o algo así). Luego reconstruye la cadena. Probablemente hay mejores formas de reconstruir la cadena, pero esto funciona en caso de apuro.

---store unicode chars into a table so you can replace those characters withthe decimal value `

CREAR LA TABLA #UnicodeCharacters (DecimalValue INT, UnicodeCharacter NCHAR);

--loop from 0 to highest unicode value you want and dump to the table you created DECLARE @x INT = 0; WHILE @x <= 65535 BEGIN BEGIN INSERT INTO #UnicodeCharacters(DecimalValue, UnicodeCharacter) SELECT @x,NCHAR(@x) END ; SET @x = @x + 1 ; END ; --index for fast retrieval CREATE CLUSTERED INDEX CX_UnicodeCharacter_DecimalValue ON #UnicodeCharacters(UnicodeCharacter, DecimalValue); --this is the string that you want to html-encode... DECLARE @String NVARCHAR(100) = N''人This is a test - Ñ''; --other vars DECLARE @NewString NVARCHAR(100) = ''''; DECLARE @Word TABLE(Character NCHAR(1)); DECLARE @Pos INT = 1; --run through the string and check each character to see if it is outside the regex expression WHILE @Pos <= LEN(@String) BEGIN DECLARE @Letter NCHAR(1) = SUBSTRING(@String,@Pos,1); PRINT @Letter; --rebuild the string replacing each unicode character outside the regex with &#[unicode value]; SELECT @NewString = @NewString + CASE WHEN @Letter LIKE N''%[0-9abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ-!@#$%^&*()_+-= ]%'' THEN @Letter ELSE ''&#'' + CAST(uc.DecimalValue AS VARCHAR(10)) + '';'' END FROM #UnicodeCharacters uc WHERE @Letter = uc.UnicodeCharacter COLLATE JAPANESE_UNICODE_BIN SET @Pos += 1 END --end result SELECT @NewString ;

`Sé que normalmente usarías [0-9A-Za-z], pero por alguna razón, consideré caracteres acentuados dentro del alcance de esa expresión cuando hice eso. Así que usé explícitamente todos los caracteres que no quería convertir a Unicode en la expresión.

Última nota, tuve que usar una intercalación diferente para hacer coincidencias en los caracteres Unicode, porque la intercalación predeterminada de LATIN (CI o de otro tipo) parecía coincidir incorrectamente con los caracteres acentuados, muy parecido a la expresión regular en LIKE.


No creo que los datos de una base de datos deban saber o preocuparse por la interfaz de usuario. Los problemas de visualización deben ser manejados por la capa de presentación. No me gustaría ver ningún HTML mezclado en la base de datos.


No deberías arreglar la cadena en SQL. Una mejor manera es usar una función en ASP.net llamada HtmlEncode, esto cocinará los caracteres especiales que causan los problemas que está viendo, vea el ejemplo a continuación. Espero que esto ayude.

string htmlEncodedStr = System.Web.HttpUtility.HtmlEncode(yourRawStringVariableHere); string decodedRawStr = System.Web.HttpUtility.HtmlDecode(htmlEncodedStr);

Edición: Ya que estás enlazando datos desde un datatable. Use una expresión en línea para llamar a HTMLEncode en el marcado de GridView o cualquier otro control que utilice y esto seguirá cumpliendo con su requisito de enlace de datos. Vea el ejemplo a continuación. Alternativamente, puede hacer un bucle de cada registro en el objeto de la tabla de datos y actualizar cada celda con la cadena codificada html antes del enlace de datos.

<%# System.Web.HttpUtility.HtmlEncode(Eval("YourColumnNameHere")) %>


No he probado esta solución yo mismo, pero lo que intentaría es utilizar la integración CLR del servidor sql / .NET y llamar a la función C # HTMLEncode desde el T-SQL. Esto puede ser ineficiente, pero sospecho que le daría el resultado más preciso.

Mi punto de partida para averiguar cómo hacer esto sería http://msdn.microsoft.com/en-us/library/ms254498%28VS.80%29.aspx


OK aquí es lo que hice. Creé una función simple para manejarlo. Está lejos de ser completo, pero al menos maneja los caracteres <>& estándar. Lo añadiré a medida que avanzo.

CREATE FUNCTION HtmlEncode ( @UnEncoded as varchar(500) ) RETURNS varchar(500) AS BEGIN DECLARE @Encoded as varchar(500) SELECT @Encoded = Replace(@UnEncoded,''<'',''&lt;'') SELECT @Encoded = Replace(@Encoded,''>'',''&gt;'') SELECT @Encoded = Replace(@Encoded,''&'',''&amp;'') RETURN @Encoded END

Entonces puedo usar:

Select Ref,dbo.HtmlEncode(RecID) from Customers

Esto me da un ID de registro seguro HTML. Probablemente haya una función incorporada pero no la puedo encontrar.


Si está mostrando una cadena en la web, puede codificarla con Server.HTMLEncode ().

Si está almacenando una cadena en la base de datos, asegúrese de que el campo de la base de datos sea "nchar", en lugar de "char". Eso le permitirá almacenar cadenas unicode.

Si no puede controlar la base de datos, puede "aplanar" la cadena a ASCII con Encoding.ASCII.GetString.


Simplemente puede usar ''XML PATH en su consulta''. Por ejemplo;

DECLARE @encodedString VARCHAR(MAX) SET @encodedString = ''give your html string you want to encode'' SELECT @encodedString SELECT (SELECT @encodedString FOR XML PATH(''''))

Ahora, como desee, puede hacerlo en su propia función de SQL. Espero que esto ayude.


asignarlo a la propiedad de texto de la etiqueta, será auto codificado por .NET


Tenemos un sistema heredado que utiliza un activador y dbmail para enviar un correo electrónico codificado en HTML cuando se ingresa una tabla, por lo que requerimos codificación dentro de la generación de correo electrónico. Noté que la versión de Leo tiene un pequeño error que codifica el & in &lt; y &gt; Yo uso esta versión:

CREATE FUNCTION HtmlEncode ( @UnEncoded as varchar(500) ) RETURNS varchar(500) AS BEGIN DECLARE @Encoded as varchar(500) --order is important here. Replace the amp first, then the lt and gt. --otherwise the &lt will become &amp;lt; SELECT @Encoded = Replace( Replace( Replace(@UnEncoded,''&'',''&amp;''), ''<'', ''&lt;''), ''>'', ''&gt;'') RETURN @Encoded END GO