Skip to content

Commit 868767e

Browse files
committed
bugfix: Fix the XSS issue when uploading history files
1 parent 71cb89c commit 868767e

File tree

2 files changed

+22
-4
lines changed

2 files changed

+22
-4
lines changed

modules/models/base_model.py

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -961,7 +961,7 @@ def rename_chat_history(self, filename, chatbot):
961961
filename = os.path.basename(full_path)
962962

963963
self.history_file_path = filename
964-
save_file(filename, self, chatbot)
964+
save_file(filename, self)
965965
return init_history_list(self.user_name)
966966

967967
def auto_name_chat_history(
@@ -978,14 +978,14 @@ def auto_name_chat_history(
978978

979979
def auto_save(self, chatbot=None):
980980
if chatbot is not None:
981-
save_file(self.history_file_path, self, chatbot)
981+
save_file(self.history_file_path, self)
982982

983983
def export_markdown(self, filename, chatbot):
984984
if filename == "":
985985
return
986986
if not filename.endswith(".md"):
987987
filename += ".md"
988-
save_file(filename, self, chatbot)
988+
save_file(filename, self)
989989

990990
def load_chat_history(self, new_history_file_path=None):
991991
logging.debug(f"{self.user_name} 加载对话历史中……")
@@ -1034,6 +1034,8 @@ def load_chat_history(self, new_history_file_path=None):
10341034
-len(saved_json["chatbot"]) :
10351035
]
10361036
logging.info(f"Trimmed history: {saved_json['history']}")
1037+
# Sanitize chatbot
1038+
saved_json["chatbot"] = remove_html_tags(saved_json["chatbot"])
10371039
logging.debug(f"{self.user_name} 加载对话历史完毕")
10381040
self.history = saved_json["history"]
10391041
self.single_turn = saved_json.get("single_turn", self.single_turn)

modules/utils.py

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -243,6 +243,21 @@ def convert_mdtext(md_text): # deprecated
243243
output += ALREADY_CONVERTED_MARK
244244
return output
245245

246+
def remove_html_tags(data):
247+
def clean_text(text):
248+
# Remove all HTML tags
249+
cleaned = re.sub(r'<[^>]+>', '', text)
250+
# Remove any remaining HTML entities
251+
cleaned = re.sub(r'&[#\w]+;', '', cleaned)
252+
# Remove extra whitespace and newlines
253+
cleaned = re.sub(r'\s+', ' ', cleaned)
254+
return cleaned.strip()
255+
256+
return [
257+
[clean_text(item) for item in sublist]
258+
for sublist in data
259+
]
260+
246261

247262
def clip_rawtext(chat_message, need_escape=True):
248263
# first, clip hr line
@@ -380,9 +395,10 @@ def construct_assistant(text):
380395
return construct_text("assistant", text)
381396

382397

383-
def save_file(filename, model, chatbot):
398+
def save_file(filename, model):
384399
system = model.system_prompt
385400
history = model.history
401+
chatbot = [(history[i]["content"], history[i + 1]["content"]) for i in range(0, len(history), 2)]
386402
user_name = model.user_name
387403
os.makedirs(os.path.join(HISTORY_DIR, user_name), exist_ok=True)
388404
if filename is None:

0 commit comments

Comments
 (0)