Отфильтруйте недопустимые символы XML в.NET

discord.py использует два разных класса для представления учетной записи, User и Member. Member является подклассом User. Объект User представляет учетную запись пользователя (вы, я, бот), а объект Member представляет состояние учетной записи на определенном сервере и включает в себя псевдонимы, роли, разрешения и т. Д.

Вы не можете забанить User, потому что User объекты не содержат никакой информации о сервере, с которого они должны быть забанены. Вместо этого вам нужно получить объект члена этого сервера. К счастью, у Server объектов есть метод, который облегчает это

member = message.channel.server.get_member(line) 
6
задан Brandon Montgomery 29 April 2009 в 13:03
поделиться

5 ответов

Я уже абстрагировал создание объектов SqlParameter повсюду в приложении, так что в этой точке я рассмотрю ввод. Мой метод абстракции создает и возвращает объект SqlParameter для использования в вызове хранимой процедуры. Если это varchar, который хочет вызывающий, я переберу каждый символ строки, которую они хотят преобразовать в объект SqlParameter, и отфильтрую эти недопустимые двоичные символы XML. Это исключит попадание неверных данных в базу данных.

0
ответ дан 17 December 2019 в 22:14
поделиться

How did the bad data get into the database? Are you using an XML column?

You can put the filtering (it's called "validation", actually) into the stored procedures used to enter data into the database, or you can add triggers to check the data regardless of where it comes from.

In general, don't allow bad data to get into the database!

0
ответ дан 17 December 2019 в 22:14
поделиться

Как ваша хранимая процедура создает XML? Если вы используете какой-либо параметр FOR XML в SQL Server, двоичные символы в текстовых полях будут правильно экранированы:

CREATE TABLE test (
   id int identity(1,1) not null primary key, 
   data nvarchar(50))
INSERT INTO test (data) values (char(0))
SELECT * FROM test FOR XML RAW

выдает:

<row ID="1" data="&#x0;" />
0
ответ дан 17 December 2019 в 22:14
поделиться

Это вопрос кодирования? Или xml просто искажен? Если уродливый, я не могу помочь. Но для кодирования ... к сожалению, ExecuteXmlReader не позволяет вам указать кодировку, но вы можете обрабатывать данные как BLOB и обрабатывать их отдельно с вашей собственной кодировкой и XmlReader ?

Если данные большие, вам, вероятно, следует использовать ExecuteReader с CommandBehavior.SequentialAccess и записать его во временный файл ( Path.GetTempFileName () ) - затем обработайте этот файл как поток с помощью XmlReader .

0
ответ дан 17 December 2019 в 22:14
поделиться

Я видел, как DotNet SqlClient «скремблирует» данные из столбцов nvarchar в базе данных, наша теория это то, чем нужно заниматься с «суррогатными кодовыми точками» см .:

http://www.siao2.com/2005/07/27/444101.aspx

http://publib.boulder.ibm.com/infocenter/iseries/ v5r3 / index.jsp? topic = rzaaxsurrogate.htm

http://publib.boulder.ibm.com/infocenter/db2luw/v8/index.jsp?topic=/com.ibm.db2.udb.doc/admin /c0004816.htm

SqlClient, казалось, «интерпретировал» некоторые байты, означая, что наш Xml больше не был правильно сформирован, преобразование в nvarchar (max), похоже, остановило это (хотя это действительно повлияло на производительность):

SELECT CONVERT(NVARCHAR(MAX), MyValue) FROM ...

Обратите внимание, что вам нужно использовать NVARCHAR (MAX), NVARCHAR (N) не работает.

Мы также обнаружили, что провайдер OleDB также работает правильно (хотя он медленнее, чем SqlClient).

1
ответ дан 17 December 2019 в 22:14
поделиться
Другие вопросы по тегам:

Похожие вопросы: