input pattern='[a-zA-Z]' 在 React 应用程序中不起作用

Posted

技术标签:

【中文标题】input pattern=\'[a-zA-Z]\' 在 React 应用程序中不起作用【英文标题】:input pattern='[a-zA-Z]' is not working in React applicationinput pattern='[a-zA-Z]' 在 React 应用程序中不起作用 【发布时间】:2018-06-22 07:54:14 【问题描述】:

我一直在处理的是一个文本input,它在用户键入时缩小了<option> 中的<select>。它工作正常,但我现在担心的是安全性、用户传递到 input 的内容以及潜在的恶意条目。

我想我可以执行<input placeholder='[a-zA-Z]' /> 之类的操作,但它仍然允许在文本框中输入其他字符。

我在这里做错了什么,什么是只允许输入字母数字的替代方法?

onInputChange(term) 
    this.setState( term );


renderOptionsSelect(term) 
    return _.map(this.props.pos_list, p => 
        var searchTerm = this.state.term.toLowerCase();
        if (p.pos_code.toLowerCase().match(searchTerm)) 
            return (
                <option key=p.pos_code value=p.pos_code>p.pos_code</option>
            );                        
        
    );


// render the main element of the container
render() 
    return (
        <div className='panel panel-default'>
            <div className='panel-heading'>
                <h4><strong>Basic Query</strong></h4>
            </div>

            <div className='panel-body'>
                <input 
                    pattern='[a-zA-Z]'
                    className='form-control' 
                    placeholder='Enter Keyword or Position Code' 
                    value=this.state.term
                    onChange=event => this.onInputChange(event.target.value)
                />

                <hr />
                <h4>Position:</h4>
                <select className='form-control'>
                    <option></option>
                    this.renderOptionsSelect()
                </select>
                <br />
                <h4>Data Cut:</h4>
                <select className='form-control' disabled=true />

            </div>
        </div>
    ); 

【问题讨论】:

pattern 属性仅在提交表单时强制执行。像这样限制输入中允许的字符并不容易,在提交时验证输入要容易得多。 Hmmm... 听起来如果我希望验证立即发生,我可能需要在 onInputChange(term) 中进行 JS 验证。 您担心什么样的恶意输入?搜索看起来像是在本地进行的,因此您可以在提交此表单所属的任何内容之前进行验证。您可以验证更改,但它会进一步减慢您的搜索速度,而且似乎没有必要。 另外,我不知道您是否感兴趣或不想要依赖项,但请查看:material-ui.com/#/components/auto-complete。这似乎是你想要的。 恶意输入,而且目前如果有人输入任何 `()`,它会在控制台中生成一个看起来不专业的 RegEx 错误。图 I 可以防止这种情况发生,即使有人不小心输入了其中一个字符。 (是的,大多数用户都没有看控制台)。 【参考方案1】:

这很容易。你:

    删除模式属性。 为 input 事件注册您的 onInputChange 方法,而不是 change 事件 (onInput=event =&gt; this.onInputChange(event.target.value))。 在更改状态之前清理onInputChange 中接收到的值。

【讨论】:

但是说真的,客户端 JS 和安全检查? :(。您首先应该重新考虑是否需要它。 这与安全无关 - 它与用户体验有关。当您可以立即验证您的输入时,您是否愿意等待服务器验证您的输入? 当你移除 onChange 处理程序并改用 onInput 时,React 将抛出一个控制台错误,抱怨缺少 onChange。为了抑制这种情况,您可以创建一个不执行任何操作的 onChange 处理程序,如下所示: onChange=() => 【参考方案2】:

在此处详细检查我的答案: https://***.com/a/68052651/13607767

简单来说就是-

状态

const [tagInputVal, setTagInputVal] = useState("");

输入标签

<input id="tag-input" type="text" placeholder="Add a tag" value=tagInputVal onChange=(e) => onChangeTagInput(e)></input>

处理函数

function onChangeTagInput(e) 
    setTagInputVal(e.target.value.replace(/[^a-zA-Z\d]/ig, ""));

【讨论】:

【参考方案3】:

因此,您当前具有在用户键入时缩小&lt;select&gt; 选项的功能,现在您的关注点是通过限制用户能够提交的输入内容来提高安全性。

这个问题的答案是无法通过客户端验证来保护输入;它必须通过服务器端验证来完成

可以轻松绕过客户端安全检查。当服务器接收到输入时,必须对其进行检查,以确保它不是恶意的。

【讨论】:

【参考方案4】:

对于 React Typescript 用户。

我发现这个 sn-p 很有帮助……

const regex = new RegExp("^(?=.*[a-z])(?=.*[A-Z])(?=.*[0-9])(?=.*[!@#$%\^&\*])(?=.8,)");

这个正则表达式强制使用至少:一个数字,一个大写 字母、1 个小写字母、1 个特殊字符和 8 个字符 长密码。

那你就可以这样用了……

const [strongPassword, setStrongPassword] = useState(false);

function handleChangeValue(event: ChangeEvent<htmlInputElement>) 
    if (regex.test(event.target.value)) 
        setStrongPassword(true);
     else 
        setStrongPassword(false);
    

【讨论】:

以上是关于input pattern='[a-zA-Z]' 在 React 应用程序中不起作用的主要内容,如果未能解决你的问题,请参考以下文章

el-input 标签限制输入框内容(中文,英文,邮箱,手机号)

正则表达式

php

input的pattern属性

邮箱正则

Android里使用正則表達式