Skip to content

Commit c31d808

Browse files
author
Maia Engeli
authored
Merge pull request #67 from appoptics/sanitize_AO-10959
[sql_sanitize] fix bad sanitizing when there is an escaped `'`
2 parents a5e7dd5 + 941d596 commit c31d808

File tree

4 files changed

+26
-10
lines changed

4 files changed

+26
-10
lines changed

lib/appoptics_apm/util.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -170,7 +170,7 @@ def sanitize_sql(sql)
170170
return sql unless AppOpticsAPM::Config[:sanitize_sql]
171171

172172
regexp = Regexp.new(AppOpticsAPM::Config[:sanitize_sql_regexp], AppOpticsAPM::Config[:sanitize_sql_opts])
173-
sql.gsub(regexp, '?')
173+
sql.gsub(/\\\'/,'').gsub(regexp, '?')
174174
end
175175

176176
##

lib/rails/generators/appoptics_apm/templates/appoptics_apm_initializer.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,7 @@
7575
# collect and report query literals to AppOpticsAPM.
7676
#
7777
AppOpticsAPM::Config[:sanitize_sql] = true
78-
AppOpticsAPM::Config[:sanitize_sql_regexp] = '(\'[\s\S][^\']*\'|\d*\.\d+|\d+|NULL)'
78+
AppOpticsAPM::Config[:sanitize_sql_regexp] = '(\'[^\']*\'|\d*\.\d+|\d+|NULL)'
7979
AppOpticsAPM::Config[:sanitize_sql_opts] = Regexp::IGNORECASE
8080

8181
#

test/support/config_test.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -151,7 +151,7 @@ class ConfigTest
151151
AppOpticsAPM::Config[:verbose].must_equal false
152152
AppOpticsAPM::Config[:tracing_mode].must_equal :always
153153
AppOpticsAPM::Config[:sanitize_sql].must_equal true
154-
AppOpticsAPM::Config[:sanitize_sql_regexp].must_equal '(\'[\s\S][^\']*\'|\d*\.\d+|\d+|NULL)'
154+
AppOpticsAPM::Config[:sanitize_sql_regexp].must_equal '(\'[^\']*\'|\d*\.\d+|\d+|NULL)'
155155
AppOpticsAPM::Config[:sanitize_sql_opts].must_equal Regexp::IGNORECASE
156156

157157
AppOpticsAPM::Config[:dnt_regexp].must_equal '\.(jpg|jpeg|gif|png|ico|css|zip|tgz|gz|rar|bz2|pdf|txt|tar|wav|bmp|rtf|js|flv|swf|otf|eot|ttf|woff|woff2|svg|less)(\?.+){0,1}$'

test/support/sql_sanitize_test.rb

Lines changed: 23 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -4,14 +4,17 @@
44
require 'minitest_helper'
55

66
class SQLSanitizeTest < Minitest::Test
7+
8+
def teardown
9+
AppOpticsAPM::Config[:sanitize_sql] = false
10+
end
11+
712
def test_sanitize_sql1
813
AppOpticsAPM::Config[:sanitize_sql] = true
914

1015
sql = "INSERT INTO `queries` (`asdf_id`, `asdf_prices`, `created_at`, `updated_at`, `blue_pill`, `yearly_tax`, `rate`, `steam_id`, `red_pill`, `dimitri`, `origin`) VALUES (19231, 3, 'cat', 'dog', 111.0, 126.0, 116.0, 79.0, 72.0, 73.0, ?, 1, 3, 229.284, ?, ?, 100, ?, 0, 3, 1, ?, NULL, NULL, ?, 4, ?)"
1116
result = AppOpticsAPM::Util.sanitize_sql(sql)
1217
result.must_equal "INSERT INTO `queries` (`asdf_id`, `asdf_prices`, `created_at`, `updated_at`, `blue_pill`, `yearly_tax`, `rate`, `steam_id`, `red_pill`, `dimitri`, `origin`) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)"
13-
14-
AppOpticsAPM::Config[:sanitize_sql] = false
1518
end
1619

1720
def test_sanitize_sql2
@@ -20,8 +23,6 @@ def test_sanitize_sql2
2023
sql = "SELECT \"game_types\".* FROM \"game_types\" WHERE \"game_types\".\"game_id\" IN (1162)"
2124
result = AppOpticsAPM::Util.sanitize_sql(sql)
2225
result.must_equal "SELECT \"game_types\".* FROM \"game_types\" WHERE \"game_types\".\"game_id\" IN (?)"
23-
24-
AppOpticsAPM::Config[:sanitize_sql] = false
2526
end
2627

2728
def test_sanitize_sql3
@@ -30,8 +31,6 @@ def test_sanitize_sql3
3031
sql = "SELECT \"comments\".* FROM \"comments\" WHERE \"comments\".\"commentable_id\" = 2798 AND \"comments\".\"commentable_type\" = 'Video' AND \"comments\".\"parent_id\" IS NULL ORDER BY comments.created_at DESC"
3132
result = AppOpticsAPM::Util.sanitize_sql(sql)
3233
result.must_equal "SELECT \"comments\".* FROM \"comments\" WHERE \"comments\".\"commentable_id\" = ? AND \"comments\".\"commentable_type\" = ? AND \"comments\".\"parent_id\" IS ? ORDER BY comments.created_at DESC"
33-
34-
AppOpticsAPM::Config[:sanitize_sql] = false
3534
end
3635

3736
def test_sanitize_sql4
@@ -40,8 +39,25 @@ def test_sanitize_sql4
4039
sql = "SELECT `assets`.* FROM `assets` WHERE `assets`.`type` IN ('Picture') AND (updated_at >= '2015-07-08 19:22:00') AND (updated_at <= '2015-07-08 19:23:00') LIMIT 31 OFFSET 0"
4140
result = AppOpticsAPM::Util.sanitize_sql(sql)
4241
result.must_equal "SELECT `assets`.* FROM `assets` WHERE `assets`.`type` IN (?) AND (updated_at >= ?) AND (updated_at <= ?) LIMIT ? OFFSET ?"
42+
end
4343

44-
AppOpticsAPM::Config[:sanitize_sql] = false
44+
def test_sanitize_quoted_stuff1
45+
AppOpticsAPM::Config[:sanitize_sql] = true
46+
47+
sql = "SELECT `users`.* FROM `users` WHERE (mobile IN ('234 234 234') AND email IN ('a_b_c@hotmail.co.uk'))"
48+
result = AppOpticsAPM::Util.sanitize_sql(sql)
49+
result.must_equal "SELECT `users`.* FROM `users` WHERE (mobile IN (?) AND email IN (?))"
50+
end
51+
52+
def test_sanitize_quoted_stuff2
53+
AppOpticsAPM::Config[:sanitize_sql] = true
54+
55+
56+
# trying to reproduce "SELECT `users`.* FROM `users` WHERE (mobile IN (?a_b_c@hotmail.co.uk') LIMIT ?"
57+
sql = "SELECT `users`.* FROM `users` WHERE (mobile IN ('\\\'1454545') AND email IN ('a_b_c@hotmail.co.uk')) LIMIT 5"
58+
# sql = "SELECT `users`.* FROM `users` WHERE (mobile IN ('2342423') AND email IN ('a_b_c@hotmail.co.uk')) LIMIT 5"
59+
result = AppOpticsAPM::Util.sanitize_sql(sql)
60+
result.must_equal "SELECT `users`.* FROM `users` WHERE (mobile IN (?) AND email IN (?)) LIMIT ?"
4561
end
4662

4763
def test_dont_sanitize

0 commit comments

Comments
 (0)