Commit 06358447 by Liu

fix:上线漏洞

parent 91c11f7b
...@@ -44,7 +44,7 @@ export const DocxPreview: React.FC<DocxPreviewProps> = ({ src, className = '', o ...@@ -44,7 +44,7 @@ export const DocxPreview: React.FC<DocxPreviewProps> = ({ src, className = '', o
onRendered?.() onRendered?.()
}) })
.catch((error) => { .catch((error) => {
console.error('DOCX 渲染失败:', error) console.error('DOCX 渲染失败:')
onError?.(error) onError?.(error)
}) })
} }
......
...@@ -539,9 +539,9 @@ export const Chat: React.FC = () => { ...@@ -539,9 +539,9 @@ export const Chat: React.FC = () => {
}, 2000) }, 2000)
} }
}) })
.catch((error) => { .catch(() => {
// 流式请求出错时的处理 // 流式请求出错时的处理
console.error('[Chat] 流式请求失败:', error) console.error('[Chat] 流式请求失败:')
// 清除自动调用标记 // 清除自动调用标记
isAutoSubmitQualityImprovementRef.current = false isAutoSubmitQualityImprovementRef.current = false
// 设置最后一条 AI 回答的 endAnswerFlag,用于停止打字效果 // 设置最后一条 AI 回答的 endAnswerFlag,用于停止打字效果
......
...@@ -598,9 +598,9 @@ export const TacticsChat: React.FC = () => { ...@@ -598,9 +598,9 @@ export const TacticsChat: React.FC = () => {
}, 2000) }, 2000)
} }
}) })
.catch((error) => { .catch(() => {
// 流式请求出错时的处理 // 流式请求出错时的处理
console.error('[TacticsChat] 流式请求失败:', error) console.error('[TacticsChat] 流式请求失败:')
// 设置最后一条 AI 回答的 endAnswerFlag,用于停止打字效果 // 设置最后一条 AI 回答的 endAnswerFlag,用于停止打字效果
setAllItems((prevItems) => { setAllItems((prevItems) => {
const newItems = [...prevItems] const newItems = [...prevItems]
......
...@@ -8,12 +8,14 @@ import styles from './Collect.module.less' ...@@ -8,12 +8,14 @@ import styles from './Collect.module.less'
import { fetchQueryCollectionList } from '@/api/collect' import { fetchQueryCollectionList } from '@/api/collect'
import DeleteIcon from '@/assets/svg/delete.svg?react' import DeleteIcon from '@/assets/svg/delete.svg?react'
import { fetchDelCollection } from '@/api/chat' import { fetchDelCollection } from '@/api/chat'
import { fetchSessionConversationId } from '@/api/conversation'
import { MarkdownDetail } from '@/components/MarkdownDetail' import { MarkdownDetail } from '@/components/MarkdownDetail'
import AIcon from '@/assets/svg/aicon.svg?react' import AIcon from '@/assets/svg/aicon.svg?react'
import QIcon from '@/assets/svg/qicon.svg?react' import QIcon from '@/assets/svg/qicon.svg?react'
import EmptyIcon from '@/assets/svg/empty.svg?react' import EmptyIcon from '@/assets/svg/empty.svg?react'
import ShineBorder from '@/components/ShineBorder' import ShineBorder from '@/components/ShineBorder'
import SdreamLoading from '@/components/SdreamLoading' import SdreamLoading from '@/components/SdreamLoading'
import { safeSessionStorageGetItem } from '@/lib/utils'
export const Collect: React.FC = () => { export const Collect: React.FC = () => {
const navigate = useNavigate() const navigate = useNavigate()
...@@ -84,22 +86,43 @@ export const Collect: React.FC = () => { ...@@ -84,22 +86,43 @@ export const Collect: React.FC = () => {
} }
// 添加返回上一页的函数 // 添加返回上一页的函数
const handleGoBack = () => { const handleGoBack = async () => {
// 设置标记,用于 Chat 组件检测从收藏页返回 // 设置标记,用于 Chat 组件检测从收藏页返回
sessionStorage.setItem('fromCollect', 'true') sessionStorage.setItem('fromCollect', 'true')
if (window.history.length > 1) { // 仅允许回退到同源来源页,避免跳转到不可控外部页面
const isSameOriginReferrer = (() => {
if (!document.referrer) {
return false
}
try {
return new URL(document.referrer).origin === window.location.origin
}
catch {
return false
}
})()
if (window.history.length > 1 && isSameOriginReferrer) {
navigate(-1) navigate(-1)
return return
} }
const rawConversationId = sessionStorage.getItem('currentConversationId') || '' try {
// 仅允许常见会话 ID 字符,避免可控输入直接参与路由拼接 const currentToolId = safeSessionStorageGetItem('currentToolId') || ''
if (/^[\w-]+$/.test(rawConversationId)) { const sessionRes = await fetchSessionConversationId({ busiId: currentToolId })
const conversationId = encodeURIComponent(rawConversationId) const conversationId = sessionRes?.data?.conversationId
navigate(`/chat/${conversationId}`, { state: { fromCollect: true } }) const isSafeConversationId
= typeof conversationId === 'string'
&& /^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i.test(conversationId)
if (isSafeConversationId) {
navigate(`/chat/${encodeURIComponent(conversationId)}`, { state: { fromCollect: true } })
return return
} }
// 无效 ID 时保持原有目标页(等价于 conversationId 为空时的 /chat/) }
navigate('/chat/', { state: { fromCollect: true } }) catch (error) {
console.error('[Collect] 获取会话ID失败:', error)
}
// 无有效会话 ID 时,固定回到站内白名单页面
navigate('/home', { state: { fromCollect: true } })
} }
useEffect(() => { useEffect(() => {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment