当前位置: 首页>后端>正文

网络安全漏洞防护知识一:input输入防止xss攻击的防御措施

网络安全漏洞防护知识一:input输入防止xss攻击的防御措施

input输入预防xss网络攻击的防御措施

1.首先项目安装 dompurify, 终端安装命令:npm i dompurify

2.在utils文件夹下面创建directives文件夹,然后在该文件夹下面创建inputFilter.js 具体内容如下:

import DOMPurify from 'dompurify';

/**

*? 实现功能

*? 1、默认情况下只禁止空格输入

*? 2、intFilter 限制只能输入整数

*? 3、priceFilter 限制只能输入整数和小数(价格类)

*? 4、phoneFilter 限制只能输入手机号

*? 5、specialFilter 限制最大值和最小值(抛出错误给回调函数)

*? 6、domPurify 限制非法字符的输入

*/

const addListener = function(el, type, fn) {

? el.addEventListener(type, fn, false)

}

const domPurify = function(el){

addListener(el, 'keyup', () => {

? el.value =? DOMPurify.sanitize(el.value);

el.dispatchEvent(new Event("input"));

})

}

const spaceFilter = function(el) {

? addListener(el, 'keyup', () => {

? ? el.value = el.value.replace(/\s+/, '');

el.dispatchEvent(new Event("input"));

? })

}

const intFilter = function(el) {

? addListener(el, 'keyup', () => {

? ? el.value = el.value.replace(/\D/g, '');

el.dispatchEvent(new Event("input"));

? })

}

const priceFilter = function(el) {

? addListener(el, 'keyup', () => {

? ? el.value = el.value.replace(/[^\d.]*/g, '')

? ? if (isNaN(el.value)) {

? ? ? el.value = ''

? ? }

el.dispatchEvent(new Event("input"));

? })

}

const specialFilter = function(el) {

? addListener(el, 'keyup', () => {

? ? el.value = el.value.replace(/[^\a-\z\A-\Z0-9\u4E00-\u9FA5]/g, '');

el.dispatchEvent(new Event("input"));

? })

}

const phoneFilter = function(el) {

? addListener(el, 'blur', () => {

? ? if (!el.value) {

? ? ? return

? ? }

? ? const phoneReg = new RegExp('^(13|14|15|16|17|18|19)[0-9]{9}$')

? ? if (!phoneReg.test(el.value)) {

? ? ? alert('手机号输入错误')

? ? ? el.value = ''

? ? }

? })

}

const urlFilter = function(el) {

? addListener(el, 'blur', () => {

? ? if (!el.value) {

? ? ? return

? ? }

? ? const urlReg = /(^#)|(^http(s*):\/\/[^\s]+\.[^\s]+)/

? ? if (!urlReg.test(el.value)) {

? ? ? alert('url输入错误')

? ? ? el.value = ''

? ? }

? })

}

export default {

? bind(el, binding) {

? ? if (el.tagName.toLowerCase() !== 'input') {

? ? ? el = el.getElementsByTagName('input')[0]

? ? }

? ? spaceFilter(el)

? ? switch (binding.arg) {

? ? ? case 'int':

? ? ? ? intFilter(el)

? ? ? ? break

? ? ? case 'price':

? ? ? ? priceFilter(el)

? ? ? ? break

? ? ? case 'special':

? ? ? ? specialFilter(el)

? ? ? ? break

? ? ? case 'phone':

? ? ? ? phoneFilter(el)

? ? ? ? break

? ? ? case 'url':

? ? ? ? urlFilter(el)

? ? ? ? break

? case 'dom':

? domPurify(el)

? break

? ? ? default:

? ? ? ? break

? ? }

? }

}

然后创建index.js文件 具体代码如下:

import inputFilter from './inputFilter'

const install = function(Vue) {

? Vue.directive('inputFilter', inputFilter)

}

if (window.Vue) {

? window.inputFilter = inputFilter

? Vue.use(install)

}

inputFilter.install = install

export default inputFilter

最后在main.js中引入js

import DomPurify from './utils/directives/index.js'

Vue.use(DomPurify);

在vue项目中使用如下v-input-filter:dom

? ? ? ? ? ? ? ? <el-input

? ? ? ? ? ? ? ? ? ? type="password"

? ? ? ? ? ? ? ? ? ? v-model="bsform.password"

? ? ? ? ? ? ? ? ? ? placeholder="请输入密码"

? ? ? ? ? ? ? ? ? ? autocomplete="off"

? ? ? ? ? ? ? ? ? ?v-input-filter:dom

? ? ? ? ? ? ? ? ? ? :show-password="true"

? ? ? ? ? ? ? ? ? ? class="login-input"

? ? ? ? ? ? ? ? ? ></el-input>


https://www.xamrdz.com/backend/3db1934406.html

相关文章: