Лучший способ закодировать текстовые данные для XML в Java?

Я думаю, что если кто-то захочет использовать PHP и MySQL или какой-нибудь другой сервер базы данных:

  1. Подумайте об обучении PDO (объекты данных PHP) - это база данных уровень доступа, обеспечивающий единый метод доступа к нескольким базам данных.
  2. Подумайте об обучении MySQLi
  3. Используйте собственные функции PHP, такие как: strip_tags , mysql_real_escape_string или если переменная числовая, просто (int)$foo. Подробнее о типах переменных в PHP читайте здесь . Если вы используете библиотеки, такие как PDO или MySQLi, всегда используйте PDO :: quote () и mysqli_real_escape_string () .

Примеры библиотек:

---- PDO

----- Никакие заполнители - не спешили для SQL-инъекций! Это плохо

$request = $pdoConnection->("INSERT INTO parents (name, addr, city) values ($name, $addr, $city)");

----- Без имени заполнители

$request = $pdoConnection->("INSERT INTO parents (name, addr, city) values (?, ?, ?);

----- Именованные заполнители

$request = $pdoConnection->("INSERT INTO parents (name, addr, city) value (:name, :addr, :city)");

--- MySQLi

$request = $mysqliConnection->prepare('
       SELECT * FROM trainers
       WHERE name = ?
       AND email = ?
       AND last_login > ?');

    $query->bind_param('first_param', 'second_param', $mail, time() - 3600);
    $query->execute();

PS:

PDO побеждает в этом сражении с легкостью. Благодаря поддержке двенадцати различных драйверов баз данных и именованных параметров мы можем игнорировать небольшую потерю производительности и привыкнуть к ее API. С точки зрения безопасности, оба они являются безопасными, пока разработчик использует их так, как они должны использоваться

. Но хотя PDO и MySQLi довольно быстры, MySQLi выполняет незначительную скорость в тестах - ~ 2,5% для незаготовленных отчетов и ~ 6,5% для подготовленных.

И, пожалуйста, проверьте каждый запрос в своей базе данных - это лучший способ предотвратить инъекцию.

88
задан Community 23 May 2017 в 10:31
поделиться

7 ответов

Очень просто: пользуйтесь библиотекой XML. Тем путем это на самом деле будет право вместо того, чтобы требовать детального знания битов спецификации XML.

41
ответ дан Jon Skeet 24 November 2019 в 07:25
поделиться

Используйте JAXP и забудьте о тексте, обрабатывающем его, будет сделан для Вас автоматически.

0
ответ дан Fernando Miguélez 24 November 2019 в 07:25
поделиться

Примечание: Вашим вопросом является [приблизительно 112] выход , не кодирование . Выход использует < и т.д. позволить синтаксическому анализатору различать "это - команда XML" и "это - некоторый текст". Кодирование является материалом, который Вы определяете в заголовке XML (UTF-8, ISO-8859-1, и т.д.).

, В первую очередь, как все остальные сказал, пользуйтесь библиотекой XML. XML выглядит простым, но материал encoding+escaping является темным вуду (который Вы заметите, как только Вы встречаетесь с умляутами и японским языком и другим странным материалом как" полные цифры ширины " (& #FF11; 1)). Хранение человекочитаемый XML является задачей Sisyphus.

я предлагаю никогда не попытаться быть умным о текстовом кодировании и выходе в XML. Но не позволяйте этому мешать Вам пробовать; просто помните, когда это укусит Вас (и это будет).

Однако при использовании только UTF-8, для создания вещей более читаемыми можно рассмотреть эту стратегию:

  • , Если текст действительно содержит '<'; '>' или '&'; оберните его в <![CDATA[ ... ]]>
  • , Если текст не содержит эти три символа, не деформируйте его.

я использую это в редакторе SQL, и это позволяет разработчикам cut& SQL вставки от стороннего инструмента SQL в XML, не вызывая беспокойство о выходе. Это работает, потому что SQL не может содержать умляуты в нашем случае, таким образом, я в безопасности.

5
ответ дан Aaron Digulla 24 November 2019 в 07:25
поделиться

Это работало хорошо на меня для обеспечения завершенной версии текстовой строки:

public class XMLHelper {

/**
 * Returns the string where all non-ascii and <, &, > are encoded as numeric entities. I.e. "&lt;A &amp; B &gt;"
 * .... (insert result here). The result is safe to include anywhere in a text field in an XML-string. If there was
 * no characters to protect, the original string is returned.
 * 
 * @param originalUnprotectedString
 *            original string which may contain characters either reserved in XML or with different representation
 *            in different encodings (like 8859-1 and UFT-8)
 * @return
 */
public static String protectSpecialCharacters(String originalUnprotectedString) {
    if (originalUnprotectedString == null) {
        return null;
    }
    boolean anyCharactersProtected = false;

    StringBuffer stringBuffer = new StringBuffer();
    for (int i = 0; i < originalUnprotectedString.length(); i++) {
        char ch = originalUnprotectedString.charAt(i);

        boolean controlCharacter = ch < 32;
        boolean unicodeButNotAscii = ch > 126;
        boolean characterWithSpecialMeaningInXML = ch == '<' || ch == '&' || ch == '>';

        if (characterWithSpecialMeaningInXML || unicodeButNotAscii || controlCharacter) {
            stringBuffer.append("&#" + (int) ch + ";");
            anyCharactersProtected = true;
        } else {
            stringBuffer.append(ch);
        }
    }
    if (anyCharactersProtected == false) {
        return originalUnprotectedString;
    }

    return stringBuffer.toString();
}

}
13
ответ дан Lawrence Johnston 24 November 2019 в 07:25
поделиться

Просто используйте.

<![CDATA[ your text here ]]>

Это позволит любые символы кроме окончания

]]>

, Таким образом, можно будет включать символы, которые были бы недопустимы, такие как & и>. Например.

<element><![CDATA[ characters such as & and > are allowed ]]></element>

Однако атрибутов должны будут оставить, поскольку блоки CDATA не могут использоваться для них.

19
ответ дан ng. 24 November 2019 в 07:25
поделиться

Как другие упомянули, пользование библиотекой XML является самым легким путем. Если Вы действительно хотите выйти из себя, Вы могли бы изучить StringEscapeUtils от библиотека Commons Lang Apache.

117
ответ дан Stevoisiak supports Monica 24 November 2019 в 07:25
поделиться

В то время как идеализм говорит, что используйте XML-библиотеку, ИМХО, если у вас есть базовое представление об XML, то здравый смысл и производительность говорят о шаблоне полностью. Возможно, это и более читабельно. Хотя использование функций экранирования библиотеки, вероятно, является хорошей идеей.

Подумайте об этом: XML был предназначен для написания людьми.

Используйте библиотеки для генерации XML, когда ваш XML как «объект» лучше моделирует вашу проблему. Например, если подключаемые модули участвуют в процессе построения этого XML.

Изменить: что касается того, как на самом деле экранировать XML в шаблонах, использование CDATA или escapeXml (строка) из JSTL - два хороших решения, escapeXml (строка) можно использовать как это:

<%@taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions"%>

<item>${fn:escapeXml(value)}</item>
6
ответ дан 24 November 2019 в 07:25
поделиться
Другие вопросы по тегам:

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