Является ли данный оператор sql уязвимым для атаки sql инъекцией? - PullRequest
1 голос
/ 10 февраля 2020

Я создаю оператор sql, подобный приведенному ниже, в приложении rails: -

bank_ids = params[:bank_ids] # comes from end user or simply, is a user input.  

sql_string = "SELECT * FROM users WHERE bank_id IN (#{bank_ids});"  

Является ли оператор sql выше уязвимым для инъекционной атаки, ввод 'bank_ids' завершен контролируемый пользователем.

1 Ответ

4 голосов
/ 10 февраля 2020

Возьмем, к примеру, таблицу, предназначенную для хранения логического значения, чтобы определить, является ли пользователь администратором или нет (возможно, это не так, но это пример):

                                                              Table "public.users"
   Column   |              Type              | Collation | Nullable |              Default              | Storage  | Stats target | Description
------------+--------------------------------+-----------+----------+-----------------------------------+----------+--------------+-------------
 id         | bigint                         |           | not null | nextval('users_id_seq'::regclass) | plain    |              |
 name       | character varying              |           |          |                                   | extended |              |
 admin      | boolean                        |           |          |                                   | plain    |              |
 bank_id    | integer                        |           |          |                                   | plain    |              |

Если вы получите что-то вроде этого:

'1) or id IN (select id from users where admin = true'

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

select * from users where bank_id IN (1) or id IN (select id from users where admin = true)

Лучше для вас полагаться на имеющийся у вас ORM и оставить его для выполнения очистки и правильных привязок для вас (это одна из причин, почему эти инструменты существуют). Например, использование ActiveRecord свяжет переданные для вас значения без особой необходимости:

User.where(bank_id: '1) or id IN (select id from users where admin = true')
# ... SELECT "users".* FROM "users" WHERE "users"."bank_id" = $1  [["bank_id", 1]]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...