Кодирование HTML в T-SQL?
Есть ли какая-либо функция для кодирования строк HTML в T-SQL? У меня есть устаревшая база данных, которая содержит dodgey-символы, такие как '<', ' > ' и т.д. Я могу написать функцию для замены символов, но есть ли лучший способ?
У меня есть приложение ASP.Net, и когда он возвращает строку, он содержит символы, которые вызывают ошибку. Приложение ASP.Net считывает данные из таблицы базы данных. Он не записывается в таблицу.
Ответы
Ответ 1
У нас есть устаревшая система, которая использует триггер и dbmail для отправки HTML-кодированного письма при вводе таблицы, поэтому нам требуется кодирование в генерации электронной почты. Я заметил, что у версии Лео есть небольшая ошибка, которая кодирует и в <
и >
я использую эту версию:
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 < will become &lt;
SELECT @Encoded =
Replace(
Replace(
Replace(@UnEncoded,'&','&'),
'<', '<'),
'>', '>')
RETURN @Encoded
END
GO
Ответ 2
Это немного поздно, но в любом случае, здесь правильные пути:
HTML-Encode (кодировка HTML = кодировка XML):
DECLARE @s NVARCHAR(100)
SET @s = '<html>unsafe & safe Utf8CharsDon''tGetEncoded ÄöÜ - "Conex"<html>'
SELECT (SELECT @s FOR XML PATH(''))
HTML-код в запросе:
SELECT
FIELD_NAME
,(SELECT FIELD_NAME AS [text()] FOR XML PATH('')) AS FIELD_NAME_HtmlENcoded
FROM TABLE_NAME
HTML-Decode:
SELECT CAST('<root>' + '<root>Test&123' + '</root>' AS XML).value(N'(root)[1]', N'varchar(max)');
Если вы хотите сделать это правильно, вы можете использовать хранимую CLR-процедуру.
Однако это становится немного сложнее, потому что вы не можете использовать System.Web-Assembly в CLR-хранимых процедурах (поэтому вы не можете использовать System.Web.HttpUtility.HtmlDecode(htmlEncodedStr);). Поэтому вам нужно написать свой собственный класс HttpUtility, который я бы не рекомендовал, особенно для декодирования.
К счастью, вы можете копировать System.Web.HttpUtility из исходного кода mono (.NET для Linux). Затем вы можете использовать HttpUtility без ссылки на system.web.
Затем вы пишете эту CLR-хранимую процедуру:
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
И зарегистрируйте его:
GO
/*
--http://stackoverflow.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;
*/
Впоследствии вы можете использовать его как обычные функции:
SELECT
dbo.HtmlEncode('helloäÖühello123') AS Encoded
,dbo.HtmlDecode('helloäÖühello123') AS Decoded
Любой, кто просто копирует пасты, учтите, что по соображениям эффективности вы использовали бы
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;
}
если вы используете эту функцию в процессе производства.
Смотрите здесь отредактированные моно классы:
http://pastebin.com/pXi57iZ3
http://pastebin.com/2bfGKBte
Вам нужно определить NET_2_0 в настройках сборки
![Build options]()
Ответ 3
Вы не должны исправлять строку в SQL. Лучше всего использовать функцию в ASP.net под названием HtmlEncode, это будет готовить специальные символы, которые вызывают проблемы, которые вы видите, см. Пример ниже. Надеюсь, это поможет.
string htmlEncodedStr = System.Web.HttpUtility.HtmlEncode(yourRawStringVariableHere);
string decodedRawStr = System.Web.HttpUtility.HtmlDecode(htmlEncodedStr);
Изменить:
Так как вы привязываете данные к данным из данных. Используйте встроенное выражение для вызова HTMLEncode в разметке GridView или любого другого элемента управления, используемого вами, и это все равно будет удовлетворять требованиям привязки данных. См. Пример ниже. Альтернативно вы можете зацикливать каждую запись в объекте таблицы данных и обновлять каждую ячейку с помощью кодированной html строки до привязки данных.
<%# System.Web.HttpUtility.HtmlEncode(Eval("YourColumnNameHere")) %>
Ответ 4
Я не думаю, что данные в базе данных должны знать или заботиться о пользовательском интерфейсе. Уровень отображения должен обрабатываться уровнем представления. Я бы не хотел, чтобы какой-либо HTML смешивался с базой данных.
Ответ 5
Если вы показываете строку в Интернете, вы можете закодировать ее с помощью Server.HTMLEncode().
Если вы сохраняете строку в базе данных, убедитесь, что поле базы данных "nchar", а не "char". Это позволит хранить строки unicode.
Если вы не можете управлять базой данных, вы можете "сгладить" строку в ASCII с помощью Encoding.ASCII.GetString.
Ответ 6
Вы можете просто использовать "XML PATH в своем запросе". Например:
DECLARE @encodedString VARCHAR(MAX)
SET @encodedString = 'give your html string you want to encode'
SELECT @encodedString
SELECT (SELECT @encodedString FOR XML PATH(''))
Теперь, как ваше желание, вы можете это сделать в своей собственной функции sql. Надеюсь, это поможет.
Ответ 7
ОК, вот что я сделал. Я создал простую функцию для ее обработки. Это далеко не полный, но, по крайней мере, обрабатывает стандартные символы <>&
. Я просто добавлю к этому, когда я пойду.
CREATE FUNCTION HtmlEncode
(
@UnEncoded as varchar(500)
)
RETURNS varchar(500)
AS
BEGIN
DECLARE @Encoded as varchar(500)
SELECT @Encoded = Replace(@UnEncoded,'<','<')
SELECT @Encoded = Replace(@Encoded,'>','>')
SELECT @Encoded = Replace(@Encoded,'&','&')
RETURN @Encoded
END
Затем я могу использовать:
Select Ref,dbo.HtmlEncode(RecID) from Customers
Это дает мне безопасный идентификатор записи HTML. Возможно, есть встроенная функция, но я не могу ее найти.
Ответ 8
назначьте его текстовому свойству метки, он будет автоматически закодирован .NET.
Ответ 9
Я не пробовал это решение самостоятельно, но я бы попытался использовать интеграцию sql server/.NET CLR и фактически вызывать функцию HTMLEncode С# из T-SQL.
Это может быть неэффективным, но я подозреваю, что это даст вам самый точный результат.
Моей отправной точкой для разработки, как это сделать, будет http://msdn.microsoft.com/en-us/library/ms254498%28VS.80%29.aspx