From 4bfce9cea309ad8904ead316d7902378623c87d7 Mon Sep 17 00:00:00 2001 From: z418577198 <418577198@qq.com> Date: Tue, 2 Sep 2025 10:32:14 +0800 Subject: [PATCH 1/8] Merge pull request #12198 from 2betop/fix-xss-issue (#12201) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit fix: 修复 Html 渲染部分场景没有执行 xss 过滤器的问题 Co-authored-by: Allen --- packages/amis-ui/src/components/Html.tsx | 8 +++++++- packages/amis-ui/src/components/TooltipWrapper.tsx | 8 ++------ packages/amis-ui/src/index.tsx | 4 +++- packages/amis/src/preset.tsx | 10 ++++++---- packages/amis/src/renderers/App.tsx | 6 +----- packages/amis/src/renderers/CRUD.tsx | 2 +- packages/amis/src/renderers/CRUD2.tsx | 5 +---- packages/amis/src/renderers/Carousel.tsx | 2 +- packages/amis/src/renderers/Form/Picker.tsx | 2 +- 9 files changed, 23 insertions(+), 24 deletions(-) diff --git a/packages/amis-ui/src/components/Html.tsx b/packages/amis-ui/src/components/Html.tsx index 5d454453d72..5f638309909 100644 --- a/packages/amis-ui/src/components/Html.tsx +++ b/packages/amis-ui/src/components/Html.tsx @@ -17,6 +17,8 @@ export interface HtmlProps { filterHtml?: (input: string) => string; } +export const HTMLFilterContext = React.createContext((txt: string) => txt); + export class Html extends React.Component { static defaultProps = { inline: true @@ -24,6 +26,8 @@ export class Html extends React.Component { dom: any; + static contextType = HTMLFilterContext; + constructor(props: HtmlProps) { super(props); this.htmlRef = this.htmlRef.bind(this); @@ -49,7 +53,9 @@ export class Html extends React.Component { const {html, filterHtml} = this.props; if (html) { - this.dom.innerHTML = filterHtml ? filterHtml(html) : html; + let filter: (text: string) => string = + filterHtml || (this.context as any) || ((text: string) => text); + this.dom.innerHTML = filter(html); } } diff --git a/packages/amis-ui/src/components/TooltipWrapper.tsx b/packages/amis-ui/src/components/TooltipWrapper.tsx index cae30849880..de44eff3353 100644 --- a/packages/amis-ui/src/components/TooltipWrapper.tsx +++ b/packages/amis-ui/src/components/TooltipWrapper.tsx @@ -317,8 +317,7 @@ export class TooltipWrapper extends React.Component< offset, tooltipTheme = 'light', showArrow = true, - children, - filterHtml + children } = tooltipObj; const childProps: any = { @@ -372,10 +371,7 @@ export class TooltipWrapper extends React.Component< {children ? ( <>{typeof children === 'function' ? children() : children} ) : ( - + )} diff --git a/packages/amis-ui/src/index.tsx b/packages/amis-ui/src/index.tsx index 6b843dc059e..53cdcbc84cc 100644 --- a/packages/amis-ui/src/index.tsx +++ b/packages/amis-ui/src/index.tsx @@ -13,10 +13,12 @@ import type {SchemaEditorItemPlaceholder} from './components/schema-editor/Commo import {schemaEditorItemPlaceholder} from './components/schema-editor/Common'; import withStore from './withStore'; import withRemoteConfig from './withRemoteConfig'; +import {HTMLFilterContext} from './components/Html'; export { schemaEditorItemPlaceholder, SchemaEditorItemPlaceholder, withStore, - withRemoteConfig + withRemoteConfig, + HTMLFilterContext }; diff --git a/packages/amis/src/preset.tsx b/packages/amis/src/preset.tsx index a9aeb1e5c6c..391b16916c8 100644 --- a/packages/amis/src/preset.tsx +++ b/packages/amis/src/preset.tsx @@ -6,7 +6,7 @@ import { themeable, ThemeProps } from 'amis-core'; -import {ImageGallery} from 'amis-ui'; +import {HTMLFilterContext, ImageGallery} from 'amis-ui'; import {setRenderSchemaFn} from 'amis-ui/lib/components/Alert'; import {alert, confirm} from 'amis-ui/lib/components/Alert'; import {toast} from 'amis-ui/lib/components/Toast'; @@ -46,9 +46,11 @@ setRenderSchemaFn((controls, value, callback, scopeRef, theme) => { addRootWrapper((props: any) => { const {env, children} = props; return ( - - {children} - + + + {children} + + ); }); diff --git a/packages/amis/src/renderers/App.tsx b/packages/amis/src/renderers/App.tsx index 9801312f888..ab3cb4f4fe9 100644 --- a/packages/amis/src/renderers/App.tsx +++ b/packages/amis/src/renderers/App.tsx @@ -337,11 +337,7 @@ export class App extends React.Component {
{logo && ~logo.indexOf(' + ) : logo ? ( ) : ( diff --git a/packages/amis/src/renderers/CRUD.tsx b/packages/amis/src/renderers/CRUD.tsx index 7a2f68feadd..06663bcddc0 100644 --- a/packages/amis/src/renderers/CRUD.tsx +++ b/packages/amis/src/renderers/CRUD.tsx @@ -2763,7 +2763,7 @@ export default class CRUD extends React.Component { {labelTpl ? ( - + ) : ( getVariable(item, labelField || 'label') || getVariable(item, valueField || primaryField || 'id') diff --git a/packages/amis/src/renderers/CRUD2.tsx b/packages/amis/src/renderers/CRUD2.tsx index fc5243109af..981b79b521f 100644 --- a/packages/amis/src/renderers/CRUD2.tsx +++ b/packages/amis/src/renderers/CRUD2.tsx @@ -1424,10 +1424,7 @@ export default class CRUD2 extends React.Component { {labelTpl ? ( - + ) : ( getVariable(item, labelField || 'label') || getVariable(item, primaryField || 'id') diff --git a/packages/amis/src/renderers/Carousel.tsx b/packages/amis/src/renderers/Carousel.tsx index 525a036e47b..c5c307e68d7 100644 --- a/packages/amis/src/renderers/Carousel.tsx +++ b/packages/amis/src/renderers/Carousel.tsx @@ -170,7 +170,7 @@ const defaultSchema = { className={cx('Carousel-image')} /> ) : data.hasOwnProperty('html') ? ( - + ) : data.hasOwnProperty('item') ? ( {data.item} ) : ( diff --git a/packages/amis/src/renderers/Form/Picker.tsx b/packages/amis/src/renderers/Form/Picker.tsx index 26a6e1a611a..ea82d4699fa 100644 --- a/packages/amis/src/renderers/Form/Picker.tsx +++ b/packages/amis/src/renderers/Form/Picker.tsx @@ -605,7 +605,7 @@ export default class PickerControl extends React.PureComponent< }} > {labelTpl ? ( - + ) : ( `${ getVariable(item, labelField || 'label') || From efeaa4509c3d7791f2af1d7bf6796b49b0560878 Mon Sep 17 00:00:00 2001 From: qinhaoyan <30946345+qinhaoyan@users.noreply.github.com> Date: Wed, 3 Sep 2025 18:00:27 +0800 Subject: [PATCH 2/8] =?UTF-8?q?chore:=20=E8=A1=A5=E5=85=85=E5=A4=96?= =?UTF-8?q?=E8=A7=82=E7=BC=96=E8=BE=91=E5=99=A8=E7=BB=84=E4=BB=B6=E8=AF=AD?= =?UTF-8?q?=E6=96=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- packages/amis-theme-editor-helper/i18nConfig.js | 3 --- .../amis-theme-editor-helper/src/locale/en-US.ts | 15 ++++++++++++++- .../amis-theme-editor-helper/src/locale/zh-CN.ts | 15 ++++++++++++++- .../src/renderers/Border.tsx | 6 ++++-- 4 files changed, 32 insertions(+), 7 deletions(-) diff --git a/packages/amis-theme-editor-helper/i18nConfig.js b/packages/amis-theme-editor-helper/i18nConfig.js index 6b9da4917f1..ae811dddfb1 100644 --- a/packages/amis-theme-editor-helper/i18nConfig.js +++ b/packages/amis-theme-editor-helper/i18nConfig.js @@ -6,9 +6,6 @@ module.exports = { test: /.*(ts|tsx|js|jsx)$/ }, includes: ['src/renderers'], - ignore: { - list: ['src/*'] - }, importInfo: { source: 'i18n-runtime', imported: 'i18n', diff --git a/packages/amis-theme-editor-helper/src/locale/en-US.ts b/packages/amis-theme-editor-helper/src/locale/en-US.ts index 39a146e88c9..6c0565c2b51 100644 --- a/packages/amis-theme-editor-helper/src/locale/en-US.ts +++ b/packages/amis-theme-editor-helper/src/locale/en-US.ts @@ -229,5 +229,18 @@ extendLocale('en-US', { 'c0215e2abf0fe27597acba2be64f6993': 'Small size', '93dee976f68681ec6950380d757d8c18': 'Multiple selection mode', '9be232c5cffa019aab21bd631ff23462': 'Yunshe', - '1dfba2e7e2df2efc4a25f4f2adcba25e': 'System preset theme' + '1dfba2e7e2df2efc4a25f4f2adcba25e': 'System preset theme', + '96b15b89fd7df6180780a7ac7305ba7c': 'Border size', + '84fafbb9668c30ba550e8bd3ebab65a6': 'Border style', + '9b4bae5d8251de0b6f00b704936b00d3': 'Border color', + 'd9c2ace0d7ecc55bdea2fd91732ca29c': 'Gradient', + '20def7942674282277c3714ed7ea6ce0': 'image', + '690660d9dbd7312ad2825e554736e2f8': 'Font color', + '5f15efdc32badce0902c46a7a0105c51': 'Font size', + '916e646c9e6add3ae7053cbec7c37d91': 'Font weight', + 'c3ce3c8fd80b9b9e221353faa162facf': 'Line height', + '4e7f76261f8c4c6d78998f85fc1f4c6e': 'Margin', + '841d77223f0ec8cd0b530ed8e0775b20': 'Padding', + 'border-size': 'Border size', + 'border-style': 'Border style' }); diff --git a/packages/amis-theme-editor-helper/src/locale/zh-CN.ts b/packages/amis-theme-editor-helper/src/locale/zh-CN.ts index c522428a840..b088e72b209 100644 --- a/packages/amis-theme-editor-helper/src/locale/zh-CN.ts +++ b/packages/amis-theme-editor-helper/src/locale/zh-CN.ts @@ -228,5 +228,18 @@ extendLocale('zh-CN', { 'c0215e2abf0fe27597acba2be64f6993': '尺寸小', '93dee976f68681ec6950380d757d8c18': '多选模式', '9be232c5cffa019aab21bd631ff23462': '云舍', - '1dfba2e7e2df2efc4a25f4f2adcba25e': '系统预设主题' + '1dfba2e7e2df2efc4a25f4f2adcba25e': '系统预设主题', + '96b15b89fd7df6180780a7ac7305ba7c': '边框粗细', + '84fafbb9668c30ba550e8bd3ebab65a6': '边框样式', + '9b4bae5d8251de0b6f00b704936b00d3': '边框颜色', + 'd9c2ace0d7ecc55bdea2fd91732ca29c': '渐变', + '20def7942674282277c3714ed7ea6ce0': '图片', + '690660d9dbd7312ad2825e554736e2f8': '字体颜色', + '5f15efdc32badce0902c46a7a0105c51': '字体大小', + '916e646c9e6add3ae7053cbec7c37d91': '字体字重', + 'c3ce3c8fd80b9b9e221353faa162facf': '字体行高', + '4e7f76261f8c4c6d78998f85fc1f4c6e': '外边距', + '841d77223f0ec8cd0b530ed8e0775b20': '内边距', + 'border-size': '边框粗细', + 'border-style': '边框样式' }); diff --git a/packages/amis-theme-editor-helper/src/renderers/Border.tsx b/packages/amis-theme-editor-helper/src/renderers/Border.tsx index a728ccc59f2..ef70927a60a 100644 --- a/packages/amis-theme-editor-helper/src/renderers/Border.tsx +++ b/packages/amis-theme-editor-helper/src/renderers/Border.tsx @@ -281,7 +281,9 @@ function BoxBorder(props: BorderProps & FormControlProps) { borderType === 'all' ? 'top' : borderType }-border-width`} state={state} - placeholder={editorDefaultValue?.[getKey('width')] || '边框粗细'} + placeholder={ + editorDefaultValue?.[getKey('width')] || _i18n('border-size') + } />