SQL аналог впрыска для JAVA струн - PullRequest
0 голосов
/ 04 марта 2020

Я передаю строку из Java в Python через промежуточное ПО и оцениваю строку для выполнения метода в python.

Допустим, я отправляю приведенную ниже строку из JAVA

'test_method("Value1", "Value2", **{"k1:":"v1", "k2":"v2"}'

Это будет оценено в python и будет вызван test_method с аргументами. Это работает нормально, пока в любом из значений не будет одинарного или двойного qoute. Например, если v1 или v2 содержат одинарные или двойные кавычки, я получаю синтаксическую ошибку во время оценки в python

. Я обрабатываю это, экранируя все символы при отправке из python.

Я не уверен, что здесь может присутствовать какой-либо аналог инъекции SQL. Может кто-нибудь сказать, безопасно ли избежать кавычек и обратной косой черты? Если нет, каков рекомендуемый способ сделать это.

1 Ответ

1 голос
/ 04 марта 2020

У вас есть сервер Python и клиент Java. Вопрос в том, доверяет ли сервер клиенту? Риск - это «внедрение кода» (см. OW ASP стр. для получения полезной информации).

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

Если вы управляете клиентом Java (вы единственный, кто пишет строку для eval 'd), вы можете чувствовать себя в безопасности, но есть некоторые проблемы:

  • Может ли какой-то другой клиент выступить в роли клиента Java и обмануть сервер? Если да, вы должны убедиться, что доступ к серверу является контроллером (клиент должен быть авторизован).
  • Даже если авторизация клиента проверена, этот клиент может контролироваться злоумышленником. Независимо от того, используется ли у вас модель безопасности Zero trust или (глубокоэшелонированная защита) [https://en.wikipedia.org/wiki/Defense_in_depth_ (вычисления)] , сервер не должен доверять данным, полученным от клиента.

Тем не менее, у вас есть два основных варианта, оба на стороне сервера :

  • Принять любой ввод и попытаться очистить то, что вы получаете (проверьте что кавычки сбалансированы, что у вас нет команды delete_all_files, et c.). В этом случае клиент Java должен избегать кавычек, обратной косой черты, ... Это очень рискованно , потому что воображение злоумышленников (и обычных пользователей) безгранично и вы можете получить командную строку, которая взломает sh ваш сервер.
  • Определите протокол между клиентом и сервером, например: клиент отправляет строку json, содержащую имя функции и параметры сервер проверяет, разрешено ли это, и выполняет его. Это намного лучше, потому что сервер может легко контролировать, если функция и аргументы действительны. (Вы можете создать свой собственный двоичный протокол, если хотите, но Json или XML - хороший выбор.) С таким протоколом вы можете избежать использования eval / exec на стороне сервера.

Подводя итог, я рекомендую вам:

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