|
|
|
Как применить строковую функцию только к части выборки?
|
|||
|---|---|---|---|
|
#18+
Есть информационная система (веб-приложение), в которой имеется конфиденциальная информация, которую не должны видеть почти все пользователи. Например пароль на доступ к определенному сервису, который хранится текстом. В информационной системе показ или скрытие этой информацией регулируется правами доступа пользователей (штатным инструментом). В информационной системе также есть функция "Журнал действий пользователей", который показывает выполняемые действия. Одно из таких действий — это смена пароля, для этого действия в текстовом описании действия указывается старый и новый пароль. То есть это недоработка информационной системы, посредством которой пользователи могут узнать пароль клиента. Чтобы исправить эту недоработку, я внес изменения в серверный код информационной системы — точнее в текст SQL-запроса, который использует серверный код для получения информации из журнала. В SQL-запросе для поля с текстовым описанием действия я с помощью case определяю тип действия и для сообщений и смене пароля выполняю regexp_replace. Все работает, но таблица журнала действий содержит миллионы строк и в результате задача "Журнал действий пользователей" начинает очень сильно тормозить — а без применения функции к полям таблицы задача отрабатывает быстро, поскольку необходимые поля индексированы и для вывода записей используется пагинация. Сейчас я временно использую другое решение — SQL-запрос оставил как есть, а замену текста выполняю в процессе вывода строк для веб-сервера. Так работает приемлемо, поскольку выводится не более 100 строк и даже построчная их обработка выполняется быстро. А можно ли нужные изменения применить прямо в SQL-запросе, чтобы из БД уже возвращалась замаскированная информация? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.04.2018, 11:14 |
|
||
|
Как применить строковую функцию только к части выборки?
|
|||
|---|---|---|---|
|
#18+
может быть не стоит хранить пароль в открытом виде в описании к действию? То есть подменять его при вставке в БД истории действия пользователей? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.04.2018, 11:31 |
|
||
|
Как применить строковую функцию только к части выборки?
|
|||
|---|---|---|---|
|
#18+
Alibek B. а без применения функции к полям таблицы задача отрабатывает быстро, поскольку необходимые поля индексированы и для вывода записей используется пагинация. Не верю ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.04.2018, 11:35 |
|
||
|
Как применить строковую функцию только к части выборки?
|
|||
|---|---|---|---|
|
#18+
Alibek B.в текстовом описании действия указывается старый и новый пароль У вас тут ошибка. Попробуйте хранить хэш. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.04.2018, 11:36 |
|
||
|
Как применить строковую функцию только к части выборки?
|
|||
|---|---|---|---|
|
#18+
Нет, пароль должен быть текстом, он используется оборудованием, которое не умеет работать с кодированным или хешированным паролем, поддерживает только plain password. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.04.2018, 11:36 |
|
||
|
Как применить строковую функцию только к части выборки?
|
|||
|---|---|---|---|
|
#18+
Alibek B., Планы в студию с наложение regexp_replace и без ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.04.2018, 11:38 |
|
||
|
Как применить строковую функцию только к части выборки?
|
|||
|---|---|---|---|
|
#18+
DshedooУ вас тут ошибка. Попробуйте хранить хэш. Так информационная система сделана. Программный код информационной системы мне доступен, поэтому теоретически я могу это сделать — маскировать пароль при регистрации действия в журнале. Но пароль может изменяться в разных местах и разными способами, поэтому я могу что-то пропустить. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.04.2018, 11:38 |
|
||
|
Как применить строковую функцию только к части выборки?
|
|||
|---|---|---|---|
|
#18+
XMLerПланы в студию с наложение regexp_replace и без Это сложновато будет. SQL собирается в информационной системе, в SQL есть хинты, поэтому для правильности нужно перехватить тот SQL-запрос, который информационная система отправляет в СУБД. А я не настолько хорошо знаю ЯП информационной системы, чтобы это сделать. Но попробую собрать SQL вручную, исходя из программного кода. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.04.2018, 11:41 |
|
||
|
Как применить строковую функцию только к части выборки?
|
|||
|---|---|---|---|
|
#18+
Alibek B., 1) странно что сильно тормозит из-за regexp_replace 2) разово в журнале шифровать пароли олд/нью напр раз в 15минут (не выход, но ...) 3) если "Журнал действий пользователей" имеет триггер, шифровать в нем зы можно добавить триггер на журнал но могут возникнуть тормоза .... stax ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.04.2018, 12:16 |
|
||
|
Как применить строковую функцию только к части выборки?
|
|||
|---|---|---|---|
|
#18+
Журнал действий операторов — это одна из самых больших таблиц, там порядка 200кк записей, я с ней экспериментировать не рискну. Что касается тормозов от применения функции к одному из полей выборки — может быть это ломает какой-нибудь хинт. Когда извлеку SQL и воспроизведу проблему, приложу оба плана. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.04.2018, 12:23 |
|
||
|
Как применить строковую функцию только к части выборки?
|
|||
|---|---|---|---|
|
#18+
Alibek B.Что касается тормозов от применения функции к одному из полей выборки — может быть это ломает какой-нибудь хинт. Какой именно хинт ломает изменение select кляузы с field1 на case when a=1 then regexp_replace(fild_1 else field_1 end ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.04.2018, 12:28 |
|
||
|
Как применить строковую функцию только к части выборки?
|
|||
|---|---|---|---|
|
#18+
Не знаю, это предположение и может быть причина в другом. Вот DDL основной таблицы: Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74. 75. 76. 77. 78. 79. 80. 81. 82. 83. 84. 85. 86. 87. 88. 89. 90. 91. 92. 93. 94. 95. 96. 97. 98. 99. 100. 101. 102. 103. 104. 105. 106. 107. 108. 109. 110. 111. 112. 113. 114. 115. 116. 117. 118. 119. 120. 121. 122. 123. 124. 125. 126. 127. 128. 129. 130. 131. 132. 133. 134. 135. 136. 137. 138. 139. 140. 141. 142. 143. 144. 145. 146. 147. 148. 149. 150. 151. 152. 153. 154. 155. 156. 157. 158. 159. 160. 161. 162. 163. 164. 165. 166. 167. 168. Запрос в целом базируется на таком: Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. (строки, где указаны переменные с символом доллара, формируются динамически, в зависимости от выбранных условий) Но в серверном коде он как-то обрабатывается дополнительно, потому что там есть листание по страницам. Где это делается в коде я пока не нашел, скорее всего это какой-то общий механизм, вынесенный в отдельную библиотеку. Вот пример запроса с конкретными параметрами: Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. В веб-интерфейсе информационной системы и в TOAD запрос с такими параметрами выполняется менее секунды. Если поле bm_action_log_staff_comment я формирую в зависимости от bm_action_log.action_id и определенного параметра, зависящего от текущего пользователя, то в информационной системе этот запрос выполняется очень долго. В TOAD я его повторить пока не могу. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.04.2018, 13:07 |
|
||
|
Как применить строковую функцию только к части выборки?
|
|||
|---|---|---|---|
|
#18+
Alibek B.в текст SQL-запроса, который использует серверный код для получения информации из журнала. В SQL-запросе для поля с текстовым описанием действия я с помощью case определяю тип действия и для сообщений и смене пароля выполняю regexp_replace. Все работает,А что мешает сделать это один раз в триггере? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.04.2018, 13:11 |
|
||
|
Как применить строковую функцию только к части выборки?
|
|||
|---|---|---|---|
|
#18+
Я стараюсь не лезть туда, где могу что-то сломать. Если я что-то неправильно сделаю в программном коде информационной системы, который осуществляет вывод информации в браузер, то это ошибку легко будет исправить, в самом крайнем случае просто скопировав заранее сделанную копию программного модуля. Если я что-то сделаю неправильно в триггере, я могу испортить данные. Их конечно можно вернуть через бэкап, но это сложнее и дольше. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.04.2018, 13:15 |
|
||
|
Как применить строковую функцию только к части выборки?
|
|||
|---|---|---|---|
|
#18+
К тому же у некоторых пользователей есть доступ к просмотру паролей, и им вполне можно разрешить смотреть эти пароли в журнале. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.04.2018, 13:16 |
|
||
|
Как применить строковую функцию только к части выборки?
|
|||
|---|---|---|---|
|
#18+
Alibek B.Я стараюсь не лезтьОбратись к разработчикам, не майся дурью. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.04.2018, 13:30 |
|
||
|
Как применить строковую функцию только к части выборки?
|
|||
|---|---|---|---|
|
#18+
а как выглядит запрос с case? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.04.2018, 14:06 |
|
||
|
Как применить строковую функцию только к части выборки?
|
|||
|---|---|---|---|
|
#18+
Alibek B.В веб-интерфейсе информационной системы и в TOAD запрос с такими параметрами выполняется менее секунды. Если поле bm_action_log_staff_comment я формирую в зависимости от bm_action_log.action_id и определенного параметра, зависящего от текущего пользователя, то в информационной системе этот запрос выполняется очень долго. В TOAD я его повторить пока не могу. в запросе нет bm_action_log_staff_comment я так понимаю Вам надо поменять bm_action_log.new_value bm_action_log_new_value, на типа .... decode(bm_action_log.target_id?,xxx.'******',new_value) bm_action_log_new_value ... ..... stax ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.04.2018, 14:41 |
|
||
|
Как применить строковую функцию только к части выборки?
|
|||
|---|---|---|---|
|
#18+
ElicОбратись к разработчикам Это слишком дорого. Кроме того, сейчас эта версия информационной системы уже не поддерживается, нужно обновляться на 3 мажорных версии и переносить модификации. Практически это нереально. Бельфяа как выглядит запрос с case? Как-то так: Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. По хорошему вместо in (1,2,3) должно быть exists (select ... from bm_staff join bm_role on ...), но как я понимаю, такой подход на больших таблицах противопоказан, поэтому списки идентификаторов у меня вписаны прямо в запрос. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.04.2018, 14:48 |
|
||
|
Как применить строковую функцию только к части выборки?
|
|||
|---|---|---|---|
|
#18+
Alibek B. Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. Код: plsql 1. 2. 3. 4. 5. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.04.2018, 15:06 |
|
||
|
Как применить строковую функцию только к части выборки?
|
|||
|---|---|---|---|
|
#18+
Alibek B.Нет, пароль должен быть текстом, он используется оборудованием, которое не умеет работать с кодированным или хешированным паролем, поддерживает только plain password.Я верно понял, что оборудование лезет в логи для получения самого свежего пароля? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.04.2018, 16:55 |
|
||
|
Как применить строковую функцию только к части выборки?
|
|||
|---|---|---|---|
|
#18+
Нет, я имел ввиду, что открытый пароль нужен в рабочих таблицах — оборудование авторизует услуги по RADIUS и умеет только plain password. Хранить открытый пароль в логах необходимости нет, но сама информационная система устроена так, что любые атрибуты (в том числе и пароли) сохраняет в логах как есть, в виде текста. Если маскировать пароль перед сохранением в логах (с помощью триггера), то это на функционировании системы никак не скажется. В принципе на таблице логов и без того висит триггер, и насколько я могу видеть, в него маскировку паролей несложно будет добавить. Но теперь уже из любопытства хотелось бы узнать, можно ли маскировать пароль непосредственно в SQL-запросе, не изменяя БД. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.04.2018, 17:05 |
|
||
|
Как применить строковую функцию только к части выборки?
|
|||
|---|---|---|---|
|
#18+
Повесь RLS policy для маскировки от всех кто не должен видеть. Например только владелец может видеть поле sal в таблице sec_emp: Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74. 75. 76. 77. 78. 79. 80. 81. 82. 83. 84. 85. 86. 87. 88. 89. 90. 91. 92. 93. 94. 95. 96. SY. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.04.2018, 17:32 |
|
||
|
Как применить строковую функцию только к части выборки?
|
|||
|---|---|---|---|
|
#18+
Alibek B.Но теперь уже из любопытства хотелось бы узнать, можно ли маскировать пароль непосредственно в SQL-запросе, не изменяя БД. можно, ведь " В SQL-запросе для поля с текстовым описанием действия я с помощью case определяю тип действия и для сообщений и смене пароля выполняю regexp_replace." вопрос в другом, почему "начинает очень сильно тормозить " я б так делал задал параметры с хитринкой напр с 29 апреля или что-то подобное для запроса с тормозами и искал итоговый оператор в v$sql ..... stax ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.04.2018, 17:42 |
|
||
|
|

start [/forum/topic.php?fid=52&fpage=118&tid=1884157]: |
0ms |
get settings: |
6ms |
get forum list: |
18ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
45ms |
get topic data: |
12ms |
get forum data: |
3ms |
get page messages: |
77ms |
get tp. blocked users: |
2ms |
| others: | 205ms |
| total: | 376ms |

| 0 / 0 |
