XieJava's blog

记录最好的自己


  • 首页

  • 分类

  • 标签

  • 归档

  • 关于

Django加入markdown编辑器及markdown上传图片不回显避坑

发表于 2022-07-15 | 更新于: 2025-06-14 | 分类于 技术 , 开发 | | 阅读次数:
字数统计: 1.3k | 阅读时长 ≈ 5

一般来说一个CMS系统如博客系统都需要一个好的富文本编辑器,现在大家更多的是选择MarkDown编辑器来编辑内容。Django作为python的主流web开发框架当然少不了markdown的插件。本文介绍如何在Django框架中引入markdown编辑器及在使用markdown时的注意事项。

在Django框架中引入markdown编辑器主要是通过安装引入Django-mdeditor库来实现。
Django-mdeditor 是基于 Editor.md 的一个 django Markdown 文本编辑插件应用。
其官方下载地址见 https://pypi.org/project/django-mdeditor/
根据官方指导文档

一、安装使用

1、安装django-mdeditor

1
pip install django-mdeditor

2、在 settings 配置文件 INSTALLED_APPS 中添加 mdeditor

1
2
3
4
5
6
7
8
9
10
11
12
13
INSTALLED_APPS = [
'blog',
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'rest_framework',
'django_filters',#注册条件查询
# 注册markdown的应用
'mdeditor',
]

3、针对django3.0+修改 frame 配置

1
X_FRAME_OPTIONS = 'SAMEORIGIN'  # django 3.0 + 默认为 deny

4、在 settings 中添加媒体文件的路径配置

1
2
MEDIA_URL = '/media/'
MEDIA_ROOT = os.path.join(BASE_DIR, 'uploads')

在你项目根目录下创建 uploads/editor 目录,用于存放上传的图片。

5、在项目的根 urls.py 中添加扩展url和媒体文件url:

注意是在项目的根 urls.py 中添加扩展url和媒体文件url,而不是在其他项目应用的urls.py中添加

1
2
3
4
5
6
7
8
9
10
11
12
13
from django.conf.urls import url, include
from django.conf.urls.static import static
from django.conf import settings
...

urlpatterns = [
...
url(r'mdeditor/', include('mdeditor.urls'))
]

if settings.DEBUG:
# static files (images, css, javascript, etc.)
urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

6、在项目model中应用markdown

示例代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
'''博客文章'''
class BlogPost(BaseModel):
id = models.AutoField(primary_key=True)
title = models.CharField(max_length=200, verbose_name='文章标题', unique = True)
category = models.ForeignKey(BlogCategory, blank=True, null=True, verbose_name='文章分类', on_delete=models.DO_NOTHING)
isTop=models.BooleanField(default=False,verbose_name='是否置顶')
isHot=models.BooleanField(default=False,verbose_name='是否热门')
summary=models.CharField(max_length=500,verbose_name='内容摘要',default='')
content=MDTextField(verbose_name='内容')
viewsCount= models.IntegerField(default=0, verbose_name="查看数")
commentsCount=models.IntegerField(default=0, verbose_name="评论数")

def __str__(self):
return self.title

class Meta:
verbose_name = '博客文章'
verbose_name_plural = '博客文章'

见 content=MDTextField(verbose_name='内容') 表示博客文章的内容是MDTextField

7、向 admin.py 中注册model:

1
2
3
4
5
6
from django.contrib import admin
from blog.models import *
# Register your models here.
@admin.register(BlogPost)
class BlogPostAdmin(admin.ModelAdmin):
list_display = ['title','category','isTop','isHot']

8、迁移创建数据表

运行 python manage.py makemigrations 和 python manage.py migrate 来创建你的model 数据库表,可以看到默认创建的content字段是longtext类型的
默认创建的content字段是longtext类型的

9、测试验证

启动应用,访问http://127.0.0.1:8000/admin/ 点击新增博客文章,可以看到内容字段是markdown编辑器输入了。
markdown编辑器

至此django应用中就可以使用markdown编辑器了。

二、markdown上传图片不回显避坑

按照以上步骤配置django-mdeditor,markdown编辑器可以正常使用,但是这里有个大坑,就是有些浏览器在上传图片后上传的图片不回显!
我就碰到了这样的情况。

上传图片后上传的图片不回显

在添加图片界面选择本地上传图片后发现后台接口调到了 /mdeditor/uploads/?guid=1657867564930 接口并且返回了200,但是上传的图片地址不回显,提交报“错误:图片地址不能为空。” 这就奇了怪了。
打开浏览器的调试工具,发现报了一个错,Uncaught SyntaxError: Unexpected token 下 in JSON at position 141

浏览器的调试工具,发现报了一个错

点击详情,具体应该是获取的JSON无法解析。

JSON无法解析

这个JSON为什么无法解析呢?开始进一步调试,这个JSON是上传时调用的后台上传方法返回的。所以来看看是不是后台上传接口返回的JSON串有什么问题。找到/mdeditor/uploads路由所对应的源码

/mdeditor/uploads路由所对应的源码

UploadView的源代码,就是返回一个成功的json报文

1
2
3
4
5
return JsonResponse({'success': 1,
'message': "上传成功!",
'url': os.path.join(settings.MEDIA_URL,
MDEDITOR_CONFIGS['image_folder'],
file_full_name)})

实际打断点debug也是正常返回上传成功的json报文。

打断点debug也是正常返回上传成功的json报文

这就有点奇怪了,接口返回了正常的json报文怎么就解析不了了呢?接着继续调前台js代码,看究竟是什么原因。

json串里多了几个字“下载视频”!

发现js获取的json串里多了几个字“下载视频”! 这是什么鬼?实在是没有地方有返回“下载视频”这几个字啊?看js代码是通过iframe来处理请求的,再来看看iframe的内容,发现iframe里确实有“下载视频”

iframe里确实有“下载视频”

原来是有个chrome浏览器插件,擅自给加了“下载视频”的内容。再来看浏览器装了些啥插件。原来是有个迅雷插件,应该就是这个插件搞的鬼了,罪魁祸首就是它了!
罪魁祸首迅雷插件

把这个迅雷插件删除或停用,果然一切正常!可以正常回显!!!

可以正常回显

显示插入的图片

显示插入的图片

所以,碰到markdown上传图片不回显的情况,先看下自己的浏览器是不是开启了迅雷插件应用,如果开启了迅雷插件应用先停用或删除!


作者博客:http://xiejava.ishareread.com/


“fullbug”微信公众号

关注微信公众号,一起学习、成长!

Django的restframework接口框架自定义返回数据格式

发表于 2022-07-14 | 更新于: 2025-06-14 | 分类于 技术 , 开发 | | 阅读次数:
字数统计: 1.3k | 阅读时长 ≈ 5

在前后端分离是大趋势的背景下,前端获取数据都是通过调用后台的接口来获取数据微服务的应用越来越多。Django是Python进行web应用开发常用的web框架,用Django框架进行web应用框架减少了很多工作,通常用很少量的代码就可以实现数据的增、删、改、查的业务应用,同样用Django的restframework的框架对外发布接口也是非常的简单方便,几行代码就可以将数据对象通过接口的方式提供服务。因为在实际开发过程中接口的返回数据有一定的格式,本文介绍通过自定义Response返回对象来自定义接口返回数据格式。

以下示例将数据对象Friend通过restframework框架进行接口发布。
只要定义Friend数据对象

1
2
3
4
5
6
7
8
9
10
11
12
class Friend(BaseModel):
id=models.AutoField(primary_key=True)
siteName=models.CharField(max_length=20, verbose_name='友链站点名称')
path=models.CharField(max_length=100, verbose_name='地址路径')
desc=models.CharField(max_length=200, verbose_name='描述')

def __str__(self):
return self.siteName

class Meta:
verbose_name='友链'
verbose_name_plural='友链'

定义一个序列化类将返回的字段序列化

1
2
3
4
class FriendModelSerializer(serializers.ModelSerializer):
class Meta:
model = Friend
fields = "__all__"

定义一个接口视图类获取数据

1
2
3
class FriendView(viewsets.ModelViewSet):
queryset = Friend.objects.all()
serializer_class = FriendModelSerializer

定义接口路由就可以通过httprestfull的接口进行访问了

1
2
3
4
friend_list=views.FriendView.as_view({'get':'list',})
urlpatterns = [
path('friend/',friend_list),
]

接口访问效果如下:
http://localhost:8000/api/friend/
httprestfull的接口

但是在项目中经常会碰到接口格式变化的情况,restframework框架默认的返回数据格式不满足应用的需求。比如一般的接口都会有接口返回的code、msg、data,code用来标识接口返回代码比如200是正常,msg用来记录异常或其信息,data用来返回具体的数据。
通过restframework接口自定义返回数据格式也是很简单方便的。
先自定义Response返回对象,在返回对象中自定义数据返回的格式,示例代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
from rest_framework.response import Response
from rest_framework.serializers import Serializer

class CustomResponse(Response):
def __init__(self,data=None,code=None,msg=None,
status=None,
template_name=None, headers=None,
exception=False, content_type=None,**kwargs):
super().__init__(None, status=status)

if isinstance(data, Serializer):
msg = (
'You passed a Serializer instance as data, but '
'probably meant to pass serialized `.data` or '
'`.error`. representation.'
)
raise AssertionError(msg)
#自定义返回格式
self.data={'code':code,'msg':msg,'data':data}
self.data.update(kwargs)
self.template_name=template_name
self.exception=exception
self.content_type=content_type

if headers:
for name, value in headers.items():
self[name] = value

在接口接口视图类获取数据返回时,使用该自定义的Response返回对象。

1
2
3
4
5
6
7
8
class FriendView(viewsets.ModelViewSet):
queryset = Friend.objects.all()
serializer_class = FriendModelSerializer
#自定义list方法,自定义Response返回
def list(self, request, *args, **kwargs):
queryset = self.filter_queryset(self.get_queryset())
serializer = self.get_serializer(queryset, many=True)
return CustomResponse(data=serializer.data, code=200, msg="OK", status=status.HTTP_200_OK)

接口访问效果如下:
可以看到返回数据格式中增加了code,msg 数据放到了data节点
自定义数据返回格式

列表数据通常接口要提供翻页功能,在接口中要有总页数、当前页、是否有下一页的信息。
可以自定义一个分页器,在分页器中自定义需要返回的分页参数
参考示例代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
from rest_framework import status
from rest_framework.pagination import PageNumberPagination
from common.customresponse import CustomResponse

class MyPage(PageNumberPagination):
page_size = 8 #每页显示数量
max_page_size = 50 #每页最大显示数量。
page_size_query_param = 'size' #每页数量的参数名称
page_query_param = 'page' #页码的参数名称

def get_paginated_response(self, data):
#自定义分页器的返回参数
return CustomResponse(data=data,code=200,msg="OK",status=status.HTTP_200_OK, count=self.page.paginator.count,next=self.get_next_link(),previous=self.get_previous_link(),size=self.page_size,page=self.page.number)

在接口接口视图类获取数据返回时,如果有分页器则使用该分页器自定义的Response返回对象。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class FriendView(viewsets.ModelViewSet):
queryset = Friend.objects.all()
serializer_class = FriendModelSerializer
pagination_class = MyPage
#自定义list方法,自定义Response返回
def list(self, request, *args, **kwargs):
queryset = self.filter_queryset(self.get_queryset())
page = self.paginate_queryset(queryset)
#如果有分页器,则进行分页后返回
if page is not None:
serializer = self.get_serializer(page, many=True)
return self.get_paginated_response(serializer.data)

serializer = self.get_serializer(queryset, many=True)
return CustomResponse(data=serializer.data, code=200, msg="OK", status=status.HTTP_200_OK)

接口访问效果如下:
可以看到接口中自定义增加了分页信息。
接口中自定义增加了分页信息

但是有时候可能希望分页的信息数据要放在data节点里面,这样也是可以做到的。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
from rest_framework import status
from rest_framework.pagination import PageNumberPagination
from common.customresponse import CustomResponse

class MyPage(PageNumberPagination):
page_size = 8 #每页显示数量
max_page_size = 50 #每页最大显示数量。
page_size_query_param = 'size' #每页数量的参数名称
page_query_param = 'page' #页码的参数名称

#自定义分页器的返回参数
def get_paginated_response(self, data):
ret_data = dict()
ret_data['items'] = data
# 加入自定义分页信息
ret_data['total'] = self.page.paginator.count
ret_data['hasNextPage'] = self.get_next_link()
ret_data['size'] = self.page_size
ret_data['page'] = self.page.number
return CustomResponse(data=ret_data,code=200,msg="OK",status=status.HTTP_200_OK)

接口访问效果如下:
可以看到接口中自定义增加了分页信息,分页的信息数据放在data节点里面了
自定义增加了分页信息,分页的信息数据放在data节点里面
至此,本文介绍了通过Django的restframework接口框架自定义Response返回对象来自定义返回数据格式。Django的restframework接口框架使用简单方便,拿来即用,能够很大程度上减少代码开发量。


博客地址:http://xiejava.ishareread.com/


“fullbug”微信公众号

关注:微信公众号,一起学习成长!

Vue3引入vue-router路由并通过vue-wechat-title设置页面title

发表于 2022-07-03 | 更新于: 2025-06-14 | 分类于 技术 , 开发 | | 阅读次数:
字数统计: 1.7k | 阅读时长 ≈ 7

对于用类似Vue前后端分离技术架构的单页应用页面之间的跳转没有非前后端分离那么来得直接,甚至连设置跳转页面的Title都要费一番周折,本文介绍Vue3引入vue-router路由并设置页面Title,通过vue-router实现页面的路由,通过vue-wechat-title来设置页面的title。

一、用vue-router库实现路由管理

vue-router是Vue.js官方推荐的路由管理库。它和Vue.js的核心深度集成,让构建单页应用变得轻松容易。使用Vue.js和vue-router库创建单页应用非常的简单:使用Vue.js开发,整个应用已经被拆分成了独立的组件;使用vue-router库,可以把路由映射到各个组件,并把各个组件渲染到正确的地方。下面就来介绍如何安装引入vue-router库并实现路由管理

1、安装vue-router库

使用如下命令安装vue-router库

1
npm install -save -vue-router

也可以通过 npm install -save vue-router@4 来指定版本号@4表示版本是4
安装成功后,可以在控制台看到了安装成功的信息和版本号
控制台看到了安装成功的信息和版本号
除此之外也可以在工程中的package.json中看到依赖的库中包含有vue-router及版本号。
package.json中看到依赖的库中包含有vue-router及版本号

2、在router文件夹下创建router.js

在工程的src目录下建立router文件夹 在router文件夹下创建router.js,该文件是Vue路由管理的核心文件,所有的各组件的路由在该文件中进行配置。
参考代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
import { createRouter,createWebHistory } from "vue-router"; //引入vue-router组件
import HelloWorld from '@/components/HelloWorld'; //引入需要路由管理的页面组件HelloWorld
import siteLogin from '@/views/user/login'; //引入需要路由管理的页面组件login
import userInfo from "@/views/user/userinfo"; //引入需要路由管理的页面组件userinfo
const router = createRouter({
history:createWebHistory(),
routes:[
{
path:'/', //路由的路径
name:'Home', //路由的名称
component:HelloWorld, //路由的组件
},
{
path:'/login',
name:'Login',
component:siteLogin,
},
{
path:'/userinfo',
name:'UserInfo',
component:userInfo,
}
]
})
export default router;

代码组织结构如下:
代码组织结构如下

3、在App.vue中加入路由视图

在App.vue中加入<router-view />
App.vue示例代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
<template>
<div id="app">
<router-view />
</div>
</template>
<script>
export default {
name: 'App',
}
</script>
<style>
</style>

4、在项目的main.js中引入路由

参考代码如下:

1
2
3
4
import { createApp } from 'vue';
import App from './App.vue';
import router from "@/router/router"; //引入路由,会去找router下的router.js的配置文件
createApp(App).use(router).mount('#app') //创建应用的时候应用路由

5、验证效果

为了显示更清楚,将默认创建的src\components\HelloWorld.vue内容稍加调整

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<template>
<div >
第一个路由组件Home
<p>{{ name }}</p>
</div>
</template>

<script>
export default {
name: 'HelloWorld',
data() {
return {
name:"Hello World!"
}
}
}
</script>
<!-- Add "scoped" attribute to limit CSS to this component only -->
<style scoped>
</style>

如果上面的步骤没有遗漏,在终端输入 npm run serve 将前端服务启动起来,在浏览器访问localhost:8080可以看到如下页面:

localhost:8080

访问localhost:8080/login

访问localhost:8080/login

访问localhost:8080/userinfo

访问localhost:8080/userinfo
可以看到访问不同的URL路由到了不同的Vue页面,上述login.vue和userinfo.vue示例代码没有给出,大家可以自行随便实现。

二、用vue-wechat-title实现页面title的设置

在上面实现了不同页面的路由管理,但是访问不同的URL看到的页面title所有的页面都是一样的,如何设置不同页面不同的页面Title呢?比较方便的做法是用vue-wechat-title来实现。
同样首先要安装vue-wechat-title库

1、安装vue-wechat-title库

使用如下命令安装vue-wechat-title库

1
npm install vue-wechat-title -save

安装完成后在工程中的package.json中看到依赖的库中包含有vue-wechat-title及版本号
package.json中看到依赖的库中包含有vue-wechat-title及版本号

2、在router文件夹下的router.js中增加title的配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
import { createRouter,createWebHistory } from "vue-router"; //引入vue-router组件
import HelloWorld from '@/components/HelloWorld'; //引入需要路由管理的页面组件HelloWorld
import siteLogin from '@/views/user/login'; //引入需要路由管理的页面组件login
import userInfo from "@/views/user/userinfo"; //引入需要路由管理的页面组件userinfo
const router = createRouter({
history:createWebHistory(),
routes:[
{
path:'/', //路由的路径
name:'Home', //路由的名称
meta:{
title: '首页' //title配置
},
component:HelloWorld, //路由的组件
},
{
path:'/login',
name:'Login',
meta:{
title:'登录'
},
component:siteLogin,
},
{
path:'/userinfo',
name:'UserInfo',
meta:{
title: '用户信息'
},
component:userInfo,
}
]
})
export default router;

主要是在路由配置时设置了meta:{title:'xxxx'}如下图:

router.js中增加title的配置

3、在App.vue页面中使用

App.vue代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<template>
<div id="app" v-wechat-title="$route.meta.title">
<router-view />
</div>
</template>

<script>
export default {
name: 'App',
}
</script>

<style>
</style>

主要是在<div id="app" v-wechat-title="$route.meta.title"> 加入了v-wechat-title="$route.meta.title"

4、在main.js中引用vue-wechat-title

在main.js中引用vue-wechat-title的时候有个坑,如果按照一般的引用会报错
mian.js代码示例如下:

1
2
3
4
5
import { createApp } from 'vue';
import App from './App.vue';
import router from "@/router/router"; //引入路由,会去找router下的router.js的配置文件
import VueWechatTitle from 'vue-wechat-title'; //引入VueWechatTitle
createApp(App).use(router,VueWechatTitle).mount('#app') //创建应用的时候应用路由

在终端输入 npm run serve 将前端服务启动起来会报错!
Uncaught TypeError: Cannot read properties of undefined (reading ‘deep’)

原因是在挂载app示例前,vue-wechat-title还没有加载好,一定要先应用再挂载app
将createApp(App).use(router,VueWechatTitle).mount(‘#app’)删除或注释掉。改用

1
2
3
4
const app=createApp(App);
app.use(VueWechatTitle);
app.use(router);
app.mount('#app')

main.js的参考示例代码如下:

1
2
3
4
5
6
7
8
9
import { createApp } from 'vue';
import App from './App.vue';
import router from "@/router/router"; //引入路由,会去找router下的router.js的配置文件
import VueWechatTitle from 'vue-wechat-title'; //引入VueWechatTitle
//createApp(App).use(router,VueWechatTitle).mount('#app') //指令定义在 mount('#app')之后,导致自定义指令未挂载到,会报错
const app=createApp(App);
app.use(VueWechatTitle);
app.use(router);
app.mount('#app')

5、验证效果

在终端输入 npm run serve 将前端服务启动起来
看到访问不同的URL会显示不同的title
http://localhost:8080/

http://localhost:8080/的title
http://localhost:8080/login

login的title登录

http://localhost:8080/userinfo

userinfo的title用户信息

本文通过以上实例实现了Vue3引入vue-router路由并设置页面Title,通过vue-router实现页面的路由,通过vue-wechat-title来设置页面的title都还比较方便。


博客地址:http://xiejava.ishareread.com/


“fullbug”微信公众号

关注:微信公众号,一起学习成长!

Vue快速入门

发表于 2022-07-03 | 更新于: 2025-06-14 | 分类于 技术 , 开发 | | 阅读次数:
字数统计: 2.3k | 阅读时长 ≈ 10

一、什么是Vue

Vue (读音 /vjuː/,类似于 view) 是一套用于构建用户界面的渐进式框架。与其它大型框架不同的是,Vue 被设计为可以自底向上逐层应用。Vue 的核心库只关注视图层,不仅易于上手,还便于与第三方库或既有项目整合。另一方面,当与现代化的工具链以及各种支持类库结合使用时,Vue 也完全能够为复杂的单页应用提供驱动。

二、安装

1、独立版本
直接下载并用<script>标签引入
官网下载地址:https://cn.vuejs.org/js/vue.js
2、使用CDN
和独立版本类似,与独立版本的区别就是不用下载到本地应用,直接引用CDN加速以后的地址。缺点是如果是内网封闭环境不能用,国内CDN也不稳定,国外的CDN有时无法访问。如官网的
<script src="https://cdn.jsdelivr.net/npm/vue@2.6.14/dist/vue.js"></script> 就无法访问。
几个比较稳定的CDN
Staticfile CDN(国内) : https://cdn.staticfile.org/vue/2.2.2/vue.min.js
unpkg:https://unpkg.com/vue@2.6.14/dist/vue.min.js。
cdnjs : https://cdnjs.cloudflare.com/ajax/libs/vue/2.1.8/vue.min.js
3、命令行工具
Vue 提供了一个官方的 CLI,为单页面应用 (SPA) 快速搭建繁杂的脚手架。它为现代前端工作流提供了开箱即用的构建设置。只需要几分钟的时间就可以运行起来并带有热重载、保存时 lint 校验,以及生产环境可用的构建版本。更多详情可查阅 Vue CLI 的文档。

三、第一个Vue

程序员学一门新的语音或框架,都是从hello world!开始的。来看一下Vue的hello world!
将vue.min.js下载到本地,在vue.min.js的目录下新建一个hellovue.html的文件,代码如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<!DOCTYPE html>
<html>
<head>
<script src="vue.min.js"></script>
</head>
<body>
<div id="app">
{{ message }}
</div>

<script type="text/javascript">
var app = new Vue({
el: '#app',
data: {
message: 'Hello Vue!'
}
});
</script>
</body>
</html>

用浏览器打开,hello Vue! 成功的展现出来,第一个Vue就这么简单。
hello Vue!

在这里我们通过<script src="vue.min.js"></script>引入了本地的vue.min.js,就可以用vue框架了。
通过<div id="app">构建了一个DOM元素div标签元素,id为app,`{{message}}` 是占位符,类似于大多数的模板语法。

1
2
3
<div id="app">
{{ message }}
</div>

在javascript代码中,定义了一个Vue对象,对象中构造了el和data两个参数。el是元素选择器,通过#app选择了id="app"的div,data用来定义数据属性,这里定义了massage:'hellow Vue!',通过`{{message}}`将数据hellow Vue显示输出。
可以用chrome浏览器的开发者工具打开控制台看到app.message的值为’hellow Vue!’。
chrome浏览器的开发者工具调试

可以通过修改这个变量的值而改变显示在浏览器的值。
修改值

四、常用基本语法

模板语法
Vue.js 使用了基于 HTML 的模板语法,允许开发者声明式地将 DOM 绑定至底层 Vue 实例的数据。
Vue.js 的核心是一个允许你采用简洁的模板语法来声明式的将数据渲染进 DOM 的系统。
结合响应系统,在应用状态改变时, Vue 能够智能地计算出重新渲染组件的最小代价并应用到 DOM 操作上

插值文本

数据绑定最常见的形式就是使用 `{{xxx}}`(双大括号)的文本插值:
正如我们的第一的Vue通过`{{ message }}`将文本值插入到占位符进行数据绑定

1
2
3
<div id="app">
<p>{{ message }}</p>
</div>

绑定输出html

使用v-html 指令用于输出 html 代码:

1
2
3
4
5
6
7
8
9
10
app2:v-html指令输出html代码
<div id="app2">
<div v-html="message"></div>
</div>
var app2 = new Vue({
el: '#app2',
data: {
message: '<b>Hello Vue!</b>'
}
});

效果如下图所示:
v-html

如果不用v-html插入,将<div id="app2">标签内容改成用文本插入

1
2
3
<div id="app2">
<p>{{ message }}</p>
</div>

显示效果如下,直接将html代码给显示出来了。
直接显示HTML代码

绑定属性

HTML 属性中的值应使用 v-bind 指令。
如插入绑定 a 标签的href属性

1
2
3
4
5
6
7
8
9
10
app3:v-bind指令绑定属性值
<div id="app3">
<a target="_blank" v-bind:href="url">click me go to myblog</a>
</div>
var app3 = new Vue({
el: '#app3',
data: {
url: 'http://xiejava.ishareread.com/'
}
});

效果如下:
绑定属性

绑定样式

class 与 style 是 HTML 元素的属性,用于设置元素的样式,可以用 v-bind 来绑定设置样式属性

1
2
3
4
5
6
7
8
9
10
11
12
app4:v-band:class指令绑定样式
<div id="app4">
<div v-bind:class="{ 'active': isActive }"></div>
</div>
<br>
var app4=new Vue(
{
el: '#app4',
data: {
isActive:true
}
});

定义样式

1
2
3
4
5
6
7
<style>
.active {
width: 100px;
height: 100px;
background: red;
}
</style>

效果如下:
v-band:class

插值Javascript表达式

vue.js插值支持javascript表达式

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
app5:vue.js插值的javascript表达式支持
<div id="app5">
{{5+5}}<br>
{{ ok ? 'YES' : 'NO' }}<br>
{{ message.split('').reverse().join('') }}
<div v-bind:id="'list-' + id">xiejava</div>
</div>
<br>
var app5 = new Vue({
el: '#app5',
data: {
ok: true,
message: 'XIEJAVA',
id : 1
}
});

效果如下:

vue.js插值支持javascript表达式

常用语句

v-if v-else (条件语句)

条件判断使用 v-if 指令,可以用 v-else 指令给 v-if 添加一个 “else” 块:

1
2
3
4
5
6
7
8
9
10
11
app6:v-if条件语句
<div id="app6">
<div v-if="ok">YES</div>
<div v-else>NO</div>
</div>
var app6 = new Vue({
el:"#app6",
data:{
ok:false,
}
});

效果如下:

v-if v-else (条件语句)

for循环语句

循环使用 v-for 指令,v-for 可以绑定数据到数组来渲染一个列表

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<div id="app7">
<ol>
<li v-for="code in codes">
{{ code.name }}
</li>
</ol>
</div>
<br>
var app7=new Vue(
{
el: '#app7',
data: {
codes: [
{ name: 'java' },
{ name: 'python' },
{ name: 'php' }
]
}
});

效果如下:
for循环语句

v-on绑定事件

事件监听可以使用 v-on 指令进行绑定

1
2
3
4
5
6
7
8
9
10
11
<div id="app8">
<button v-on:click="counter += 1">+1</button>
<p>加了 {{ counter }} 次1。</p>
</div>
var app8=new Vue(
{
el: '#app8',
data: {
counter:0
}
});

效果如下:

v-on绑定事件

以上全部示例代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
<!DOCTYPE html>
<html>
<head>
<script src="https://cdn.staticfile.org/vue/2.2.2/vue.min.js"></script>
</head>
<body>
app1:hello Vue!
<div id="app1">
{{ message }}
</div>
<br>

app2:v-html指令输出html代码
<div id="app2">
<div v-html="message"></div>
</div>
<br>

app3:v-bind指令绑定属性值
<div id="app3">
<a target="_blank" v-bind:href="url">click me go to myblog</a>
</div>
<br>

app4:v-band:class指令绑定样式
<div id="app4">
<div v-bind:class="{ 'active': isActive }"></div>
</div>
<br>

app5:vue.js插值的javascript表达式支持
<div id="app5">
{{5+5}}<br>
{{ ok ? 'YES' : 'NO' }}<br>
{{ message.split('').reverse().join('') }}
<div v-bind:id="'list-' + id">xiejava</div>
</div>
<br>

app6:v-if条件语句
<div id="app6">
<div v-if="ok">YES</div>
<div v-else>NO</div>
</div>
<br>

app7:for循环语句
<div id="app7">
<ol>
<li v-for="code in codes">
{{ code.name }}
</li>
</ol>
</div>
<br>

app8:v-on绑定事件
<div id="app8">
<button v-on:click="counter += 1">+1</button>
<p>加了 {{ counter }} 次1。</p>
</div>
<br>

<script type="text/javascript">
var app1 = new Vue({
el: '#app1',
data: {
message: 'Hello Vue!'
}
});

var app2 = new Vue({
el: '#app2',
data: {
message: '<b>Hello Vue!</b>'
}
});

var app3 = new Vue({
el: '#app3',
data: {
url: 'http://xiejava.ishareread.com/'
}
});

var app4=new Vue(
{
el: '#app4',
data: {
isActive:true
}
});

var app5 = new Vue({
el: '#app5',
data: {
ok: true,
message: 'XIEJAVA',
id : 1
}
});

var app6 = new Vue({
el:"#app6",
data:{
ok:false,
}
});

var app7=new Vue(
{
el: '#app7',
data: {
codes: [
{ name: 'java' },
{ name: 'python' },
{ name: 'php' }
]
}
});

var app8=new Vue(
{
el: '#app8',
data: {
counter:0
}
});
</script>
<style>
.active {
width: 100px;
height: 100px;
background: red;
}
</style>
</body>
</html>

通过上面的快速入门,基本了解什么是VUE、VUE的安装及基本的使用,常用的语法。后面还要更深入的学习VUE的组件、路由、后台接口调用等。


博客地址:http://xiejava.ishareread.com/


“fullbug”微信公众号

关注:微信公众号,一起学习成长!

PyCharm在用Django开发时debug模式启动失败显示can't find '__main__' module的解决方法

发表于 2022-06-06 | 更新于: 2025-06-14 | 分类于 技术 , 开发 | | 阅读次数:
字数统计: 203 | 阅读时长 ≈ 1

初次用Django开发web应用,在试图用Pycharm进行debug的时候,出现了一个奇怪的问题。以正常模式启动或者在terminal启动都没有问题。但是以debug模式启动时,显示can't find '__main__' module”报错。在网上找了很久都没有看到解决方法,最后在某乎上看到一篇文章,在启动时加上--noreload参数,既可以debug模式启动。

报错信息:
报错信息
解决方法:
在启动时加上 --noreload 参数可以正常启动调试
加入不重新加载参数

debug启动正常也可以调试了。
debug正常启动

踩过的坑记录一下,希望能帮到碰到同样问题的人。

感谢大佬的文章 https://zhuanlan.zhihu.com/p/443763989


博客地址:http://xiejava.ishareread.com/


“fullbug”微信公众号

关注微信公众号,一起学习、成长!

Python使用BeautifulSoup4修改网页内容实战

发表于 2022-05-18 | 更新于: 2025-06-14 | 分类于 技术 , 开发 | | 阅读次数:
字数统计: 1.2k | 阅读时长 ≈ 6

最近有个小项目,需要爬取页面上相应的资源数据后,保存到本地,然后将原始的HTML源文件保存下来,对HTML页面的内容进行修改将某些标签整个给替换掉。

对于这类需要对HTML进行操作的需求,最方便的莫过于BeautifulSoup4的库了。

样例的HTML代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<html>
<body>
<a class="videoslide" href="http://www.test.com/wp-content/uploads/1020/1381824922.JPG">
<img src="http://www.test.com/wp-content/uploads/1020/1381824922_zy_compress.JPG" data-zy-media-id="zy_location_201310151613422786"/>
</a>
<a href="http://www.test.com/wp-content/uploads/1020/第一张_1381824798.JPG">
<img data-zy-media-id="zy_image_201310151613169945" src="http://www.test.com/wp-content/uploads/1020/第一张_1381824798_zy_compress.JPG"/></a>
<a href="http://www.test.com/wp-content/uploads/1020/第二张_1381824796.jpg">
<img data-zy-media-id="zy_image_201310151613163009" src="http://www.test.com/wp-content/uploads/1020/第二张_1381824796_zy_compress.jpg"/>
</a>
<a href="http://www.test.com/wp-content/uploads/1020/第三张.jpg">
<img data-zy-media-id="zy_image_201312311838584446" src="http://www.test.com/wp-content/uploads/1020/第三张_zy_compress.jpg"/>
</a>
</body>
</html>

这里主要包括了<a >标签,<a >标签里面嵌入了<img >标签,其中有<a class="videoslide">的标识该标签实际是可以播放动画的。需要根据class="videoslide" 来判断将整个<a >标签换成播放器的<video >标签,将没有class="videoslide" 的<a >标签换成<figure>标签。

也就是将带有的<a class="videoslide" ...><img ... /></a>标签换成

1
2
3
4
5
6
<div class="video">
<video controls width="100%" poster="视频链接的图片地址.jpg">
<source src="视频文件的静态地址.mp4" type="video/mp4" />
您的浏览器不支持H5视频,请使用Chrome/Firefox/Edge浏览器。
</video>
</div>

将<a ....><img .../></a>标签换成

1
2
3
4
<figure>
< img src="图片地址_compressed.jpg" data-zy-media-id="图片地址.jpg">
<figcaption>文字说明(如果有)</figcaption>
</figure>

这里通过BeautifulSoup4 的select()方法找到标签,通过get()方法获取标签及标签属性值,通过replaceWith来替换标签,具体代码如下:
首先安装BeautifulSoup4的库,BeautifulSoup4库依赖于lxml库,所以也需要安装lxml库。

1
2
pip install bs4
pip install lxml

具体代码实现如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
import os
from bs4 import BeautifulSoup
htmlstr='<html><body>' \
'<a class="videoslide" href="http://www.test.com/wp-content/uploads/1020/1381824922.JPG">' \
'<img src="http://www.test.com/wp-content/uploads/1020/1381824922_zy_compress.JPG" data-zy-media-id="zy_location_201310151613422786"/></a>' \
'<a href="http://www.test.com/wp-content/uploads/1020/第一张_1381824798.JPG">' \
'<img data-zy-media-id="zy_image_201310151613169945" src="http://www.test.com/wp-content/uploads/1020/第一张_1381824798_zy_compress.JPG"/></a>' \
'<a href="http://www.test.com/wp-content/uploads/1020/第二张_1381824796.jpg">' \
'<img data-zy-media-id="zy_image_201310151613163009" src="http://www.test.com/wp-content/uploads/1020/第二张_1381824796_zy_compress.jpg"/></a>' \
'<a href="http://www.test.com/wp-content/uploads/1020/第三张.jpg">' \
'<img data-zy-media-id="zy_image_201312311838584446" src="http://www.test.com/wp-content/uploads/1020/第三张_zy_compress.jpg"/></a>' \
'</body></html>'

def procHtml(htmlstr):
soup = BeautifulSoup(htmlstr, 'lxml')
a_tags=soup.select('a')
for a_tag in a_tags:
a_tag_src = a_tag.get('href')
a_tag_filename = os.path.basename(a_tag_src)
a_tag_path = os.path.join('src', a_tag_filename)
a_tag['href']=a_tag_path
next_tag=a_tag.next
#判断是视频还是图片,如果a标签带了class="videoslide" 是视频否则是图片
if a_tag.get('class') and 'videoslide'==a_tag.get('class')[0]:
# 处理视频文件
media_id = next_tag.get('data-zy-media-id')
if media_id:
media_url = 'http://www.test.com/travel/show_media/' + str(media_id)+'.mp4'
media_filename = os.path.basename(media_url)
media_path = os.path.join('src', media_filename)
# 将div.video标签替换a标签
video_html = '<div class=\"video\"><video controls width = \"100%\" poster = \"' + a_tag_path + '\" ><source src = \"' + media_path + '\" type = \"video/mp4\" /> 您的浏览器不支持H5视频,请使用Chrome / Firefox / Edge浏览器。 </video></div>'
video_soup = BeautifulSoup(video_html, 'lxml')
a_tag.replaceWith(video_soup.div)
else:
#获取图片信息
if 'img'==next_tag.name:
img_src=next_tag.get('src')
# 判断是否路径是否为本地资源 data:image和file:
if img_src.find('data:image') == -1 and img_src.find('file:') == -1:
img_filename = os.path.basename(img_src)
img_path = os.path.join('src', img_filename)
# 将<figure><img>标签替换a标签
figcaption=''
figure_html='<figure><img src=\"'+img_path+'\" data-zy-media-id=\"'+a_tag_path+'\"><figcaption>'+figcaption+'</figcaption></figure>'
figure_soup = BeautifulSoup(figure_html, 'lxml')
a_tag.replaceWith(figure_soup.figure)
html_content = soup.contents[0]
return html_content

if __name__ == '__main__':
pro_html_str=procHtml(htmlstr)
print(pro_html_str)

结果:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<html>
<body>
<div class="video">
<video controls="" poster="src\1381824922.JPG" width="100%">
<source src="src\zy_location_201310151613422786.mp4" type="video/mp4"/> 您的浏览器不支持H5视频,请使用Chrome / Firefox / Edge浏览器。
</video>
</div>
<figure>
<img data-zy-media-id="src\第一张_1381824798.JPG" src="src\第一张_1381824798_zy_compress.JPG"/>
<figcaption></figcaption>
</figure>
<figure>
<img data-zy-media-id="src\第二张_1381824796.jpg" src="src\第二张_1381824796_zy_compress.jpg"/>
<figcaption></figcaption></figure>
<figure>
<img data-zy-media-id="src\第三张.jpg" src="src\第三张_zy_compress.jpg"/>
<figcaption></figcaption>
</figure>
</body>
</html>

博客地址:http://xiejava.ishareread.com/

网络安全设备-认识运维安全管理与审计系统(堡垒机)

发表于 2022-05-11 | 更新于: 2025-06-14 | 分类于 技术 , 网络安全 | | 阅读次数:
字数统计: 2.9k | 阅读时长 ≈ 10

一、什么是运维安全管理与审计系统

运维安全管理与审计系统(俗称 “堡垒机”):是采用新一代智能运维技术框架,基于认证、授权、访问、审计的管理流程设计理念,实现对企事业IT中心的网络设备、数据库、安全设备、主机系统、中间件等资源统一运维管理和审计;通过集中化运维管控、运维过程实时监管、运维访问合规性控制、运维过程图形化审计等功能,为企事业IT中心运维构建一套事前预防、事中监控、事后审计完善的安全管理体系。

简单的说,运维安全管理与审计系统(堡垒机)就是用来控制哪些人可以登录哪些资产(事先防范和控制),以及录像记录登录资产后做了什么事情(事中监控和事后溯源)的系统。其核心是可控及审计。可控是指权限可控、行为可控。权限可控指可以方便的设置、回收运维操作人员的权限;行为可控,比如需要集中禁用某个危险命令;可审计,指有权限操作的人员对资产的所有操作都有记录,能够被监控和审计。

二、为什么需要运维安全管理与审计系统

当企业的IT资产越来越多,当参与运维的岗位越来越多样性,运维团队达到一定的规模,不同的人员如运维人员、开发人员、第三方代维、厂商支撑人员需要控制访问不同的资产及权限,如果没有一套好的机制,就会产生混乱。无法有效的做到“哪些人允许以什么样的身份访问哪些设备”,更加没有办法知道“哪些人登录设备后做了哪些事情”,出了问题以后无法回溯。

运维混乱

运维安全管理与审计系统(堡垒机)是从跳板机(也叫前置机)的概念演变过来的。早在2000年左右,一些中大型企业为了能对运维人员的远程登录进行集中管理,会在机房部署一台跳板机。跳板机其实就是一台unix/linux/windows操作系统的服务器,所有运维人员都需要先远程登录跳板机,然后再从跳板机登录其他服务器中进行运维操作。

跳板机

跳板机解决了远程登录集中管理访问的问题,但跳板机并没有实现对运维人员操作行为的控制和审计,使用跳板机过程中还是会有误操作、违规操作导致的操作事故,一旦出现操作事故很难快速定位原因和责任人。此外,跳板机存在严重的安全风险,一旦跳板机系统被攻入,则将后端资源风险完全暴露无遗。同时,对于个别资源(如telnet)可以通过跳板机来完成一定的内控,但是对于更多更特殊的资源(ftp、rdp等)来讲就显得力不从心了。

人们逐渐认识到跳板机的不足,进而需要更新、更好的安全技术理念来实现运维操作管理。需要一种能满足角色管理与授权审批、信息资源访问控制、操作记录和审计、系统变更和维护控制要求,并生成一些统计报表配合管理规范来不断提升IT内控的合规性的产品。在这些理念的指导下,2005年前后,运维安全管理与审计系统(堡垒机)开始以一个独立的产品形态被广泛部署,有效地降低了运维操作风险,使得运维操作管理变得更简单、更安全。

堡垒机

运维安全管理与审计系统(堡垒机)承担了运维人员在运维过程中唯一的入口,通过精细化授权以明确“哪些人以什么身份访问了哪些设备”,从而让运维混乱变得有序起来,堡垒机不仅可以明确每一个运维人员的访问路径,还可以将每一次访问及操作过程变得可以“审计”,就像飞机中的黑匣子,汽车上的行车记录仪,能够做到针对运维人员的每次一操作均可以录像、全程审计,一但出了问题,可以追踪溯源。

运维安全管理与审计系统的目标可以概括为5W,主要是为了降低运维风险。具体如下:

  • 审计:你做了什么?(What)
  • 授权:你能做哪些?(Which)
  • 账号:你要去哪?(Where)
  • 认证:你是谁?(Who)
  • 来源:访问时间?(When)

运维安全管理与审计系统实现:

  • 事前预防:建立“自然人-资源-资源账号”关系,实现统一认证和授权
  • 事中控制:建立“自然人-操作-资源”关系,实现操作审计和控制
  • 事后审计:建立“自然人-资源-审计日志”关系,实现事后溯源和责任界定

三、运维安全管理与审计系统原理

原理

运维安全管理与审计系统(堡垒机),主要采用4A管理模型,对IT运维操作进行访问控制和行为审计的合规性管控系统,主要用来解决企业IT运维部门账号管理混乱,身份冒用、滥用,授权控制不明确,操作行为不规范,事件责任无法定位等问题。
4A 是指认证 Authentication、授权 Authorization、账号 Account、审计 Audit,中文名称为统一安全管理平台解决方案。即将身份认证、授权、记账和审计定义为网络安全的四大组成部分,从而确立了身份认证在整个网络安全系统中的地位与作用。
具体来说:

  • 集中认证 (authentication) 管理
    可以根据用户应用的实际需要,为用户提供不同强度的认证方式,既可以保持原有的静态口令方式,又可以提供具有双因子认证方式的高强度认证(一次性口令、数字证书、动态口令),而且还能够集成现有其它如生物特征等新型的认证方式。不仅可以实现用户认证的统一管理,并且能够为用户提供统一的认证门户,实现企业信息资源访问的单点登录。
  • 集中权限 (authorization) 管理
    可以对用户的资源访问权限进行集中控制。它既可以实现对 B/S、C/S 应用系统资源的访问权限控制,也可以实现对数据库、主机及网络设备的操作的权限控制,资源控制类型既包括 B/S 的 URL、C/S 的功能模块,也包括数据库的数据、记录及主机、网络设备的操作命令、IP 地址及端口。
  • 集中帐号(account)管理
    为用户提供统一集中的帐号管理,支持管理的资源包括主流的操作系统、网络设备和应用系统;不仅能够实现被管理资源帐号的创建、删除及同步等帐号管理生命周期所包含的基本功能,而且也可以通过平台进行帐号密码策略,密码强度、生存周期的设定。
  • 集中审计 (audit) 管理
    将用户所有的操作日志集中记录管理和分析,不仅可以对用户行为进行监控,并且可以通过集中的审计数据进行数据挖掘,以便于事后的安全事故责任的认定。

技术架构

实现的技术架构如下:
堡垒机技术架构

核心功能

主要核心功能包括:
1、访问控制
通过对访问资源的严格控制,堡垒机可以确保运维人员在其账号有效权限、期限内合法访问操作资源,降低操作风险,以实现安全监管目的,保障运维操作人员的安全、合法合规、可控制性。
2、账号管理
当运维人员在使用堡垒机时,无论是使用云主机还是局域网的主机,都可以同步导入堡垒机进行账号集中管理与密码的批量修改,并可一键批量设置SSH秘钥对等。
3、资源授权
支持云主机、局域网主机等多种形式的主机资源授权,并且堡垒机采用基于角色的访问控制模型,能够对用户、资源、功能作用进行细致化的授权管理,解决人员众多、权限交叉、资产繁琐、各类权限复制等众多运维人员遇到的运维难题。
4、指令审核
对运维人员的账号使用情况,包括登录、资源访问、资源使用等。针对敏感指令,堡垒机可以对非法操作进行阻断响应或触发审核的操作情况,审核未通过的敏感指令,堡垒机将进行拦截。
5、审计录像
除了可以提供安全层面外,还可以利用堡垒机的事前权限授权、事中敏感指令拦截外,以及堡垒机事后运维审计的特性。运维人员在堡垒机中所进行的运维操作均会以日志的形式记录,管理者即通过日志对微云人员的操作进行安全审计录像。
6、身份认证
为运维人员提供不同强度的认证方式,既可以保持原有的静态口令方式,还可以提供微信、短信等认证方式。堡垒机不仅可以实现用户认证的统一管理,还能为运维人员提供统一一致的认证门户,实现企业的信息资源访问的单点登录。
7、操作审计
将运维人员所有操作日志集中管理与分析,不仅可以对用户行为进行监控与拦截,还可以通过集中的安全审计数据进行数据挖掘,以便于运维人员对安全事故的操作审计认定。

四、运维安全管理与审计系统部署方式

1、单机部署

堡垒机主要都是旁路部署,旁挂在交换机旁边,只要能访问所有设备即可。
部署特点:
旁路部署,逻辑串联。
不影响现有网络结构。
单机部署

2、HA高可靠部署

旁路部署两台堡垒机,中间有心跳线连接,同步数据。对外提供一个虚拟IP。用户通过堡垒机虚拟IP进行访问,堡垒机自动进行会话负载分配和数据同步、冗余存储。
部署特点:
两台硬件堡垒机,一主一备/提供VIP。
当主机出现故障时,备机自动接管服务。
HA高可靠部署

五、常见运维安全管理与审计系统产品

商用

奇安信[运维安全管理与审计系统]:https://www.qianxin.com/product/detail/pid/385
亚信安全[信磐堡垒机]:https://www.asiainfo-sec.com/product/detail-27.html
绿盟[绿盟运维安全管理系统]:https://www.nsfocus.com.cn/html/2019/212_0926/20.html
启明星辰[堡垒机]:https://www.venustech.com.cn/new_type/blj/

开源

麒麟堡垒机:http://www.secvpn.com.cn/
飞致JumpServer堡垒机:https://fit2cloud.com/jumpserver/index.html


博客地址:http://xiejava.ishareread.com/


“fullbug”微信公众号

关注:微信公众号,一起学习成长!

网络信息安全之信息系统安全保障

发表于 2022-04-29 | 更新于: 2025-06-14 | 分类于 技术 , 网络安全 | | 阅读次数:
字数统计: 3.3k | 阅读时长 ≈ 11

一、信息系统安全保障相关概念

信息系统是用于采集、处理、存储、传输、分发和部署信息的整个基础设施、组织结构、人员和组件的总和。随着当前社会信息化程度的不断提高,各类信息系统越来越成为其所从属的组织机构生存和发展的关键因素,信息系统的安全风险也成为组织风险的一部分。同时,信息系统受来自于组织内部与外部环境的约束,信息系统的安全保障除了要充分分析信息系统本身的技术、业务、管理等特性,还要考虑这些约束条件所产生的要求。为了保障组织机构完成使命,系统安全管理人员必须针对信息系统面临的各种各样的风险制定相应的策略。

信息系统安全保障是在信息系统的整个生命周期中,通过对信息系统的风险分析,制定并执行相应的安全保障策略,从技术、管理、工程和人员等方面提出信息安全保障要求,确保信息系统的保密性、完整性和可用性,把安全风险降到可接受的程度,从而保障系统能够顺利实现组织机构的使命。

信息系统安全保障工作就是针对信息系统在运行环境中所面临的各种风险,制定信息安全保障策略体系,在策略指导下,设计并实现信息安全保障架构或模型,采取技术、管理等安全保障措施,将风险降至预定可接受的程度,从而保障其使命要求。策略体系是组织机构在对风险、资产和使命综合理解的基础上所做出的指导文件。策略体系的制定,反映了组织机构对信息系统安全保障及其目标的理解,它的制定和贯彻执行对组织机构信息系统安全保障起着纲领性的指导作用。
信息系统安全概念和关系

信息系统安全保障工作的基础和前提是风险管理。信息安全策略必须以风险管理为基础,针对可能存在的各种威胁和自身存在的弱点,采取有针对性的防范措施。

二、信息系统安全保障模型

信息系统安全保障模型包含保障要素、生命周期和安全特征3个方面。
信息系统安全保障模型

信息系统安全保障模型的主要思路是以风险和策略为基础,在整个信息系统的生命周期中实施技术、管理、工程和人员保障要素。通过信息系统安全保障实现信息安全的安全特征:信息的保密性、完整性和可用性特征,从而达到保障组织机构执行其使命的根本目的。

模型特点:

  • 将风险和策略作为信息系统安全保障的基础和核心。
  • 强调信息系统安全保障应贯穿于整个信息系统生命周期的全过程。
  • 强调综合保障的观念。通过综合技术、管理、工程和人员要素来保障信息系统安全。

1、基于信息系统生命周期的信息安全保障

信息系统的生命周期层面和保障要素层面不是相互孤立的,而是相互关联、密不可分的。
信息系统安全保障生命周期的安全保障要素

在信息系统生命周期模型中,将信息系统的整个生命周期抽象成计划组织、开发采购、实施交付、运行维护和废弃5个阶段,加上在运行维护阶段的变更产生的反馈,形成信息系统生命周期完整的闭环结构。在信息系统生命周期中的任何时间点上,都需要综合信息系统安全保障的技术、管理、工程和人员保障要素。

  • 计划组织阶段 :根据组织机构的业务要求、法律法规的要求、系统所存在的风险等因素,产生了信息系统安全保障需求。在此阶段,信息安全策略应加入信息系统建设和使用的决策中。从信息系统建设开始,就应该综合考虑系统的安全保障要求,确保信息系统建设和信息系统安全保障建设同步规划、同步实施。也就是我们平时讲的信息系统和安全保障要“三同步”–同步规划、同步建设、同步使用。
  • 开发采购阶段:此阶段是计划组织阶段的细化和具体体现。在此阶段中,进行系统安全需求分析、系统安全体系设计以及相关预算申请和项目准备等活动。在此阶段,应克服传统拘泥于具体技术的片面性,要综合考虑系统的风险和安全策略,将信息系统安全保障作为一个个整体,进行系统地设计,建立信息系统安全保障整体规划和全局视野。组织机构可根据具体要求,对系统整体的技术、管理安全保障规划或设计进行评估,以保证对信息系统的整体规划满足组织机构的建设要求和相关国家与行业的要求。
  • 实施交付阶段:在此阶段,组织机构可通过对承建方进行信息安全服务资格要求和人员专业资格要求以确保施工组织的服务能力;组织机构还可通过信息系统安全保障工程保障对实施施工过程进行监理和评估,最终确保所交付系统的安全性。
  • 运行维护阶段:信息系统进人运行维护阶段后,对信息系统的管理、运行维护和使用人员的能力等方面进行综合保障,是信息系统得以安全正常运行的根本保证。
  • 变更:信息系统投入运行后并不是- - 成不变的,它随着业务和需求的变更、外界环境的变更产生新的要求或增强原有的要求,重新进人信息系统组织计划阶段(即规划阶段)。
  • 废弃阶段:当信息系统不再满足业务要求时,信息系统进入废弃阶段,在这个阶段,需要考虑信息安全销毁等要素。

这样,通过在信息系统生命周期所有阶段融人信息系统安全保障概念,确保了信息系统的持续动态安全保障。

2、信息安全保障要素

1)信息安全技术

信息安全技术体系包括以下几个方面。

  • 密码技术:密码技术及应用涵盖了数据处理过程的各个环节,如数据加密、密码分析、数字签名、身份识别、秘密分享等。通过以密码学为核心的信息安全理论与技术保证数据的机密性和完整性等要求。
    访问控制技术:在为用户对系统资源提供最大限度共享的基础上,对用户的访问权进行管理,防止对信息的非授权篡改和滥用。访问控制对经过身份鉴别后的合法用户提供所需要的且经过授权的服务,拒绝用户越权的服务请求,保证用户在系统安全策略下有序工作。
  • 审计和监控技术:审计是事后认定违反安全规则行为的分析技术,在检测违反安全规则方面、准确发现系统发生的事件以及对事件发生的事后分析方面,审计都发挥着巨大的作用。审计技术的发展,来源于对访问的跟踪,这些访问包括对保存在计算机系统中敏感及重要信息的访问和对计算机系统资源的访问。网络安全监控包括主动监控和被动监控。它依赖于在任何给定时间内网络组件和检测器记录下已经发生的事情,接收日志信息,并对它进行分析。
  • 网络安全技术:这些技术包括网络协议安全、防火墙技术、人侵检测系统/人侵防御系统( Intrusion Detection System/Intrusion Prevention System, IDS/IPS )安全管理平台( Security Operations Center, SOC )、统一威胁管理( Unified Threat Management, UTM )等。网络安全技术主要是保护网络的安全,防止入侵攻击行为的发生。防火墙是一个位于可信网络和不可信网络之间的边界防护系统。防病毒网关防止基于HTTP/FTP/SMTP/POP3/HTTPS等网络协议侵人网络内部的病毒进行过滤。人侵检测系统是一种对网络传输进行即时监视,在发现可疑传输时发出警报措施的网络安全设备。人侵防御系统是监视网络传输行为的安全技术,它能够即时地中断、调整或隔离一些异常或是具有伤害性的网络传输行为。
  • 操作系统与数据库安全技术:操作系统安全技术主要包括身份鉴别、访问控制 、文件系统安全、安全审计等方面。数据库安全技术包括数据库的安全特性和安全功能,数据库完整性要求和备份恢复,以及数据库安全防护、安全监控和安全审计等。
  • 安全漏洞与恶意代码:包括安全漏洞的成因、分类、发掘方法,以及如何修复等;以及恶意代码的加载、隐藏和自我保护技术,恶意代码的检测原理及清除方法等。
  • 软件安全开发:包括软件安全开发模型、软件安全开发关键阶段的安全控制措施等内容。

2)信息安全管理

信息安全管理体系,是组织在整体或特定范围内建立信息安全方针和目标,以及完成这些目标所用方法的体系。基于对业务风险的认识、ISMS包括建立、实施、操作、监视、复查、维护和改进信息安全等一系列的管 理活动,并且表现为组织结构、策略方针、计划活动、目标与原则、人员与责任、过程与方法、资源等诸多要素的集合。

风险管理是指以风险为主线进行信息安全的管理,它的实施目标就是要依据安全标准和信息系统的安全需求,对信息、信息载体、信息环境进行安全管理,以达到安全目标。

风险管理贯穿于整个信息系统生命周期,包括对象确立、风险评估、风险控制、审核批准、监控与审查、沟通与咨询等6个方面的内容。其中,对象确立、风险评估、风险控制和审核批准是信息安全风险管理的4个基本步骤,监控与审查、沟通与咨询则贯穿于这4个基本步骤中。

3)信息安全工程

信息安全工程涉及系统和应用的开发、集成、操作、管理、维护和进化以及产品的开发、交付和升级。

系统安全工程能力成熟模型(Systems Security Engineering Capability Maturity Model,SSE-CMM)描述了一个组织的系统安全工程过程必须包含的基本特征。这些特征是完善的安全工程保证,也是系统安全工程实施的度量标准,同时还是一个易于理解的评估系统安全工程实施的框架。

4)信息安全人才

信息安全保障诸要素中,人是最关键也是最活跃的要素。网络攻防对抗,最终较量的是攻防两端的人,而不是设备。对组织机构来说,应建立一个完整的信息安全人才体系。
信息安全人才体系应包括以下方面。

  • 所有员工:需要进行信息安全保障意识教育,具体可以采用内部培训、在组织机构网站上发布相关信息等措施来增强所有员工的安全意识。
  • 涉及信息系统的岗位和职责的员工:需要进行相应的信息安全保障的基本技能培训。
  • 信息安全专业人员:应建立更全面、更专业的信息安全保障知识和经验。

本文节选自:
《信息安全技术 信息系统安全保障评估框架:简介和一般模型》GB_T 20274.1 200
《CISP培训教材》


博客地址:http://xiejava.ishareread.com/


“fullbug”微信公众号

关注:微信公众号,一起学习成长!

安全运营之漏洞管理

发表于 2022-04-25 | 更新于: 2025-06-14 | 分类于 技术 , 网络安全 | | 阅读次数:
字数统计: 2.6k | 阅读时长 ≈ 8

1947年冯·诺依曼建立计算机系统结构理论时认为,计算机系统也有天生的类似基因的缺陷,也可能在使用和发展过程中产生意想不到的问题。20世纪七八十年代,早期黑客的出现和第一个计算机病毒的产生,软件漏洞逐渐引起人们的关注。在各种产品、主机、网络和复杂信息系统中,安全漏洞以不同形式存在,而且数量逐年增加,利用漏洞造成的各类安全事件层出不穷。攻击行为或网络安全事件的发生正越来越多地受到利益驱动的影响,这种“黑色产业链”的兴起,导致越来越多的网络终端受害,大量机密信息被窃取,敏感数据信息在互联网上传播,并在黑市中待价而沽。工业控制领域以及新技术新应用的安全漏洞,特别是基础核心系统的安全漏洞已经成为危害国家经济和发展安全的重要因素。在安全运营过程中一个最重要的工作就是漏洞管理。

一、什么是安全漏洞

安全漏洞(Vulnerability)也被称为脆弱性。
根据国标-信息安全技术-安全漏洞标识与描述规范[GB/T 28458-2012]对安全漏洞的定义,安全漏洞是计算机信息系统在需求、设计、实现、配置运行等过程中,有意或无意产生的缺陷。这些缺陷以不同形式存在于计算机信息系统的各个层次和环节之中,一旦被恶意主体所利用,就会对计算机信息系统的安全造成损害,从而影响计算机信息系统的正常运行,危害信息产品或系统及信息的安全属性。

有时漏洞也被称作错误( Error)、缺陷 ( Fault)、 弱点( Weakness )或是故障( Failure )等,这些术语很容易引起混淆。在许多情况下,人们习惯于将错误、缺陷、弱点都简单地称为漏洞。需要指出的是,严格地说,错误、缺陷、弱点和故障并不等于漏洞。错误、缺陷和弱点是产生漏洞的条件,漏洞被利用后必然会破坏安全属性,但不一定能引起产品或系统故障。

二、安全漏洞标识与描述

以下为国标-信息安全技术-安全漏洞标识与描述规范[GB/T 28458-2012] 对安全漏洞标识与描述的定义:
安全漏洞描述项包括标识号、名称、发布时间、发布单位、类别、等级、影响系统等必须的描述项,并可更具需要扩充(但不限于)相关编号、利用方法、解决方案建议、其他描述等描述项。
安全漏洞描述

标识号
CVD-YYYY-NNNNNN格式为标识号。CVD为Common V ulnerabilities Description 的缩写;YYYY为4位十进制数字,表示产生本安全漏洞的年份;NNNNNN为6位十进制数字,表示当年内产生的安全漏洞的序号。
名称
安全漏洞标题,概括性描述安全漏洞信息的短语,例如InternetExplorer8.0缓冲区溢出漏洞。
发布时间
安全漏洞信息发布日期。
发布单位
发布安全漏洞的单位全称。
类别
安全漏洞所属分类,说明安全漏洞分类归属的信息。
等级
安全漏洞危害级别,说明安全漏洞能够造成的危害程度。
影响系统
安全漏洞所影响系统的信息,例如厂商、产品名称和版本号等。
相关编号
安全漏洞的其他相关编号,例如Bugtraq编号、CVE编号等。
利用方法
安全漏洞利用的方法,例如安全漏洞攻击方案或利用代码。
解决方案建议
安全漏洞的解决方案,例如补丁信息等。
其他描述
安全漏洞描述需要说明的其他相关信息,例如安全漏洞产生的具体原因。

三、安全漏洞的分类分级

分类

网络安全漏洞分类是基于漏洞产生或触发的技术原因对漏洞进行划分,分类如下:
安全漏洞分类

分级

网络安全漏洞分级是指采用分级的方式对网络安全漏洞潜在危害的程度进行描述,包括技术分级
和综合分级两种分级方式,每种方式均分为超危(严重)、高危、中危和低危四个等级,具体内容如下:
超危(严重):漏洞可以非常容易地对目标对象造成特别严重后果;
高危:漏洞可以容易地对目标对象造成严重后果;
中危:漏洞可以对目标对象造成一般后果,或者比较困难地对目标造成严重后果;
低危:漏洞可以对目标对象造成轻微后果,或者比较困难地对目标对象造成一般严重后果,或
者非常困难地对目标对象造成严重后果。

四、安全漏洞的生命周期

依据信息安全漏洞从产生到消亡的整个过程,信息安全漏洞生命周期分以下几个阶段:
a)漏洞的发现:通过人工或者自动的方法分析、挖掘漏洞的过程,并且该漏洞可以被验证和重现。
b)漏洞的利用:利用漏洞对计算机信息系统的保密性、完整性和可用性造成损害的过程。
c)漏洞的修复:通过补丁、升级版本或配置策略等对漏洞进行修补的过程,使得该漏洞不能够被
恶意主体所利用。
d)漏洞的公开:通过公开渠道(如网站、邮件列表等)公布漏洞信息的过程。

五、安全漏洞的闭环管理

根据漏洞生命周期中漏洞所处的不同状态,将漏洞管理行为对应为预防、收集、消减和发布等活动。
漏洞生命周期

预防是指通过各种安全手段提高信息系统的安全水平,避免漏洞的产生和恶意利用。
收集是针对已发现的漏洞进行信息的及时跟踪与获取。
消减是指在漏洞被发现后积极采取补救措施,最大限度减少漏洞带来的损失。
发布是指在遵循一定的发布策略的前提下,对漏洞及其修复信息进行发布。
用户、厂商和漏洞管理组织可以根据漏洞的状态及管理活动建立符合自身特点的漏洞处理策略和处理流程。
对于企业组织安全运营来说可以参考以下漏洞处理流程:
漏洞处理流程

发现漏洞

一般由渗透测试工程师通过漏洞扫描工具或渗透测试发现系统漏洞,提交渗透测试报告。由安全工程师进行漏洞验证,确定系统漏洞是否真实存在。

漏洞录入

在漏洞验证完成后,安全工程师需要根据企业内部的漏洞等级划分标准,将存在的漏洞录入漏洞管理系统。

漏洞分发

漏洞管理系统根据漏洞所影响的业务系统、主机IP等匹配到系统负责部门和修复人。通知系统负责人进行修复加固等。

漏洞跟进及修复

根据漏洞等级设定的时效性,设置修复计划时间,漏洞复验时间,在漏洞管理系统中进行管理和跟进。漏洞修复人修复完成后提交安全工程师进行漏洞复验,验证漏洞是否确实已经修复。如果漏洞在目前的技术条件下确实无法修复,提交系统负责进行风险确认,采取其他规避风险的措施,如调整访控策略、下线等。

漏洞修复周期

漏洞修复周期,包括漏洞的验证、评估、分发、复验、修复和关闭的各个环节。漏洞的修复周期,会根据漏洞等级确定。
参考如下:

漏洞等级 漏洞确认时间 漏洞修复时间
超危(严重) 12小时 24小时
高危 24小时 3*24小时
中危 36小时 7*24小时
低危 72小时 14*24小时

漏洞数据分析

对于漏洞管理整个流程来说,漏洞缓解或已解决后,关闭工单不是最终的目的,需要对漏洞数据进行分析,持续运营,可以从以下几个方面考虑:
1)统计一段时间内,外网系统出现的次数最多的Top10漏洞排名,分析漏洞出现的原因;
如外网系统中出现多次SQL注入漏洞,可以检查WAF的规则库是否及时更新?规则是否生效?此外网系统是否在WAF的防护之内?对外的系统为何不做严格的字符过滤机制等。
2)统计一段时间内,自主开发系统中漏洞数量最多的Top10系统排名,分析造成的原因;
如弱口令次数过多,是安全意识宣传不够?研发人员不重视?
3)哪些供应商的开发的系统漏洞数量最多?分析存在的原因;
是否需要约谈供应商沟通,是安全开发能力的问题,还是研发安全意识不够?
4)哪些框架被利用造成的漏洞过多?
是情报问题?还是应急响应机制的原因?是否可以替换为其他框架?


参考资料
信息安全技术 安全漏洞分类 GBT 33561-2017
信息安全技术 安全漏洞标识与描述规范 GB∕T 28458-2012
信息安全技术 安全漏洞等级划分指南 GB∕T 30279-2013
信息安全技术 信息安全漏洞管理规范 GB/T 30276-2013
安惞《浅谈企业内部安全漏洞的运营(一):规范化》

博客地址:http://xiejava.ishareread.com/


“fullbug”微信公众号

关注微信公众号,一起学习、成长!

网络信息安全之基于时间的安全模型(PDR和PPDR模型)

发表于 2022-04-23 | 更新于: 2025-06-14 | 分类于 技术 , 网络安全 | | 阅读次数:
字数统计: 2.6k | 阅读时长 ≈ 9

基于时间的安全模型是基于”任何安全防护措施都是基于时间的,超过该时间段,这种防护措施是可能被攻破的“这样的前提。该模型主要给出了信息系统的攻防时间表。攻击时间指的是在系统采取某种防守措施,通过不同的攻击手段来计算攻破该防守措施所需要的时间。防守时间指的是,对于某种固定攻击手法,通过采取不同的安全防护措施,来计算该防护措施所能坚守的时间。

基于时间的安全模型主要包括PDR和后来改进的PPDR模型,PDR模型是源自美国国际互联网安全系统公司ISS提出的自适应网络安全模型ANSM(AdaptiveNetwork Security Model),是一个可量化、可数学证明、基于时间的安全模型。美国ISS公司(后被IBM收购)提出的。PPDR模型是PDR的模型上发展起来的,也称P2DR,加入的P是Policy策略。

一、PDR模型

保护-检测-响应( Protection-Detection-Response, PDR )模型是信息安全保障工作中常用的模型,是最早体现主动防御思想的一种网络安全模型,其思想是承认信息系统中漏洞的存在,正视信息系统面临的威胁,通过采取适度防护、加强检测工作、落实对安全事件的响应、建立对威胁的防护来保障系统的安全。
模型图如下图所示:
PDR模型

P-protection,保护就是采用一切可能的措施来保护网络、系统以及信息的安全。通常采用的技术及方法主要包括加密、认证、访问控制、防火墙及防病毒等。

D-detect,检测可以了解和评估网络和系统的安全状态,为安全防护和安全响应提供依据。常用的检测技术主要包括入侵检测、漏洞检测及网络扫描等技术。

R-response,应急响应在安全模型中占有重要地位,是解决安全问题的最有效办法。解决安全问题就是解决紧急响应和异常处理问题,因此,建立应急响应机制,形成快速安全响应的能力,对网络和系统至关重要。

PDR模型直观、实用,建立了一个所谓的基于时间的可证明的安全模型,定义了防护时间Pt(攻击者发起攻击时,保护系统不被攻破的时间)、检测时间Dt(从发起攻击到检测到攻击的时间)和响应时间Rt(从发现攻击到做出有效响应的时间)3个概念,并给出了评定系统安全的计算方式,当Pt>Dt+Rt时,即认为系统是安全的,也就是说,如果在攻击者攻破系统之前发现并阻止了攻击的行为,那么系统就是安全的。

局限性:系统的Pt、Dt、Rt 很难准确定义,面对不同攻击者和不同种类的攻击,这些时间都是变化的,其实还是不能有效证明-一个系统是否安全。并且该模型对系统的安全隐患和安全措施采取相对固定的前提假设,难于适应网络安全环境的快速变化。

二、PPDR模型

策略-保护检测-响应模型( Policy-Protection-Detection-Response, PPDR )是在PDR模型的基础_上发展出来的模型,也称为P2DR模型。模型的核心思想是所有的防护、检测、响应都是依据安全策略实施的,模型包括4个主要部分: Policy (策略)、Protection ( 保护)、Detection(检测)和Response(响应)。
模型图如下图所示:
PPDR模型

策略(Policy):模型的核心,所有的防护、检测和响应都是依据安全策略实施的。安全策略一般由总体安全策略和具体安全策略两部分组成。
保护(Protection):保护是根据系统可能出现的安全问题而采取的预防措施,这些措施通过传统的静态安全技术实现。采用的防护技术通常包括数据加密、身份认证、访问控制、授权和虚拟专用网(VPN)技术、防火墙、安全扫描和数据备份等。
检测(Detection):当攻击者穿透防护系统时,检测功能就发挥作用,与防护系统形成互补。检测是动态响应的依据。
响应(Response):系统一旦检测到人侵,响应系统就开始工作,进行事件处理。响应包括应急响应和恢复处理,恢复处理又包括系统恢复和信息恢复。

PPDR模型是在整体的安全策略的控制和指导下,在综合运用防护工具(如防火墙、操作系统身份认证、加密等)的同时,利用检测工具(如漏洞评估、人侵检测等)了解和评估系统的安全状态,通过适当的反应将系统调整到“最安全”和“风险最低”的状态。保护、检测和响应组成了一个完整的、动态的安全循环,在安全策略的指导下保证信息系统的安全。

该理论的最基本原理就是信息安全相关的所有活动,不管是攻击行为、防护行为、检测行为和响应行为等都要消耗时间,因此可以用时间来衡量一个体系的安全性和安全能力。假设系统的防护、检测和反应时间分别是Pt、Dt和Rt。系统被对手成功攻击后的时间为暴露时间(Et),那么PPDR模型就可以用典型的数学公式来表达安全的要求:如果Pt>Dt+Rt,那么系统是安全的。

P2DR模型中的数学法则:
假设S系统的防护、检测和反应的时间分别是
• Pt(防护时间、有效防御攻击的时间)
• Dt(检测时间、发起攻击到检测到的时间)
• Rt(反应时间、检测到攻击到处理完成时间)
假设系统被对手成功攻击后的时间为
• Et(暴露时间)
则该系统防护、检测和反应的时间关系如下:
• 如果Pt>Dt+Rt,那么S是安全的;
• 如果Pt<Dt+Rt,那么Et=(Dt+Rt)-Pt。

PPDR给出了安全的全新定义:“及时的检测和响应就是安全”,”及时的检测和恢复就是安全”。这样的定义给出了解决安全问题的明确方向:提高系统的防护时间Pt,降低检测时间Dt和响应时间Rt。

与PDR模型相比,PPDR模型更强调控制和对抗,即强调系统安全的动态性,并且以安全检测、漏洞监测和自适应填充“安全间隙”为循环来提高网络安全。值得指出的是,在PPDR模型中,考虑了管理因素,它强调安全管理的持续性、安全策略的动态性,以实时监视网络活动、发现威胁和弱点来调整和填补网络漏洞。另外,该模型强调检测的重要性,通过经常对信息系统的评估把握系统风险点,及时弱化甚至消除系统的安全漏洞。但该模型忽略了内在的变化因素,如人员的流动、人员的素质和策略贯彻的不稳定性。系统本身安全能力的增强、系统和整个网络的优化,以及人员在系统中最重要角色的素质提升,都是该安全系统没有考虑到的问题。

PDR PPDR
意义 最早体现主动防御思想的一种网络安全模型 是动态网络是安全体系的代表模型,动态安全模型的雏形。
组成 保护-检测-响应( Protection-Detection-Response, PDR ) 策略-保护检测-响应模型( Policy-Protection-Detection-Response, PPDR )
特点 PDR模型建立了一个所谓的基于时间的可证明的安全模型,定义了:防护时间Pt (黑客发起攻击时,保护系统不被攻破的时间)、检测时间Dt (从发起攻击到检测到攻击的时间)和响应时间Rt (从发现攻击到作出有效响应的时间)。当Pt>Dt+Rt时,即认为系统是安全的,也就是说,如果在黑客攻破系统之前发现并阻止了黑客的行为,那么系统就是安全的。 给出了安全一个全新的定义:“及时的检测和响应就是安全”,“及时的检测和恢复就是安全”。而且,这样的定义为安全问题的解决给出了明确的方向:提高系统的防护时间Pt,降低检测时间.Dt和响应时间Rt。
局限性 系统的Pt、Dt、Rt 很难准确定义,面对不同攻击者和不同种类的攻击,这些时间都是变化的,其实还是不能有效证明一个系统是否安全。并且该模型对系统的安全隐患和安全措施采取相对固定的前提假设,难于适应网络安全环境的快速变化 忽略了内在的变化因素,如人员的流动、人员的素质和策略贯彻的不稳定性。系统本身安全能力的增强、系统和整个网络的优化,以及人员在系统中最重要角色的素质提升,都是该安全系统没有考虑到的问题。

不管是PDR还是PPDR,总体来说还是局限于从技术上考虑信息安全问题。随着信息化的发展,人们越来越意识到信息安全涉及面非常广,除了技术,管理、制度、人员和法律等方面也是信息安全必须考虑的因素,就像一个由多块木块构成的“木桶”,木桶的容量由最短的那块板决定。在处理信息安全问题时,必须全面考虑各方面的因素,任何一个方面的遗漏都有可能形成“短板”。


作者博客:http://xiejava.ishareread.com


“fullbug”微信公众号

关注:微信公众号,一起学习成长!

<1…121314…21>
XieJava

XieJava

201 日志
11 分类
26 标签
RSS
GitHub
友情链接
  • 爱分享读书
  • CSDN
  • 豆瓣
© 2025 XieJava | Site words total count: 416.3k

主题 — NexT.Muse
0%