Java - escape-строка для предотвращения внедрения SQL

Фактически, RESTfulness применяется только к RESOURCES, как указано универсальным идентификатором ресурса. Поэтому даже говорить о вещах, таких как заголовки, файлы cookie и т. Д. В отношении REST, не очень уместно. REST может работать над любым протоколом, хотя это обычно выполняется по HTTP.

Основным определяющим является следующее: если вы отправляете вызов REST, который является URI, то, как только вызов успешно завершен на сервер, делает ли этот URI один и тот же контент, если не выполняются переходы (PUT, POST, DELETE)? Этот тест будет исключать ошибки или запросы на аутентификацию, которые будут возвращены, поскольку в этом случае запрос еще не дошел до сервера, то есть сервлет или приложение, которое вернет документ, соответствующий данному URI.

Аналогично, в случае POST или PUT вы можете отправить заданный URI / полезную нагрузку и независимо от того, сколько раз вы отправляете сообщение, оно всегда будет обновлять одни и те же данные, чтобы последующие GET вернули согласованный результат?

REST - это данные приложения, а не информация о низком уровне, требуемая для передачи этих данных.

В следующем сообщении в блоге Рой Филдинг дал хорошее резюме всей идеи REST:

http://groups.yahoo.com/neo/groups/rest -discuss / conversations / topics / 5841

«Система RESTful переходит из одного стационарного состояния в другое, и каждое такое установившееся состояние является как потенциальным стартовым состоянием, так и потенциальным концом -state. Т.е. система RESTful представляет собой неизвестное количество компонентов, подчиняющихся простому набору правил, так что они всегда либо находятся в REST, либо переходят из одного состояния RESTful в другое состояние RESTful. Каждое состояние может быть полностью понято представлением (s ) он содержит и набор переходов, которые он предоставляет, причем переходы, ограниченные единым набором действий, должны быть понятны. Система может быть диаграммой сложного состояния, но каждый пользовательский агент может видеть только одно состояние за раз ( текущее установившееся состояние), и, таким образом, каждое состояние является простым и может быть проанализировано независимо. Пользователь OTOH может создавать свои собственные переходы при любом ti (например, введите URL-адрес, выберите закладку, откройте редактор и т. д.).


Переход к проблеме аутентификации, будь то с помощью файлов cookie или заголовков, до тех пор, пока информация не является частью URI и полезной нагрузки POST, она вообще не имеет никакого отношения к REST. Итак, что касается состояния без гражданства, мы говорим только о данных приложения.

Например, когда пользователь вводит данные в экран графического интерфейса, клиент отслеживает, какие поля были введены, что нет, никаких обязательных полей, которые отсутствуют. Это все CLIENT CONTEXT и не следует отправлять или отслеживать на сервере. То, что отправляется на сервер, - это полный набор полей, которые необходимо изменить в ресурсе IDENTIFIED (посредством URI), так что переход происходит на этом ресурсе из одного состояния RESTful в другой.

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

141
задан Tim Pietzcker 28 November 2009 в 18:45
поделиться

7 ответов

PreparedStatements are the way to go, because they make SQL injection impossible. Here's a simple example taking the user's input as the parameters:

public insertUser(String name, String email) {
   Connection conn = null;
   PreparedStatement stmt = null;
   try {
      conn = setupTheDatabaseConnectionSomehow();
      stmt = conn.prepareStatement("INSERT INTO person (name, email) values (?, ?)");
      stmt.setString(1, name);
      stmt.setString(2, email);
      stmt.executeUpdate();
   }
   finally {
      try {
         if (stmt != null) { stmt.close(); }
      }
      catch (Exception e) {
         // log this error
      }
      try {
         if (conn != null) { conn.close(); }
      }
      catch (Exception e) {
         // log this error
      }
   }
}

No matter what characters are in name and email, those characters will be placed directly in the database. They won't affect the INSERT statement in any way.

There are different set methods for different data types -- which one you use depends on what your database fields are. For example, if you have an INTEGER column in the database, you should use a setInt method. The PreparedStatement documentation lists all the different methods available for setting and getting data.

243
ответ дан 23 November 2019 в 23:02
поделиться

Я думаю escapeSql от , StringEscapeUtils мог сделать задание. Все же для попытки его, но похоже на вероятную опцию.

0
ответ дан 21 September 2019 в 01:35
поделиться

If really you can't use Defense Option 1: Prepared Statements (Parameterized Queries) or Defense Option 2: Stored Procedures, don't build your own tool, use the OWASP Enterprise Security API. From the OWASP ESAPI hosted on Google Code:

Don’t write your own security controls! Reinventing the wheel when it comes to developing security controls for every web application or web service leads to wasted time and massive security holes. The OWASP Enterprise Security API (ESAPI) Toolkits help software developers guard against security‐related design and implementation flaws.

For more details, see Preventing SQL Injection in Java and SQL Injection Prevention Cheat Sheet.

Pay a special attention to Defense Option 3: Escaping All User Supplied Input that introduces the OWASP ESAPI project).

35
ответ дан 23 November 2019 в 23:02
поделиться

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

Поэтому используйте параметры для всех предложений input, update и where. Динамический SQL - это просто открытая дверь для хакеров, и он включает динамический SQL в хранимые процедуры. Параметризация, параметризация, параметризация.

45
ответ дан 23 November 2019 в 23:02
поделиться

(Это ответ на комментарий OP под исходным вопросом; я полностью согласен с тем, что PreparedStatement - это инструмент для этой работы, а не регулярные выражения.)

Когда вы говорите \ n , вы имеете в виду последовательность \ + n или фактический символ перевода строки? Если это \ + n , задача довольно проста:

s = s.replaceAll("['\"\\\\]", "\\\\$0");

Чтобы сопоставить одну обратную косую черту во входных данных, вы помещаете четыре из них в строку регулярного выражения. Чтобы поместить в вывод одну обратную косую черту, вы помещаете четыре из них в заменяющую строку. Предполагается, что вы создаете регулярные выражения и замены в форме строковых литералов Java. Если вы создаете их каким-либо другим способом (например, читая их из файла), вам не нужно делать все это двойное экранирование.

Если у вас есть символ перевода строки во вводе и вы хотите заменить его escape-последовательностью, вы можете сделать второй проход по вводу с помощью этого:

s = s.replaceAll("\n", "\\\\n");

Или, может быть, вам нужны две обратные косые черты (я не слишком это ясно):

s = s.replaceAll("\n", "\\\\\\\\n");
19
ответ дан 23 November 2019 в 23:02
поделиться

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

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

Для получения дополнительной информации, Использование подготовленных операторов из Учебники по Java будут хорошим местом для начала.

9
ответ дан 23 November 2019 в 23:02
поделиться

In case you are dealing with a legacy system, or you have too many places to switch to PreparedStatements in too little time - i.e. if there is an obstacle to using the best practice suggested by other answers, you can try AntiSQLFilter

6
ответ дан 23 November 2019 в 23:02
поделиться
Другие вопросы по тегам:

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