Очистка строки в Java - PullRequest
       1

Очистка строки в Java

9 голосов
/ 11 июля 2011

Есть ли какая-либо функция или библиотека, которые можно использовать для очистки ввода пользователя.Как, например, если пользователь вводит текст с именем baily's, тогда я должен экранировать ' перед отправкой его на запрос mysql.Точно так же я должен иметь возможность фильтровать нулевые символы и \ n, \ t, \ r и т. Д. Как и в PHP у нас есть mysql_real_escape_string($input) Есть ли что-нибудь в Java, чтобы сделать это?

Ответы [ 5 ]

11 голосов
/ 11 июля 2011

В Java вы обычно не делаете это вручную.

Вместо этого вы будете использовать PreparedStatement и передавать любые аргументы в свой оператор SQL с помощью явных setString() или setObject() методов.

Таким образом, драйвер JDBC будет обрабатывать его (либо выполняя необходимое экранирование, либо отправляя оператор SQL отдельно от аргументов в зависимости от БД).

Например, ваш код может выглядеть так (используя prepareStatement()):

Connection c = ...; // get Connection from somehwere
PreparedStatement stmt = c.prepareStatement("SELECT * FROM BOOKS WHERE TITLE = ?");
stmt.setString(1, userInput);
ResultSet result = stmt.executeQuery();
4 голосов
/ 11 июля 2011

Для этого вы используете подготовленные операторы с заполнителями. Смотри http://download.oracle.com/javase/tutorial/jdbc/basics/prepared.html

Точно так же, как вы должны в PHP: http://php.net/manual/en/pdo.prepared-statements.php

Я имею в виду не обижаться, когда говорю, что только идиоты будут использовать mysql_real_escape_string в пользу готовых заявлений с заполнителями.

2 голосов
/ 12 февраля 2012

Краткий ответ, нет, за исключением очень специфических определений «чистый». Прямо сейчас вы должны использовать решение для конкретного языка - для SQL просто используйте подготовленный оператор.

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

Существуют автоматические контекстные авто-экранирующие символы для HTML на языках шаблонов, таких как Soy , Go , вариант jQuery , cTemplates, clearsilver и, надеюсь, другие в ближайшее время.

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

Учитывая грамматику, подобную приведенной ниже, которая включает аннотации, которые показывают, как структура данных отображается в подстроки на языке:

JSONValue            := JSONNullLiteral
                      | JSONBooleanLiteral
                      | JSONObject
                      | JSONArray
                      | JSONString
                      | JSONNumber                                    ;
JSONObject           := @KeyValueMap ([{] JSONMemberList? [}])        ;
JSONMemberList       := JSONMember ([,] JSONMemberList)?              ;
JSONMember           := @Key JSONString [:] @Value JSONValue          ;
JSONNullLiteral      := @ValueNull "null"                             ;
JSONBooleanLiteral   := @ValueFalse "false" | @ValueTrue "true"       ;
JSONArray            := @List("[" (JSONValue ([,] JSONValue)*)? "]")  ;
JSONString           := @String ([\"] JSONStringCharacters? [\"])     ;
JSONNumber           := @Number (Sign? (Mantissa Exponent? | Hex))    ;
JSONStringCharacters := JSONStringCharacter JSONStringCharacters?     ;
JSONStringCharacter  := @Char ([^\"\\\x00-\x1f])
                      | JSONEscapeSequence                            ;
JSONEscapeSequence   := "\\" @Char [/\\\"]
                      | @Char{[\x08]} "\\b"
                      | @Char{[\x0c]} "\\f"
                      | @Char{[\x0a]} "\\n"
                      | @Char{[\x0d]} "\\r"
                      | @Char{[\x09]} "\\t"
                      | @Char ("\\u" @Scalar (hex hex hex hex))       ;
Mantissa             := (Integer ([.] Fraction?) | [.] Fraction)      ;
Exponent             := [Ee] Sign? decimal+                           ;
Integer              := [0] | [1-9] [0=9]*                            ;
Fraction             := [0-9]+                                        ;
Hex                  := [0] [Xx] hex+                                 ;
Sign                 := [+\-]                                         ;

мы можем построить конечный автомат, как показано ниже:

enter image description here

, которая преобразует последовательности событий (start, start_object, start_key, символ 'x', ...) в инструкции, которые кодируют символы в буфер.

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

Если это сработает, было бы легко включить в языки программирования общего назначения механизмы автоматического и безопасного составления контента на таких языках, как SQL, HTML и т. Д. С изменениями в определениях языков, чтобы execute_query мог найти Границы между указанным программистом контентом и внедренным контентом в execute_query("SELECT * FROM Table WHERE ID=$ID") и их использование для автоматического выхода из внедренного контента, мы можем заставить эту идиому работать так, как задумал программист.

2 голосов
/ 11 июля 2011

Вы должны использовать PreparedStatement и установить значения $input с помощью функции setString.

Причина использования PreparedStatement заключается в том, что каждой базе данных может потребоваться экранировать разные вещи. Эта сложность скрыта в конкретной реализации PreparedStatement, предоставляемой поставщиком базы данных.

1 голос
/ 11 июля 2011

Используемый вами экранирование специфично для системы, для которой вы хотите использовать строку.Если вы используете MySQL, вам нужно сделать другое экранирование, чем если вы хотите использовать строку в фрагменте Javascript.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...