Skip to content

Commit 9cec8e4

Browse files
committed
fix(api): Escape list values to prevent SQL injection
1 parent e3515eb commit 9cec8e4

File tree

1 file changed

+5
-1
lines changed

1 file changed

+5
-1
lines changed

cmdb-api/api/lib/cmdb/search/ci/db/search.py

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -537,6 +537,8 @@ def __query_build_by_field(self, queries, is_first=True, only_type_query_special
537537
if isinstance(q, dict):
538538
if len(q['queries']) == 1 and ";" in q['queries'][0]:
539539
values = q['queries'][0].split(";")
540+
# Escape values to prevent SQL injection
541+
values = [v.replace("'", "\\'").replace('"', '\\"') for v in values]
540542
in_values = ",".join("'{0}'".format(v) for v in values)
541543
_query_sql = QUERY_CI_BY_NO_ATTR_IN.format(in_values, alias)
542544
operator = q['operator']
@@ -556,7 +558,9 @@ def __query_build_by_field(self, queries, is_first=True, only_type_query_special
556558
q = q.replace("*", "%").replace('\\n', '%')
557559
_query_sql = QUERY_CI_BY_NO_ATTR.format(q, alias)
558560
else:
559-
_query_sql = QUERY_CI_BY_NO_ATTR_IN.format(",".join("'{0}'".format(v) for v in q), alias)
561+
# Escape list values to prevent SQL injection
562+
escaped_q = [v.replace("'", "\\'").replace('"', '\\"') for v in q]
563+
_query_sql = QUERY_CI_BY_NO_ATTR_IN.format(",".join("'{0}'".format(v) for v in escaped_q), alias)
560564

561565
if is_first and _query_sql and not self.only_type_query:
562566
query_sql = "SELECT * FROM ({0}) AS {1}".format(_query_sql, alias)

0 commit comments

Comments
 (0)