├── .gitignore ├── LICENSE ├── README.md ├── SecurityPaper-themes ├── 404.html ├── __init__.py ├── assets │ ├── fonts │ │ ├── font-awesome.css │ │ ├── material-icons.css │ │ └── specimen │ │ │ ├── FontAwesome.ttf │ │ │ ├── FontAwesome.woff │ │ │ ├── FontAwesome.woff2 │ │ │ ├── MaterialIcons-Regular.ttf │ │ │ ├── MaterialIcons-Regular.woff │ │ │ └── MaterialIcons-Regular.woff2 │ ├── images │ │ ├── favicon.png │ │ └── icons │ │ │ ├── bitbucket.svg │ │ │ ├── github.svg │ │ │ └── gitlab.svg │ ├── javascripts │ │ ├── application.js │ │ ├── lunr │ │ │ ├── lunr-chinese.min.js │ │ │ ├── lunr.da.js │ │ │ ├── lunr.de.js │ │ │ ├── lunr.du.js │ │ │ ├── lunr.es.js │ │ │ ├── lunr.fi.js │ │ │ ├── lunr.fr.js │ │ │ ├── lunr.hu.js │ │ │ ├── lunr.it.js │ │ │ ├── lunr.jp.js │ │ │ ├── lunr.multi.js │ │ │ ├── lunr.no.js │ │ │ ├── lunr.pt.js │ │ │ ├── lunr.ro.js │ │ │ ├── lunr.ru.js │ │ │ ├── lunr.stemmer.support.js │ │ │ ├── lunr.sv.js │ │ │ ├── lunr.tr.js │ │ │ └── tinyseg.js │ │ └── modernizr.js │ └── stylesheets │ │ ├── application-palette.css │ │ └── application.css ├── base.html ├── main.html ├── mkdocs_theme.yml └── partials │ ├── footer.html │ ├── header.html │ ├── hero.html │ ├── integrations │ ├── analytics.html │ └── disqus.html │ ├── language.html │ ├── language │ ├── ar.html │ ├── ca.html │ ├── cs.html │ ├── da.html │ ├── de.html │ ├── en.html │ ├── es.html │ ├── fa.html │ ├── fi.html │ ├── fr.html │ ├── gl.html │ ├── he.html │ ├── hi.html │ ├── hr.html │ ├── hu.html │ ├── id.html │ ├── it.html │ ├── ja.html │ ├── kr.html │ ├── nl.html │ ├── no.html │ ├── pl.html │ ├── pt.html │ ├── ru.html │ ├── sh.html │ ├── sk.html │ ├── sr.html │ ├── sv.html │ ├── tr.html │ ├── uk.html │ ├── vi.html │ ├── zh-Hant.html │ ├── zh-TW.html │ └── zh.html │ ├── nav-item.html │ ├── nav.html │ ├── palette.html │ ├── search.html │ ├── social.html │ ├── source.html │ ├── tabs-item.html │ ├── tabs.html │ ├── toc-item.html │ └── toc.html ├── docs ├── 1.SDL介绍 │ ├── 1-什么是SDL.md │ ├── 2-企业为什么需求SDL.md │ ├── 3-哪些企业需要SDL.md │ └── 4-SDL所带来的优缺点.md ├── 2.SDL规范文档 │ ├── 1-安全设计Checklist.md │ ├── 10-SDL上线规定文档.md │ ├── 11-web应用安全业务自查checklist.md │ ├── 2-php安全编码规范.md │ ├── 3-java安全编码规范.md │ ├── 4-python安全编码规范.md │ ├── 5-nodejs安全编码规范.md │ ├── 6-移动安全规范.md │ ├── 7-产品设计开发最佳实践.md │ ├── 8-常见协议安全开发实践.md │ └── 9-MySQL安全配置.md ├── 3.SDL落地方案 │ ├── 1-安全培训.md │ ├── 2-需求评估.md │ ├── 3-产品设计.md │ ├── 4-代码编写.md │ ├── 5-渗透测试.md │ ├── 6-上线发布.md │ └── 7-应急响应.md ├── 4.构建企业安全 │ ├── 1-内功修炼第一步-挖漏洞.md │ ├── 2-内功修炼第二步-引起重视.md │ ├── 3-互联网安全运营的思考.md │ ├── 4-如何利用Flink实现超大规模用户行为分析.md │ └── 5-APT 攻击基础科普.md ├── 5.附录 │ ├── 01.相关术语.md │ ├── 02.文档变更规范.md │ ├── 03.GitHub工作流.md │ └── 04.NAXSI安装测试与简介.md ├── 6.Project │ ├── 1-内部钓鱼系统.md │ ├── 2-工作流自动化代码审计.md │ └── 3-泰式感知.md ├── 7.安全前瞻 │ └── 1-BeyondCorp-以全新方式保障企业安全.md ├── _headers ├── images │ ├── 2018 │ │ ├── 10 │ │ │ ├── 01.jpeg │ │ │ ├── 02.jpeg │ │ │ └── github │ │ │ │ ├── 1.png │ │ │ │ ├── 2.png │ │ │ │ ├── 3.png │ │ │ │ ├── 4.png │ │ │ │ └── 5.png │ │ ├── 08 │ │ │ ├── 01.png │ │ │ ├── 02.png │ │ │ ├── 03.png │ │ │ ├── 04.png │ │ │ ├── 05.png │ │ │ ├── 06.png │ │ │ ├── 07.png │ │ │ └── 08.jpg │ │ └── 09 │ │ │ ├── 01.png │ │ │ └── 02.png │ ├── 4.构建企业安全 │ │ └── 4-如何利用Flink实现大规模用户行为分析 │ │ │ ├── 01.jpg │ │ │ └── 02.jpg │ ├── 7.安全前瞻 │ │ └── 1-BeyondCorp-以全新方式保障企业安全 │ │ │ ├── 1.png │ │ │ └── 2.png │ ├── head │ │ ├── 1024.jpg │ │ ├── 108haili.jpeg │ │ ├── God.jpeg │ │ ├── I.png │ │ ├── Jun6l3.jpg │ │ ├── Minggle.jpg │ │ ├── Murviet.png │ │ ├── Weiho.png │ │ ├── backlion.jpg │ │ ├── chuanguosuiyuebulao.jpeg │ │ ├── cloudwafs.jpeg │ │ ├── corporation │ │ │ ├── hansight.png │ │ │ └── yidonganquan.png │ │ ├── doubiduo.jpeg │ │ ├── dubbo.jpeg │ │ ├── fengzi.jpeg │ │ ├── fengzi1.jpeg │ │ ├── fireeye.jpg │ │ ├── hzkey.jpeg │ │ ├── johnathan.jpeg │ │ ├── jsp-shell.jpg │ │ ├── k4n5ha0.jpeg │ │ ├── lmowen.jpeg │ │ ├── lost_maniac.jpeg │ │ ├── pa55w0rd.jpeg │ │ ├── realjac.jpg │ │ ├── tinker.jpeg │ │ ├── xiaoletian.jpeg │ │ ├── xiatao.jpeg │ │ ├── xuandao.jpeg │ │ ├── yiming.png │ │ ├── yitiaoyu.jpeg │ │ └── zhanzhexizao.png │ ├── logo.svg │ └── weixin.jpg ├── index.md └── update.md ├── mkdocs.yml └── requirements.txt /.gitignore: -------------------------------------------------------------------------------- 1 | site/ 2 | .DS_Store 3 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | Copyright (c) 2 | 3 | Anti 996 License Version 1.0 (Draft) 4 | 5 | Permission is hereby granted to any individual or legal entity 6 | obtaining a copy of this licensed work (including the source code, 7 | documentation and/or related items, hereinafter collectively referred 8 | to as the "licensed work"), free of charge, to deal with the licensed 9 | work for any purpose, including without limitation, the rights to use, 10 | reproduce, modify, prepare derivative works of, distribute, publish 11 | and sublicense the licensed work, subject to the following conditions: 12 | 13 | 1. The individual or the legal entity must conspicuously display, 14 | without modification, this License and the notice on each redistributed 15 | or derivative copy of the Licensed Work. 16 | 17 | 2. The individual or the legal entity must strictly comply with all 18 | applicable laws, regulations, rules and standards of the jurisdiction 19 | relating to labor and employment where the individual is physically 20 | located or where the individual was born or naturalized; or where the 21 | legal entity is registered or is operating (whichever is stricter). In 22 | case that the jurisdiction has no such laws, regulations, rules and 23 | standards or its laws, regulations, rules and standards are 24 | unenforceable, the individual or the legal entity are required to 25 | comply with Core International Labor Standards. 26 | 27 | 3. The individual or the legal entity shall not induce or force its 28 | employee(s), whether full-time or part-time, or its independent 29 | contractor(s), in any methods, to agree in oral or written form, to 30 | directly or indirectly restrict, weaken or relinquish his or her 31 | rights or remedies under such laws, regulations, rules and standards 32 | relating to labor and employment as mentioned above, no matter whether 33 | such written or oral agreement are enforceable under the laws of the 34 | said jurisdiction, nor shall such individual or the legal entity 35 | limit, in any methods, the rights of its employee(s) or independent 36 | contractor(s) from reporting or complaining to the copyright holder or 37 | relevant authorities monitoring the compliance of the license about 38 | its violation(s) of the said license. 39 | 40 | THE LICENSED WORK IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 41 | EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 42 | MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. 43 | IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, 44 | DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR 45 | OTHERWISE, ARISING FROM, OUT OF OR IN ANY WAY CONNECTION WITH THE 46 | LICENSED WORK OR THE USE OR OTHER DEALINGS IN THE LICENSED WORK. -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | ## SecurityPaper 2 | 3 | 所有文档都来自中国互联网一线安全工程师编写整理 4 | 5 | 6 | ## 官网 7 | 8 | ``` 9 | https://www.SecurityPaper.org 10 | ``` 11 | 12 | 官网状态:[![Build Status](https://travis-ci.com/SecurityPaper/SecurityPaper-web.svg?branch=master)](https://travis-ci.com/SecurityPaper/SecurityPaper-web) 13 | 14 | ## 下载文档方法 15 | 16 | clone 项目到本地 17 | 18 | 所有文档都在**docs**目录下,以markdown文件进行存储,可以直接保存 19 | 20 | 21 | 22 | ## 提交文章和改进 23 | 24 | 请参考git工作流方法 25 | 26 | fork项目到自己账户,修改后提交给主分支,审核后即可展示。 27 | 提交可以多种方式,如web、命令、客户端,这里演示web提交方式 28 | 提交SDL落地方案-产品设计 29 | 1. 选择相应的文件,所有文档都在**_post**目录下 30 | ``` 31 | SecurityPaper-web/_posts/3.SDL落地方案/2018-08-17-SDL-3-产品设计.md 32 | ``` 33 | 34 | 选择**edit**或者**create new file**,文件名必须要符合: ```YEAR-MONTH-DAY-title.md``` 35 | 36 | ![图片1](https://github.com/SecurityPaper/SecurityPaper-web/raw/master/docs/images/2018/10/github/1.png) 37 | 38 | 2. 编辑文档 39 | 所有博客文章顶部必须有一段YAML头信息(YAML front- matter),文章可以使用markdown格式编写 40 | ``` 41 | --- 42 | date: 2018-08-17 43 | title: 03.产品设计 44 | categories: 45 | - 3.SDL落地方案 46 | description: 和研发同学进行产品设计定框架部分应该怎么去执行 47 | type: Document 48 | --- 49 | ``` 50 | 51 | 编辑完成之后点击**commit changes**(同命令```git add . && git commit -m "添加产品设计" && git pusht origin master```) 52 | 53 | ![图片2](https://github.com/SecurityPaper/SecurityPaper-web/raw/master/docs/images/2018/10/github/2.png) 54 | 55 | 3. 提交pull请求 56 | 点击**New pull request** 57 | 58 | ![图片3](https://github.com/SecurityPaper/SecurityPaper-web/raw/master/docs/images/2018/10/github/3.png) 59 | 60 | 检查没有问题,点击**Create pull request** 61 | 62 | ![图片4](https://github.com/SecurityPaper/SecurityPaper-web/raw/master/docs/images/2018/10/github/4.png) 63 | 64 | 提交成功,等待管理员**Merge**之后就成功了 65 | 66 | ![图片5](https://github.com/SecurityPaper/SecurityPaper-web/raw/master/docs/images/2018/10/github/5.png) 67 | 68 | ## 署名 69 | 70 | 原则上对文章修改后即可进行署名在协作者添加上自己的ID。 71 | 72 | ## About页面变更 73 | 74 | 需要对网站文档进行提交建议以及文档改进或者文档编写方可在About页面添加自己ID 75 | 76 | 排序需要按照字母顺序排序。 77 | -------------------------------------------------------------------------------- /SecurityPaper-themes/404.html: -------------------------------------------------------------------------------- 1 | {% extends "base.html" %} 2 | {% block content %} 3 |

404 - Not found

4 | {% endblock %} 5 | -------------------------------------------------------------------------------- /SecurityPaper-themes/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SecurityPaper/SecurityPaper-web/cbe1d19c3b8090e38e70b319a31c78248528fea6/SecurityPaper-themes/__init__.py -------------------------------------------------------------------------------- /SecurityPaper-themes/assets/fonts/material-icons.css: -------------------------------------------------------------------------------- 1 | /*! 2 | * Licensed under the Apache License, Version 2.0 (the "License"); you may not 3 | * use this file except in compliance with the License. You may obtain a copy 4 | * of the License at: 5 | * 6 | * http://www.apache.org/licenses/LICENSE-2.0 7 | * 8 | * UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING, SOFTWARE 9 | * DISTRIBUTED UNDER THE LICENSE IS DISTRIBUTED ON AN "AS IS" BASIS, 10 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. 11 | * SEE THE LICENSE FOR THE SPECIFIC LANGUAGE GOVERNING PERMISSIONS AND 12 | * LIMITATIONS UNDER THE LICENSE. 13 | */@font-face{font-family:"Material Icons";font-style:normal;font-weight:400;src:local("Material Icons"),local("MaterialIcons-Regular"),url("specimen/MaterialIcons-Regular.woff2") format("woff2"),url("specimen/MaterialIcons-Regular.woff") format("woff"),url("specimen/MaterialIcons-Regular.ttf") format("truetype")} -------------------------------------------------------------------------------- /SecurityPaper-themes/assets/fonts/specimen/FontAwesome.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SecurityPaper/SecurityPaper-web/cbe1d19c3b8090e38e70b319a31c78248528fea6/SecurityPaper-themes/assets/fonts/specimen/FontAwesome.ttf -------------------------------------------------------------------------------- /SecurityPaper-themes/assets/fonts/specimen/FontAwesome.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SecurityPaper/SecurityPaper-web/cbe1d19c3b8090e38e70b319a31c78248528fea6/SecurityPaper-themes/assets/fonts/specimen/FontAwesome.woff -------------------------------------------------------------------------------- /SecurityPaper-themes/assets/fonts/specimen/FontAwesome.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SecurityPaper/SecurityPaper-web/cbe1d19c3b8090e38e70b319a31c78248528fea6/SecurityPaper-themes/assets/fonts/specimen/FontAwesome.woff2 -------------------------------------------------------------------------------- /SecurityPaper-themes/assets/fonts/specimen/MaterialIcons-Regular.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SecurityPaper/SecurityPaper-web/cbe1d19c3b8090e38e70b319a31c78248528fea6/SecurityPaper-themes/assets/fonts/specimen/MaterialIcons-Regular.ttf -------------------------------------------------------------------------------- /SecurityPaper-themes/assets/fonts/specimen/MaterialIcons-Regular.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SecurityPaper/SecurityPaper-web/cbe1d19c3b8090e38e70b319a31c78248528fea6/SecurityPaper-themes/assets/fonts/specimen/MaterialIcons-Regular.woff -------------------------------------------------------------------------------- /SecurityPaper-themes/assets/fonts/specimen/MaterialIcons-Regular.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SecurityPaper/SecurityPaper-web/cbe1d19c3b8090e38e70b319a31c78248528fea6/SecurityPaper-themes/assets/fonts/specimen/MaterialIcons-Regular.woff2 -------------------------------------------------------------------------------- /SecurityPaper-themes/assets/images/favicon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SecurityPaper/SecurityPaper-web/cbe1d19c3b8090e38e70b319a31c78248528fea6/SecurityPaper-themes/assets/images/favicon.png -------------------------------------------------------------------------------- /SecurityPaper-themes/assets/images/icons/bitbucket.svg: -------------------------------------------------------------------------------- 1 | 3 | 20 | 21 | -------------------------------------------------------------------------------- /SecurityPaper-themes/assets/images/icons/github.svg: -------------------------------------------------------------------------------- 1 | 3 | 18 | 19 | -------------------------------------------------------------------------------- /SecurityPaper-themes/assets/images/icons/gitlab.svg: -------------------------------------------------------------------------------- 1 | 3 | 4 | 7 | 8 | 9 | 12 | 13 | 14 | 17 | 18 | 19 | 22 | 23 | 24 | 27 | 28 | 29 | 32 | 33 | 34 | 37 | 38 | 39 | -------------------------------------------------------------------------------- /SecurityPaper-themes/assets/javascripts/lunr/lunr.da.js: -------------------------------------------------------------------------------- 1 | !function(e,r){"function"==typeof define&&define.amd?define(r):"object"==typeof exports?module.exports=r():r()(e.lunr)}(this,function(){return function(e){if(void 0===e)throw new Error("Lunr is not present. Please include / require Lunr before this script.");if(void 0===e.stemmerSupport)throw new Error("Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.");var r,m,i;e.da=function(){this.pipeline.reset(),this.pipeline.add(e.da.trimmer,e.da.stopWordFilter,e.da.stemmer),this.searchPipeline&&(this.searchPipeline.reset(),this.searchPipeline.add(e.da.stemmer))},e.da.wordCharacters="A-Za-zªºÀ-ÖØ-öø-ʸˠ-ˤᴀ-ᴥᴬ-ᵜᵢ-ᵥᵫ-ᵷᵹ-ᶾḀ-ỿⁱⁿₐ-ₜKÅℲⅎⅠ-ↈⱠ-ⱿꜢ-ꞇꞋ-ꞭꞰ-ꞷꟷ-ꟿꬰ-ꭚꭜ-ꭤff-stA-Za-z",e.da.trimmer=e.trimmerSupport.generateTrimmer(e.da.wordCharacters),e.Pipeline.registerFunction(e.da.trimmer,"trimmer-da"),e.da.stemmer=(r=e.stemmerSupport.Among,m=e.stemmerSupport.SnowballProgram,i=new function(){var i,t,n,s=[new r("hed",-1,1),new r("ethed",0,1),new r("ered",-1,1),new r("e",-1,1),new r("erede",3,1),new r("ende",3,1),new r("erende",5,1),new r("ene",3,1),new r("erne",3,1),new r("ere",3,1),new r("en",-1,1),new r("heden",10,1),new r("eren",10,1),new r("er",-1,1),new r("heder",13,1),new r("erer",13,1),new r("s",-1,2),new r("heds",16,1),new r("es",16,1),new r("endes",18,1),new r("erendes",19,1),new r("enes",18,1),new r("ernes",18,1),new r("eres",18,1),new r("ens",16,1),new r("hedens",24,1),new r("erens",24,1),new r("ers",16,1),new r("ets",16,1),new r("erets",28,1),new r("et",-1,1),new r("eret",30,1)],o=[new r("gd",-1,-1),new r("dt",-1,-1),new r("gt",-1,-1),new r("kt",-1,-1)],a=[new r("ig",-1,1),new r("lig",0,1),new r("elig",1,1),new r("els",-1,1),new r("løst",-1,2)],d=[17,65,16,1,0,0,0,0,0,0,0,0,0,0,0,0,48,0,128],u=[239,254,42,3,0,0,0,0,0,0,0,0,0,0,0,0,16],c=new m;function l(){var e,r=c.limit-c.cursor;c.cursor>=t&&(e=c.limit_backward,c.limit_backward=t,c.ket=c.cursor,c.find_among_b(o,4)?(c.bra=c.cursor,c.limit_backward=e,c.cursor=c.limit-r,c.cursor>c.limit_backward&&(c.cursor--,c.bra=c.cursor,c.slice_del())):c.limit_backward=e)}this.setCurrent=function(e){c.setCurrent(e)},this.getCurrent=function(){return c.getCurrent()},this.stem=function(){var e,r=c.cursor;return function(){var e,r=c.cursor+3;if(t=c.limit,0<=r&&r<=c.limit){for(i=r;;){if(e=c.cursor,c.in_grouping(d,97,248)){c.cursor=e;break}if((c.cursor=e)>=c.limit)return;c.cursor++}for(;!c.out_grouping(d,97,248);){if(c.cursor>=c.limit)return;c.cursor++}(t=c.cursor)=t&&(r=c.limit_backward,c.limit_backward=t,c.ket=c.cursor,e=c.find_among_b(s,32),c.limit_backward=r,e))switch(c.bra=c.cursor,e){case 1:c.slice_del();break;case 2:c.in_grouping_b(u,97,229)&&c.slice_del()}}(),c.cursor=c.limit,l(),c.cursor=c.limit,function(){var e,r,i,n=c.limit-c.cursor;if(c.ket=c.cursor,c.eq_s_b(2,"st")&&(c.bra=c.cursor,c.eq_s_b(2,"ig")&&c.slice_del()),c.cursor=c.limit-n,c.cursor>=t&&(r=c.limit_backward,c.limit_backward=t,c.ket=c.cursor,e=c.find_among_b(a,5),c.limit_backward=r,e))switch(c.bra=c.cursor,e){case 1:c.slice_del(),i=c.limit-c.cursor,l(),c.cursor=c.limit-i;break;case 2:c.slice_from("løs")}}(),c.cursor=c.limit,c.cursor>=t&&(e=c.limit_backward,c.limit_backward=t,c.ket=c.cursor,c.out_grouping_b(d,97,248)?(c.bra=c.cursor,n=c.slice_to(n),c.limit_backward=e,c.eq_v_b(n)&&c.slice_del()):c.limit_backward=e),!0}},function(e){return"function"==typeof e.update?e.update(function(e){return i.setCurrent(e),i.stem(),i.getCurrent()}):(i.setCurrent(e),i.stem(),i.getCurrent())}),e.Pipeline.registerFunction(e.da.stemmer,"stemmer-da"),e.da.stopWordFilter=e.generateStopWordFilter("ad af alle alt anden at blev blive bliver da de dem den denne der deres det dette dig din disse dog du efter eller en end er et for fra ham han hans har havde have hende hendes her hos hun hvad hvis hvor i ikke ind jeg jer jo kunne man mange med meget men mig min mine mit mod ned noget nogle nu når og også om op os over på selv sig sin sine sit skal skulle som sådan thi til ud under var vi vil ville vor være været".split(" ")),e.Pipeline.registerFunction(e.da.stopWordFilter,"stopWordFilter-da")}}); -------------------------------------------------------------------------------- /SecurityPaper-themes/assets/javascripts/lunr/lunr.de.js: -------------------------------------------------------------------------------- 1 | !function(e,r){"function"==typeof define&&define.amd?define(r):"object"==typeof exports?module.exports=r():r()(e.lunr)}(this,function(){return function(e){if(void 0===e)throw new Error("Lunr is not present. Please include / require Lunr before this script.");if(void 0===e.stemmerSupport)throw new Error("Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.");var _,p,r;e.de=function(){this.pipeline.reset(),this.pipeline.add(e.de.trimmer,e.de.stopWordFilter,e.de.stemmer),this.searchPipeline&&(this.searchPipeline.reset(),this.searchPipeline.add(e.de.stemmer))},e.de.wordCharacters="A-Za-zªºÀ-ÖØ-öø-ʸˠ-ˤᴀ-ᴥᴬ-ᵜᵢ-ᵥᵫ-ᵷᵹ-ᶾḀ-ỿⁱⁿₐ-ₜKÅℲⅎⅠ-ↈⱠ-ⱿꜢ-ꞇꞋ-ꞭꞰ-ꞷꟷ-ꟿꬰ-ꭚꭜ-ꭤff-stA-Za-z",e.de.trimmer=e.trimmerSupport.generateTrimmer(e.de.wordCharacters),e.Pipeline.registerFunction(e.de.trimmer,"trimmer-de"),e.de.stemmer=(_=e.stemmerSupport.Among,p=e.stemmerSupport.SnowballProgram,r=new function(){var r,n,i,s=[new _("",-1,6),new _("U",0,2),new _("Y",0,1),new _("ä",0,3),new _("ö",0,4),new _("ü",0,5)],o=[new _("e",-1,2),new _("em",-1,1),new _("en",-1,2),new _("ern",-1,1),new _("er",-1,1),new _("s",-1,3),new _("es",5,2)],c=[new _("en",-1,1),new _("er",-1,1),new _("st",-1,2),new _("est",2,1)],u=[new _("ig",-1,1),new _("lich",-1,1)],a=[new _("end",-1,1),new _("ig",-1,2),new _("ung",-1,1),new _("lich",-1,3),new _("isch",-1,2),new _("ik",-1,2),new _("heit",-1,3),new _("keit",-1,4)],t=[17,65,16,1,0,0,0,0,0,0,0,0,0,0,0,0,8,0,32,8],d=[117,30,5],l=[117,30,4],m=new p;function h(e,r,n){return!(!m.eq_s(1,e)||(m.ket=m.cursor,!m.in_grouping(t,97,252)))&&(m.slice_from(r),m.cursor=n,!0)}function w(){for(;!m.in_grouping(t,97,252);){if(m.cursor>=m.limit)return!0;m.cursor++}for(;!m.out_grouping(t,97,252);){if(m.cursor>=m.limit)return!0;m.cursor++}return!1}function f(){return i<=m.cursor}function b(){return n<=m.cursor}this.setCurrent=function(e){m.setCurrent(e)},this.getCurrent=function(){return m.getCurrent()},this.stem=function(){var e=m.cursor;return function(){for(var e,r,n,i,s=m.cursor;;)if(e=m.cursor,m.bra=e,m.eq_s(1,"ß"))m.ket=m.cursor,m.slice_from("ss");else{if(e>=m.limit)break;m.cursor=e+1}for(m.cursor=s;;)for(r=m.cursor;;){if(n=m.cursor,m.in_grouping(t,97,252)){if(i=m.cursor,m.bra=i,h("u","U",n))break;if(m.cursor=i,h("y","Y",n))break}if(n>=m.limit)return m.cursor=r;m.cursor=n+1}}(),m.cursor=e,function(){i=m.limit,n=i;var e=m.cursor+3;0<=e&&e<=m.limit&&(r=e,w()||((i=m.cursor)=m.limit)return;m.cursor++}}}(),!0}},function(e){return"function"==typeof e.update?e.update(function(e){return r.setCurrent(e),r.stem(),r.getCurrent()}):(r.setCurrent(e),r.stem(),r.getCurrent())}),e.Pipeline.registerFunction(e.de.stemmer,"stemmer-de"),e.de.stopWordFilter=e.generateStopWordFilter("aber alle allem allen aller alles als also am an ander andere anderem anderen anderer anderes anderm andern anderr anders auch auf aus bei bin bis bist da damit dann das dasselbe dazu daß dein deine deinem deinen deiner deines dem demselben den denn denselben der derer derselbe derselben des desselben dessen dich die dies diese dieselbe dieselben diesem diesen dieser dieses dir doch dort du durch ein eine einem einen einer eines einig einige einigem einigen einiger einiges einmal er es etwas euch euer eure eurem euren eurer eures für gegen gewesen hab habe haben hat hatte hatten hier hin hinter ich ihm ihn ihnen ihr ihre ihrem ihren ihrer ihres im in indem ins ist jede jedem jeden jeder jedes jene jenem jenen jener jenes jetzt kann kein keine keinem keinen keiner keines können könnte machen man manche manchem manchen mancher manches mein meine meinem meinen meiner meines mich mir mit muss musste nach nicht nichts noch nun nur ob oder ohne sehr sein seine seinem seinen seiner seines selbst sich sie sind so solche solchem solchen solcher solches soll sollte sondern sonst um und uns unse unsem unsen unser unses unter viel vom von vor war waren warst was weg weil weiter welche welchem welchen welcher welches wenn werde werden wie wieder will wir wird wirst wo wollen wollte während würde würden zu zum zur zwar zwischen über".split(" ")),e.Pipeline.registerFunction(e.de.stopWordFilter,"stopWordFilter-de")}}); -------------------------------------------------------------------------------- /SecurityPaper-themes/assets/javascripts/lunr/lunr.du.js: -------------------------------------------------------------------------------- 1 | !function(r,e){"function"==typeof define&&define.amd?define(e):"object"==typeof exports?module.exports=e():e()(r.lunr)}(this,function(){return function(r){if(void 0===r)throw new Error("Lunr is not present. Please include / require Lunr before this script.");if(void 0===r.stemmerSupport)throw new Error("Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.");var v,q,e;r.du=function(){this.pipeline.reset(),this.pipeline.add(r.du.trimmer,r.du.stopWordFilter,r.du.stemmer),this.searchPipeline&&(this.searchPipeline.reset(),this.searchPipeline.add(r.du.stemmer))},r.du.wordCharacters="A-Za-zªºÀ-ÖØ-öø-ʸˠ-ˤᴀ-ᴥᴬ-ᵜᵢ-ᵥᵫ-ᵷᵹ-ᶾḀ-ỿⁱⁿₐ-ₜKÅℲⅎⅠ-ↈⱠ-ⱿꜢ-ꞇꞋ-ꞭꞰ-ꞷꟷ-ꟿꬰ-ꭚꭜ-ꭤff-stA-Za-z",r.du.trimmer=r.trimmerSupport.generateTrimmer(r.du.wordCharacters),r.Pipeline.registerFunction(r.du.trimmer,"trimmer-du"),r.du.stemmer=(v=r.stemmerSupport.Among,q=r.stemmerSupport.SnowballProgram,e=new function(){var e,i,u,o=[new v("",-1,6),new v("á",0,1),new v("ä",0,1),new v("é",0,2),new v("ë",0,2),new v("í",0,3),new v("ï",0,3),new v("ó",0,4),new v("ö",0,4),new v("ú",0,5),new v("ü",0,5)],n=[new v("",-1,3),new v("I",0,2),new v("Y",0,1)],t=[new v("dd",-1,-1),new v("kk",-1,-1),new v("tt",-1,-1)],c=[new v("ene",-1,2),new v("se",-1,3),new v("en",-1,2),new v("heden",2,1),new v("s",-1,3)],a=[new v("end",-1,1),new v("ig",-1,2),new v("ing",-1,1),new v("lijk",-1,3),new v("baar",-1,4),new v("bar",-1,5)],l=[new v("aa",-1,-1),new v("ee",-1,-1),new v("oo",-1,-1),new v("uu",-1,-1)],m=[17,65,16,1,0,0,0,0,0,0,0,0,0,0,0,0,128],d=[1,0,0,17,65,16,1,0,0,0,0,0,0,0,0,0,0,0,0,128],f=[17,67,16,1,0,0,0,0,0,0,0,0,0,0,0,0,128],_=new q;function s(r){return(_.cursor=r)>=_.limit||(_.cursor++,!1)}function w(){for(;!_.in_grouping(m,97,232);){if(_.cursor>=_.limit)return!0;_.cursor++}for(;!_.out_grouping(m,97,232);){if(_.cursor>=_.limit)return!0;_.cursor++}return!1}function b(){return i<=_.cursor}function p(){return e<=_.cursor}function g(){var r=_.limit-_.cursor;_.find_among_b(t,3)&&(_.cursor=_.limit-r,_.ket=_.cursor,_.cursor>_.limit_backward&&(_.cursor--,_.bra=_.cursor,_.slice_del()))}function h(){var r;u=!1,_.ket=_.cursor,_.eq_s_b(1,"e")&&(_.bra=_.cursor,b()&&(r=_.limit-_.cursor,_.out_grouping_b(m,97,232)&&(_.cursor=_.limit-r,_.slice_del(),u=!0,g())))}function k(){var r;b()&&(r=_.limit-_.cursor,_.out_grouping_b(m,97,232)&&(_.cursor=_.limit-r,_.eq_s_b(3,"gem")||(_.cursor=_.limit-r,_.slice_del(),g())))}this.setCurrent=function(r){_.setCurrent(r)},this.getCurrent=function(){return _.getCurrent()},this.stem=function(){var r=_.cursor;return function(){for(var r,e,i,n=_.cursor;;){if(_.bra=_.cursor,r=_.find_among(o,11))switch(_.ket=_.cursor,r){case 1:_.slice_from("a");continue;case 2:_.slice_from("e");continue;case 3:_.slice_from("i");continue;case 4:_.slice_from("o");continue;case 5:_.slice_from("u");continue;case 6:if(_.cursor>=_.limit)break;_.cursor++;continue}break}for(_.cursor=n,_.bra=n,_.eq_s(1,"y")?(_.ket=_.cursor,_.slice_from("Y")):_.cursor=n;;)if(e=_.cursor,_.in_grouping(m,97,232)){if(i=_.cursor,_.bra=i,_.eq_s(1,"i"))_.ket=_.cursor,_.in_grouping(m,97,232)&&(_.slice_from("I"),_.cursor=e);else if(_.cursor=i,_.eq_s(1,"y"))_.ket=_.cursor,_.slice_from("Y"),_.cursor=e;else if(s(e))break}else if(s(e))break}(),_.cursor=r,i=_.limit,e=i,w()||((i=_.cursor)<3&&(i=3),w()||(e=_.cursor)),_.limit_backward=r,_.cursor=_.limit,function(){var r,e,i,n,o,t,s=_.limit-_.cursor;if(_.ket=_.cursor,r=_.find_among_b(c,5))switch(_.bra=_.cursor,r){case 1:b()&&_.slice_from("heid");break;case 2:k();break;case 3:b()&&_.out_grouping_b(f,97,232)&&_.slice_del()}if(_.cursor=_.limit-s,h(),_.cursor=_.limit-s,_.ket=_.cursor,_.eq_s_b(4,"heid")&&(_.bra=_.cursor,p()&&(e=_.limit-_.cursor,_.eq_s_b(1,"c")||(_.cursor=_.limit-e,_.slice_del(),_.ket=_.cursor,_.eq_s_b(2,"en")&&(_.bra=_.cursor,k())))),_.cursor=_.limit-s,_.ket=_.cursor,r=_.find_among_b(a,6))switch(_.bra=_.cursor,r){case 1:if(p()){if(_.slice_del(),i=_.limit-_.cursor,_.ket=_.cursor,_.eq_s_b(2,"ig")&&(_.bra=_.cursor,p()&&(n=_.limit-_.cursor,!_.eq_s_b(1,"e")))){_.cursor=_.limit-n,_.slice_del();break}_.cursor=_.limit-i,g()}break;case 2:p()&&(o=_.limit-_.cursor,_.eq_s_b(1,"e")||(_.cursor=_.limit-o,_.slice_del()));break;case 3:p()&&(_.slice_del(),h());break;case 4:p()&&_.slice_del();break;case 5:p()&&u&&_.slice_del()}_.cursor=_.limit-s,_.out_grouping_b(d,73,232)&&(t=_.limit-_.cursor,_.find_among_b(l,4)&&_.out_grouping_b(m,97,232)&&(_.cursor=_.limit-t,_.ket=_.cursor,_.cursor>_.limit_backward&&(_.cursor--,_.bra=_.cursor,_.slice_del())))}(),_.cursor=_.limit_backward,function(){for(var r;;)if(_.bra=_.cursor,r=_.find_among(n,3))switch(_.ket=_.cursor,r){case 1:_.slice_from("y");break;case 2:_.slice_from("i");break;case 3:if(_.cursor>=_.limit)return;_.cursor++}}(),!0}},function(r){return"function"==typeof r.update?r.update(function(r){return e.setCurrent(r),e.stem(),e.getCurrent()}):(e.setCurrent(r),e.stem(),e.getCurrent())}),r.Pipeline.registerFunction(r.du.stemmer,"stemmer-du"),r.du.stopWordFilter=r.generateStopWordFilter(" aan al alles als altijd andere ben bij daar dan dat de der deze die dit doch doen door dus een eens en er ge geen geweest haar had heb hebben heeft hem het hier hij hoe hun iemand iets ik in is ja je kan kon kunnen maar me meer men met mij mijn moet na naar niet niets nog nu of om omdat onder ons ook op over reeds te tegen toch toen tot u uit uw van veel voor want waren was wat werd wezen wie wil worden wordt zal ze zelf zich zij zijn zo zonder zou".split(" ")),r.Pipeline.registerFunction(r.du.stopWordFilter,"stopWordFilter-du")}}); -------------------------------------------------------------------------------- /SecurityPaper-themes/assets/javascripts/lunr/lunr.fi.js: -------------------------------------------------------------------------------- 1 | !function(i,e){"function"==typeof define&&define.amd?define(e):"object"==typeof exports?module.exports=e():e()(i.lunr)}(this,function(){return function(i){if(void 0===i)throw new Error("Lunr is not present. Please include / require Lunr before this script.");if(void 0===i.stemmerSupport)throw new Error("Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.");var v,C,e;i.fi=function(){this.pipeline.reset(),this.pipeline.add(i.fi.trimmer,i.fi.stopWordFilter,i.fi.stemmer),this.searchPipeline&&(this.searchPipeline.reset(),this.searchPipeline.add(i.fi.stemmer))},i.fi.wordCharacters="A-Za-zªºÀ-ÖØ-öø-ʸˠ-ˤᴀ-ᴥᴬ-ᵜᵢ-ᵥᵫ-ᵷᵹ-ᶾḀ-ỿⁱⁿₐ-ₜKÅℲⅎⅠ-ↈⱠ-ⱿꜢ-ꞇꞋ-ꞭꞰ-ꞷꟷ-ꟿꬰ-ꭚꭜ-ꭤff-stA-Za-z",i.fi.trimmer=i.trimmerSupport.generateTrimmer(i.fi.wordCharacters),i.Pipeline.registerFunction(i.fi.trimmer,"trimmer-fi"),i.fi.stemmer=(v=i.stemmerSupport.Among,C=i.stemmerSupport.SnowballProgram,e=new function(){var n,t,l,o,r=[new v("pa",-1,1),new v("sti",-1,2),new v("kaan",-1,1),new v("han",-1,1),new v("kin",-1,1),new v("hän",-1,1),new v("kään",-1,1),new v("ko",-1,1),new v("pä",-1,1),new v("kö",-1,1)],s=[new v("lla",-1,-1),new v("na",-1,-1),new v("ssa",-1,-1),new v("ta",-1,-1),new v("lta",3,-1),new v("sta",3,-1)],a=[new v("llä",-1,-1),new v("nä",-1,-1),new v("ssä",-1,-1),new v("tä",-1,-1),new v("ltä",3,-1),new v("stä",3,-1)],u=[new v("lle",-1,-1),new v("ine",-1,-1)],c=[new v("nsa",-1,3),new v("mme",-1,3),new v("nne",-1,3),new v("ni",-1,2),new v("si",-1,1),new v("an",-1,4),new v("en",-1,6),new v("än",-1,5),new v("nsä",-1,3)],i=[new v("aa",-1,-1),new v("ee",-1,-1),new v("ii",-1,-1),new v("oo",-1,-1),new v("uu",-1,-1),new v("ää",-1,-1),new v("öö",-1,-1)],m=[new v("a",-1,8),new v("lla",0,-1),new v("na",0,-1),new v("ssa",0,-1),new v("ta",0,-1),new v("lta",4,-1),new v("sta",4,-1),new v("tta",4,9),new v("lle",-1,-1),new v("ine",-1,-1),new v("ksi",-1,-1),new v("n",-1,7),new v("han",11,1),new v("den",11,-1,q),new v("seen",11,-1,j),new v("hen",11,2),new v("tten",11,-1,q),new v("hin",11,3),new v("siin",11,-1,q),new v("hon",11,4),new v("hän",11,5),new v("hön",11,6),new v("ä",-1,8),new v("llä",22,-1),new v("nä",22,-1),new v("ssä",22,-1),new v("tä",22,-1),new v("ltä",26,-1),new v("stä",26,-1),new v("ttä",26,9)],w=[new v("eja",-1,-1),new v("mma",-1,1),new v("imma",1,-1),new v("mpa",-1,1),new v("impa",3,-1),new v("mmi",-1,1),new v("immi",5,-1),new v("mpi",-1,1),new v("impi",7,-1),new v("ejä",-1,-1),new v("mmä",-1,1),new v("immä",10,-1),new v("mpä",-1,1),new v("impä",12,-1)],_=[new v("i",-1,-1),new v("j",-1,-1)],k=[new v("mma",-1,1),new v("imma",0,-1)],b=[17,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8],d=[17,65,16,1,0,0,0,0,0,0,0,0,0,0,0,0,8,0,32],e=[17,65,16,0,0,0,0,0,0,0,0,0,0,0,0,0,8,0,32],f=[17,97,24,1,0,0,0,0,0,0,0,0,0,0,0,0,8,0,32],h=new C;function p(){for(var i;i=h.cursor,!h.in_grouping(d,97,246);){if((h.cursor=i)>=h.limit)return!0;h.cursor++}for(h.cursor=i;!h.out_grouping(d,97,246);){if(h.cursor>=h.limit)return!0;h.cursor++}return!1}function g(){var i,e;if(h.cursor>=o)if(e=h.limit_backward,h.limit_backward=o,h.ket=h.cursor,i=h.find_among_b(r,10)){switch(h.bra=h.cursor,h.limit_backward=e,i){case 1:if(!h.in_grouping_b(f,97,246))return;break;case 2:if(!(l<=h.cursor))return}h.slice_del()}else h.limit_backward=e}function j(){return h.find_among_b(i,7)}function q(){return h.eq_s_b(1,"i")&&h.in_grouping_b(e,97,246)}this.setCurrent=function(i){h.setCurrent(i)},this.getCurrent=function(){return h.getCurrent()},this.stem=function(){var i,e=h.cursor;return o=h.limit,l=o,p()||(o=h.cursor,p()||(l=h.cursor)),n=!1,h.limit_backward=e,h.cursor=h.limit,g(),h.cursor=h.limit,function(){var i,e,r;if(h.cursor>=o)if(e=h.limit_backward,h.limit_backward=o,h.ket=h.cursor,i=h.find_among_b(c,9))switch(h.bra=h.cursor,h.limit_backward=e,i){case 1:r=h.limit-h.cursor,h.eq_s_b(1,"k")||(h.cursor=h.limit-r,h.slice_del());break;case 2:h.slice_del(),h.ket=h.cursor,h.eq_s_b(3,"kse")&&(h.bra=h.cursor,h.slice_from("ksi"));break;case 3:h.slice_del();break;case 4:h.find_among_b(s,6)&&h.slice_del();break;case 5:h.find_among_b(a,6)&&h.slice_del();break;case 6:h.find_among_b(u,2)&&h.slice_del()}else h.limit_backward=e}(),h.cursor=h.limit,function(){var i,e,r;if(h.cursor>=o)if(e=h.limit_backward,h.limit_backward=o,h.ket=h.cursor,i=h.find_among_b(m,30)){switch(h.bra=h.cursor,h.limit_backward=e,i){case 1:if(!h.eq_s_b(1,"a"))return;break;case 2:case 9:if(!h.eq_s_b(1,"e"))return;break;case 3:if(!h.eq_s_b(1,"i"))return;break;case 4:if(!h.eq_s_b(1,"o"))return;break;case 5:if(!h.eq_s_b(1,"ä"))return;break;case 6:if(!h.eq_s_b(1,"ö"))return;break;case 7:if(r=h.limit-h.cursor,!j()&&(h.cursor=h.limit-r,!h.eq_s_b(2,"ie"))){h.cursor=h.limit-r;break}if(h.cursor=h.limit-r,h.cursor<=h.limit_backward){h.cursor=h.limit-r;break}h.cursor--,h.bra=h.cursor;break;case 8:if(!h.in_grouping_b(d,97,246)||!h.out_grouping_b(d,97,246))return}h.slice_del(),n=!0}else h.limit_backward=e}(),h.cursor=h.limit,function(){var i,e,r;if(h.cursor>=l)if(e=h.limit_backward,h.limit_backward=l,h.ket=h.cursor,i=h.find_among_b(w,14)){if(h.bra=h.cursor,h.limit_backward=e,1==i){if(r=h.limit-h.cursor,h.eq_s_b(2,"po"))return;h.cursor=h.limit-r}h.slice_del()}else h.limit_backward=e}(),h.cursor=h.limit,h.cursor=(n?h.cursor>=o&&(i=h.limit_backward,h.limit_backward=o,h.ket=h.cursor,h.find_among_b(_,2)?(h.bra=h.cursor,h.limit_backward=i,h.slice_del()):h.limit_backward=i):(h.cursor=h.limit,function(){var i,e,r,n,t,s;if(h.cursor>=o){if(e=h.limit_backward,h.limit_backward=o,h.ket=h.cursor,h.eq_s_b(1,"t")&&(h.bra=h.cursor,r=h.limit-h.cursor,h.in_grouping_b(d,97,246)&&(h.cursor=h.limit-r,h.slice_del(),h.limit_backward=e,n=h.limit-h.cursor,h.cursor>=l&&(h.cursor=l,t=h.limit_backward,h.limit_backward=h.cursor,h.cursor=h.limit-n,h.ket=h.cursor,i=h.find_among_b(k,2))))){if(h.bra=h.cursor,h.limit_backward=t,1==i){if(s=h.limit-h.cursor,h.eq_s_b(2,"po"))return;h.cursor=h.limit-s}return h.slice_del()}h.limit_backward=e}}()),h.limit),function(){var i,e,r,n;if(h.cursor>=o){for(i=h.limit_backward,h.limit_backward=o,e=h.limit-h.cursor,j()&&(h.cursor=h.limit-e,h.ket=h.cursor,h.cursor>h.limit_backward&&(h.cursor--,h.bra=h.cursor,h.slice_del())),h.cursor=h.limit-e,h.ket=h.cursor,h.in_grouping_b(b,97,228)&&(h.bra=h.cursor,h.out_grouping_b(d,97,246)&&h.slice_del()),h.cursor=h.limit-e,h.ket=h.cursor,h.eq_s_b(1,"j")&&(h.bra=h.cursor,r=h.limit-h.cursor,h.eq_s_b(1,"o")?h.slice_del():(h.cursor=h.limit-r,h.eq_s_b(1,"u")&&h.slice_del())),h.cursor=h.limit-e,h.ket=h.cursor,h.eq_s_b(1,"o")&&(h.bra=h.cursor,h.eq_s_b(1,"j")&&h.slice_del()),h.cursor=h.limit-e,h.limit_backward=i;;){if(n=h.limit-h.cursor,h.out_grouping_b(d,97,246)){h.cursor=h.limit-n;break}if(h.cursor=h.limit-n,h.cursor<=h.limit_backward)return;h.cursor--}h.ket=h.cursor,h.cursor>h.limit_backward&&(h.cursor--,h.bra=h.cursor,t=h.slice_to(),h.eq_v_b(t)&&h.slice_del())}}(),!0}},function(i){return"function"==typeof i.update?i.update(function(i){return e.setCurrent(i),e.stem(),e.getCurrent()}):(e.setCurrent(i),e.stem(),e.getCurrent())}),i.Pipeline.registerFunction(i.fi.stemmer,"stemmer-fi"),i.fi.stopWordFilter=i.generateStopWordFilter("ei eivät emme en et ette että he heidän heidät heihin heille heillä heiltä heissä heistä heitä hän häneen hänelle hänellä häneltä hänen hänessä hänestä hänet häntä itse ja johon joiden joihin joiksi joilla joille joilta joina joissa joista joita joka joksi jolla jolle jolta jona jonka jos jossa josta jota jotka kanssa keiden keihin keiksi keille keillä keiltä keinä keissä keistä keitä keneen keneksi kenelle kenellä keneltä kenen kenenä kenessä kenestä kenet ketkä ketkä ketä koska kuin kuka kun me meidän meidät meihin meille meillä meiltä meissä meistä meitä mihin miksi mikä mille millä miltä minkä minkä minua minulla minulle minulta minun minussa minusta minut minuun minä minä missä mistä mitkä mitä mukaan mutta ne niiden niihin niiksi niille niillä niiltä niin niin niinä niissä niistä niitä noiden noihin noiksi noilla noille noilta noin noina noissa noista noita nuo nyt näiden näihin näiksi näille näillä näiltä näinä näissä näistä näitä nämä ole olemme olen olet olette oli olimme olin olisi olisimme olisin olisit olisitte olisivat olit olitte olivat olla olleet ollut on ovat poikki se sekä sen siihen siinä siitä siksi sille sillä sillä siltä sinua sinulla sinulle sinulta sinun sinussa sinusta sinut sinuun sinä sinä sitä tai te teidän teidät teihin teille teillä teiltä teissä teistä teitä tuo tuohon tuoksi tuolla tuolle tuolta tuon tuona tuossa tuosta tuota tähän täksi tälle tällä tältä tämä tämän tänä tässä tästä tätä vaan vai vaikka yli".split(" ")),i.Pipeline.registerFunction(i.fi.stopWordFilter,"stopWordFilter-fi")}}); -------------------------------------------------------------------------------- /SecurityPaper-themes/assets/javascripts/lunr/lunr.fr.js: -------------------------------------------------------------------------------- 1 | !function(e,r){"function"==typeof define&&define.amd?define(r):"object"==typeof exports?module.exports=r():r()(e.lunr)}(this,function(){return function(e){if(void 0===e)throw new Error("Lunr is not present. Please include / require Lunr before this script.");if(void 0===e.stemmerSupport)throw new Error("Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.");var r,y,s;e.fr=function(){this.pipeline.reset(),this.pipeline.add(e.fr.trimmer,e.fr.stopWordFilter,e.fr.stemmer),this.searchPipeline&&(this.searchPipeline.reset(),this.searchPipeline.add(e.fr.stemmer))},e.fr.wordCharacters="A-Za-zªºÀ-ÖØ-öø-ʸˠ-ˤᴀ-ᴥᴬ-ᵜᵢ-ᵥᵫ-ᵷᵹ-ᶾḀ-ỿⁱⁿₐ-ₜKÅℲⅎⅠ-ↈⱠ-ⱿꜢ-ꞇꞋ-ꞭꞰ-ꞷꟷ-ꟿꬰ-ꭚꭜ-ꭤff-stA-Za-z",e.fr.trimmer=e.trimmerSupport.generateTrimmer(e.fr.wordCharacters),e.Pipeline.registerFunction(e.fr.trimmer,"trimmer-fr"),e.fr.stemmer=(r=e.stemmerSupport.Among,y=e.stemmerSupport.SnowballProgram,s=new function(){var s,i,t,n=[new r("col",-1,-1),new r("par",-1,-1),new r("tap",-1,-1)],u=[new r("",-1,4),new r("I",0,1),new r("U",0,2),new r("Y",0,3)],o=[new r("iqU",-1,3),new r("abl",-1,3),new r("Ièr",-1,4),new r("ièr",-1,4),new r("eus",-1,2),new r("iv",-1,1)],c=[new r("ic",-1,2),new r("abil",-1,1),new r("iv",-1,3)],a=[new r("iqUe",-1,1),new r("atrice",-1,2),new r("ance",-1,1),new r("ence",-1,5),new r("logie",-1,3),new r("able",-1,1),new r("isme",-1,1),new r("euse",-1,11),new r("iste",-1,1),new r("ive",-1,8),new r("if",-1,8),new r("usion",-1,4),new r("ation",-1,2),new r("ution",-1,4),new r("ateur",-1,2),new r("iqUes",-1,1),new r("atrices",-1,2),new r("ances",-1,1),new r("ences",-1,5),new r("logies",-1,3),new r("ables",-1,1),new r("ismes",-1,1),new r("euses",-1,11),new r("istes",-1,1),new r("ives",-1,8),new r("ifs",-1,8),new r("usions",-1,4),new r("ations",-1,2),new r("utions",-1,4),new r("ateurs",-1,2),new r("ments",-1,15),new r("ements",30,6),new r("issements",31,12),new r("ités",-1,7),new r("ment",-1,15),new r("ement",34,6),new r("issement",35,12),new r("amment",34,13),new r("emment",34,14),new r("aux",-1,10),new r("eaux",39,9),new r("eux",-1,1),new r("ité",-1,7)],l=[new r("ira",-1,1),new r("ie",-1,1),new r("isse",-1,1),new r("issante",-1,1),new r("i",-1,1),new r("irai",4,1),new r("ir",-1,1),new r("iras",-1,1),new r("ies",-1,1),new r("îmes",-1,1),new r("isses",-1,1),new r("issantes",-1,1),new r("îtes",-1,1),new r("is",-1,1),new r("irais",13,1),new r("issais",13,1),new r("irions",-1,1),new r("issions",-1,1),new r("irons",-1,1),new r("issons",-1,1),new r("issants",-1,1),new r("it",-1,1),new r("irait",21,1),new r("issait",21,1),new r("issant",-1,1),new r("iraIent",-1,1),new r("issaIent",-1,1),new r("irent",-1,1),new r("issent",-1,1),new r("iront",-1,1),new r("ît",-1,1),new r("iriez",-1,1),new r("issiez",-1,1),new r("irez",-1,1),new r("issez",-1,1)],w=[new r("a",-1,3),new r("era",0,2),new r("asse",-1,3),new r("ante",-1,3),new r("ée",-1,2),new r("ai",-1,3),new r("erai",5,2),new r("er",-1,2),new r("as",-1,3),new r("eras",8,2),new r("âmes",-1,3),new r("asses",-1,3),new r("antes",-1,3),new r("âtes",-1,3),new r("ées",-1,2),new r("ais",-1,3),new r("erais",15,2),new r("ions",-1,1),new r("erions",17,2),new r("assions",17,3),new r("erons",-1,2),new r("ants",-1,3),new r("és",-1,2),new r("ait",-1,3),new r("erait",23,2),new r("ant",-1,3),new r("aIent",-1,3),new r("eraIent",26,2),new r("èrent",-1,2),new r("assent",-1,3),new r("eront",-1,2),new r("ât",-1,3),new r("ez",-1,2),new r("iez",32,2),new r("eriez",33,2),new r("assiez",33,3),new r("erez",32,2),new r("é",-1,2)],f=[new r("e",-1,3),new r("Ière",0,2),new r("ière",0,2),new r("ion",-1,1),new r("Ier",-1,2),new r("ier",-1,2),new r("ë",-1,4)],m=[new r("ell",-1,-1),new r("eill",-1,-1),new r("enn",-1,-1),new r("onn",-1,-1),new r("ett",-1,-1)],_=[17,65,16,1,0,0,0,0,0,0,0,0,0,0,0,128,130,103,8,5],b=[1,65,20,0,0,0,0,0,0,0,0,0,0,0,0,0,128],d=new y;function k(e,r,s){return!(!d.eq_s(1,e)||(d.ket=d.cursor,!d.in_grouping(_,97,251)))&&(d.slice_from(r),d.cursor=s,!0)}function p(e,r,s){return!!d.eq_s(1,e)&&(d.ket=d.cursor,d.slice_from(r),d.cursor=s,!0)}function g(){for(;!d.in_grouping(_,97,251);){if(d.cursor>=d.limit)return!0;d.cursor++}for(;!d.out_grouping(_,97,251);){if(d.cursor>=d.limit)return!0;d.cursor++}return!1}function q(){return t<=d.cursor}function v(){return i<=d.cursor}function h(){return s<=d.cursor}function z(){if(!function(){var e,r;if(d.ket=d.cursor,e=d.find_among_b(a,43)){switch(d.bra=d.cursor,e){case 1:if(!h())return!1;d.slice_del();break;case 2:if(!h())return!1;d.slice_del(),d.ket=d.cursor,d.eq_s_b(2,"ic")&&(d.bra=d.cursor,h()?d.slice_del():d.slice_from("iqU"));break;case 3:if(!h())return!1;d.slice_from("log");break;case 4:if(!h())return!1;d.slice_from("u");break;case 5:if(!h())return!1;d.slice_from("ent");break;case 6:if(!q())return!1;if(d.slice_del(),d.ket=d.cursor,e=d.find_among_b(o,6))switch(d.bra=d.cursor,e){case 1:h()&&(d.slice_del(),d.ket=d.cursor,d.eq_s_b(2,"at")&&(d.bra=d.cursor,h()&&d.slice_del()));break;case 2:h()?d.slice_del():v()&&d.slice_from("eux");break;case 3:h()&&d.slice_del();break;case 4:q()&&d.slice_from("i")}break;case 7:if(!h())return!1;if(d.slice_del(),d.ket=d.cursor,e=d.find_among_b(c,3))switch(d.bra=d.cursor,e){case 1:h()?d.slice_del():d.slice_from("abl");break;case 2:h()?d.slice_del():d.slice_from("iqU");break;case 3:h()&&d.slice_del()}break;case 8:if(!h())return!1;if(d.slice_del(),d.ket=d.cursor,d.eq_s_b(2,"at")&&(d.bra=d.cursor,h()&&(d.slice_del(),d.ket=d.cursor,d.eq_s_b(2,"ic")))){d.bra=d.cursor,h()?d.slice_del():d.slice_from("iqU");break}break;case 9:d.slice_from("eau");break;case 10:if(!v())return!1;d.slice_from("al");break;case 11:if(h())d.slice_del();else{if(!v())return!1;d.slice_from("eux")}break;case 12:if(!v()||!d.out_grouping_b(_,97,251))return!1;d.slice_del();break;case 13:return q()&&d.slice_from("ant"),!1;case 14:return q()&&d.slice_from("ent"),!1;case 15:return r=d.limit-d.cursor,d.in_grouping_b(_,97,251)&&q()&&(d.cursor=d.limit-r,d.slice_del()),!1}return!0}return!1}()&&(d.cursor=d.limit,!function(){var e,r;if(d.cursor=t){if(s=d.limit_backward,d.limit_backward=t,d.ket=d.cursor,e=d.find_among_b(f,7))switch(d.bra=d.cursor,e){case 1:if(h()){if(i=d.limit-d.cursor,!d.eq_s_b(1,"s")&&(d.cursor=d.limit-i,!d.eq_s_b(1,"t")))break;d.slice_del()}break;case 2:d.slice_from("i");break;case 3:d.slice_del();break;case 4:d.eq_s_b(2,"gu")&&d.slice_del()}d.limit_backward=s}}();d.cursor=d.limit,d.ket=d.cursor,d.eq_s_b(1,"Y")?(d.bra=d.cursor,d.slice_from("i")):(d.cursor=d.limit,d.eq_s_b(1,"ç")&&(d.bra=d.cursor,d.slice_from("c")))}this.setCurrent=function(e){d.setCurrent(e)},this.getCurrent=function(){return d.getCurrent()},this.stem=function(){var e,r=d.cursor;return function(){for(var e,r;;){if(e=d.cursor,d.in_grouping(_,97,251)){if(d.bra=d.cursor,r=d.cursor,k("u","U",e))continue;if(d.cursor=r,k("i","I",e))continue;if(d.cursor=r,p("y","Y",e))continue}if(d.cursor=e,!k("y","Y",d.bra=e)){if(d.cursor=e,d.eq_s(1,"q")&&(d.bra=d.cursor,p("u","U",e)))continue;if((d.cursor=e)>=d.limit)return;d.cursor++}}}(),d.cursor=r,function(){var e=d.cursor;if(t=d.limit,s=i=t,d.in_grouping(_,97,251)&&d.in_grouping(_,97,251)&&d.cursor=d.limit){d.cursor=t;break}d.cursor++}while(!d.in_grouping(_,97,251))}t=d.cursor,d.cursor=e,g()||(i=d.cursor,g()||(s=d.cursor))}(),d.limit_backward=r,d.cursor=d.limit,z(),d.cursor=d.limit,e=d.limit-d.cursor,d.find_among_b(m,5)&&(d.cursor=d.limit-e,d.ket=d.cursor,d.cursor>d.limit_backward&&(d.cursor--,d.bra=d.cursor,d.slice_del())),d.cursor=d.limit,function(){for(var e,r=1;d.out_grouping_b(_,97,251);)r--;if(r<=0){if(d.ket=d.cursor,e=d.limit-d.cursor,!d.eq_s_b(1,"é")&&(d.cursor=d.limit-e,!d.eq_s_b(1,"è")))return;d.bra=d.cursor,d.slice_from("e")}}(),d.cursor=d.limit_backward,function(){for(var e,r;r=d.cursor,d.bra=r,e=d.find_among(u,4);)switch(d.ket=d.cursor,e){case 1:d.slice_from("i");break;case 2:d.slice_from("u");break;case 3:d.slice_from("y");break;case 4:if(d.cursor>=d.limit)return;d.cursor++}}(),!0}},function(e){return"function"==typeof e.update?e.update(function(e){return s.setCurrent(e),s.stem(),s.getCurrent()}):(s.setCurrent(e),s.stem(),s.getCurrent())}),e.Pipeline.registerFunction(e.fr.stemmer,"stemmer-fr"),e.fr.stopWordFilter=e.generateStopWordFilter("ai aie aient aies ait as au aura aurai auraient aurais aurait auras aurez auriez aurions aurons auront aux avaient avais avait avec avez aviez avions avons ayant ayez ayons c ce ceci celà ces cet cette d dans de des du elle en es est et eu eue eues eurent eus eusse eussent eusses eussiez eussions eut eux eûmes eût eûtes furent fus fusse fussent fusses fussiez fussions fut fûmes fût fûtes ici il ils j je l la le les leur leurs lui m ma mais me mes moi mon même n ne nos notre nous on ont ou par pas pour qu que quel quelle quelles quels qui s sa sans se sera serai seraient serais serait seras serez seriez serions serons seront ses soi soient sois soit sommes son sont soyez soyons suis sur t ta te tes toi ton tu un une vos votre vous y à étaient étais était étant étiez étions été étée étées étés êtes".split(" ")),e.Pipeline.registerFunction(e.fr.stopWordFilter,"stopWordFilter-fr")}}); -------------------------------------------------------------------------------- /SecurityPaper-themes/assets/javascripts/lunr/lunr.hu.js: -------------------------------------------------------------------------------- 1 | !function(e,n){"function"==typeof define&&define.amd?define(n):"object"==typeof exports?module.exports=n():n()(e.lunr)}(this,function(){return function(e){if(void 0===e)throw new Error("Lunr is not present. Please include / require Lunr before this script.");if(void 0===e.stemmerSupport)throw new Error("Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.");var p,_,n;e.hu=function(){this.pipeline.reset(),this.pipeline.add(e.hu.trimmer,e.hu.stopWordFilter,e.hu.stemmer),this.searchPipeline&&(this.searchPipeline.reset(),this.searchPipeline.add(e.hu.stemmer))},e.hu.wordCharacters="A-Za-zªºÀ-ÖØ-öø-ʸˠ-ˤᴀ-ᴥᴬ-ᵜᵢ-ᵥᵫ-ᵷᵹ-ᶾḀ-ỿⁱⁿₐ-ₜKÅℲⅎⅠ-ↈⱠ-ⱿꜢ-ꞇꞋ-ꞭꞰ-ꞷꟷ-ꟿꬰ-ꭚꭜ-ꭤff-stA-Za-z",e.hu.trimmer=e.trimmerSupport.generateTrimmer(e.hu.wordCharacters),e.Pipeline.registerFunction(e.hu.trimmer,"trimmer-hu"),e.hu.stemmer=(p=e.stemmerSupport.Among,_=e.stemmerSupport.SnowballProgram,n=new function(){var r,i=[new p("cs",-1,-1),new p("dzs",-1,-1),new p("gy",-1,-1),new p("ly",-1,-1),new p("ny",-1,-1),new p("sz",-1,-1),new p("ty",-1,-1),new p("zs",-1,-1)],n=[new p("á",-1,1),new p("é",-1,2)],a=[new p("bb",-1,-1),new p("cc",-1,-1),new p("dd",-1,-1),new p("ff",-1,-1),new p("gg",-1,-1),new p("jj",-1,-1),new p("kk",-1,-1),new p("ll",-1,-1),new p("mm",-1,-1),new p("nn",-1,-1),new p("pp",-1,-1),new p("rr",-1,-1),new p("ccs",-1,-1),new p("ss",-1,-1),new p("zzs",-1,-1),new p("tt",-1,-1),new p("vv",-1,-1),new p("ggy",-1,-1),new p("lly",-1,-1),new p("nny",-1,-1),new p("tty",-1,-1),new p("ssz",-1,-1),new p("zz",-1,-1)],t=[new p("al",-1,1),new p("el",-1,2)],e=[new p("ba",-1,-1),new p("ra",-1,-1),new p("be",-1,-1),new p("re",-1,-1),new p("ig",-1,-1),new p("nak",-1,-1),new p("nek",-1,-1),new p("val",-1,-1),new p("vel",-1,-1),new p("ul",-1,-1),new p("nál",-1,-1),new p("nél",-1,-1),new p("ból",-1,-1),new p("ról",-1,-1),new p("tól",-1,-1),new p("bõl",-1,-1),new p("rõl",-1,-1),new p("tõl",-1,-1),new p("ül",-1,-1),new p("n",-1,-1),new p("an",19,-1),new p("ban",20,-1),new p("en",19,-1),new p("ben",22,-1),new p("képpen",22,-1),new p("on",19,-1),new p("ön",19,-1),new p("képp",-1,-1),new p("kor",-1,-1),new p("t",-1,-1),new p("at",29,-1),new p("et",29,-1),new p("ként",29,-1),new p("anként",32,-1),new p("enként",32,-1),new p("onként",32,-1),new p("ot",29,-1),new p("ért",29,-1),new p("öt",29,-1),new p("hez",-1,-1),new p("hoz",-1,-1),new p("höz",-1,-1),new p("vá",-1,-1),new p("vé",-1,-1)],s=[new p("án",-1,2),new p("én",-1,1),new p("ánként",-1,3)],c=[new p("stul",-1,2),new p("astul",0,1),new p("ástul",0,3),new p("stül",-1,2),new p("estül",3,1),new p("éstül",3,4)],w=[new p("á",-1,1),new p("é",-1,2)],o=[new p("k",-1,7),new p("ak",0,4),new p("ek",0,6),new p("ok",0,5),new p("ák",0,1),new p("ék",0,2),new p("ök",0,3)],l=[new p("éi",-1,7),new p("áéi",0,6),new p("ééi",0,5),new p("é",-1,9),new p("ké",3,4),new p("aké",4,1),new p("eké",4,1),new p("oké",4,1),new p("áké",4,3),new p("éké",4,2),new p("öké",4,1),new p("éé",3,8)],u=[new p("a",-1,18),new p("ja",0,17),new p("d",-1,16),new p("ad",2,13),new p("ed",2,13),new p("od",2,13),new p("ád",2,14),new p("éd",2,15),new p("öd",2,13),new p("e",-1,18),new p("je",9,17),new p("nk",-1,4),new p("unk",11,1),new p("ánk",11,2),new p("énk",11,3),new p("ünk",11,1),new p("uk",-1,8),new p("juk",16,7),new p("ájuk",17,5),new p("ük",-1,8),new p("jük",19,7),new p("éjük",20,6),new p("m",-1,12),new p("am",22,9),new p("em",22,9),new p("om",22,9),new p("ám",22,10),new p("ém",22,11),new p("o",-1,18),new p("á",-1,19),new p("é",-1,20)],m=[new p("id",-1,10),new p("aid",0,9),new p("jaid",1,6),new p("eid",0,9),new p("jeid",3,6),new p("áid",0,7),new p("éid",0,8),new p("i",-1,15),new p("ai",7,14),new p("jai",8,11),new p("ei",7,14),new p("jei",10,11),new p("ái",7,12),new p("éi",7,13),new p("itek",-1,24),new p("eitek",14,21),new p("jeitek",15,20),new p("éitek",14,23),new p("ik",-1,29),new p("aik",18,26),new p("jaik",19,25),new p("eik",18,26),new p("jeik",21,25),new p("áik",18,27),new p("éik",18,28),new p("ink",-1,20),new p("aink",25,17),new p("jaink",26,16),new p("eink",25,17),new p("jeink",28,16),new p("áink",25,18),new p("éink",25,19),new p("aitok",-1,21),new p("jaitok",32,20),new p("áitok",-1,22),new p("im",-1,5),new p("aim",35,4),new p("jaim",36,1),new p("eim",35,4),new p("jeim",38,1),new p("áim",35,2),new p("éim",35,3)],k=[17,65,16,0,0,0,0,0,0,0,0,0,0,0,0,0,1,17,52,14],f=new _;function b(){return r<=f.cursor}function d(){var e=f.limit-f.cursor;return!!f.find_among_b(a,23)&&(f.cursor=f.limit-e,!0)}function g(){if(f.cursor>f.limit_backward){f.cursor--,f.ket=f.cursor;var e=f.cursor-1;f.limit_backward<=e&&e<=f.limit&&(f.cursor=e,f.bra=e,f.slice_del())}}function h(){f.ket=f.cursor,f.find_among_b(e,44)&&(f.bra=f.cursor,b()&&(f.slice_del(),function(){var e;if(f.ket=f.cursor,(e=f.find_among_b(n,2))&&(f.bra=f.cursor,b()))switch(e){case 1:f.slice_from("a");break;case 2:f.slice_from("e")}}()))}this.setCurrent=function(e){f.setCurrent(e)},this.getCurrent=function(){return f.getCurrent()},this.stem=function(){var e=f.cursor;return function(){var e,n=f.cursor;if(r=f.limit,f.in_grouping(k,97,252))for(;;){if(e=f.cursor,f.out_grouping(k,97,252))return f.cursor=e,f.find_among(i,8)||(f.cursor=e)=f.limit)return r=e;f.cursor++}if(f.cursor=n,f.out_grouping(k,97,252)){for(;!f.in_grouping(k,97,252);){if(f.cursor>=f.limit)return;f.cursor++}r=f.cursor}}(),f.limit_backward=e,f.cursor=f.limit,function(){var e;if(f.ket=f.cursor,(e=f.find_among_b(t,2))&&(f.bra=f.cursor,b())){if((1==e||2==e)&&!d())return;f.slice_del(),g()}}(),f.cursor=f.limit,h(),f.cursor=f.limit,function(){var e;if(f.ket=f.cursor,(e=f.find_among_b(s,3))&&(f.bra=f.cursor,b()))switch(e){case 1:f.slice_from("e");break;case 2:case 3:f.slice_from("a")}}(),f.cursor=f.limit,function(){var e;if(f.ket=f.cursor,(e=f.find_among_b(c,6))&&(f.bra=f.cursor,b()))switch(e){case 1:case 2:f.slice_del();break;case 3:f.slice_from("a");break;case 4:f.slice_from("e")}}(),f.cursor=f.limit,function(){var e;if(f.ket=f.cursor,(e=f.find_among_b(w,2))&&(f.bra=f.cursor,b())){if((1==e||2==e)&&!d())return;f.slice_del(),g()}}(),f.cursor=f.limit,function(){var e;if(f.ket=f.cursor,(e=f.find_among_b(l,12))&&(f.bra=f.cursor,b()))switch(e){case 1:case 4:case 7:case 9:f.slice_del();break;case 2:case 5:case 8:f.slice_from("e");break;case 3:case 6:f.slice_from("a")}}(),f.cursor=f.limit,function(){var e;if(f.ket=f.cursor,(e=f.find_among_b(u,31))&&(f.bra=f.cursor,b()))switch(e){case 1:case 4:case 7:case 8:case 9:case 12:case 13:case 16:case 17:case 18:f.slice_del();break;case 2:case 5:case 10:case 14:case 19:f.slice_from("a");break;case 3:case 6:case 11:case 15:case 20:f.slice_from("e")}}(),f.cursor=f.limit,function(){var e;if(f.ket=f.cursor,(e=f.find_among_b(m,42))&&(f.bra=f.cursor,b()))switch(e){case 1:case 4:case 5:case 6:case 9:case 10:case 11:case 14:case 15:case 16:case 17:case 20:case 21:case 24:case 25:case 26:case 29:f.slice_del();break;case 2:case 7:case 12:case 18:case 22:case 27:f.slice_from("a");break;case 3:case 8:case 13:case 19:case 23:case 28:f.slice_from("e")}}(),f.cursor=f.limit,function(){var e;if(f.ket=f.cursor,(e=f.find_among_b(o,7))&&(f.bra=f.cursor,b()))switch(e){case 1:f.slice_from("a");break;case 2:f.slice_from("e");break;case 3:case 4:case 5:case 6:case 7:f.slice_del()}}(),!0}},function(e){return"function"==typeof e.update?e.update(function(e){return n.setCurrent(e),n.stem(),n.getCurrent()}):(n.setCurrent(e),n.stem(),n.getCurrent())}),e.Pipeline.registerFunction(e.hu.stemmer,"stemmer-hu"),e.hu.stopWordFilter=e.generateStopWordFilter("a abban ahhoz ahogy ahol aki akik akkor alatt amely amelyek amelyekben amelyeket amelyet amelynek ami amikor amit amolyan amíg annak arra arról az azok azon azonban azt aztán azután azzal azért be belül benne bár cikk cikkek cikkeket csak de e ebben eddig egy egyes egyetlen egyik egyre egyéb egész ehhez ekkor el ellen elsõ elég elõ elõször elõtt emilyen ennek erre ez ezek ezen ezt ezzel ezért fel felé hanem hiszen hogy hogyan igen ill ill. illetve ilyen ilyenkor ismét ison itt jobban jó jól kell kellett keressünk keresztül ki kívül között közül legalább legyen lehet lehetett lenne lenni lesz lett maga magát majd majd meg mellett mely melyek mert mi mikor milyen minden mindenki mindent mindig mint mintha mit mivel miért most már más másik még míg nagy nagyobb nagyon ne nekem neki nem nincs néha néhány nélkül olyan ott pedig persze rá s saját sem semmi sok sokat sokkal szemben szerint szinte számára talán tehát teljes tovább továbbá több ugyanis utolsó után utána vagy vagyis vagyok valaki valami valamint való van vannak vele vissza viszont volna volt voltak voltam voltunk által általában át én éppen és így õ õk õket össze úgy új újabb újra".split(" ")),e.Pipeline.registerFunction(e.hu.stopWordFilter,"stopWordFilter-hu")}}); -------------------------------------------------------------------------------- /SecurityPaper-themes/assets/javascripts/lunr/lunr.jp.js: -------------------------------------------------------------------------------- 1 | !function(e,r){"function"==typeof define&&define.amd?define(r):"object"==typeof exports?module.exports=r():r()(e.lunr)}(this,function(){return function(n){if(void 0===n)throw new Error("Lunr is not present. Please include / require Lunr before this script.");if(void 0===n.stemmerSupport)throw new Error("Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.");var i="2"==n.version[0];n.jp=function(){this.pipeline.reset(),this.pipeline.add(n.jp.stopWordFilter,n.jp.stemmer),i?this.tokenizer=n.jp.tokenizer:(n.tokenizer&&(n.tokenizer=n.jp.tokenizer),this.tokenizerFn&&(this.tokenizerFn=n.jp.tokenizer))};var o=new n.TinySegmenter;n.jp.tokenizer=function(e){if(!arguments.length||null==e||null==e)return[];if(Array.isArray(e))return e.map(function(e){return i?new n.Token(e.toLowerCase()):e.toLowerCase()});for(var r=e.toString().toLowerCase().replace(/^\s+/,""),t=r.length-1;0<=t;t--)if(/\S/.test(r.charAt(t))){r=r.substring(0,t+1);break}return o.segment(r).filter(function(e){return!!e}).map(function(e){return i?new n.Token(e):e})},n.jp.stemmer=function(e){return e},n.Pipeline.registerFunction(n.jp.stemmer,"stemmer-jp"),n.jp.wordCharacters="一二三四五六七八九十百千万億兆一-龠々〆ヵヶぁ-んァ-ヴーア-ン゙a-zA-Za-zA-Z0-90-9",n.jp.stopWordFilter=function(e){if(-1===n.jp.stopWordFilter.stopWords.indexOf(i?e.toString():e))return e},n.jp.stopWordFilter=n.generateStopWordFilter("これ それ あれ この その あの ここ そこ あそこ こちら どこ だれ なに なん 何 私 貴方 貴方方 我々 私達 あの人 あのかた 彼女 彼 です あります おります います は が の に を で え から まで より も どの と し それで しかし".split(" ")),n.Pipeline.registerFunction(n.jp.stopWordFilter,"stopWordFilter-jp")}}); -------------------------------------------------------------------------------- /SecurityPaper-themes/assets/javascripts/lunr/lunr.multi.js: -------------------------------------------------------------------------------- 1 | !function(e,i){"function"==typeof define&&define.amd?define(i):"object"==typeof exports?module.exports=i():i()(e.lunr)}(this,function(){return function(o){o.multiLanguage=function(){for(var e=Array.prototype.slice.call(arguments),i=e.join("-"),t="",r=[],n=[],s=0;s=c.limit)return;c.cursor=e+1}for(;!c.out_grouping(u,97,248);){if(c.cursor>=c.limit)return;c.cursor++}(s=c.cursor)=s&&(r=c.limit_backward,c.limit_backward=s,c.ket=c.cursor,e=c.find_among_b(a,29),c.limit_backward=r,e))switch(c.bra=c.cursor,e){case 1:c.slice_del();break;case 2:n=c.limit-c.cursor,c.in_grouping_b(d,98,122)?c.slice_del():(c.cursor=c.limit-n,c.eq_s_b(1,"k")&&c.out_grouping_b(u,97,248)&&c.slice_del());break;case 3:c.slice_from("er")}}(),c.cursor=c.limit,r=c.limit-c.cursor,c.cursor>=s&&(e=c.limit_backward,c.limit_backward=s,c.ket=c.cursor,c.find_among_b(m,2)?(c.bra=c.cursor,c.limit_backward=e,c.cursor=c.limit-r,c.cursor>c.limit_backward&&(c.cursor--,c.bra=c.cursor,c.slice_del())):c.limit_backward=e),c.cursor=c.limit,c.cursor>=s&&(i=c.limit_backward,c.limit_backward=s,c.ket=c.cursor,(n=c.find_among_b(l,11))?(c.bra=c.cursor,c.limit_backward=i,1==n&&c.slice_del()):c.limit_backward=i),!0}},function(e){return"function"==typeof e.update?e.update(function(e){return i.setCurrent(e),i.stem(),i.getCurrent()}):(i.setCurrent(e),i.stem(),i.getCurrent())}),e.Pipeline.registerFunction(e.no.stemmer,"stemmer-no"),e.no.stopWordFilter=e.generateStopWordFilter("alle at av bare begge ble blei bli blir blitt både båe da de deg dei deim deira deires dem den denne der dere deres det dette di din disse ditt du dykk dykkar då eg ein eit eitt eller elles en enn er et ett etter for fordi fra før ha hadde han hans har hennar henne hennes her hjå ho hoe honom hoss hossen hun hva hvem hver hvilke hvilken hvis hvor hvordan hvorfor i ikke ikkje ikkje ingen ingi inkje inn inni ja jeg kan kom korleis korso kun kunne kva kvar kvarhelst kven kvi kvifor man mange me med medan meg meget mellom men mi min mine mitt mot mykje ned no noe noen noka noko nokon nokor nokre nå når og også om opp oss over på samme seg selv si si sia sidan siden sin sine sitt sjøl skal skulle slik so som som somme somt så sånn til um upp ut uten var vart varte ved vere verte vi vil ville vore vors vort vår være være vært å".split(" ")),e.Pipeline.registerFunction(e.no.stopWordFilter,"stopWordFilter-no")}}); -------------------------------------------------------------------------------- /SecurityPaper-themes/assets/javascripts/lunr/lunr.pt.js: -------------------------------------------------------------------------------- 1 | !function(e,r){"function"==typeof define&&define.amd?define(r):"object"==typeof exports?module.exports=r():r()(e.lunr)}(this,function(){return function(e){if(void 0===e)throw new Error("Lunr is not present. Please include / require Lunr before this script.");if(void 0===e.stemmerSupport)throw new Error("Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.");var j,C,r;e.pt=function(){this.pipeline.reset(),this.pipeline.add(e.pt.trimmer,e.pt.stopWordFilter,e.pt.stemmer),this.searchPipeline&&(this.searchPipeline.reset(),this.searchPipeline.add(e.pt.stemmer))},e.pt.wordCharacters="A-Za-zªºÀ-ÖØ-öø-ʸˠ-ˤᴀ-ᴥᴬ-ᵜᵢ-ᵥᵫ-ᵷᵹ-ᶾḀ-ỿⁱⁿₐ-ₜKÅℲⅎⅠ-ↈⱠ-ⱿꜢ-ꞇꞋ-ꞭꞰ-ꞷꟷ-ꟿꬰ-ꭚꭜ-ꭤff-stA-Za-z",e.pt.trimmer=e.trimmerSupport.generateTrimmer(e.pt.wordCharacters),e.Pipeline.registerFunction(e.pt.trimmer,"trimmer-pt"),e.pt.stemmer=(j=e.stemmerSupport.Among,C=e.stemmerSupport.SnowballProgram,r=new function(){var s,n,i,o=[new j("",-1,3),new j("ã",0,1),new j("õ",0,2)],a=[new j("",-1,3),new j("a~",0,1),new j("o~",0,2)],r=[new j("ic",-1,-1),new j("ad",-1,-1),new j("os",-1,-1),new j("iv",-1,1)],t=[new j("ante",-1,1),new j("avel",-1,1),new j("ível",-1,1)],u=[new j("ic",-1,1),new j("abil",-1,1),new j("iv",-1,1)],w=[new j("ica",-1,1),new j("ância",-1,1),new j("ência",-1,4),new j("ira",-1,9),new j("adora",-1,1),new j("osa",-1,1),new j("ista",-1,1),new j("iva",-1,8),new j("eza",-1,1),new j("logía",-1,2),new j("idade",-1,7),new j("ante",-1,1),new j("mente",-1,6),new j("amente",12,5),new j("ável",-1,1),new j("ível",-1,1),new j("ución",-1,3),new j("ico",-1,1),new j("ismo",-1,1),new j("oso",-1,1),new j("amento",-1,1),new j("imento",-1,1),new j("ivo",-1,8),new j("aça~o",-1,1),new j("ador",-1,1),new j("icas",-1,1),new j("ências",-1,4),new j("iras",-1,9),new j("adoras",-1,1),new j("osas",-1,1),new j("istas",-1,1),new j("ivas",-1,8),new j("ezas",-1,1),new j("logías",-1,2),new j("idades",-1,7),new j("uciones",-1,3),new j("adores",-1,1),new j("antes",-1,1),new j("aço~es",-1,1),new j("icos",-1,1),new j("ismos",-1,1),new j("osos",-1,1),new j("amentos",-1,1),new j("imentos",-1,1),new j("ivos",-1,8)],m=[new j("ada",-1,1),new j("ida",-1,1),new j("ia",-1,1),new j("aria",2,1),new j("eria",2,1),new j("iria",2,1),new j("ara",-1,1),new j("era",-1,1),new j("ira",-1,1),new j("ava",-1,1),new j("asse",-1,1),new j("esse",-1,1),new j("isse",-1,1),new j("aste",-1,1),new j("este",-1,1),new j("iste",-1,1),new j("ei",-1,1),new j("arei",16,1),new j("erei",16,1),new j("irei",16,1),new j("am",-1,1),new j("iam",20,1),new j("ariam",21,1),new j("eriam",21,1),new j("iriam",21,1),new j("aram",20,1),new j("eram",20,1),new j("iram",20,1),new j("avam",20,1),new j("em",-1,1),new j("arem",29,1),new j("erem",29,1),new j("irem",29,1),new j("assem",29,1),new j("essem",29,1),new j("issem",29,1),new j("ado",-1,1),new j("ido",-1,1),new j("ando",-1,1),new j("endo",-1,1),new j("indo",-1,1),new j("ara~o",-1,1),new j("era~o",-1,1),new j("ira~o",-1,1),new j("ar",-1,1),new j("er",-1,1),new j("ir",-1,1),new j("as",-1,1),new j("adas",47,1),new j("idas",47,1),new j("ias",47,1),new j("arias",50,1),new j("erias",50,1),new j("irias",50,1),new j("aras",47,1),new j("eras",47,1),new j("iras",47,1),new j("avas",47,1),new j("es",-1,1),new j("ardes",58,1),new j("erdes",58,1),new j("irdes",58,1),new j("ares",58,1),new j("eres",58,1),new j("ires",58,1),new j("asses",58,1),new j("esses",58,1),new j("isses",58,1),new j("astes",58,1),new j("estes",58,1),new j("istes",58,1),new j("is",-1,1),new j("ais",71,1),new j("eis",71,1),new j("areis",73,1),new j("ereis",73,1),new j("ireis",73,1),new j("áreis",73,1),new j("éreis",73,1),new j("íreis",73,1),new j("ásseis",73,1),new j("ésseis",73,1),new j("ísseis",73,1),new j("áveis",73,1),new j("íeis",73,1),new j("aríeis",84,1),new j("eríeis",84,1),new j("iríeis",84,1),new j("ados",-1,1),new j("idos",-1,1),new j("amos",-1,1),new j("áramos",90,1),new j("éramos",90,1),new j("íramos",90,1),new j("ávamos",90,1),new j("íamos",90,1),new j("aríamos",95,1),new j("eríamos",95,1),new j("iríamos",95,1),new j("emos",-1,1),new j("aremos",99,1),new j("eremos",99,1),new j("iremos",99,1),new j("ássemos",99,1),new j("êssemos",99,1),new j("íssemos",99,1),new j("imos",-1,1),new j("armos",-1,1),new j("ermos",-1,1),new j("irmos",-1,1),new j("ámos",-1,1),new j("arás",-1,1),new j("erás",-1,1),new j("irás",-1,1),new j("eu",-1,1),new j("iu",-1,1),new j("ou",-1,1),new j("ará",-1,1),new j("erá",-1,1),new j("irá",-1,1)],c=[new j("a",-1,1),new j("i",-1,1),new j("o",-1,1),new j("os",-1,1),new j("á",-1,1),new j("í",-1,1),new j("ó",-1,1)],l=[new j("e",-1,1),new j("ç",-1,2),new j("é",-1,1),new j("ê",-1,1)],f=[17,65,16,0,0,0,0,0,0,0,0,0,0,0,0,0,3,19,12,2],d=new C;function v(){if(d.out_grouping(f,97,250)){for(;!d.in_grouping(f,97,250);){if(d.cursor>=d.limit)return!0;d.cursor++}return!1}return!0}function p(){var e,r,s=d.cursor;if(d.in_grouping(f,97,250))if(e=d.cursor,v()){if(d.cursor=e,function(){if(d.in_grouping(f,97,250))for(;!d.out_grouping(f,97,250);){if(d.cursor>=d.limit)return!1;d.cursor++}return i=d.cursor,!0}())return}else i=d.cursor;if(d.cursor=s,d.out_grouping(f,97,250)){if(r=d.cursor,v()){if(d.cursor=r,!d.in_grouping(f,97,250)||d.cursor>=d.limit)return;d.cursor++}i=d.cursor}}function _(){for(;!d.in_grouping(f,97,250);){if(d.cursor>=d.limit)return!1;d.cursor++}for(;!d.out_grouping(f,97,250);){if(d.cursor>=d.limit)return!1;d.cursor++}return!0}function h(){return i<=d.cursor}function b(){return s<=d.cursor}function g(){var e;if(d.ket=d.cursor,!(e=d.find_among_b(w,45)))return!1;switch(d.bra=d.cursor,e){case 1:if(!b())return!1;d.slice_del();break;case 2:if(!b())return!1;d.slice_from("log");break;case 3:if(!b())return!1;d.slice_from("u");break;case 4:if(!b())return!1;d.slice_from("ente");break;case 5:if(!(n<=d.cursor))return!1;d.slice_del(),d.ket=d.cursor,(e=d.find_among_b(r,4))&&(d.bra=d.cursor,b()&&(d.slice_del(),1==e&&(d.ket=d.cursor,d.eq_s_b(2,"at")&&(d.bra=d.cursor,b()&&d.slice_del()))));break;case 6:if(!b())return!1;d.slice_del(),d.ket=d.cursor,(e=d.find_among_b(t,3))&&(d.bra=d.cursor,1==e&&b()&&d.slice_del());break;case 7:if(!b())return!1;d.slice_del(),d.ket=d.cursor,(e=d.find_among_b(u,3))&&(d.bra=d.cursor,1==e&&b()&&d.slice_del());break;case 8:if(!b())return!1;d.slice_del(),d.ket=d.cursor,d.eq_s_b(2,"at")&&(d.bra=d.cursor,b()&&d.slice_del());break;case 9:if(!h()||!d.eq_s_b(1,"e"))return!1;d.slice_from("ir")}return!0}function k(e,r){if(d.eq_s_b(1,e)){d.bra=d.cursor;var s=d.limit-d.cursor;if(d.eq_s_b(1,r))return d.cursor=d.limit-s,h()&&d.slice_del(),!1}return!0}function q(){if(!g()&&(d.cursor=d.limit,!function(){var e,r;if(d.cursor>=i){if(r=d.limit_backward,d.limit_backward=i,d.ket=d.cursor,e=d.find_among_b(m,120))return d.bra=d.cursor,1==e&&d.slice_del(),d.limit_backward=r,!0;d.limit_backward=r}return!1}()))return d.cursor=d.limit,d.ket=d.cursor,void((e=d.find_among_b(c,7))&&(d.bra=d.cursor,1==e&&h()&&d.slice_del()));var e;d.cursor=d.limit,d.ket=d.cursor,d.eq_s_b(1,"i")&&(d.bra=d.cursor,d.eq_s_b(1,"c")&&(d.cursor=d.limit,h()&&d.slice_del()))}this.setCurrent=function(e){d.setCurrent(e)},this.getCurrent=function(){return d.getCurrent()},this.stem=function(){var e,r=d.cursor;return function(){for(var e;;){if(d.bra=d.cursor,e=d.find_among(o,3))switch(d.ket=d.cursor,e){case 1:d.slice_from("a~");continue;case 2:d.slice_from("o~");continue;case 3:if(d.cursor>=d.limit)break;d.cursor++;continue}break}}(),d.cursor=r,e=d.cursor,i=d.limit,s=n=i,p(),d.cursor=e,_()&&(n=d.cursor,_()&&(s=d.cursor)),d.limit_backward=r,d.cursor=d.limit,q(),d.cursor=d.limit,function(){var e;if(d.ket=d.cursor,e=d.find_among_b(l,4))switch(d.bra=d.cursor,e){case 1:h()&&(d.slice_del(),d.ket=d.cursor,d.limit,d.cursor,k("u","g")&&k("i","c"));break;case 2:d.slice_from("c")}}(),d.cursor=d.limit_backward,function(){for(var e;;){if(d.bra=d.cursor,e=d.find_among(a,3))switch(d.ket=d.cursor,e){case 1:d.slice_from("ã");continue;case 2:d.slice_from("õ");continue;case 3:if(d.cursor>=d.limit)break;d.cursor++;continue}break}}(),!0}},function(e){return"function"==typeof e.update?e.update(function(e){return r.setCurrent(e),r.stem(),r.getCurrent()}):(r.setCurrent(e),r.stem(),r.getCurrent())}),e.Pipeline.registerFunction(e.pt.stemmer,"stemmer-pt"),e.pt.stopWordFilter=e.generateStopWordFilter("a ao aos aquela aquelas aquele aqueles aquilo as até com como da das de dela delas dele deles depois do dos e ela elas ele eles em entre era eram essa essas esse esses esta estamos estas estava estavam este esteja estejam estejamos estes esteve estive estivemos estiver estivera estiveram estiverem estivermos estivesse estivessem estivéramos estivéssemos estou está estávamos estão eu foi fomos for fora foram forem formos fosse fossem fui fôramos fôssemos haja hajam hajamos havemos hei houve houvemos houver houvera houveram houverei houverem houveremos houveria houveriam houvermos houverá houverão houveríamos houvesse houvessem houvéramos houvéssemos há hão isso isto já lhe lhes mais mas me mesmo meu meus minha minhas muito na nas nem no nos nossa nossas nosso nossos num numa não nós o os ou para pela pelas pelo pelos por qual quando que quem se seja sejam sejamos sem serei seremos seria seriam será serão seríamos seu seus somos sou sua suas são só também te tem temos tenha tenham tenhamos tenho terei teremos teria teriam terá terão teríamos teu teus teve tinha tinham tive tivemos tiver tivera tiveram tiverem tivermos tivesse tivessem tivéramos tivéssemos tu tua tuas tém tínhamos um uma você vocês vos à às éramos".split(" ")),e.Pipeline.registerFunction(e.pt.stopWordFilter,"stopWordFilter-pt")}}); -------------------------------------------------------------------------------- /SecurityPaper-themes/assets/javascripts/lunr/lunr.ru.js: -------------------------------------------------------------------------------- 1 | !function(e,n){"function"==typeof define&&define.amd?define(n):"object"==typeof exports?module.exports=n():n()(e.lunr)}(this,function(){return function(e){if(void 0===e)throw new Error("Lunr is not present. Please include / require Lunr before this script.");if(void 0===e.stemmerSupport)throw new Error("Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.");var h,g,n;e.ru=function(){this.pipeline.reset(),this.pipeline.add(e.ru.trimmer,e.ru.stopWordFilter,e.ru.stemmer),this.searchPipeline&&(this.searchPipeline.reset(),this.searchPipeline.add(e.ru.stemmer))},e.ru.wordCharacters="Ѐ-҄҇-ԯᴫᵸⷠ-ⷿꙀ-ꚟ︮︯",e.ru.trimmer=e.trimmerSupport.generateTrimmer(e.ru.wordCharacters),e.Pipeline.registerFunction(e.ru.trimmer,"trimmer-ru"),e.ru.stemmer=(h=e.stemmerSupport.Among,g=e.stemmerSupport.SnowballProgram,n=new function(){var n,e,r=[new h("в",-1,1),new h("ив",0,2),new h("ыв",0,2),new h("вши",-1,1),new h("ивши",3,2),new h("ывши",3,2),new h("вшись",-1,1),new h("ившись",6,2),new h("ывшись",6,2)],t=[new h("ее",-1,1),new h("ие",-1,1),new h("ое",-1,1),new h("ые",-1,1),new h("ими",-1,1),new h("ыми",-1,1),new h("ей",-1,1),new h("ий",-1,1),new h("ой",-1,1),new h("ый",-1,1),new h("ем",-1,1),new h("им",-1,1),new h("ом",-1,1),new h("ым",-1,1),new h("его",-1,1),new h("ого",-1,1),new h("ему",-1,1),new h("ому",-1,1),new h("их",-1,1),new h("ых",-1,1),new h("ею",-1,1),new h("ою",-1,1),new h("ую",-1,1),new h("юю",-1,1),new h("ая",-1,1),new h("яя",-1,1)],w=[new h("ем",-1,1),new h("нн",-1,1),new h("вш",-1,1),new h("ивш",2,2),new h("ывш",2,2),new h("щ",-1,1),new h("ющ",5,1),new h("ующ",6,2)],i=[new h("сь",-1,1),new h("ся",-1,1)],u=[new h("ла",-1,1),new h("ила",0,2),new h("ыла",0,2),new h("на",-1,1),new h("ена",3,2),new h("ете",-1,1),new h("ите",-1,2),new h("йте",-1,1),new h("ейте",7,2),new h("уйте",7,2),new h("ли",-1,1),new h("или",10,2),new h("ыли",10,2),new h("й",-1,1),new h("ей",13,2),new h("уй",13,2),new h("л",-1,1),new h("ил",16,2),new h("ыл",16,2),new h("ем",-1,1),new h("им",-1,2),new h("ым",-1,2),new h("н",-1,1),new h("ен",22,2),new h("ло",-1,1),new h("ило",24,2),new h("ыло",24,2),new h("но",-1,1),new h("ено",27,2),new h("нно",27,1),new h("ет",-1,1),new h("ует",30,2),new h("ит",-1,2),new h("ыт",-1,2),new h("ют",-1,1),new h("уют",34,2),new h("ят",-1,2),new h("ны",-1,1),new h("ены",37,2),new h("ть",-1,1),new h("ить",39,2),new h("ыть",39,2),new h("ешь",-1,1),new h("ишь",-1,2),new h("ю",-1,2),new h("ую",44,2)],s=[new h("а",-1,1),new h("ев",-1,1),new h("ов",-1,1),new h("е",-1,1),new h("ие",3,1),new h("ье",3,1),new h("и",-1,1),new h("еи",6,1),new h("ии",6,1),new h("ами",6,1),new h("ями",6,1),new h("иями",10,1),new h("й",-1,1),new h("ей",12,1),new h("ией",13,1),new h("ий",12,1),new h("ой",12,1),new h("ам",-1,1),new h("ем",-1,1),new h("ием",18,1),new h("ом",-1,1),new h("ям",-1,1),new h("иям",21,1),new h("о",-1,1),new h("у",-1,1),new h("ах",-1,1),new h("ях",-1,1),new h("иях",26,1),new h("ы",-1,1),new h("ь",-1,1),new h("ю",-1,1),new h("ию",30,1),new h("ью",30,1),new h("я",-1,1),new h("ия",33,1),new h("ья",33,1)],o=[new h("ост",-1,1),new h("ость",-1,1)],c=[new h("ейше",-1,1),new h("н",-1,2),new h("ейш",-1,1),new h("ь",-1,3)],m=[33,65,8,232],l=new g;function f(){for(;!l.in_grouping(m,1072,1103);){if(l.cursor>=l.limit)return!1;l.cursor++}return!0}function a(){for(;!l.out_grouping(m,1072,1103);){if(l.cursor>=l.limit)return!1;l.cursor++}return!0}function p(e,n){var r,t;if(l.ket=l.cursor,r=l.find_among_b(e,n)){switch(l.bra=l.cursor,r){case 1:if(t=l.limit-l.cursor,!l.eq_s_b(1,"а")&&(l.cursor=l.limit-t,!l.eq_s_b(1,"я")))return!1;case 2:l.slice_del()}return!0}return!1}function d(e,n){var r;return l.ket=l.cursor,!!(r=l.find_among_b(e,n))&&(l.bra=l.cursor,1==r&&l.slice_del(),!0)}function _(){return!!d(t,26)&&(p(w,8),!0)}function b(){var e;l.ket=l.cursor,(e=l.find_among_b(o,2))&&(l.bra=l.cursor,n<=l.cursor&&1==e&&l.slice_del())}this.setCurrent=function(e){l.setCurrent(e)},this.getCurrent=function(){return l.getCurrent()},this.stem=function(){return e=l.limit,n=e,f()&&(e=l.cursor,a()&&f()&&a()&&(n=l.cursor)),l.cursor=l.limit,!(l.cursor>3]&1<<(7&s))return this.cursor++,!0}return!1},in_grouping_b:function(r,t,i){if(this.cursor>this.limit_backward){var s=b.charCodeAt(this.cursor-1);if(s<=i&&t<=s&&r[(s-=t)>>3]&1<<(7&s))return this.cursor--,!0}return!1},out_grouping:function(r,t,i){if(this.cursor>3]&1<<(7&s)))return this.cursor++,!0}return!1},out_grouping_b:function(r,t,i){if(this.cursor>this.limit_backward){var s=b.charCodeAt(this.cursor-1);if(i>3]&1<<(7&s)))return this.cursor--,!0}return!1},eq_s:function(r,t){if(this.limit-this.cursor>1),a=0,f=u=(l=r[i]).s_size){if(this.cursor=e+l.s_size,!l.method)return l.result;var m=l.method();if(this.cursor=e+l.s_size,m)return l.result}if((i=l.substring_i)<0)return 0}},find_among_b:function(r,t){for(var i=0,s=t,e=this.cursor,n=this.limit_backward,u=0,o=0,h=!1;;){for(var c=i+(s-i>>1),a=0,f=u=(_=r[i]).s_size){if(this.cursor=e-_.s_size,!_.method)return _.result;var m=_.method();if(this.cursor=e-_.s_size,m)return _.result}if((i=_.substring_i)<0)return 0}},replace_s:function(r,t,i){var s=i.length-(t-r);return b=b.substring(0,r)+i+b.substring(t),this.limit+=s,this.cursor>=t?this.cursor+=s:this.cursor>r&&(this.cursor=r),s},slice_check:function(){if(this.bra<0||this.bra>this.ket||this.ket>this.limit||this.limit>b.length)throw"faulty slice operation"},slice_from:function(r){this.slice_check(),this.replace_s(this.bra,this.ket,r)},slice_del:function(){this.slice_from("")},insert:function(r,t,i){var s=this.replace_s(r,t,i);r<=this.bra&&(this.bra+=s),r<=this.ket&&(this.ket+=s)},slice_to:function(){return this.slice_check(),b.substring(this.bra,this.ket)},eq_v_b:function(r){return this.eq_s_b(r.length,r)}}}},r.trimmerSupport={generateTrimmer:function(r){var t=new RegExp("^[^"+r+"]+"),i=new RegExp("[^"+r+"]+$");return function(r){return"function"==typeof r.update?r.update(function(r){return r.replace(t,"").replace(i,"")}):r.replace(t,"").replace(i,"")}}}}}); -------------------------------------------------------------------------------- /SecurityPaper-themes/assets/javascripts/lunr/lunr.sv.js: -------------------------------------------------------------------------------- 1 | !function(e,r){"function"==typeof define&&define.amd?define(r):"object"==typeof exports?module.exports=r():r()(e.lunr)}(this,function(){return function(e){if(void 0===e)throw new Error("Lunr is not present. Please include / require Lunr before this script.");if(void 0===e.stemmerSupport)throw new Error("Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.");var r,l,n;e.sv=function(){this.pipeline.reset(),this.pipeline.add(e.sv.trimmer,e.sv.stopWordFilter,e.sv.stemmer),this.searchPipeline&&(this.searchPipeline.reset(),this.searchPipeline.add(e.sv.stemmer))},e.sv.wordCharacters="A-Za-zªºÀ-ÖØ-öø-ʸˠ-ˤᴀ-ᴥᴬ-ᵜᵢ-ᵥᵫ-ᵷᵹ-ᶾḀ-ỿⁱⁿₐ-ₜKÅℲⅎⅠ-ↈⱠ-ⱿꜢ-ꞇꞋ-ꞭꞰ-ꞷꟷ-ꟿꬰ-ꭚꭜ-ꭤff-stA-Za-z",e.sv.trimmer=e.trimmerSupport.generateTrimmer(e.sv.wordCharacters),e.Pipeline.registerFunction(e.sv.trimmer,"trimmer-sv"),e.sv.stemmer=(r=e.stemmerSupport.Among,l=e.stemmerSupport.SnowballProgram,n=new function(){var n,t,i=[new r("a",-1,1),new r("arna",0,1),new r("erna",0,1),new r("heterna",2,1),new r("orna",0,1),new r("ad",-1,1),new r("e",-1,1),new r("ade",6,1),new r("ande",6,1),new r("arne",6,1),new r("are",6,1),new r("aste",6,1),new r("en",-1,1),new r("anden",12,1),new r("aren",12,1),new r("heten",12,1),new r("ern",-1,1),new r("ar",-1,1),new r("er",-1,1),new r("heter",18,1),new r("or",-1,1),new r("s",-1,2),new r("as",21,1),new r("arnas",22,1),new r("ernas",22,1),new r("ornas",22,1),new r("es",21,1),new r("ades",26,1),new r("andes",26,1),new r("ens",21,1),new r("arens",29,1),new r("hetens",29,1),new r("erns",21,1),new r("at",-1,1),new r("andet",-1,1),new r("het",-1,1),new r("ast",-1,1)],s=[new r("dd",-1,-1),new r("gd",-1,-1),new r("nn",-1,-1),new r("dt",-1,-1),new r("gt",-1,-1),new r("kt",-1,-1),new r("tt",-1,-1)],a=[new r("ig",-1,1),new r("lig",0,1),new r("els",-1,1),new r("fullt",-1,3),new r("löst",-1,2)],o=[17,65,16,1,0,0,0,0,0,0,0,0,0,0,0,0,24,0,32],u=[119,127,149],m=new l;this.setCurrent=function(e){m.setCurrent(e)},this.getCurrent=function(){return m.getCurrent()},this.stem=function(){var e,r=m.cursor;return function(){var e,r=m.cursor+3;if(t=m.limit,0<=r||r<=m.limit){for(n=r;;){if(e=m.cursor,m.in_grouping(o,97,246)){m.cursor=e;break}if(m.cursor=e,m.cursor>=m.limit)return;m.cursor++}for(;!m.out_grouping(o,97,246);){if(m.cursor>=m.limit)return;m.cursor++}(t=m.cursor)=t&&(m.limit_backward=t,m.cursor=m.limit,m.ket=m.cursor,e=m.find_among_b(i,37),m.limit_backward=r,e))switch(m.bra=m.cursor,e){case 1:m.slice_del();break;case 2:m.in_grouping_b(u,98,121)&&m.slice_del()}}(),m.cursor=m.limit,e=m.limit_backward,m.cursor>=t&&(m.limit_backward=t,m.cursor=m.limit,m.find_among_b(s,7)&&(m.cursor=m.limit,m.ket=m.cursor,m.cursor>m.limit_backward&&(m.bra=--m.cursor,m.slice_del())),m.limit_backward=e),m.cursor=m.limit,function(){var e,r;if(m.cursor>=t){if(r=m.limit_backward,m.limit_backward=t,m.cursor=m.limit,m.ket=m.cursor,e=m.find_among_b(a,5))switch(m.bra=m.cursor,e){case 1:m.slice_del();break;case 2:m.slice_from("lös");break;case 3:m.slice_from("full")}m.limit_backward=r}}(),!0}},function(e){return"function"==typeof e.update?e.update(function(e){return n.setCurrent(e),n.stem(),n.getCurrent()}):(n.setCurrent(e),n.stem(),n.getCurrent())}),e.Pipeline.registerFunction(e.sv.stemmer,"stemmer-sv"),e.sv.stopWordFilter=e.generateStopWordFilter("alla allt att av blev bli blir blivit de dem den denna deras dess dessa det detta dig din dina ditt du där då efter ej eller en er era ert ett från för ha hade han hans har henne hennes hon honom hur här i icke ingen inom inte jag ju kan kunde man med mellan men mig min mina mitt mot mycket ni nu när någon något några och om oss på samma sedan sig sin sina sitta själv skulle som så sådan sådana sådant till under upp ut utan vad var vara varför varit varje vars vart vem vi vid vilka vilkas vilken vilket vår våra vårt än är åt över".split(" ")),e.Pipeline.registerFunction(e.sv.stopWordFilter,"stopWordFilter-sv")}}); -------------------------------------------------------------------------------- /SecurityPaper-themes/main.html: -------------------------------------------------------------------------------- 1 | {% extends "base.html" %} 2 | -------------------------------------------------------------------------------- /SecurityPaper-themes/mkdocs_theme.yml: -------------------------------------------------------------------------------- 1 | # Copyright (c) 2016-2018 Martin Donath 2 | 3 | # Permission is hereby granted, free of charge, to any person obtaining a copy 4 | # of this software and associated documentation files (the "Software"), to 5 | # deal in the Software without restriction, including without limitation the 6 | # rights to use, copy, modify, merge, publish, distribute, sublicense, and/or 7 | # sell copies of the Software, and to permit persons to whom the Software is 8 | # furnished to do so, subject to the following conditions: 9 | 10 | # The above copyright notice and this permission notice shall be included in 11 | # all copies or substantial portions of the Software. 12 | 13 | # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 14 | # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 15 | # FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE 16 | # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 17 | # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 18 | # FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS 19 | # IN THE SOFTWARE. 20 | 21 | # Language for theme localization 22 | language: en 23 | 24 | # Text direction (can be ltr or rtl), default: ltr 25 | direction: 26 | 27 | # Feature flags for functionality that alters behavior significantly, and thus 28 | # may be a matter of taste 29 | feature: 30 | 31 | # Another layer on top of the main navigation for larger screens in the form 32 | # of tabs, especially useful for larger documentation projects 33 | tabs: false 34 | 35 | # Sets the primary and accent color palettes as defined in the Material Design 36 | # documentation - possible values can be looked up in the getting started guide 37 | palette: 38 | 39 | # Primary color used for header, sidebar and links, default: indigo 40 | primary: 41 | 42 | # Accent color for highlighting user interaction, default: indigo 43 | accent: 44 | 45 | # Fonts used by Material, automatically loaded from Google Fonts - see the site 46 | # for a list of available fonts 47 | font: 48 | 49 | # Default font for text 50 | text: Roboto 51 | 52 | # Fixed-width font for code listings 53 | code: Roboto Mono 54 | 55 | # Favicon to be rendered 56 | favicon: assets/images/favicon.png 57 | 58 | # The logo of the documentation shown in the header and navigation can either 59 | # be a Material Icon ligature (see https://material.io/icons/) or an image URL 60 | logo: 61 | icon: "\uE80C" 62 | 63 | # Material includes the search in the header as a partial, not as a separate 64 | # template, so it's correct that search.html is missing 65 | include_search_page: false 66 | 67 | # Material doesn't use MkDocs search functionality but provides its own. For 68 | # this reason, only the search index needs to be built 69 | search_index_only: true 70 | 71 | # Static pages to build 72 | static_templates: 73 | - 404.html 74 | -------------------------------------------------------------------------------- /SecurityPaper-themes/partials/footer.html: -------------------------------------------------------------------------------- 1 | {% import "partials/language.html" as lang with context %} 2 | 56 | -------------------------------------------------------------------------------- /SecurityPaper-themes/partials/header.html: -------------------------------------------------------------------------------- 1 |
2 | 41 |
42 | -------------------------------------------------------------------------------- /SecurityPaper-themes/partials/hero.html: -------------------------------------------------------------------------------- 1 | {% set feature = config.theme.feature %} 2 | {% set class = "md-hero" %} 3 | {% if not feature.tabs %} 4 | {% set class = "md-hero md-hero--expand" %} 5 | {% endif %} 6 |
7 |
8 | {{ page.meta.hero }} 9 |
10 |
11 | -------------------------------------------------------------------------------- /SecurityPaper-themes/partials/integrations/analytics.html: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /SecurityPaper-themes/partials/integrations/disqus.html: -------------------------------------------------------------------------------- 1 | {% set disqus = config.extra.disqus %} 2 | {% if page and page.meta and page.meta.disqus is string %} 3 | {% set disqus = page.meta.disqus %} 4 | {% endif %} 5 | {% if not page.is_homepage and disqus %} 6 |

{{ lang.t("meta.comments") }}

7 |
8 | 21 | {% endif %} 22 | -------------------------------------------------------------------------------- /SecurityPaper-themes/partials/language.html: -------------------------------------------------------------------------------- 1 | {% import "partials/language/" + config.theme.language + ".html" as lang %} 2 | {% import "partials/language/en.html" as fallback %} 3 | {% macro t(key) %}{{ { 4 | "direction": config.theme.direction, 5 | "search.language": ( 6 | config.extra.search | default({}) 7 | ).language, 8 | "search.tokenizer": ( 9 | config.extra.search | default({}) 10 | ).tokenizer | default("", true), 11 | }[key] or lang.t(key) or fallback.t(key) }}{% endmacro %} 12 | -------------------------------------------------------------------------------- /SecurityPaper-themes/partials/language/ar.html: -------------------------------------------------------------------------------- 1 | {% macro t(key) %}{{ { 2 | "language": "ar", 3 | "direction": "rtl", 4 | "clipboard.copy": "نسخ إلى الحافظة", 5 | "clipboard.copied": "تم النسخ الى الحافظة", 6 | "edit.link.title": "عدل الصفحة", 7 | "footer.previous": "السابقة", 8 | "footer.next": "التالية", 9 | "meta.comments": "التعليقات", 10 | "meta.source": "المصدر", 11 | "search.language": "", 12 | "search.pipeline.stopwords": false, 13 | "search.pipeline.trimmer": false, 14 | "search.placeholder": "بحث", 15 | "search.result.placeholder": "اكتب لبدء البحث", 16 | "search.result.none": "لا توجد نتائج", 17 | "search.result.one": "نتائج البحث مستند واحد", 18 | "search.result.other": "نتائج البحث # مستندات", 19 | "skip.link.title": "انتقل إلى المحتوى", 20 | "source.link.title": "اذهب إلى المصدر", 21 | "toc.title": "جدول المحتويات" 22 | }[key] }}{% endmacro %} 23 | -------------------------------------------------------------------------------- /SecurityPaper-themes/partials/language/ca.html: -------------------------------------------------------------------------------- 1 | {% macro t(key) %}{{ { 2 | "language": "ca", 3 | "clipboard.copy": "Còpia al porta-retalls", 4 | "clipboard.copied": "Copiat al porta-retalls", 5 | "edit.link.title": "Edita aquesta pàgina", 6 | "footer.previous": "Anterior", 7 | "footer.next": "Següent", 8 | "meta.comments": "Comentaris", 9 | "meta.source": "Codi font", 10 | "search.language": "", 11 | "search.placeholder": "Cerca", 12 | "search.result.placeholder": "Escriu per a començar a cercar", 13 | "search.result.none": "Cap document coincideix", 14 | "search.result.one": "1 document coincident", 15 | "search.result.other": "# documents coincidents", 16 | "skip.link.title": "Salta el contingut", 17 | "source.link.title": "Ves al repositori", 18 | "toc.title": "Taula de continguts" 19 | }[key] }}{% endmacro %} 20 | -------------------------------------------------------------------------------- /SecurityPaper-themes/partials/language/cs.html: -------------------------------------------------------------------------------- 1 | {% macro t(key) %}{{ { 2 | "language": "cs", 3 | "clipboard.copy": "Kopírovat do schránky", 4 | "clipboard.copied": "Zkopírováno do schránky", 5 | "edit.link.title": "Upravit tuto stránku", 6 | "footer.previous": "Předchozí", 7 | "footer.next": "Další", 8 | "meta.comments": "Komentáře", 9 | "meta.source": "Zdroj", 10 | "search.language": "ro", 11 | "search.placeholder": "Hledat", 12 | "search.result.placeholder": "Pište co se má vyhledat", 13 | "search.result.none": "Nenalezeny žádné dokumenty", 14 | "search.result.one": "Nalezený dokument: 1", 15 | "search.result.other": "Nalezené dokumenty: #", 16 | "skip.link.title": "Přeskočit obsah", 17 | "source.link.title": "Přejít do repozitáře", 18 | "toc.title": "Obsah" 19 | }[key] }}{% endmacro %} 20 | -------------------------------------------------------------------------------- /SecurityPaper-themes/partials/language/da.html: -------------------------------------------------------------------------------- 1 | {% macro t(key) %}{{ { 2 | "language": "da", 3 | "clipboard.copy": "Kopiér til udklipsholderen", 4 | "clipboard.copied": "Kopieret til udklipsholderen", 5 | "edit.link.title": "Redigér denne side", 6 | "footer.previous": "Forrige", 7 | "footer.next": "Næste", 8 | "meta.comments": "Kommentarer", 9 | "meta.source": "Kilde", 10 | "search.language": "da", 11 | "search.placeholder": "Søg", 12 | "search.result.placeholder": "Indtask søgeord", 13 | "search.result.none": "Ingen resultater fundet", 14 | "search.result.one": "1 resultat", 15 | "search.result.other": "# resultater", 16 | "skip.link.title": "Gå til indholdet", 17 | "source.link.title": "Åbn arkiv", 18 | "toc.title": "Indholdsfortegnelse" 19 | }[key] }}{% endmacro %} 20 | -------------------------------------------------------------------------------- /SecurityPaper-themes/partials/language/de.html: -------------------------------------------------------------------------------- 1 | {% macro t(key) %}{{ { 2 | "language": "de", 3 | "clipboard.copy": "In Zwischenablage kopieren", 4 | "clipboard.copied": "In Zwischenablage kopiert", 5 | "edit.link.title": "Seite editieren", 6 | "footer.previous": "Zurück", 7 | "footer.next": "Weiter", 8 | "meta.comments": "Kommentare", 9 | "meta.source": "Quellcode", 10 | "search.language": "de", 11 | "search.placeholder": "Suche", 12 | "search.result.placeholder": "Suchbegriff eingeben", 13 | "search.result.none": "Keine Suchergebnisse", 14 | "search.result.one": "1 Suchergebnis", 15 | "search.result.other": "# Suchergebnisse", 16 | "skip.link.title": "Zum Inhalt", 17 | "source.link.title": "Quellcode", 18 | "toc.title": "Inhaltsverzeichnis" 19 | }[key] }}{% endmacro %} 20 | -------------------------------------------------------------------------------- /SecurityPaper-themes/partials/language/en.html: -------------------------------------------------------------------------------- 1 | {% macro t(key) %}{{ { 2 | "language": "en", 3 | "direction": "ltr", 4 | "clipboard.copy": "Copy to clipboard", 5 | "clipboard.copied": "Copied to clipboard", 6 | "edit.link.title": "Edit this page", 7 | "footer.previous": "Previous", 8 | "footer.next": "Next", 9 | "meta.comments": "Comments", 10 | "meta.source": "Source", 11 | "search.language": "en", 12 | "search.pipeline.stopwords": true, 13 | "search.pipeline.trimmer": true, 14 | "search.placeholder": "Search", 15 | "search.result.placeholder": "Type to start searching", 16 | "search.result.none": "No matching documents", 17 | "search.result.one": "1 matching document", 18 | "search.result.other": "# matching documents", 19 | "search.tokenizer": "[\s\-]+", 20 | "skip.link.title": "Skip to content", 21 | "source.link.title": "Go to repository", 22 | "toc.title": "Table of contents" 23 | }[key] }}{% endmacro %} 24 | -------------------------------------------------------------------------------- /SecurityPaper-themes/partials/language/es.html: -------------------------------------------------------------------------------- 1 | {% macro t(key) %}{{ { 2 | "language": "es", 3 | "clipboard.copy": "Copiar al portapapeles", 4 | "clipboard.copied": "Copiado al portapapeles", 5 | "edit.link.title": "Editar esta página", 6 | "footer.previous": "Anterior", 7 | "footer.next": "Siguiente", 8 | "meta.comments": "Comentarios", 9 | "meta.source": "Fuente", 10 | "search.language": "es", 11 | "search.placeholder": "Búsqueda", 12 | "search.result.placeholder": "Teclee para comenzar búsqueda", 13 | "search.result.none": "No se encontraron documentos", 14 | "search.result.one": "1 documento encontrado", 15 | "search.result.other": "# documentos encontrados", 16 | "skip.link.title": "Saltar a contenido", 17 | "source.link.title": "Ir al repositorio", 18 | "toc.title": "Tabla de contenidos" 19 | }[key] }}{% endmacro %} 20 | -------------------------------------------------------------------------------- /SecurityPaper-themes/partials/language/fa.html: -------------------------------------------------------------------------------- 1 | {% macro t(key) %}{{ { 2 | "language": "fa", 3 | "direction": "rtl", 4 | "clipboard.copy": "کپی کردن", 5 | "clipboard.copied": "کپی شد", 6 | "edit.link.title": "این صفحه را ویرایش کنید", 7 | "footer.previous": "قبلی", 8 | "footer.next": "بعدی", 9 | "meta.comments": "نظرات", 10 | "meta.source": "منبع", 11 | "search.language": "", 12 | "search.pipeline.stopwords": false, 13 | "search.pipeline.trimmer": false, 14 | "search.placeholder": "جستجو", 15 | "search.result.placeholder": "برای شروع جستجو تایپ کنید", 16 | "search.result.none": "سندی یافت نشد", 17 | "search.result.one": "1 سند یافت شد", 18 | "search.result.other": "# سند یافت شد", 19 | "skip.link.title": "پرش به محتویات", 20 | "source.link.title": "رفتن به مخزن", 21 | "toc.title": "فهرست موضوعات" 22 | }[key] }}{% endmacro %} 23 | -------------------------------------------------------------------------------- /SecurityPaper-themes/partials/language/fi.html: -------------------------------------------------------------------------------- 1 | {% macro t(key) %}{{ { 2 | "language": "fi", 3 | "clipboard.copy": "Kopioi leikepöydälle", 4 | "clipboard.copied": "Kopioitu leikepöydälle", 5 | "edit.link.title": "Muokkaa tätä sivua", 6 | "footer.previous": "Edellinen", 7 | "footer.next": "Seuraava", 8 | "meta.comments": "Kommentit", 9 | "meta.source": "Lähdekodi", 10 | "search.language": "fi", 11 | "search.placeholder": "Hae", 12 | "search.result.placeholder": "Kirjoita aloittaaksesi haun", 13 | "search.result.none": "Ei täsmääviä dokumentteja", 14 | "search.result.one": "1 täsmäävä dokumentti", 15 | "search.result.other": "# täsmäävää dokumenttia", 16 | "skip.link.title": "Hyppää sisältöön", 17 | "source.link.title": "Mene repositoryyn", 18 | "toc.title": "Sisällysluettelo" 19 | }[key] }}{% endmacro %} 20 | -------------------------------------------------------------------------------- /SecurityPaper-themes/partials/language/fr.html: -------------------------------------------------------------------------------- 1 | {% macro t(key) %}{{ { 2 | "language": "fr", 3 | "clipboard.copy": "Copier dans le presse-papier", 4 | "clipboard.copied": "Copié dans le presse-papier", 5 | "edit.link.title": "Editer cette page", 6 | "footer.previous": "Précédent", 7 | "footer.next": "Suivant", 8 | "meta.comments": "Commentaires", 9 | "meta.source": "Source", 10 | "search.language": "fr", 11 | "search.placeholder": "Rechercher", 12 | "search.result.placeholder": "Taper pour démarrer la recherche", 13 | "search.result.none": "Aucun document trouvé", 14 | "search.result.one": "1 document trouvé", 15 | "search.result.other": "# documents trouvés", 16 | "source.link.title": "Aller au dépôt", 17 | "toc.title": "Table des matières" 18 | }[key] }}{% endmacro %} 19 | -------------------------------------------------------------------------------- /SecurityPaper-themes/partials/language/gl.html: -------------------------------------------------------------------------------- 1 | {% macro t(key) %}{{ { 2 | "language": "gl", 3 | "clipboard.copy": "Copiar no cortapapeis", 4 | "clipboard.copied": "Copiado no cortapapeis", 5 | "edit.link.title": "Editar esta páxina", 6 | "footer.previous": "Anterior", 7 | "footer.next": "Seguinte", 8 | "meta.comments": "Comentarios", 9 | "meta.source": "Fonte", 10 | "search.language": "es", 11 | "search.placeholder": "Busca", 12 | "search.result.placeholder": "Insira un termo", 13 | "search.result.none": "Sen resultados", 14 | "search.result.one": "1 resultado atopado", 15 | "search.result.other": "# resultados atopados", 16 | "skip.link.title": "Ir ao contido", 17 | "source.link.title": "Ir ao repositorio", 18 | "toc.title": "Táboa de contidos" 19 | }[key] }}{% endmacro %} 20 | -------------------------------------------------------------------------------- /SecurityPaper-themes/partials/language/he.html: -------------------------------------------------------------------------------- 1 | {% macro t(key) %}{{ { 2 | "language": "he", 3 | "direction": "rtl", 4 | "clipboard.copy": "העתק ללוח", 5 | "clipboard.copied": "הועתק ללוח", 6 | "edit.link.title": "ערוך דף זה", 7 | "footer.previous": "קודם", 8 | "footer.next": "הַבָּא", 9 | "meta.comments": "הערות", 10 | "meta.source": "מָקוֹר", 11 | "search.language": "", 12 | "search.pipeline.stopwords": false, 13 | "search.pipeline.trimmer": false, 14 | "search.placeholder": "לחפש", 15 | "search.result.placeholder": "הקלד כדי להתחיל לחפש", 16 | "search.result.none": "אין מסמכים תואמים", 17 | "search.result.one": "1 מסמך תואם", 18 | "search.result.other": "# מסמך תואם", 19 | "skip.link.title": "דלג לתוכן", 20 | "source.link.title": "עבור אל מאגר", 21 | "toc.title": "תוכן העניינים" 22 | }[key] }}{% endmacro %} 23 | -------------------------------------------------------------------------------- /SecurityPaper-themes/partials/language/hi.html: -------------------------------------------------------------------------------- 1 | {% macro t(key) %}{{ { 2 | "language": "hi", 3 | "clipboard.copy": "क्लिपबोर्ड पर कॉपी करें", 4 | "clipboard.copied": "क्लिपबोर्ड पर कॉपी कर दिया गया", 5 | "edit.link.title": "इस पृष्ठ को संपादित करें", 6 | "footer.previous": "पिछला", 7 | "footer.next": "आगामी", 8 | "meta.comments": "टिप्पणियाँ", 9 | "meta.source": "स्रोत", 10 | "search.language": "", 11 | "search.pipeline.stopwords": false, 12 | "search.pipeline.trimmer": false, 13 | "search.placeholder": "खोज", 14 | "search.result.placeholder": "खोज शुरू करने के लिए टाइप करें", 15 | "search.result.none": "कोई मिलान डॉक्यूमेंट नहीं", 16 | "search.result.one": "1 मिलान डॉक्यूमेंट", 17 | "search.result.other": "# मिलान डाक्यूमेंट्स", 18 | "skip.link.title": "विषय पर बढ़ें", 19 | "source.link.title": "रिपॉजिटरी पर जाएं", 20 | "toc.title": "विषय - सूची" 21 | }[key] }}{% endmacro %} 22 | -------------------------------------------------------------------------------- /SecurityPaper-themes/partials/language/hr.html: -------------------------------------------------------------------------------- 1 | {% macro t(key) %}{{ { 2 | "language": "hr", 3 | "clipboard.copy": "Kopirajte u međuspremnik", 4 | "clipboard.copied": "Kopirano u međuspremnik", 5 | "edit.link.title": "Uredi stranicu", 6 | "footer.previous": "Prethodno", 7 | "footer.next": "Sljedeće", 8 | "meta.comments": "Komentari", 9 | "meta.source": "Izvor", 10 | "search.language": "", 11 | "search.pipeline.stopwords": false, 12 | "search.pipeline.trimmer": false, 13 | "search.placeholder": "Pretraživanje", 14 | "search.result.placeholder": "Unesite pojam pretraživanja", 15 | "search.result.none": "Ništa nije pronađeno", 16 | "search.result.one": "1 rezultat pretraživanja", 17 | "search.result.other": "# rezultata pretraživanja", 18 | "skip.link.title": "Preskočite na sadržaj", 19 | "source.link.title": "Idite u repozitorij", 20 | "toc.title": "Sadržaj" 21 | }[key] }}{% endmacro %} 22 | -------------------------------------------------------------------------------- /SecurityPaper-themes/partials/language/hu.html: -------------------------------------------------------------------------------- 1 | {% macro t(key) %}{{ { 2 | "language": "hu", 3 | "clipboard.copy": "Másolás vágólapra", 4 | "clipboard.copied": "Vágólapra másolva", 5 | "edit.link.title": "Oldal szerkesztése", 6 | "footer.previous": "Előző", 7 | "footer.next": "Következő", 8 | "meta.comments": "Hozzászólások", 9 | "meta.source": "Forrás", 10 | "search.language": "hu", 11 | "search.placeholder": "Keresés", 12 | "search.result.placeholder": "Kereséshez írj ide valamit", 13 | "search.result.none": "Nincs találat", 14 | "search.result.one": "1 egyező dokumentum", 15 | "search.result.other": "# egyező dokumentum", 16 | "skip.link.title": "Kihagyás", 17 | "source.link.title": "Főoldalra ugrás", 18 | "toc.title": "Tartalomjegyzék" 19 | }[key] }}{% endmacro %} 20 | -------------------------------------------------------------------------------- /SecurityPaper-themes/partials/language/id.html: -------------------------------------------------------------------------------- 1 | {% macro t(key) %}{{ { 2 | "language": "id", 3 | "clipboard.copy": "Salin ke memori", 4 | "clipboard.copied": "Tersalin ke memori", 5 | "edit.link.title": "Ubah halaman ini", 6 | "footer.previous": "Sebelumnya", 7 | "footer.next": "Selanjutnya", 8 | "meta.comments": "Komentar", 9 | "meta.source": "Sumber", 10 | "search.language": "", 11 | "search.pipeline.stopwords": false, 12 | "search.pipeline.trimmer": false, 13 | "search.placeholder": "Cari", 14 | "search.result.placeholder": "Ketik untuk mulai pencarian", 15 | "search.result.none": "Tidak ada dokumen yang sesuai", 16 | "search.result.one": "1 dokumen ditemukan", 17 | "search.result.other": "# dokumen ditemukan", 18 | "skip.link.title": "Lewati ke isi", 19 | "source.link.title": "Menuju repositori", 20 | "toc.title": "Daftar isi" 21 | }[key] }}{% endmacro %} 22 | -------------------------------------------------------------------------------- /SecurityPaper-themes/partials/language/it.html: -------------------------------------------------------------------------------- 1 | {% macro t(key) %}{{ { 2 | "language": "it", 3 | "clipboard.copy": "Copia", 4 | "clipboard.copied": "Copiato", 5 | "edit.link.title": "Modifica", 6 | "footer.previous": "Precedente", 7 | "footer.next": "Prossimo", 8 | "meta.comments": "Commenti", 9 | "meta.source": "Sorgente", 10 | "search.language": "it", 11 | "search.placeholder": "Cerca", 12 | "search.result.placeholder": "Scrivi per iniziare a cercare", 13 | "search.result.none": "Nessun documento trovato", 14 | "search.result.one": "1 documento trovato", 15 | "search.result.other": "# documenti trovati", 16 | "skip.link.title": "Vai al contenuto", 17 | "source.link.title": "Apri repository", 18 | "toc.title": "Indice" 19 | }[key] }}{% endmacro %} 20 | -------------------------------------------------------------------------------- /SecurityPaper-themes/partials/language/ja.html: -------------------------------------------------------------------------------- 1 | {% macro t(key) %}{{ { 2 | "language": "ja", 3 | "clipboard.copy": "クリップボードへコピー", 4 | "clipboard.copied": "コピーしました", 5 | "edit.link.title": "編集", 6 | "footer.previous": "前", 7 | "footer.next": "次", 8 | "meta.comments": "コメント", 9 | "meta.source": "ソース", 10 | "search.language": "jp", 11 | "search.placeholder": "検索", 12 | "search.result.placeholder": "検索キーワードを入力してください", 13 | "search.result.none": "何も見つかりませんでした", 14 | "search.result.one": "1件見つかりました", 15 | "search.result.other": "#件見つかりました", 16 | "search.tokenizer": "[\s\- 、。,.]+", 17 | "source.link.title": "リポジトリへ", 18 | "toc.title": "目次" 19 | }[key] }}{% endmacro %} 20 | -------------------------------------------------------------------------------- /SecurityPaper-themes/partials/language/kr.html: -------------------------------------------------------------------------------- 1 | {% macro t(key) %}{{ { 2 | "language": "kr", 3 | "clipboard.copy": "클립보드로 복사", 4 | "clipboard.copied": "클립보드에 복사됨", 5 | "edit.link.title": "이 페이지를 편집", 6 | "footer.previous": "이전", 7 | "footer.next": "다음", 8 | "meta.comments": "댓글", 9 | "meta.source": "출처", 10 | "search.language": "jp", 11 | "search.placeholder": "검색", 12 | "search.result.placeholder": "검색어를 입력하세요", 13 | "search.result.none": "검색어와 일치하는 문서가 없습니다", 14 | "search.result.one": "1개의 일치하는 문서", 15 | "search.result.other": "#개의 일치하는 문서", 16 | "source.link.title": "저장소로 이동", 17 | "toc.title": "목차" 18 | }[key] }}{% endmacro %} 19 | -------------------------------------------------------------------------------- /SecurityPaper-themes/partials/language/nl.html: -------------------------------------------------------------------------------- 1 | {% macro t(key) %}{{ { 2 | "language": "nl", 3 | "clipboard.copy": "Kopiëren naar klembord", 4 | "clipboard.copied": "Gekopieerd naar klembord", 5 | "edit.link.title": "Wijzig deze pagina", 6 | "footer.previous": "Vorige", 7 | "footer.next": "Volgende", 8 | "meta.comments": "Reacties", 9 | "meta.source": "Bron", 10 | "search.language": "du", 11 | "search.placeholder": "Zoeken", 12 | "search.result.placeholder": "Typ om te beginnen met zoeken", 13 | "search.result.none": "Geen overeenkomende documenten", 14 | "search.result.one": "1 overeenkomende document", 15 | "search.result.other": "# overeenkomende documenten", 16 | "skip.link.title": "Ga naar inhoud", 17 | "source.link.title": "Ga naar repository", 18 | "toc.title": "Inhoudsopgave" 19 | }[key] }}{% endmacro %} 20 | -------------------------------------------------------------------------------- /SecurityPaper-themes/partials/language/no.html: -------------------------------------------------------------------------------- 1 | {% macro t(key) %}{{ { 2 | "language": "no", 3 | "clipboard.copy": "Kopier til utklippstavlen", 4 | "clipboard.copied": "Kopiert til utklippstavlen", 5 | "edit.link.title": "Rediger denne siden", 6 | "footer.previous": "Forrige", 7 | "footer.next": "Neste", 8 | "meta.comments": "Kommentarer", 9 | "meta.source": "Kilde", 10 | "search.language": "no", 11 | "search.placeholder": "Søk", 12 | "search.result.placeholder": "Skriv søkeord", 13 | "search.result.none": "Ingen treff", 14 | "search.result.one": "1 treff", 15 | "search.result.other": "# treff", 16 | "skip.link.title": "Gå til innhold", 17 | "source.link.title": "Gå til kilde", 18 | "toc.title": "Innholdsfortegnelse" 19 | }[key] }}{% endmacro %} 20 | -------------------------------------------------------------------------------- /SecurityPaper-themes/partials/language/pl.html: -------------------------------------------------------------------------------- 1 | {% macro t(key) %}{{ { 2 | "language": "pl", 3 | "clipboard.copy": "Kopiuj do schowka", 4 | "clipboard.copied": "Skopiowane", 5 | "edit.link.title": "Edytuj tę stronę", 6 | "footer.previous": "Poprzednia strona", 7 | "footer.next": "Następna strona", 8 | "meta.comments": "Komentarze", 9 | "meta.source": "Kod źródłowy", 10 | "search.language": "", 11 | "search.pipeline.stopwords": false, 12 | "search.pipeline.trimmer": false, 13 | "search.placeholder": "Szukaj", 14 | "search.result.placeholder": "Zacznij pisać, aby szukać", 15 | "search.result.none": "Brak wyników wyszukiwania", 16 | "search.result.one": "Wyniki wyszukiwania: 1", 17 | "search.result.other": "Wyniki wyszukiwania: #", 18 | "skip.link.title": "Przejdź do treści", 19 | "source.link.title": "Idź do repozytorium", 20 | "toc.title": "Spis treści" 21 | }[key] }}{% endmacro %} 22 | -------------------------------------------------------------------------------- /SecurityPaper-themes/partials/language/pt.html: -------------------------------------------------------------------------------- 1 | {% macro t(key) %}{{ { 2 | "language": "pt", 3 | "clipboard.copy": "Copiar para área de transferência", 4 | "clipboard.copied": "Copiado para área de transferência", 5 | "edit.link.title": "Editar esta página", 6 | "footer.previous": "Anterior", 7 | "footer.next": "Próximo", 8 | "meta.comments": "Comentários", 9 | "meta.source": "Fonte", 10 | "search.language": "pt", 11 | "search.placeholder": "Buscar", 12 | "search.result.placeholder": "Digite para iniciar a busca", 13 | "search.result.none": "Nenhum resultado encontrado", 14 | "search.result.one": "1 resultado encontrado", 15 | "search.result.other": "# resultados encontrados", 16 | "skip.link.title": "Ir para o conteúdo", 17 | "source.link.title": "Ir ao repositório", 18 | "toc.title": "Índice" 19 | }[key] }}{% endmacro %} 20 | -------------------------------------------------------------------------------- /SecurityPaper-themes/partials/language/ru.html: -------------------------------------------------------------------------------- 1 | {% macro t(key) %}{{ { 2 | "language": "ru", 3 | "clipboard.copy": "Копировать в буфер", 4 | "clipboard.copied": "Скопировано в буфер", 5 | "edit.link.title": "Редактировать страницу", 6 | "footer.previous": "Назад", 7 | "footer.next": "Вперед", 8 | "meta.comments": "Комментарии", 9 | "meta.source": "Исходный код", 10 | "search.language": "ru", 11 | "search.placeholder": "Поиск", 12 | "search.result.placeholder": "Начните печатать для поиска", 13 | "search.result.none": "Совпадений не найдено", 14 | "search.result.one": "Найдено 1 совпадение", 15 | "search.result.other": "Найдено # совпадений", 16 | "skip.link.title": "Перейти к содержанию", 17 | "source.link.title": "Перейти к репозиторию", 18 | "toc.title": "Содержание" 19 | }[key] }}{% endmacro %} 20 | -------------------------------------------------------------------------------- /SecurityPaper-themes/partials/language/sh.html: -------------------------------------------------------------------------------- 1 | {% macro t(key) %}{{ { 2 | "language": "sh", 3 | "clipboard.copy": "Kopiraj u klipbord", 4 | "clipboard.copied": "Iskopirano u klipbord", 5 | "edit.link.title": "Uredi stranicu", 6 | "footer.previous": "Prethodno", 7 | "footer.next": "Sledeće", 8 | "meta.comments": "Komentari", 9 | "meta.source": "Izvor", 10 | "search.language": "ro", 11 | "search.placeholder": "Pretraga", 12 | "search.result.placeholder": "Unesite pojam pretrage", 13 | "search.result.none": "Ništa nije pronađeno", 14 | "search.result.one": "1 rezultat pretrage", 15 | "search.result.other": "# rezultata pretrage", 16 | "skip.link.title": "Idi na tekst", 17 | "source.link.title": "Idi u repozitorijum", 18 | "toc.title": "Sadržaj" 19 | }[key] }}{% endmacro %} 20 | -------------------------------------------------------------------------------- /SecurityPaper-themes/partials/language/sk.html: -------------------------------------------------------------------------------- 1 | {% macro t(key) %}{{ { 2 | "language": "sk", 3 | "clipboard.copy": "Kopírovať do schránky", 4 | "clipboard.copied": "Skopírované do schránky", 5 | "edit.link.title": "Upraviť túto stránku", 6 | "footer.previous": "Späť", 7 | "footer.next": "Ďalej", 8 | "meta.comments": "Komentáre", 9 | "meta.source": "Zdroj", 10 | "search.language": "sk", 11 | "search.placeholder": "Hľadať", 12 | "search.result.placeholder": "Pre vyhľadávanie začni písať", 13 | "search.result.none": "Žiadne vyhovujúce dokumenty", 14 | "search.result.one": "Vyhovujúci dokument: 1", 15 | "search.result.other": "Vyhovujúce dokumenty: #", 16 | "skip.link.title": "Preskočiť na obsah", 17 | "source.link.title": "Zobraziť repozitár", 18 | "toc.title": "Obsah" 19 | }[key] }}{% endmacro %} 20 | -------------------------------------------------------------------------------- /SecurityPaper-themes/partials/language/sr.html: -------------------------------------------------------------------------------- 1 | {% macro t(key) %}{{ { 2 | "language": "sr", 3 | "clipboard.copy": "Копирај у клипборд", 4 | "clipboard.copied": "Ископирано у клипборд", 5 | "edit.link.title": "Уреди страницу", 6 | "footer.previous": "Претходно", 7 | "footer.next": "Следеће", 8 | "meta.comments": "Коментари", 9 | "meta.source": "Извор", 10 | "search.language": "", 11 | "search.pipeline.stopwords": false, 12 | "search.pipeline.trimmer": false, 13 | "search.placeholder": "Претрага", 14 | "search.result.placeholder": "Унесите појам претраге", 15 | "search.result.none": "Нису пронађени документи", 16 | "search.result.one": "1 резултат претраге", 17 | "search.result.other": "# резултата претраге", 18 | "skip.link.title": "Иди на текст", 19 | "source.link.title": "Иди у репозиторијум", 20 | "toc.title": "Садржај" 21 | }[key] }}{% endmacro %} 22 | -------------------------------------------------------------------------------- /SecurityPaper-themes/partials/language/sv.html: -------------------------------------------------------------------------------- 1 | {% macro t(key) %}{{ { 2 | "language": "sv", 3 | "clipboard.copy": "Kopiera till urklipp", 4 | "clipboard.copied": "Kopierat till urklipp", 5 | "edit.link.title": "Redigera sidan", 6 | "footer.previous": "Föregående", 7 | "footer.next": "Nästa", 8 | "meta.comments": "Kommentarer", 9 | "meta.source": "Källa", 10 | "search.language": "sv", 11 | "search.placeholder": "Sök", 12 | "search.result.placeholder": "Skriv sökord", 13 | "search.result.none": "Inga sökresultat", 14 | "search.result.one": "1 sökresultat", 15 | "search.result.other": "# sökresultat", 16 | "skip.link.title": "Gå till innehållet", 17 | "source.link.title": "Gå till datakatalog", 18 | "toc.title": "Innehållsförteckning" 19 | }[key] }}{% endmacro %} 20 | -------------------------------------------------------------------------------- /SecurityPaper-themes/partials/language/tr.html: -------------------------------------------------------------------------------- 1 | {% macro t(key) %}{{ { 2 | "language": "tr", 3 | "clipboard.copy": "Kopyala", 4 | "clipboard.copied": "Kopyalandı", 5 | "edit.link.title": "Düzenle", 6 | "footer.previous": "Önceki", 7 | "footer.next": "Sonraki", 8 | "meta.comments": "Yorumlar", 9 | "meta.source": "Kaynak", 10 | "search.language": "tr", 11 | "search.placeholder": "Ara", 12 | "search.result.placeholder": "Aramaya başlamak için yazın", 13 | "search.result.none": "Eşleşen doküman bulunamadı", 14 | "search.result.one": "1 doküman bulundu", 15 | "search.result.other": "# doküman bulundu", 16 | "source.link.title": "Depoya git", 17 | "toc.title": "İçindekiler" 18 | }[key] }}{% endmacro %} 19 | -------------------------------------------------------------------------------- /SecurityPaper-themes/partials/language/uk.html: -------------------------------------------------------------------------------- 1 | {% macro t(key) %}{{ { 2 | "language": "uk", 3 | "clipboard.copy": "Скопіювати в буфер", 4 | "clipboard.copied": "Скопійовано в буфер", 5 | "edit.link.title": "Редагувати сторінку", 6 | "footer.previous": "Назад", 7 | "footer.next": "Вперед", 8 | "meta.comments": "Коментарі", 9 | "meta.source": "Вихідний код", 10 | "search.language": "ru", 11 | "search.placeholder": "Пошук", 12 | "search.result.placeholder": "Розпочніть писати для пошуку", 13 | "search.result.none": "Збігів не знайдено", 14 | "search.result.one": "Знайдено 1 збіг", 15 | "search.result.other": "Знайдено # збігів", 16 | "skip.link.title": "Перейти до змісту", 17 | "source.link.title": "Перейти до репозиторію", 18 | "toc.title": "Зміст" 19 | }[key] }}{% endmacro %} 20 | -------------------------------------------------------------------------------- /SecurityPaper-themes/partials/language/vi.html: -------------------------------------------------------------------------------- 1 | {% macro t(key) %}{{ { 2 | "language": "vi", 3 | "clipboard.copy": "Sao chép vào bộ nhớ", 4 | "clipboard.copied": "Sao chép xong", 5 | "edit.link.title": "Chỉnh sửa", 6 | "footer.previous": "Trước", 7 | "footer.next": "Sau", 8 | "meta.comments": "Bình luận", 9 | "meta.source": "Mã nguồn", 10 | "search.placeholder": "Tìm kiếm", 11 | "search.result.placeholder": "Nhập để bắt đầu tìm kiếm", 12 | "search.result.none": "Không tìm thấy tài liệu liên quan", 13 | "search.result.one": "1 tài liệu liên quan", 14 | "search.result.other": "# tài liệu liên quan", 15 | "skip.link.title": "Vào thẳng nội dung", 16 | "source.link.title": "Đến kho lưu trữ mã nguồn", 17 | "toc.title": "Mục lục" 18 | }[key] }}{% endmacro %} 19 | -------------------------------------------------------------------------------- /SecurityPaper-themes/partials/language/zh-Hant.html: -------------------------------------------------------------------------------- 1 | {% macro t(key) %}{{ { 2 | "language": "zh-Hant", 3 | "clipboard.copy": "拷貝", 4 | "clipboard.copied": "已拷貝", 5 | "edit.link.title": "編輯此頁", 6 | "footer.previous": "上一頁", 7 | "footer.next": "下一頁", 8 | "meta.comments": "評論", 9 | "meta.source": "來源", 10 | "search.language": "jp", 11 | "search.placeholder": "搜尋", 12 | "search.result.placeholder": "鍵入以開始檢索", 13 | "search.result.none": "沒有找到符合條件的結果", 14 | "search.result.one": "找到 1 个符合條件的結果", 15 | "search.result.other": "# 個符合條件的結果", 16 | "search.tokenizer": "[\,\。]+", 17 | "skip.link.title": "跳轉至", 18 | "source.link.title": "前往 Github 倉庫", 19 | "toc.title": "目錄" 20 | }[key] }}{% endmacro %} 21 | -------------------------------------------------------------------------------- /SecurityPaper-themes/partials/language/zh-TW.html: -------------------------------------------------------------------------------- 1 | {% macro t(key) %}{{ { 2 | "language": "zh-Hant", 3 | "clipboard.copy": "複製", 4 | "clipboard.copied": "已複製", 5 | "edit.link.title": "編輯此頁", 6 | "footer.previous": "上一頁", 7 | "footer.next": "下一頁", 8 | "meta.comments": "留言", 9 | "meta.source": "來源", 10 | "search.language": "jp", 11 | "search.placeholder": "搜尋", 12 | "search.result.placeholder": "打字進行搜尋", 13 | "search.result.none": "沒有符合的項目", 14 | "search.result.one": "找到 1 個符合的項目", 15 | "search.result.other": "找到 # 個符合的項目", 16 | "search.tokenizer": "[\,\。]+", 17 | "skip.link.title": "跳轉到", 18 | "source.link.title": "前往倉庫", 19 | "toc.title": "本頁目錄" 20 | }[key] }}{% endmacro %} 21 | -------------------------------------------------------------------------------- /SecurityPaper-themes/partials/language/zh.html: -------------------------------------------------------------------------------- 1 | {% macro t(key) %}{{ { 2 | "language": "zh", 3 | "clipboard.copy": "复制", 4 | "clipboard.copied": "已复制", 5 | "edit.link.title": "编辑此页", 6 | "footer.previous": "后退", 7 | "footer.next": "前进", 8 | "meta.comments": "评论", 9 | "meta.source": "来源", 10 | "search.language": "jp", 11 | "search.placeholder": "搜索", 12 | "search.result.placeholder": "键入以开始搜索", 13 | "search.result.none": "没有找到符合条件的结果", 14 | "search.result.one": "找到 1 个符合条件的结果", 15 | "search.result.other": "# 个符合条件的结果", 16 | "search.tokenizer": "[\,\。]+", 17 | "skip.link.title": "跳转至", 18 | "source.link.title": "前往 Github 仓库", 19 | "toc.title": "目录" 20 | }[key] }}{% endmacro %} 21 | -------------------------------------------------------------------------------- /SecurityPaper-themes/partials/nav-item.html: -------------------------------------------------------------------------------- 1 | {% set class = "md-nav__item" %} 2 | {% if nav_item.active %} 3 | {% set class = "md-nav__item md-nav__item--active" %} 4 | {% endif %} 5 | {% if nav_item.children %} 6 |
  • 7 | {% if nav_item.active %} 8 | 9 | {% else %} 10 | 11 | {% endif %} 12 | 15 | 28 |
  • 29 | {% elif nav_item == page %} 30 |
  • 31 | {% set toc_ = page.toc %} 32 | 33 | {% if toc_ | first is defined and "\x3ch1 id=" in page.content %} 34 | {% set toc_ = (toc_ | first).children %} 35 | {% endif %} 36 | {% if toc_ | first is defined %} 37 | 40 | {% endif %} 41 | 42 | {{ nav_item.title }} 43 | 44 | {% if toc_ | first is defined %} 45 | {% include "partials/toc.html" %} 46 | {% endif %} 47 |
  • 48 | {% else %} 49 |
  • 50 | 51 | {{ nav_item.title }} 52 | 53 |
  • 54 | {% endif %} 55 | -------------------------------------------------------------------------------- /SecurityPaper-themes/partials/nav.html: -------------------------------------------------------------------------------- 1 | 16 | -------------------------------------------------------------------------------- /SecurityPaper-themes/partials/palette.html: -------------------------------------------------------------------------------- 1 | {% macro primary(key) %}{{ { 2 | "red": "#ef5350", 3 | "pink": "#e91e63", 4 | "purple": "#ab47bc", 5 | "deep-purple": "#7e57c2", 6 | "indigo": "#3f51b5", 7 | "blue": "#2196f3", 8 | "light-blue": "#03a9f4", 9 | "cyan": "#00bcd4", 10 | "teal": "#009688", 11 | "green": "#4caf50", 12 | "light-green": "#7cb342", 13 | "lime": "#c0ca33", 14 | "yellow": "#f9a825", 15 | "amber": "#ffa000", 16 | "orange": "#fb8c00", 17 | "deep-orange": "#ff7043", 18 | "brown": "#795548", 19 | "grey": "#757575", 20 | "blue-grey": "#546e7a" 21 | }[key] }}{% endmacro %} 22 | {% macro accent(key) %}{{ { 23 | "red": "#ff1744", 24 | "pink": "#f50057", 25 | "purple": "#e040fb", 26 | "deep-purple": "#7c4dff", 27 | "indigo": "#536dfe", 28 | "blue": "#448aff", 29 | "light-blue": "#0091ea", 30 | "cyan": "#00b8d4", 31 | "teal": "#00bfa5", 32 | "green": "#00c853", 33 | "light-green": "#64dd17", 34 | "lime": "#aeea00", 35 | "yellow": "#ffd600", 36 | "amber": "#ffab00", 37 | "orange": "#ff9100", 38 | "deep-orange": "#ff6e40" 39 | }[key] }}{% endmacro %} 40 | -------------------------------------------------------------------------------- /SecurityPaper-themes/partials/search.html: -------------------------------------------------------------------------------- 1 | {% import "partials/language.html" as lang with context %} 2 | 24 | -------------------------------------------------------------------------------- /SecurityPaper-themes/partials/social.html: -------------------------------------------------------------------------------- 1 | {% if config.extra.social %} 2 | 8 | {% endif %} 9 | -------------------------------------------------------------------------------- /SecurityPaper-themes/partials/source.html: -------------------------------------------------------------------------------- 1 | {% import "partials/language.html" as lang with context %} 2 | {% set platform = config.extra.repo_icon or config.repo_url %} 3 | {% if "github" in platform %} 4 | {% set repo_type = "github" %} 5 | {% elif "gitlab" in platform %} 6 | {% set repo_type = "gitlab" %} 7 | {% elif "bitbucket" in platform %} 8 | {% set repo_type = "bitbucket" %} 9 | {% else %} 10 | {% set repo_type = "" %} 11 | {% endif %} 12 | {% block repo %} 13 | 14 | {% if repo_type %} 15 |
    16 | 17 | 18 | 19 |
    20 | {% endif %} 21 |
    22 | {{ config.repo_name }} 23 |
    24 |
    25 | {% endblock %} 26 | -------------------------------------------------------------------------------- /SecurityPaper-themes/partials/tabs-item.html: -------------------------------------------------------------------------------- 1 | {% if nav_item.is_homepage %} 2 |
  • 3 | {% if not page.ancestors | length and nav | selectattr("url", page.url) %} 4 | 5 | {{ nav_item.title }} 6 | 7 | {% else %} 8 | 9 | {{ nav_item.title }} 10 | 11 | {% endif %} 12 |
  • 13 | {% elif nav_item.children and nav_item.children | length > 0 %} 14 | {% set title = title | default(nav_item.title) %} 15 | {% if (nav_item.children | first).children %} 16 | {% set nav_item = nav_item.children | first %} 17 | {% include "partials/tabs-item.html" %} 18 | {% else %} 19 |
  • 20 | {% if nav_item.active %} 21 | 22 | {{ title }} 23 | 24 | {% else %} 25 | 26 | {{ title }} 27 | 28 | {% endif %} 29 |
  • 30 | {% endif %} 31 | {% endif %} 32 | -------------------------------------------------------------------------------- /SecurityPaper-themes/partials/tabs.html: -------------------------------------------------------------------------------- 1 | {% set class = "md-tabs" %} 2 | {% if page.ancestors | length > 0 %} 3 | {% set class = "md-tabs md-tabs--active" %} 4 | {% endif %} 5 | 14 | -------------------------------------------------------------------------------- /SecurityPaper-themes/partials/toc-item.html: -------------------------------------------------------------------------------- 1 |
  • 2 | 3 | {{ toc_item.title }} 4 | 5 | {% if toc_item.children %} 6 | 13 | {% endif %} 14 |
  • 15 | -------------------------------------------------------------------------------- /SecurityPaper-themes/partials/toc.html: -------------------------------------------------------------------------------- 1 | {% import "partials/language.html" as lang with context %} 2 | 34 | -------------------------------------------------------------------------------- /docs/1.SDL介绍/1-什么是SDL.md: -------------------------------------------------------------------------------- 1 | 2 | # 01.什么是SDL 3 | 4 | 作者:Lost Maniac 5 | 6 | ------ 7 | 8 | SDL是微软提出的一种软件开发安全生命周期管理的一种最佳安全实践,全称为Security Development Lifecycle。 9 | 10 | SDL是微软软件开发安全保障流程,结合了软件开发整个生命周期,将安全工程师嵌入到整个开发流程,和研发一起来协同工作保障整个软件生命周期内的安全。 11 | 12 | SDL分为7个步骤和16种最佳安全实践的方式来保证整体安全流程周期内的可控性。 13 | -------------------------------------------------------------------------------- /docs/1.SDL介绍/2-企业为什么需求SDL.md: -------------------------------------------------------------------------------- 1 | 2 | # 02.企业为什么需求SDL 3 | 4 | 5 | 作者:Murviet 6 | 7 | ----- 8 | 9 | 在SDL方法中,目的是为了从安全漏洞产生的根源上解决应用安全问题,通过对软件开发流程的控制,保证产品的安全性。 10 | 11 | 当一个企业对安全相对重视的情况下,在每年进行安全轮询时还总能找到各种各样的安全问题。每年的漏洞数量并没有明显的下降。这个时候就应该 12 | 考虑从根源解决问题。 13 | 14 | 由于企业的开发人员的技术参差不齐,部分相关开发者心中没有安全的相关概念、项目的上线及迭代更新没有相应的规范等等,这些问题都将会是导致出现安全问题的根本原因。 15 | 16 | 而SDL规范流程正是从根本原因解决这些问题。SDL对软件开发过程中所有参与该项目的相关工种,都将引入相关的安全概念,形成一个闭环,从而解决出现安全的根本问题。 -------------------------------------------------------------------------------- /docs/1.SDL介绍/3-哪些企业需要SDL.md: -------------------------------------------------------------------------------- 1 | 2 | # 03.哪些企业需要SDL 3 | 4 | 作者:Murviet 5 | 6 | ---- 7 | 8 | 哪些企业需要SDL 9 | 10 | 随着社会的发展,现在基本上所有的企业都在利用计算机网络进行办公,几乎所有的商业信息都存储在了网络之上。如果对信息安全不够重视,一旦商业机密被他人窃取,受到的经济损失将是无法估计的,有可能影响着企业的生死存亡。 11 | 12 | 理论上来讲对于信息安全,无论企业规模大小,无论企业信息的重要程度如何,注重信息安全是非常有必要的。但部分企业无法承担网络安全所带来的花销以及人力成本问题,所以企业要衡量一下网络安全在公司所占有的资源以及地位是否能够承受。对于互联网企业、软件开发商以及注重商业机密或大量用户信息依赖在网络环境中的相关企业都应重视网络安全问题。 13 | 14 | 对于拥有庞大的开发团队的企业,由于大量的开发人员以及产品的频繁迭代,推动SDL规范流程是目前最好的减少企业相关网络应用产品的安全问题。 15 | 16 | 推动SDL需企业具备以下条件: 17 | 18 | 1. 重视信息安全 19 | 2. 拥有成熟的开发和管理团队 20 | 3. 规范的产品研发和迭代流程 21 | -------------------------------------------------------------------------------- /docs/1.SDL介绍/4-SDL所带来的优缺点.md: -------------------------------------------------------------------------------- 1 | 2 | # 04.SDL所带来的优缺点 3 | 4 | 作者: 5 | 6 | ---- 7 | 8 | 未完成 9 | -------------------------------------------------------------------------------- /docs/2.SDL规范文档/10-SDL上线规定文档.md: -------------------------------------------------------------------------------- 1 | 2 | # 11. SDL上线规定文档 3 | 4 | 5 | 作者:Lost Maniac 6 | 7 | 协作: 8 | 9 | --- 10 | 11 | ## 1. 概述 12 | ### 1.1. 编制目的 13 | 14 | 为了提升公司各业务线产品的安全质量,降低安全风险,进一步提升公司整体安全水平,结合公司现有产品设计、开发、测试及上线流程,特制定此《XX产品安全开发流程》。 15 | 16 | ### 1.2. 适用范围 17 | 此流程适用于 **XX** 所有业务线产品的安全设计、开发、测试及上线。 18 | 19 | ## 2. 什么是安全开发流程(SDL)? 20 | 21 | SDL 的全称是 **Security Development Lifecycle**,即:安全开发生命周期。它是由微软最早提出的,是一种帮助解决软件安全问题的方法。SDL 中的方法,试图从安全漏洞产生的根源上解决问题。SDL 是一个安全保证的过程,通过对软件工程的控制,从而保证产品的安全性。它能够帮助企业以最小的成本提高产品的安全性,对企业安全的发展来说,可以起到事半功倍的效果。 22 | 23 | ## 3. 实施 SDL 的目的 24 | 实施 SDL 的核心目的只有一个,那就是通过在开发过程中加入安全控制的方法,提升各业务线项目、系统的安全性。避免因项目上线后存在安全漏洞被攻击者恶意利用而造成不必要的安全风险和损失。 25 | 26 | ## 4. 实施 SDL 的好处 27 | 28 | * 提前主动发现安全漏洞,降低安全风险和漏洞修复成本 29 | * 在项目开发前期就引入安全控制的方法,构建标准化安全开发流程,从根源上减少安全漏洞和降低安全风险 30 | * 保证所有项目在上线前都通知到安全团队 31 | 32 | 33 | ## 5. 如何实施安全开发流程 34 | 35 | ### 5.1. XX SDL 整体流程 36 | 37 | 38 | ![整体流程](/images/2018/10/01.jpeg) 39 | 40 | 41 | 42 | ### 5.2. 项目立项 43 | 要求:需要保证所有项目在立项时都通知到安全团队。 44 | 通知方式:邮件+企业微信、立项会议 45 | 46 | ### 5.3. 需求分析 47 | 48 | 要求:所有需求必须通过安全评审,由安全团队来评估需求是否存在安全风险或是否需要设计安全功能;如果安全评审未通过,不允许进入下一步研发流程 49 | 50 | 51 | > 安全评审流程: 52 | 53 | 54 | ![安全评审流程](/images/2018/10/02.jpeg) 55 | 56 | 57 | 安全评审成果:安全评审报告 58 | 安全评审沟通方式:邮件+企业微信、jira安全评审提交 59 | 60 | ### 5.4. 设计 61 | 62 | 在设计阶段,由产品和研发团队自查,确认是否有违反《XX开发安全红线准则》的行为。 63 | 64 | ### 5.5. 编码实现 65 | 在编码实现阶段,研发工程师应遵循 **《XX安全开发手册》**。 66 | 67 | ### 5.6. 测试验证 68 | 在开发工作完成后,应与功能测试同步进行安全测试,安全测试过程中发现的安全漏洞通过“jira XX安全团队漏洞提交”管理。 69 | 70 | 安全测试需求提交方式:邮件+企业微信、项目安全提测系统 71 | 72 | ### 5.7. 业务验收 73 | 在业务验收时,应同步进行安全验收,完成后由安全团队发布《XX项目安全验收报告》,如 74 | 果在安全验收过程中发现存在未修复的高危及严重级别安全漏洞,不允许进入上线发布环节。 75 | 76 | ### 5.8. 上线与维护 77 | 78 | * 如果未收到“通过安全验收”的报告,不允许私自上线发布项目。 79 | * 在项目上线前,由安全团队添加相应必要的安全监控、定期漏洞扫描。 -------------------------------------------------------------------------------- /docs/2.SDL规范文档/11-web应用安全业务自查checklist.md: -------------------------------------------------------------------------------- 1 | 2 | # 11. Web应用安全业务自查checklist 3 | 4 | 5 | 作者:realjac 6 | 7 | 协作:Melody 8 | 9 | --- 10 | 11 | ## 1. 概述 12 | ### 1.1. 编制目的 13 | 14 | * 此checklist用于业务线测试或开发人员在上线前进行安全自查 15 | * 安全前置落地实施,是将安全需求嵌入开发流程的急先锋 16 | 17 | ### 1.2. 编写原则 18 | - 便于业务理解常见安全风险 19 | - 方便业务检查项目中存在的最显而易见的风险点 20 | - 不求覆盖最全,保证能在业务落地使用 21 | - 基于公司常见场景出发的经验归纳 22 | 23 | ## 2. checklist内容 24 | 25 | | 业务功能 | 自查安全项 | 风险等级 | 满足/不满足/不适用 | 备注 | 26 | |:-------|:------------------------------------------------------------------------------------------|:-----|:-----------|:---| 27 | | 登录 | 1.系统应接入账号安全组统一登录平台 | 中 | | | 28 | | | 2.自建登录功能应使用验证码等二次验证机制,且验证码应在每次登录成功或失败后失效刷新; | 中 | | | 29 | | | 3.如密码等敏感信息应加密传输; | 中 | | | 30 | | | 4.外网系统应使用https传输登录信息; | 高 | | | 31 | | | 5.用户登录失败的提示信息应为“用户名或密码错误”/“登录失败”等模糊提示; | 低 | | | 32 | | 注册 | 1.应有二次审核机制,如手机/邮箱等方式验证 | 高 | | | 33 | | | 2.短信发送接口应限制针对同一手机号的请求频率; | 低 | | | 34 | | 密码找回 | 1.应有二次审核机制,如手机/邮箱等方式验证,不可修改需要验证的手机号/邮箱等; | 高 | | | 35 | | | 2.短信发送接口应限制针对同一手机号的请求频率; | 低 | | | 36 | | | 3.在每一步环节应判断上一步的合法性; | 中 | | | 37 | | 退出登录 | 1.session认证会话应配置过期时间,一般建议60min; | 低 | | | 38 | | | 2.点击退出后应销毁服务端认证session,使用户端cookie在退出登录后失效; | 中 | | | 39 | | 上传 | 1.上传功能文件后缀应使用白名单限制为业务需要的文件类型; | 高 | | | 40 | | | 2.应限制上传目录的权限,不允许赋予上传目录和上传的文件执行权限; | 中 | | | 41 | | | 3.建议使用公司统一的文件存储系统,如… | 中 | | | 42 | | 下载 | 1.下载目录应被限定在固定目录内,不允许被../../等路径操作跨目录访问其他文件; | 高 | | | 43 | | | 2.敏感资源应设置访问控制权限,只允许拥有授权的角色下载; | 高 | | | 44 | | 跨域需求接口 | 使用CORS跨域时,CORS安全配置: | | | | 45 | | | 1.应设置Access-Control-Allow-Origin及Origin白名单域名为可信域(xx.test.com); | 中 | | | 46 | | | 2.只有需要携带Cookie时,才允许设置Access-Control-Allow-Credentials头,且Origin白名单必须精细化设置,不允许如*.test.com的配置。 | 高 | | | 47 | | | JSONP接口: | | | | 48 | | | 1.必须使用白名单严格限制请求来源referer; | 高 | | | 49 | | 网络资源调用 | 1.应使用白名单限定允许调用的URL,特别针对内网的请求应严格限定; | 高 | | | 50 | | 调用系统命令 | 1.应使用白名单限定允许调用的系统命令; | 高 | | | 51 | | 敏感操作接口 | 1.应使用白名单限制请求来源referer或增加token等机制验证请求发起者身份; | 高 | | | 52 | | | 2.应记录应用操作日志; | 中 | | | 53 | | | 3.敏感操作接口如订单支付等,应使用悲观锁或乐观锁保证事务的ACID特性,解决并发竞争问题; | 高 | | | 54 | | | 4.对敏感资源进行操作时,应在服务端校验资源标识归属人是否与当前登录人一致; | 高 | | | 55 | | | | | | | 56 | | 漏洞扫描 | 1.上线前应使用自动化漏洞扫描工具扫描测试,确定无漏洞和安全风险; | 必须 | | | 57 | | 源代码审计 | 1.上线前应使用代码扫描工具进行扫描,确定无漏洞和安全风险; | 必须 | | | 58 | | 数据安全 | 数据处理:(参考公司数据分级标准) | | | | 59 | | | 1.对用户可控输入且最终会回显输出到页面的数据,应使用公司安全防护组件进行转义安全编码后再输出; | 中 | | | 60 | | | 2.应将SQL语句预编译处理,未能预编译处理的语句如order by子句应使用白名单控制用户允许的输入; | 高 | | | 61 | | | 3.应在前端对敏感字段(如手机号、身份证、银行卡号)脱敏展示; | 中 | | | 62 | | | 数据传输: | | | | 63 | | | 1.外网系统应使用https传输数据; | 中 | | | 64 | | | 2.敏感字段应脱敏/加密处理; | 中 | | | 65 | | | 数据存储: | | | | 66 | | | 1.日志中不应包含明文或未脱敏敏感数据; | 低 | | | 67 | | | 2.敏感数据应加密存储; | 中 | | | 68 | 69 | -------------------------------------------------------------------------------- /docs/2.SDL规范文档/2-php安全编码规范.md: -------------------------------------------------------------------------------- 1 | 2 | # 02.php安全编码规范 3 | 4 | 作者:tinker 5 | 6 | 协作: 7 | 8 | 注解:请根据业务安全等级需要自行协调以下建议。 9 | 10 | --- 11 | 12 | ## 1.配置 13 | php.ini基本安全配置 14 | 15 | --- 16 | 17 | ### 1.1应启用“cgi.force_redirect” 18 | cgi.force_redirect在php.ini中修改,默认是开启的,它可以防止当PHP运行的CGI脚本未经验证的访问。在IIS,OmniHTTPD和Xitami上是禁用的,但在所有其他情况下它应该打开。 19 | ```php 20 | ; php.ini 21 | cgi.force_redirect=1 ; 22 | ``` 23 | 24 | --- 25 | 26 | ### 1.2应禁用“enable_dl” 27 | 该指令仅对Apache模块版本的PHP有效。你可以针对每个虚拟机或每个目录开启或关闭dl()动态加载PHP模块。关闭动态加载的主要原因是为了安全。通过动态加载,有可能忽略所有open_basedir限制。默认允许动态加载,除了使用安全模式。在安全模式,总是无法使用dl()。 28 | ```php 29 | ; php.ini 30 | enable_dl=0 ; 31 | ``` 32 | 33 | --- 34 | 35 | ### 1.3应禁用“file_uploads” 36 | file_uploads默认是开启的,允许将文件上传到您的站点。因为来自陌生人的文件本质上是不可信甚至危险的,除非您的网站绝对需要,否则应禁用此功能。如果开启请进行相应的限制,参考upload_max_filesize, upload_tmp_dir,和post_max_size。 37 | ```php 38 | ; php.ini 39 | file_uploads = 0 ; 40 | ``` 41 | 42 | --- 43 | 44 | ### 1.4通过“open_basedir”限制文件访问权限 45 | open_basedir默认是打开所有文件,它将 PHP 所能打开的文件限制在指定的目录树,包括文件本身。本指令不受安全模式打开或者关闭的影响。当一个脚本试图用例如 fopen() ,include或者 gzopen() 打开一个文件时,该文件的位置将被检查。当文件在指定的目录树之外时 PHP 将拒绝打开它。所有的符号连接都会被解析,所以不可能通过符号连接来避开此限制。 46 | 47 | open_basedir应该配置一个目录,然后可以递归访问。但是,应该避免使用. (当前目录)作为open_basedir值,因为它在脚本执行期间动态解析特殊值 . 指明脚本的工作目录将被作为基准目录,但这有些危险,因为脚本的工作目录可以轻易被 chdir() 而改变。 48 | 49 | 在 httpd.conf 文件中,open_basedir 可以像其它任何配置选项一样用“php_admin_value open_basedir none”的方法关闭(例如某些虚拟主机中)。在 Windows 中,用分号分隔目录。在任何其它系统中用冒号分隔目录。作为 Apache 模块时,父目录中的 open_basedir 路径自动被继承。 50 | 51 | 用 open_basedir 指定的限制实际上是前缀,不是目录名。也就是说“open_basedir = /dir/incl”也会允许访问“/dir/include”和“/dir/incls”,如果它们存在的话。如果要将访问限制在仅为指定的目录,用斜线结束路径名。例如:“open_basedir = /dir/incl/”。 52 | ```php 53 | ; php.ini 54 | open_basedir="${USER}/scripts/data" ; 55 | ``` 56 | 57 | --- 58 | 59 | ### 1.5应禁用“session.use_trans_sid” 60 | 默认为 0(禁用)。当禁用cookie时,如果它开启,PHP会自动将用户的会话ID附加到URL。基于 URL 的会话管理比基于 cookie 的会话管理有更多安全风险,从表面上看,这似乎是让那些禁用cookie的用户正常使用您的网站的好方法。实际上,它使那些用户容易被任何人劫持他们的会话。例如用户有可能通过 email 将一个包含有效的会话 ID 的 URL 发给他的朋友,或者用户总是有可能在收藏夹中存有一个包含会话 ID 的 URL 来以同样的会话 ID 去访问站点。也可以从浏览器历史记录和服务器日志中检索URL获取会话ID。 61 | ```php 62 | ; php.ini 63 | session.use_trans_sid = 0 ; 64 | ``` 65 | 66 | --- 67 | 68 | ### 1.6会话管理cookie不能是持久的 69 | 没有固定生命周期或到期日期的Cookie被称为非持久性或“会话”cookie,这意味着它们只会持续与浏览器会话一样长,并且在浏览器关闭时会消失。具有到期日期的Cookie叫做“持久性”Cookie,他们将被存储/保留到这些生存日期。 70 | 71 | 管理网站上的登录会话应用非持久性cookie。要使cookie非持久化,只需省略该 expires属性即可。也可以使用session.cookie_lifetime实现。 72 | 73 | --- 74 | 75 | ### 1.7应禁用"allow_url_fopen"和"allow_url_include" 76 | allow_url_fopen和allow_url_include默认是开启的,他们允许代码从URL中读入脚本。从站点外部吸入可执行代码的能力,加上不完美的输入清理可能会使站点裸露给攻击者。即使该站点的输入过滤在今天是完美的,但不能保证以后也是。 77 | ```php 78 | ; php.ini 79 | allow_url_fopen = 0 80 | allow_url_include = 0 81 | ``` 82 | 83 | ## 2.编码 84 | php安全编码建议 85 | 86 | --- 87 | 88 | ### 2.1慎用sleep()函数 89 | sleep()有时用于通过限制响应率来防止拒绝服务(DoS)攻击。但是因为它占用了一个线程,每个请求需要更长的时间来服务,这会使应用程序更容易受到DoS攻击,而不是减少风险。 90 | ```php 91 | if (is_bad_ip($requester)) { 92 | sleep(5); // 不合规的用法 93 | } 94 | ``` 95 | 96 | --- 97 | 98 | ### 2.2禁止代码动态注入和执行 99 | eval()函数是一种在运行时运行任意代码的方法。 100 | 函数eval()语言结构是非常危险的,因为它允许执行任意 PHP 代码。因此不鼓励使用它。如果您仔细的确认过,除了使用此结构以外别无方法,请多加注意,不要允许传入任何由用户提供的、未经完整验证过的数据。 101 | ```php 102 | eval($code_to_be_dynamically_executed) // 不合规的用法 103 | ``` 104 | 105 | --- 106 | 107 | ### 2.3禁止凭据硬编码 108 | 因为从编译的应用程序中提取字符串很容易,所以永远不应对凭证进行硬编码。对于分发的应用程序尤其如此。 109 | 凭据应存储在受强保护的加密配置文件或数据库中的代码之外。 110 | ```php 111 | // 合规的用法 112 | $uname = getEncryptedUser(); 113 | $password = getEncryptedPass(); 114 | connect($uname, $password); 115 | ``` 116 | ```php 117 | // 不合规的用法 118 | $uname = "steve"; 119 | $password = "blue"; 120 | connect($uname, $password); 121 | ``` 122 | 123 | ### 2.4禁止危险函数 124 | 125 | 有时候,我们不希望执行包括system()等在那的能够执行命令的php函数,或者能够查看phpinfo信息的 126 | 127 |   phpinfo()等函数,那么我们就可以禁止它们: 128 | 129 |   disable_functions = system,passthru,exec,shell_exec,popen,phpinfo 130 | 131 |   如果你要禁止任何文件和目录的操作,那么可以关闭很多文件操作 132 | 133 |   disable_functions = chdir,chroot,dir,getcwd,opendir,readdir,scandir,fopen,unlink,delete,copy,mkdir,   rmdir,rename,file,file_get_contents,fputs,fwrite,chgrp,chmod,chown 134 | 135 |   以上只是部分常用的文件处理函数,你也可以把上面执行命令函数和这个函数结合,应该就能够抵制大部分的phpshell了。 136 | 137 | -------------------------------------------------------------------------------- /docs/2.SDL规范文档/4-python安全编码规范.md: -------------------------------------------------------------------------------- 1 | 2 | # 04.python安全编码规范 3 | 4 | 5 | 作者:I 6 | 7 | 协作: 8 | 9 | ------- 10 | 11 | ## python语言安全 12 | 13 | 本身要注意的有,一些危险函数,危险模块的调用,主要是系统调用。这个如果调用一定要对输入输出做好过滤,以下是代码中各种导致进行系统调用的方式。尽量避免。 14 | 15 | - 避免各种情况导致系统调用 16 | 17 | - 谨慎使用Eval 18 | 19 | - 数据序列化 20 | 21 | ## Web编程 22 | 23 | 对应Web编程中安全概念在python web框架中的实现。url跳转,目录遍历,任意文件读取也需要考虑在内。针对不同的框架也需要。 24 | 25 | ### Flask 安全 26 | 27 | - 使用Flask-Security 28 | - 直接生成 HTML 而不通过使用Jinja2 29 | - 不要在用户提交的数据上调用Markup 30 | - 使用 Content-Disposition: attachment 标头去避免上传html文件 31 | - 防止CSRF,flask本身没有实现该功能 32 | 33 | ### Django 安全 34 | 35 | 可参考[phithon](https://www.leavesongs.com)的博客,有较多相关资料。 36 | 37 | - 关闭DEBUG模式 38 | - 关闭swagger调试 39 | - 妥善保存SECRET_KEY 40 | - 使用SecurityMiddleware 41 | - 设置SECURE_HSTS_SECONDS开启HSTS头,强制HTTPS访问 42 | - 设置SECURE_CONTENT_TYPE_NOSNIFF输出nosniff头,防止类型混淆类漏洞 43 | - 设置SECURE_BROWSER_XSS_FILTER输出x-xss-protection头,让浏览器强制开启XSS过滤 44 | - 设置SECURE_SSL_REDIRECT让HTTP的请求强制跳转到HTTPS 45 | - 设置SESSION_COOKIE_SECURE使Cookie为Secure,不允许在HTTP中传输 46 | - 设置CSRF_COOKIE_SECURE使CSRF Token Cookie设置为Secure,不允许在HTTP中传输 47 | - 设置CSRF_COOKIE_HTTPONLY为HTTP ONLY 48 | - 设置X_FRAME_OPTIONS返回X-FRAME-OPTIONS: DENY头,以防止被其他页面作为框架加载导致ClickJacking 49 | - 部署前运行安全性检测 django-admin.py checksecure --settings=production_settings 50 | 51 | ## 审计工具 52 | 安装使用方式较为简单,所以不做介绍。 53 | - [AST-based static Analyzer: Bandit](https://github.com/openstack/bandit) 54 | - [Static Analyzer: PYT](https://github.com/python-security/pyt) 55 | 56 | ## 引用 57 | 58 | * [从Pwnhub诞生聊Django安全编码](https://www.leavesongs.com/PYTHON/django-coding-experience-from-pwnhub.html) 59 | * [Python安全编码与代码审计](http://xxlegend.com/2015/07/30/Python%E5%AE%89%E5%85%A8%E7%BC%96%E7%A0%81%E5%92%8C%E4%BB%A3%E7%A0%81%E5%AE%A1%E8%AE%A1/) 60 | * [Django Secure](https://django-secure.readthedocs.io/en/latest/settings.html) 61 | * [Flask安全注意事项](http://docs.jinkan.org/docs/flask/security.html) 62 | * [Python安全和代码审计相关资料](https://github.com/bit4woo/python_sec) 63 | * [Flask debu pin 安全问题](https://xz.aliyun.com/t/2553) 64 | * [Python沙箱逃逸的n种姿势](https://xz.aliyun.com/t/52) 65 | * [Escaping python sanbox](https://zolmeister.com/2013/05/escaping-python-sandbox.html) 66 | * [Pickle Security](http://v0ids3curity.blogspot.com/2012/10/exploit-exercise-python-pickles.html) 67 | * [Security Guide for developers](https://github.com/FallibleInc/security-guide-for-developers) -------------------------------------------------------------------------------- /docs/2.SDL规范文档/5-nodejs安全编码规范.md: -------------------------------------------------------------------------------- 1 | # 05.nodejs安全编码规范 2 | 3 | 4 | 作者: 5 | 6 | 协作: 7 | 8 | ------- 9 | 10 | 未完成 -------------------------------------------------------------------------------- /docs/2.SDL规范文档/7-产品设计开发最佳实践.md: -------------------------------------------------------------------------------- 1 | 2 | # 08.产品设计开发最佳实践 3 | 4 | 5 | 作者: 6 | 7 | 协作: 8 | 9 | ------- 10 | 11 | 未完成 -------------------------------------------------------------------------------- /docs/2.SDL规范文档/8-常见协议安全开发实践.md: -------------------------------------------------------------------------------- 1 | 2 | # 09. 常见协议安全 3 | 4 | 5 | 作者:I 6 | 7 | 协作: 8 | 9 | ------- 10 | 11 | 本文档通过介绍常见开发过程中因协议配置错误或代码漏洞而导致安全的问题去避免类似现象的发生。 12 | 常见开发过程中的协议: 13 | 14 | * HTTPS 15 | * WebSocket 16 | * JWT 17 | * OAuth 18 | * Json 19 | * XML 20 | 21 | ### WebSocket 安全 22 | 23 | - 输入未做校验 24 | - 帧数大小未做限制 25 | - 最大连接数未做限制,既可以耗尽客户端也可以耗尽服务端 26 | - 持久链接过多未自动关闭 27 | - Origin头部未做验证 28 | - 未采用HTTPS 29 | - 访问策略未做限制,存在越权现象(授权需由服务端限制) 30 | 31 | ## OAuth 安全 32 | 33 | - 回调域名需要白名单限制访问 34 | - OAuth Token泄露 35 | - Refer消息头泄露Authorization Code 36 | 37 | ## JWT安全 38 | 39 | ## Json, XML安全 40 | 41 | 42 | 43 | 44 | ## 引用 45 | 46 | * [WebSocket应用安全问题分析](https://security.tencent.com/index.php/blog/msg/119) -------------------------------------------------------------------------------- /docs/3.SDL落地方案/1-安全培训.md: -------------------------------------------------------------------------------- 1 | 2 | # 01.安全培训 3 | 4 | 作者:Lost Maniac 5 | 6 | 协作:李浩、袁文宇、I、Gòd、玄道k4n5ha0、johnathan、一条鱼、dubbo、夏韬、jsp-shell、108haili、1024、小乐天、fireeye、backlion、Minggle、Pa55w0rd 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 | * 敏感数据上传到云笔记、GitHub 35 | * 共享账号 36 | * 使用公司邮箱注册外部账号或者私人账号 37 | * 社交网络发布公司技术解决方案&保密产品信息 38 | * 公司账号和私人账号要隔离 39 | * 打印后及时取走 40 | * 定期删除浏览记录和搜索记录 41 | 42 | * 个人电脑安全 43 | * 锁屏幕 44 | * 不轻易插入陌生U盘 45 | * 及时的系统更新 46 | * 不从外部下载破解软件(有需要请找IT同学) 47 | * 不将公司数据带离工作场所 48 | * 电脑要加开机密码,防止电脑丢失后造成数据泄露 49 | * 企业微信、微信、QQ、QQ群文件发送文件要打包加密 50 | * 工作文档加密盘(利用如TrueCrypt的之类的加密软件) 51 | 52 | * 密码泄露 53 | * 根据调查显示目前全世界泄露账号密码以及个人隐私有800亿条 54 | * 密码使用超过12位以上使用特殊字符、大小写字母和数字 55 | * 密码不要与公司内部密码有关联 56 | * 密码三个月要更换一次 57 | * 不在浏览器上使用保存密码功能 58 | 59 | * WiFi安全 60 | * 不连接不可信WiFi 61 | * 连接不可信WiFi后需要连接VPN 62 | * 不要在工作区私自桥接,共享办公网WIFI 63 | * 不要使用WIFI万能钥匙等共享密码的APP 64 | 65 | * VPN以及OA安全 66 | * VPN账号和OA账号仅自己持有 67 | * 任何人不会和你以任何理由要VPN以及OA账号 68 | * VPN的动态验证短信不转发给其他人 69 | 70 | * 客服注意事项 71 | * 我在和谁聊天 72 | * 确定对方身份的流程 73 | * 我可以提供哪些信息 74 | * 敏感操作回拨验证人员身份 75 | 76 | * 物理安全 77 | * 门禁 78 | * 碎纸机(防止泄露商业信息) 79 | * 视频监控 80 | * 禁止人员尾随进入工作区 81 | 82 | ## WEB安全开发 83 | 84 | * XSS跨站漏洞 85 | * SQL注入 86 | * 跨站请求伪造漏洞 87 | * 支付逻辑漏洞 88 | * 越权漏洞 89 | * 平行权限 90 | * 验证码逻辑漏洞 91 | * API未限速漏洞 92 | * GitHub敏感信息泄露 93 | * 法律风险意识 94 | 95 | ## APP安全开发 96 | 97 | * 数据安全 98 | * 存储 99 | * 传输 100 | * 使用 101 | * 验证 102 | * 代码安全 103 | * 逆向 104 | * 调试 105 | * 重新打包 106 | * 环境特性 107 | * 系统 108 | * 组件 109 | * 权限 110 | * 端口 111 | * 业务安全 112 | * 逻辑漏洞 113 | * 策略 114 | * 合规 115 | 116 | ## 安全运维 117 | 118 | * 服务器安全 119 | * MFA登录 120 | * 使用key登录 121 | * 禁止弱密码登录 122 | * 禁用无用账号 123 | * 账号锁定策略(防止暴力破解,ssh:fail2ban) 124 | * 检查特殊账号(空口令) 125 | * 禁止root远程登录 126 | * 关闭非必须服务器服务 127 | * 安装IDS/IPS系统 128 | * 进行日志收集 129 | 130 | * 更新 131 | * 系统版本要尽量贴近官方版本 132 | * 软件版本(例如:php)要及时升级 133 | 134 | * 日志 135 | * 收集全面 136 | * 实时传输 137 | * 重点日志例如 ssh 内核日志 业务日志 138 | * 业务日志要脱敏 139 | 140 | * 软件安装 141 | * 只允许可信软件源 142 | * 需要新软件需要经过安全评估 143 | * 业务代码尽量不使用root权限运行 144 | 145 | * 网络安全 146 | * ACL限制不需要互相访问的业务通讯 147 | * 安全组不要附加 148 | * snmp修改团体名称 149 | 150 | * 数据安全 151 | * 杜绝弱口令 152 | * 禁止匿名用户 153 | * 数据库加密(按照最小化权限原则) 154 | * **Redis必须加密** 155 | * 大数据服务必须有鉴权 156 | * MongoDB必须加密码 157 | 158 | * 流程安全控制 159 | * 运维准入 160 | * 域名开通流程 161 | * VPN申请流程 162 | * 跳板机申请流程 163 | 164 | 165 | * 物理安全 166 | * 机房服务器不允许使用USB接口 167 | * VGA显示器应该处于退出状态 168 | 169 | 170 | ## 产品经理安全培训 171 | 172 | * 敏感信息泄露 173 | * 调试开关 174 | * 防重签名 175 | * http-dns 176 | * 数据包劫持 177 | * 登录机制安全性 178 | * 防暴力破解 179 | * 时间窗口合理性 180 | * 不要成为短信轰炸机 181 | * 任意用户密码重置 182 | 183 | 184 | ## 引用 185 | -------------------------------------------------------------------------------- /docs/3.SDL落地方案/2-需求评估.md: -------------------------------------------------------------------------------- 1 | 2 | # 02.需求评估 3 | 4 | 作者:I 5 | 6 | 协作: 7 | 8 | ---- 9 | 10 | 记录一次安全设计评审的过程,当然这也是我第一次进行安全评审。因此做一个总结。安全设计评审应该是SDL落地安全人员参与过程中首当其冲的地方。仅指安全人员自身的功用。如果按照`SDL`流程来讲,最前期应该是进行安全培训。我们可以看两个微软SDL官方给出的流程图。 11 | ![image](https://user-images.githubusercontent.com/12653147/45536074-ee425400-b832-11e8-9ca7-442923291a3f.png) 12 | 13 | ![image](https://user-images.githubusercontent.com/12653147/45536096-01edba80-b833-11e8-8c10-7d9f2387ee44.png) 14 | 15 | 16 | 那么在安全设计评审这一阶段,应该怎么去做。我们可以先看下唯品会的SDL中在落地安全设计这一块怎么做的。 17 | 18 | ![image](https://user-images.githubusercontent.com/12653147/45603582-d4398900-ba5f-11e8-97c3-41704aa37024.png) 19 | 20 | 21 | 就我自身而言。是按照以下这个流程进行的。 22 | 23 | 24 | 25 | 看着一大堆乱七八糟,自上而下的流程,但是做起来其实很快的。此处默认安全人员熟悉各种基本的开发过程中的安全规范以及一些`Checklist`(必须要了解公司开发语言对应的安全开发规范),举例: `web`安全开发规范,`Python`安全编码规范,`Flask`安全, `Django`安全,常用的安全配置,面临哪些攻击点等等。 26 | ps: 明确逻辑是非常重要的,可以说最为重要,如果连逻辑都不明白,谈什么设计评审。 27 | 28 | 一些比较基础的: 29 | 30 | * HTTPS Everywhere 31 | * Bcypt 存储Hash 32 | * OTP 33 | * 频率限制 34 | * 盐不要硬编码 35 | * secret 和 auth-token 不要硬编码 36 | * 服务器间调用的api不要在app出现 37 | * CSP, CSRF, HSTS, X-FRAME-OPTIONS, X-XSS-PROTECTION 38 | * 过滤输入 39 | 等等等.... 40 | 41 | 下面以`C2C`平台交易部分为例进行说明,可以简单的想一下,在智联买一张火车票,打开了支付宝进行支付。: 42 | ![image](https://user-images.githubusercontent.com/12653147/45537646-67dc4100-b837-11e8-9154-a3f78020d931.png) 43 | 44 | 然后,你知道数字签名当然是很基础的部分了。那么接下来,你就要细化支付流程过程中出现哪些操作,针对这些操作需要做什么样的防护措施。下图是针对用户商户支付方之间的流程: 45 | 46 | ![image](https://user-images.githubusercontent.com/12653147/45538041-84c54400-b838-11e8-9426-f8e2074c78ca.png) 47 | 48 | 针对每个输入点,自身可控的输入输出的地方,进行过滤,校验等操作。 49 | 50 | 所以那么问题来了,如果只单单是用户和支付方之间的呢? 51 | ![image](https://user-images.githubusercontent.com/12653147/45539501-88f36080-b83c-11e8-8b18-26a204eaf0a9.png) 52 | 53 | 你也可以思考一下如何进行。 54 | 55 | 并且在`OWASP`应用安全设计中,详细指出了其他一些问题(中文版 Version 1.0 5): 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 | 下图(来自OWASP官方文档)详列上述条目以及其他需要检查的地方。 94 | ![image](https://user-images.githubusercontent.com/12653147/45603390-385b4d80-ba5e-11e8-9135-5b8352202820.png) 95 | ![image](https://user-images.githubusercontent.com/12653147/45603400-47420000-ba5e-11e8-9ac6-07ff0aedcc90.png) 96 | 97 | 但是其实并不需要按照上述所有清单做自检,或者说是当你和开发团队在讨论的过程中不需要涉及全部的checklist,可能只需要在架构上,设计上进行检验,以及身份验证和数据检验上。当然,都是需要根据自己的业务场景去实现,因地制宜。 98 | 99 | # Resources 100 | 101 | * [Mircosoft SDL lifecycle: Desing](https://www.microsoft.com/en-us/SDL/process/design.aspx) 102 | * [API Security Checklist](https://github.com/shieldfy/API-Security-Checklist) 103 | * [The Security Checklist](https://github.com/FallibleInc/security-guide-for-developers) 104 | * [Part of FLASK Security](https://gist.github.com/mylamour/702d9d6e24a27699d8759967e6eb9f4f) 105 | * [Part of Django Security](https://gist.github.com/mylamour/311299cc7fb80ad9f6674b2cf4ca02a4) 106 | -------------------------------------------------------------------------------- /docs/3.SDL落地方案/3-产品设计.md: -------------------------------------------------------------------------------- 1 | 2 | # 03.产品设计 3 | 4 | 5 | 作者:Pa55w0rd 6 | 7 | 协作: 8 | 9 | ---- 10 | 11 | 12 | ## 1.应用系统架构安全设计要求 13 | 14 | 在应用系统设计阶段,应充分考虑该架构的安全性,包括B/S、C/S等形式的安全,主要体现在应用数据和用户会话的安全,还应当考虑应用系统自身体系架构内部的安全,以及与外系统接口的安全。针对某些特殊应用,还需考虑复、抗攻击等安全机制。 15 | 16 | ### 1.1.应用系统自身架构安全 17 | 1. 自身结构中各组件之间通讯过程的安全机制
    18 | 组件之间的通讯包括命令级的和数据级的,应充分考虑: 19 | - 传输命令和数据所采用的协议的安全性。应根据组件之间通讯内容安全性要求程度的不同选择不同安全性要求的协议; 20 | - 考虑程序的模块之间的安全通讯机制; 21 | - 不应使用标准的服务端口或者常见病毒、蠕虫等使用的服务端口。 22 | 23 | 2. 认证与访问控制机制,应考虑: 24 | - 组件之间的信任机制; 25 | - 用户的身份认证机制; 26 | - 对于组件资源的访问控制机制; 27 | - 不通用户对资源的权限控制机制。 28 | 29 | 3. 组件内重要文件和数据的安全防护机制:
    30 | 存在于组件内部的重要数据资源应当考虑其相应的安全防护机制,这些重要的数据资源包括: 31 | - 配置文件; 32 | - 用户数据,包括文件数据及数据库中的数据; 33 | - 临时文件和数据; 34 | - 与外系统或者系统内部其他组件接口用的数据文件。 35 | 36 | 对这些重要数据的存取安全性设计,包括: 37 | - 文件和数据存放是否加密及采用的加密方式。 38 | 39 | ### 1.2.应用系统与外系统接口的安全 40 | 41 | 应用系统与外系统的接口安全设计,主要应考虑以下几个要素: 42 | 1. 与外系统的之间通讯中的安全机制。应充分考虑: 43 | - 传输命令和数据所采用的协议的安全性。应根据系统之间通讯内容安全性要求程度的不同选择不同安全性要求的协议; 44 | - 建议不使用默认的服务端口或者常见病毒、蠕虫等使用的服务端口。 45 | 46 | 2. 与外系统的认证与访问控制机制,应考虑: 47 | - 系统之间的信任机制; 48 | - 对于系统之间资源的访问控制机制。 49 | 50 | 3. 对外系统安全机制的符合性,应考虑: 51 | - 如果外系统采用的接口方式经评估认为是安全的,本系统应当沿用其接口规范进行设计开发; 52 | - 如果外系统采用的接口方式经评估认为存在安全缺陷,应商定采用更加安全的接口方式; 53 | - 在考虑接口安全性的同时,也应当注意接口方式对双方系统性能、磁盘、连接数等各种性能指标和资源的影响。 54 | 55 | ### 1.3.应用系统其他的安全机制 56 | 除了上述基本的安全架构设计内容外,针对不同的应用,以及应用系统的重要程度,可以补充考虑以下几种安全机制: 57 | 1. 针对Web应用的页面保护与恢复机制。
    58 | 利用专用的安全产品,或者系统自身设计时就考虑到了对于Web页面进行静态保护和监控问题,当监控到网页被篡改时能够实时恢复页面。 59 | 2. 针对特殊数据的完整性检查和监控机制。
    60 | 应用系统自身的审计机制。这一点也可算作是应用系统的安全功能设计的一部分,参见相关章节的要求。 61 | 3. 应用系统安全性分析。
    62 | 任何系统都会存在一定的安全缺陷,关键在于风险和缺陷是否可以被容忍,因此,在应用系统设计完成后,应当就其安全性问题进行自我分析和评价。 63 | 64 | ## 2.应用系统软件功能安全设计要求 65 | 除了在架构上考虑的安全机制外,这些安全机制及相关的安全功能也应当分配在应用系统软件的各部件中。应用系统在开发中应该考虑如下五个方面的安全功能: 66 | - 安全审计; 67 | - 通讯安全(此部分内容在架构中进行了设计); 68 | - 数据保护; 69 | - 认证与授权; 70 | - 资源保障。 71 | 72 | ### 2.1.认证与授权功能的设计 73 | 1. 应用软件应包含用户身份认证体系的强度设计,重要系统应使用双因素认证措施,加强系统安全性: 74 | - 用户名、口令认证; 75 | - 一次性口令、动态口令认证; 76 | - 证书认证;(可选) 77 | - 生物特征的认证(签名、声音、指纹、虹膜、视网膜等)。(可选) 78 | 2. 应用软件应包含认证失败后的处理方式设计 79 | - 连续失败3次,将锁定登录账号一个小时。账号锁定后可以由系统管理员解锁,也可以在一段时间后自动解锁; 80 | - 通知用户认证失败,防止黑客暴力猜测; 81 | - 验证码的功能; 82 | - 账号复杂度提醒功能。 83 | 3. 应用软件应包含用户权限分配和管理功能设计。 84 | - 系统编码中要实现读、写、执行三个权限的分离设计; 85 | - 系统查看、配置、修改、删除、登录、运行等权限设计; 86 | - 数据访问范围的权限设计; 87 | - 应用功能模块使用权限的设计。 88 | 4. 应用软件应包含接口设计,应明确系统的内部结构和外部接口,对于每一个对外接口应详细说明: 89 | - 需要通信的对方系统的安全状况和可信程度; 90 | - 需传送的数据的保密性和完整性要求; 91 | - 对传送数据的合法性检验规则; 92 | - 对通信可靠性的要求; 93 | - 与外部系统的互相认证方面的需求。 94 | 95 | ### 2.2.数据安全功能 96 | 1. 应用系统的数据安全功能,应当根据安全需求进行功能设计,内容涉及:数据库的安全、数据采集、数据传输、数据处理、数据存储、数据备份和恢复的安全。对重要的敏感数据应进行加密和完整性保护。 97 | 2. 应用软件应包含输入的安全性设计,主要指对错误输入、恶意输入进行处理。 98 | 3. 应用软件应包含输出的安全性设计。 99 | 100 | ### 2.3.安全审计功能 101 | 1. 应用系统具备如下安全审计功能: 102 | - 审计功能的启动和关闭; 103 | - 变更审计功能的配置信息; 104 | - 至少应进行审计的事件:进入和退出的时间(登录、退出系统)、异常的系统使用行为(失败登录)、系统维护行为、敏感行为和其它安全功能要求的审计内容; 105 | - 每个审计记录中至少记录如下信息:事件的日期和时间、事件的类型、主题标识、事件的结果(成功、失败)和事件相关信息。 106 | 2. 应用系统应支持数据查阅审计功能:按照主题、事件查阅;应用系统应明确用户能够查阅审计数据用户。 107 | 3. 在意外情况出现时,应有措施保证审计数据的可用性,当审计记录溢出时采取保护行动。 108 | 109 | ### 2.4.容错功能设计 110 | 1. 应用软件应包含各模块的出错处理设计。 111 | 2. 应用软件应包含可能出现的各种异常情况的安全处理设计。 112 | 3. 应用软件应包含抗网络攻击的能力的设计及系统脆弱性分析。4、对于应用软件本身的资源及服务的优先保障设计。 113 | 114 | ## 3.应用系统存储安全设计要求 115 | 在应用系统存储安全设计时,应对系统的存储容量、存储介质、存储备份内容、存储备份方式、存储设备功能要求及相关的存储技术统筹进行考虑。 116 | 117 | ### 3.1.应用系统的存储容量设计 118 | 应依据对于应用数据的测算,估算应用系统的存储容量,建议在存储容量估算时应考虑以下要求: 119 | - 在实际估算值上预留20%的存储余量,并考虑未来的应用存储量的增长需求。 120 | - 考虑到应用系统自身的审计数据的容量、保存期限以配置相应的存储设备。 121 | - 对于应用系统中的临时数据和过渡数据,应当设计其保存的时间,并以此考虑这部分的存储容量要求。 122 | 123 | ### 3.2.应用系统的存储介质选择 124 | 应用系统的存储介质主要包括但不限于:磁带、纸带、闪存、软盘、光 125 | 盘、磁盘和磁盘阵列。具体存储介质的选择应依据应用系统的业务种类及存储周期的要求,采用不同的介质。 126 | 1. 对于应用系统的交易数据,应采用高性能、高可靠的存储介质,如磁盘、磁盘阵列等进行存储; 127 | 2. 对于应用系统的历史数据,应采用可靠、稳定的存储介质,如磁带、光盘等进行存储。 128 | 129 | ### 3.3.应用系统存储备份对象 130 | 应用系统对于其储存备份的对象设计,应包括如下内容: 131 | 1. 系统数据的备份:应包括Web服务器的网站内容、Mail服务器的邮件实时备份、数据库、文件服务器中的文件以及其他数据; 132 | 2. 系统的完全备份:应包括关键的、需要快速恢复的设备,通过磁带机的完全备份,应实现快速的灾难恢复; 133 | 3. 系统的冗余主机备份:对于关键并且不能停止的服务设备(如计费服务、Web、Mail服务器),应考虑使用多台主机进行冗余备份,以保证当任何一台主机发生故障时,服务器仍可提供服务; 134 | 4. 系统配置的备份:应包括关键路由器的配置、防火墙的配置、各类服务器操作系统的安全配置以及各类服务器(如Web、Mail、文件服务器等)中服务器软件(如Apache、Sendmail)的配置。 135 | 136 | ### 3.4.应用系统存储备份方式 137 | 应用系统应当根据不同的阶段,系统数据不同的重要程度,对数据采取不同的备份方式: 138 | 1. 完全备份
    139 | 使用备份介质对整个系统进行完全备份,包括系统和数据。这种备份方 140 | 式的优点是直观,容易被人理解,而且当数据丢失时,可以快速恢复丢失的数据。它也有不足之处,即: 141 | - 定期对系统进行完全备份,因此在备份数据中有大量的重复信息,占用了大量的存贮空间,增加了备份成本; 142 | - 需要备份的数据量大,因此备份所需要的时间较长。
    143 | 建议在关键性应用系统的实施前、实施后、变更以及升级等重要操作时, 144 | 对操作系统进行完全备份。针对信息较小的不断变化的,且变化的内容大于 145 | 50%的,定期进行完全备份。 146 | 2. 增量备份
    147 | 每次备份的数据只是相当于上一次备份后增加和修改过的数据。没有重 148 | 复的备份数据,节省备份介质的空间,缩短了备份时间。这种备份的优点很明显,同时也存在某些不足之处,即当发生灾难时,恢复数据比较麻烦。 149 | 建议在关键性应用系统正常运行维护阶段,针对变化的、不断增加的信息,定期进行增量备份。 150 | 3. 差异备份
    151 | 每次备份的数据只是相当于上一次完全备份后新增加和修改过的数据, 152 | 即采用完全备份和差异备份相结合备份策略。如每周日进行一次完全备份, 153 | 而周一至周六进行差异备份。其优点为:没有重复的备份数据,即节省备份介质的空间,缩短了备份时间;缺点为:当发生灾难时,恢复数据比较麻烦。 154 | 建议应用系统的正常运行维护阶段,针对不断变化的(变化的内容小于 155 | 50%)系统,定期进行差异备份。 156 | 4. 按需备份
    157 | 按需备份是指在正常的备份安排之外,额外进行的备份操作,这种备份 158 | 方式可以弥补冗余管理以及长期转存的日常备份的不足。因此它是一种非常 159 | 灵活、重要的备份方式,在应用系统的各个阶段,如果备份的内容较少,可以采用按需备份。
    160 | 建议应用系统在下列情况下采取按需备份: 161 | - 只需要备份很少的几个文件、目录、数据库或数据库中的表; 162 | - 备份服务器上必要的配置文件。 163 | 5. 排除备份
    164 | 排除备份是指排除不需要的文件后再进行备份。从本质上讲,排除备份不是一种备份方法,只是减少备份冗余的一种方法。
    165 | 建议应用系统在下列情况下考虑排除备份: 166 | - 有些文件非常大,但并不重要; 167 | - 某些文件总是导致备份异常或出错。 168 | 169 | ### 3.5.应用系统的存储设备功能要求 170 | 应用系统存储设备的功能要求应包括如下内容: 171 | 1. 存储设备应保证数据的高可用性和完整性要求; 172 | 2. 存储设备应具有在多主机环境下工作的能力; 173 | 3. 存储设备应能方便地做到快速备份和恢复,重要系统应做到双机备份、支持热插拔; 174 | 4. 存储设备应有简便的、功能强大的管理工具,做到对整个存储系统的监视与控制。 175 | 176 | ## 4.应用系统通讯安全设计要求 177 | 1. 应采用安全通信协议对重要数据进行安全传输(尤其是账号、口令信息),如使用SSL/TLS、HTTPS、SFTP和IPSec等安全协议进行通信: 178 | - 终端与服务器端之间的WWW服务,建议使用HTTPS安全通信协议; 179 | - 终端与服务器端之间的FTP服务,建议使SFTP安全通信协议; 180 | - 终端与服务器端之间的Telnet服务,建议使SSH安全通信协议。 181 | 2. 终端应用程序采用加密传输机制对重要信息进行传输。 182 | 3. 终端应用程序采用完整性检查对业务的重要数据或敏感数据进行检查。 183 | 4. 终端应用程序应采用抗抵赖攻击技术对重要的交互信息进行保护。 184 | 5. 终端应用程序使用固定的通信端口。 185 | 186 | ## 5.应用系统数据库安全设计要求 187 | 1. 应从以下方面进行数据库的选型: 188 | - 数据库、应用系统的运行环境; 189 | - 数据库的稳定性、安全性(多级安全); 190 | - 数据库的容量(最多支持的库的数目、表的数目、记录数目); 191 | - 数据库的存取速度; 192 | - 是否支持多种备份方式; 193 | - 是否支持数据库的导入和导出。 194 | 2. 应明确数据库相关的用户管理、资源管理、特权管理和角色管理,明确各种用户的资源权限,并建立规范的权限文档。 195 | 3. 数据库原则上应及时更新重要补丁。在安装补丁前应先在测试环境进行,提前进行数据备份,充分准备回退方案和应急预案。 196 | 4. 数据库的配置应符合相应的基线配置要求。 197 | 5. 应及时修改数据库的默认密码或将默认账号锁定、删除。 198 | 6. 数据库的账号应根据业务和维护需要进行合理分配,避免账号共用。 199 | 200 | ## 6.应用系统数据安全设计要求 201 | 202 | ### 6.1.数据采集安全 203 | 应根据数据采集的内容、采集的频率、数据精确度要求、时间特性等来进行数据采集的安全要求设计,数据采集服务器和采集主机应考虑30%的系统开销及冗余。 204 | 205 | ### 6.2.数据传输安全 206 | 1. 应按照数据的类型、数据的重要程度、网络的安全状况等综合因素,对 207 | 数据的传输采取不同的安全保护,包括但不限于防火墙、IDS、VPN、病毒防护等安全措施。 208 | 2. 应了解数据传输存在安全隐患的网络或设备,对存在安全隐患的网络采取必要的安全技术,包括但不限于安全通信协议、加密算法、完整性检查算法以及抗抵赖攻击方法等。 209 | 3. 应制定数据传输安全的检查方式,包括但不限于数据传输安全抗主动攻击能力检查、被动抗攻击的能力检查。 210 | 4. 应保障“数据传输安全”有关的重要配置参数安全,包括但不限于口令、加/解密算法、加/解密密钥等。 211 | 5. 应采用安全通信协议对数据进行安全传输,如使用SSL/TLS、HTTPS、 212 | SFTP和IPSec等安全协议进行通信。 213 | 6. 对传输的信息进行不同等级的加密保护,即根据网络或设备的风险、传输内容安全要求的不同,选择不同安全强度的加密算法对信息进行加密传输。建议使用RSA等高强度的密码算法对非常重要的信息(如口令、加密密钥)进行加密传输;对于普通数据的传输,可以采用DES、3DES 214 | 等加密算法进行加密传输。 215 | 7. 应防止对所传输数据进行未经授权的任何形式的修改,即对业务的重要数据或敏感数据,建议使用MD5、SHA等算法对数据完整性进行保护。 216 | 8. 对重要的交互信息,建议采取抗抵赖技术,包括但不限于数字签名技术。 217 | 9. 为了配合网络其它安全设备,建议采用基于用户名/口令的认证技术、 218 | VLAN技术、MPLS技术等安全技术手段。 219 | 220 | ### 6.3.数据处理安全 221 | 1. 应根据数据的类型、数据的处理方式、数据的安全性要求、与其它接口 222 | 有关的敏感等级、数据相关业务应用的重要性程度来进行数据处理过程的安全性设计。 223 | 2. 应对原始数据进行检错和校验操作,保证原始数据的正确性和完整性。 224 | 3. 数据在转换过程中,应采用通用的标准格式,应考虑相关的不同系统和不同应用的格式需求。 225 | 4. 数据处理过程应提供处理数据的状态信息和数据处理过程的动态信息。 226 | 5. 数据处理过程应具备异常处理功能,在任一环节发现问题,均应能及时回退,必要时可以人工处理。 227 | 6. 数据处理的中间过程和中间结果不能暴露给第三方。 228 | 229 | -------------------------------------------------------------------------------- /docs/3.SDL落地方案/4-代码编写.md: -------------------------------------------------------------------------------- 1 | 2 | # 04.代码编写 3 | 4 | 5 | 作者:tinker 6 | 7 | 协作: 8 | 9 | ---- 10 | 11 | ## 1.编写《企业安全编码规范》 12 | 根据公司所使用技术栈的不同,进行编码规范设计。 13 | 14 | ## 2.制度流程建设 15 | 建立完善的代码测试、反馈、上线流程。对开发人员代码质量问题、代码安全问题进行考核。 16 | 17 | 参考:代码提交-代码审计-反馈问题-修复问题-测试环境部署 18 | 19 | 建立漏洞处理流程,对开发人员漏洞修复效率进行考核。 20 | 21 | 参考:安全人员提交漏洞-开发人员知悉漏洞-开发人员开始修复漏洞-开发人员修复完成漏洞-安全人员复测漏洞-安全人员复测完成或者复测不通过漏洞。 22 | 23 | ## 3.白盒审计工具推荐 24 | 使用工具将《企业安全编码规范》进行落地。 25 | 26 | ### 1.sonar(开源) 27 | 基于可定制规则进行静态代码扫描,从而帮助开发人员能够编写更清晰,更安全的代码。 28 | 29 | 优点: 30 | 31 | 1.开源~开源~开源~ 32 | 2.可定制规则(需要一定技术实力进行开发) 33 | 3.支持CI/CD过程集成 34 | 4.支持Code Review阶段反馈 35 | 5.目前官方给出了超过25种语言的支持 36 | 37 | 缺点: 38 | 39 | 1.不支持代码动态分析 40 | 41 | 相关链接: 42 | 43 | https://www.sonarqube.org/ 44 | https://github.com/SonarSource/sonarqube 45 | 46 | 47 | -------------------------------------------------------------------------------- /docs/3.SDL落地方案/5-渗透测试.md: -------------------------------------------------------------------------------- 1 | 2 | # 05.渗透测试 3 | 4 | 作者:枫子 5 | 6 | 协作:Lost Maniac 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 | * 第十一条主机系统安全 针对Windows、Linux、AIX等操作系统进行渗透测试。 36 | * 第十二条数据库系统安全 针对MySQL、Oracle、MSSQL、Sybase、DB2等数据库应用进行渗透测试。。 37 | * 第十三条应用系统安全 针对如ASP、JSP、PHP、CGI等组成的Web应用,包括但不限于Web应用系统安全、APP软件安全进行渗透测试。 38 | 39 | ## 四、渗透测试原则和流程 40 | 41 | * 第十四条渗透测试工作以业务系统为单位进行,所有信息系统每季度至少进行一次完整的渗透测试。为减轻渗透测试对信息系统的影响,渗透测试时间须避开业务高峰时段,单次渗透测试持续时间须控制在1天到2天,最长不得超过3天。 42 | 43 | * 第十五条为防止渗透测试造成信息系统的业务中断,在渗透测试中不得使用含有影响业务正常运行的测试手段。 44 | 45 | * 第十六条对于不能接受任何可能风险的信息系统,需搭建与生产环境完全一致的测试环境,包括硬件平台和软件平台(包括但不限于操作系统版本、中间件版本、数据库版本、应用程序版本),再对所搭建的环境进行渗透测试。 46 | 47 | * 第十七条新系统上线前和应用变更上线前必须进行渗透测试(包括黑盒测试及白盒测试),对存在高中危漏洞的系统,须整改完成后方可上线。 48 | 49 | * 第十八条渗透测试工作完成后由安全管理方出具包含漏洞名称、漏洞描述、安全级别、利用方式、修复建议等内容的渗透测试报告。 50 | 51 | ## 五、渗透测试工作的准备、监控和应急 52 | 53 | * 第十九条渗透测试前期准备安全管理方依据信息系统资产台帐信息,制定包含实施办法、实施时间、实施人员、实施范围等要素的详细测试方案,经安全组评审通过后方可开展。 54 | 55 | * 第二十条渗透测试的执行需严格按照通过评审的渗透测试方案定制渗透测试任务,并在既定的时间点开始执行。在渗透测试任务的执行过程中,渗透测试对象所属的安全人员应对渗透测试任务密切监控。 56 | 57 | * 第二十一条渗透测试的风险防范为防止在渗透测试过程中出现的异常情况,所有被测试系统须在被渗透操作之前进行一次完整的系统备份,在渗透测试任务执行过程中,业务主办方、系统运维方和安全管理方对被测试对象进行应急保障。当渗透测试过程中出现与影响性评估不符合的情况时,应根据渗透测试方案立即启动应急措施,消减对被测试对象的影响。 58 | 59 | ## 六、渗透测试后的整改 60 | 61 | * 第二十二条渗透测试结束后安全人员需对渗透测试结果进行分析,并制定整改方案和计划,1个工作日内提供包含漏洞类型、风险级别、修复方法等关键表项的渗透测试报告。 62 | 63 | * 第二十三条报告提交后1个工作日内安全管理方协调业务主办方、系统运维方、应用运维方、网络运维方组织整改交流,并将需整改的漏洞落实到具体责任人,根据整改交流会上确定的整改周期(评估为高危级别以上的漏洞整改时限为1天,中危级别的漏洞整改时限为2天)完成漏洞整改工作,无法整改的漏洞须备注说明,并提供未整改期间防护手段(在漏洞整改完成前需立即提供临时防范手段)。 64 | 65 | * 第二十四条渗透测试结果需由人工对检查出的漏洞进行复核确认,评估漏洞影响性,最终确定系统的风险系数和漏洞的安全级别。 66 | 67 | ## 七、附则 68 | 69 | * 第二十五条本管理办法由技术部负责解释。 70 | 71 | * 第二十六条本办法自颁布之日起实行,有新的修改版本颁布后,本办法自行废止。 72 | 73 | # 八、附件 -------------------------------------------------------------------------------- /docs/3.SDL落地方案/6-上线发布.md: -------------------------------------------------------------------------------- 1 | 2 | # 06.上线发布 3 | 4 | 作者:Torjan 5 | 6 | 协作: 7 | 8 | ---- 9 | 10 | 11 | 12 | # 1. 概述 13 | 14 | 为进一步规范某公司应用系统上下线管理,实现系统建设、运行维护各阶段的平稳过渡和有序衔接,确保系统安全稳定可靠运行,特制定本办法。规范仅供参考。 15 | 16 | 17 | 18 | 19 | 20 | # 2. 使用范围 21 | 22 | 本规范中仅供于某公司信息技术部,应用开发部门,运维部门,业务部门参考,系统上线指应用系统在生产环境部署并提供给用户实际使用,包括上线试运行和上线正式运行两个阶段。应用系统的开发阶段、上线试运行阶段、上线正式运行阶段以及系统下线构成其全部生命周期。其中上线试运行阶段又包括上线试运行申请、上线试运行测试、上线试运行和上线试运行验收等环节。 23 | 24 | # 3. 上线试运行申请 25 | 26 | 应用系统开发部门负责向信息技术部申请系统的上线试运行。系统申请上线试运行必须满足以下条件: 27 | 28 | 1.应用系统开发部门按照系统需求说明书、系统目标任务书或合同中的规定已完成系统的开发和实施,系统经用户试用并修改完善,已相对稳定,具备有关功能和安全保障措施,经业务部门确认能够满足当前业务需求并在一定程度上适应业务的发展。 29 | 30 | 2.应用系统开发部门对系统进行严格的测试,包括系统的功能实现、安全性、性能、可用性、兼容性、集成性等方面,并形成测试报告。测试结果经信息技术部、业务部门、运维部门和相关人员的认可。 31 | 32 | 3.应用系统开发部门完成各个层次重点用户的培训工作, 包括系统最终用户和运维部门和相关人员有关人员的培训工作。 33 | 34 | 4.应用系统开发部门配合运维部门和相关人员制定详细的上线试运行实施计划、系统备份方案、系统监控方案、安全策略配置方案、应急预案和移交计划等。 35 | 36 | 5.应用系统开发部门、 运维部门和相关人员共同检查系统的安装环境,确认满足安装所需的服务器、网络、电源等环境保障条件。 37 | 38 | 6.运维部门和相关人员基于安全可靠稳定运行和硬件资源整合利用的原则评估确定系统的安装部署模式。 39 | 40 | # 4. 上线试运行测试 41 | 42 | ## 4.1. 上线试运行的安装 43 | 44 | 运维部门和相关人员负责操作系统和支撑软件系统的安装,包括主机漏洞扫描、安全加固等工作,应用系统开发部门负责上线应用系统软件的安装和整体调试。 45 | 46 | 应用系统安装调试完成后,运维部门和相关人员即可组织应用系统开发部门开展系统上线试运行测试,测试应在一个月内完成。在上线试运行测试完成前,不对外提供服务。 47 | 48 | ## 4.2. 上线试运行测试 49 | 50 | 测试环境测试主要通过性能测试工具对系统进行压力测试和安全评估,重点考察系统的集成性、健壮性、稳定性、负荷响应能力和安全性等指标,并开展系统应急预案演练,形成相关记录和报告,测试环境应该与生产环境类似。 51 | 52 | 生产环境测试主要考察系统在上线正式运行环境中各功能模块的连通性、响应能力、安全性以及对整个应用系统的影响等指标,形成相关记录和报告。生产环境测试,应避免对在线系统产生不利影响,并应制定有关应急预案,采取数据备份措施。 53 | 54 | 测试中存在不符合项时,应用系统开发部门提出整改方案,报信息技术部及业务部门审查通过后,按要求限期整改,并再次申请复测。 55 | 56 | ## 4.3. 上线前安全测试 57 | 58 | 应该至少对需要上线的应用进行系统安全和应用安全进行安全测试,包括但不仅限于漏洞扫描,渗透测试,代码审计,基线评估; 59 | 60 | 对于要对外部开放的应用系统至少应该完成: 61 | 62 | 系统漏洞扫描,应用漏洞扫描,渗透测试,基线评估等安全评估; 63 | 64 | 对于内部使用的应用系统至少应该完成: 65 | 66 | 系统漏洞扫描,应用漏洞扫描(不仅限于以上内容)的安全评估 67 | 68 | 所有应用在测试后应进行至少一次复测,保证测试和修复结果的可靠,保障应用稳定,安全,可靠上线。 69 | 70 | # 5. 上线试运行 71 | 72 | 信息技术部和业务部门共同确定系统上线试运行开始时间和上线试运行的期限,原则上上线试运行期为三个月,具体可根据系统的复杂程度不同,按照能够全面检验系统运行质量的原则确定合理的试运行时间。 73 | 74 | 系统进入上线试运行后,按照上线正式运行的要求管理,严格执行某公司关于应用系统运行维护及安全管理的有关规定,做好数据的备份,保证系统及用户数据的安全。业务部门负责提出最终用户的权限分配方案。运维部门负责执行和登记。 75 | 76 | 上线试运行的初期安排一定时间的观察期。观察期内由应用系统开发部门和运维部门和相关人员共同安排人员进行运行监视、调试、备份和记录,并提交观察期的系统运行报告。在观察期内对系统进行变更时,按照某公司应用系统运行管理规定执行。 77 | 78 | 观察期原则上不短于上线试运行期的三分之一,一般为一个月。若观察期内系统连续运行未出现故障,未进行重大变更,满足信息技术部和业务部门相关考核要求,可认为观察期结束;否则重新开始观察期。 79 | 80 | 相关业务部门会同系统运维部门和相关人员审核观察期的系统运行报告,确认系统在观察期内运行稳定,报信息技术部审批后,办理上线试运行期间系统运行管理权限的移交手续。移交内容包括应用系统的管理权限分配情况以及有关技术服务支持的联络机制及联络人等。 81 | 82 | 系统运行管理权限移交后,系统由运维部门和相关人员负责日常运行管理、监控和系统应用统计,并负责系统和软件产品维护权限的分配和登记。应用系统开发部门负责系统应用程序级的运维技术支持,并配合运维部门和相关人员解决系统运行中出现的有关问题。 83 | 84 | 系统上线试运行期间,未发生影响用户使用的故障、未发生因软件缺陷而导致系统停运的重大故障、未进行较大变更等,可认为该系统上线试运行期间稳定运行;否则需待系统整改完善后重新开始上线试运行。 85 | 86 | 系统上线试运行期间发生变更的,需对变更部分及相关功能重新按上线试运行申请流程组织上线试运行测试后再安排上线试运行,对涉及系统重大变更的,需对整个系统重新按上线试运行申请流程组织上线试运行测试后,满足要求的重新开始上线试运行。 87 | 88 | 系统上线试运行期间稳定运行后,应用系统开发部门需删除临时工作所需的帐号及其它临时措施,组织完成工作报告、技术报告和用户使用报告,并负责办理上线试运行结束和上线试运行验收的申请手续。运维部门和相关人员负责提供系统上线试运行报告,应用系统开发部门配合。 89 | 90 | 下级单位的等级保护二级及以上应用系统上线试运行需一个月内报上级信息技术部备案。 91 | 92 | # 6. 上线试运行验收 93 | 94 | 系统上线试运行在具备以下条件后,由应用系统开发部门负责向信息技术部申请系统上线试运行验收。 95 | 96 | 系统上线试运行期间连续稳定运行。 97 | 98 | 信息技术部、业务部门及运维部门和相关人员应确定系统服务级别,建立保证应用系统正常运行的运行维护管理办法和考核制度,明确系统各级维护管理和应用人员的职责,确保信息的及时、准确、全面和安全。 99 | 100 | 应用系统开发部门完成用户应用培训、运行维护培训,配合运维部门和相关人员制定系统备份方案、系统监控方案、安全策略配置方案、应急预案等运行技术文档。 101 | 102 | 应用系统开发部门完成系统的全面移交,移交内容包括系统日常维护手册、系统管理员手册、系统培训手册、系统核心参数及端口配置表、系统用户及口令配置表(需含口令修改关联关系)、技术支持服务联系人及联系方式等。 103 | 104 | 信息技术部牵头组织验收,成立验收工作组(或验收委员会),成员应由业务部门、系统开发、运行维护的专业人员组成,验收工作组包括技术审查组、生产准备组、文档审查组等专业小组。 105 | 106 | 验收工作组按要求对项目相关文档进行全面检查,对系统功能实现、性能、安全性、数据备份与恢复、应急与快速恢复方案等进行测试和核实,并作出验收结论。 107 | 108 | 上线试运行验收要严格按照信息化项目管理有关规定,有效规避投运后的各种风险,认真做好项目开发过程中形成的应用软件源代码(包括二次开发源代码)、各类技术文档的移交、保管、存档工作。运维部门和相关人员负责运行文档的接受和系统生命周期内运行文档的管理。 109 | 110 | 验收时发现影响系统上线正式运行的重大问题,应责成相关单位立即整改,并延长上线试运行时间,系统完成整改并连续稳定运行一个月后,方可再次申请验收。 111 | 112 | 通过应用系统的上线试运行验收是应用系统完成上线试运行转入上线正式运行维护的标志。 113 | 114 | # 7. 上线正式运行 115 | 116 | 通过上线试运行验收后,系统完成建转运工作,该应用系统即为正式在运应用系统,需严格按照某公司应用系统运行维护和安全管理相关规定纳入日常管理。 117 | 118 | 运维部门和相关人员负责系统的日常运行维护,除保证系统所需网络和软硬件环境正常外,还应对系统应用情况进行实时监控,做好应用统计,保证系统安全、可靠和稳定运行。 119 | 120 | 应用系统开发部门需按合同规定指定专人负责配合运维部门和相关人员开展系统的售后服务和技术支持工作,并具体负责系统的程序代码维护。 121 | 122 | 系统的修改、调整、更新、升级等维护操作,须严格执行某公司有关应用系统运行维护的管理规定,履行相关流程和审批制度。相关维护操作应先在测试环境上开展,测试通过后部署到生产环境,不得擅自进行在线调试和修改。 123 | 124 | 为保障系统安全,在根据需要安排应用系统开发部门人员进行维护操作时,运维部门和相关人员应安排专人进行监护。维护操作完成后,运维部门和相关人员应及时收回临时分配出的所有权限。 -------------------------------------------------------------------------------- /docs/4.构建企业安全/1-内功修炼第一步-挖漏洞.md: -------------------------------------------------------------------------------- 1 | 2 | # 01.内功修炼第一步:挖漏洞 3 | 4 | 作者:Lost Maniac 5 | 6 | 协作: 7 | 8 | ----- 9 | 10 | 未完成 -------------------------------------------------------------------------------- /docs/4.构建企业安全/2-内功修炼第二步-引起重视.md: -------------------------------------------------------------------------------- 1 | 2 | # 02.内功修炼第二步:引起重视 3 | 4 | 作者:Lost Maniac 5 | 6 | 协作: 7 | 8 | 9 | ----- 10 | 11 | 未完成 -------------------------------------------------------------------------------- /docs/4.构建企业安全/3-互联网安全运营的思考.md: -------------------------------------------------------------------------------- 1 | 2 | # 03.互联网企业安全运营的思考 3 | 4 | 作者:Johnathan 5 | 协作: 6 | ---- 7 | 8 | ## 1.信息安全运营的概念 9 | 10 | 信息安全运营,简单理解就是让信息安全在企业(互联网企业,下文同)中跑起来。具体来讲就是依据信息安全管理和技术,围绕企业核心保护对象,采取科学的管理措施,将人员、技术、流程按照可以量化考核的指标有机结合,让安全在组织内部透明、顺畅的流转,同时增强企业在外部的安全影响力。 11 | 12 | ## 2.信息安全运营的价值 13 | 14 | 在企业中,信息安全初期安全工作主要是建立安全组织,构建技术抓手,包括不限于采购安全设备,开发平台等。但是从网络层、主机层、应用层、数据层都部署了一系列安全设备或者安全软件保证业务稳定运行,但是安全情况还是没有得到改善,安全问题和安全事件依然频繁发生,安全部门和业务部门不能形成良好的协作,其根本的原因就是没有进行有效的安全运营。 15 | 没有安全运营就没有办法建立安全部门在公司内部的影响力,对外不能构建安全形象和安全品牌,安全部门逐渐沦为成本部门,只能依靠合规驱动安全工作开展。 16 | 17 | ## 3.安全运营工作的要点 18 | 19 | 列举我能想到一些安全运营的思路,抛砖引玉,主要有以下几个点: 20 | 21 | ### 3.1.夯实内功 22 | 23 | 提到夯实内功,主要是要在安全部门内部建立内部自恰和闭环的安全运行机制。建章立制略过,重点说一下偏技术方面的内容。 24 | 25 | * 1.风险发现 26 | 27 | * * 风险发现包括风险评估、外部安全通告、安全设备发现、新型安全攻击手段; 28 | 29 | --- 30 | 31 | * 2.风险预警 32 | 33 | * * 安全事件预警; 34 | * * 安全漏洞预警; 35 | * * 安全监控预警; 36 | 37 | --- 38 | 39 | * 3.风险处置 40 | 41 | * * 应急流程。 42 | * * 安全策略变更。 43 | * * 升级安全补丁。 44 | 45 | --- 46 | 47 | * 4.配置变更 48 | 49 | * * 安全域内设备的增、删、改变更。 50 | * * 对外开发端口管理。 51 | * * 安全补丁的管理。 52 | 53 | --- 54 | 55 | * 5.持续改进(一页纸) 56 | 57 | * * 改进发现手段,确保没有死角。 58 | * * 改进预警机制,人员、事件、配合的事件维度。 59 | * * 改进风险应急流程,风险处置协作。 60 | * * 持续优化、梳理安全域策略、区域间端口、安全补丁升级流程。 61 | 62 | 通过风险发现、风险预警、风险处置、配置变更直到持续改进,一定要借助平台(类似opensoc)能力实现,比如工单流、审批流、统计、分析、指标、告警等等。 63 | 安全运营工作的量化,可以考核、可以对比分析是做好运营的基础。 64 | 65 | ### 3.2.建立渠道 66 | 67 | * 1.沟通渠道 68 | 69 | * * 对外沟通渠道SRC的运营 70 | * * 对内建立安全接口人组织的运营 71 | 72 | --- 73 | 74 | * 2.展示渠道 75 | 76 | * * 对外组织活动、会议的发布渠道 77 | * * 对内组织活动、会议的沟通渠道 78 | 79 | --- 80 | 81 | * 3.汇报渠道 82 | 83 | * * 事件分级汇报渠道 84 | * * 审批事件沟通渠道 85 | 86 | --- 87 | 88 | ### 3.3.充分融入 89 | 90 | 客观讲,业务部门永远是一个公司生存发展的根本,安全应该是主动了解业务,融入业务,给业务赋能,才能实现业务与安全的双赢。 91 | 让业务了解,明白信息安全的重要性。让安全知道业务的痛点,信息安全保障业务调用安全,实现安全时候一定是透明化、便捷化和无感知的。 92 | 安全一定要在业务便利性和安全性中间找到一个平衡点。 93 | ## 4.后记 94 | 本网站致力于推广SDL的落地,但是在工作实践中,如果没有一个项目管理团队配合,实践起来成本会大大增加。因此,在本文后续的迭代更新中,会尽量从一个更宽阔的视角来阐述SDLC如何通过安全运营在运营、产品、技术等等环节的落地,包括如何提升安全在公司的影响力和对外安全品牌形象。 95 | 96 | -------------------------------------------------------------------------------- /docs/4.构建企业安全/4-如何利用Flink实现超大规模用户行为分析.md: -------------------------------------------------------------------------------- 1 | # 4.如何利用Flink实现超大规模用户行为分析 2 | 3 | 作者:瀚思科技 4 | 5 | ## 网络安全中的用户行为分析 6 | 7 | 用户行为分析到底是什么?简而言之,其通过分析用户数据(例如交易数据,用户登录数据),找出异常行为以检测外部及内部人士的攻击活动。举例来说,外部攻击通常是由外部黑客通过破解 VPN 密码并夺取员工帐户的方式实现。而内部攻击则往往表现为心存不满的或者即将离职的员工对敏感信息的窃取。我们需要分析的源文件通常表现为多种数据类型,例如服务器数据、网络数据、数据库数据、应用程序数据、安全数据等。传统的用户行为分析系统通常以离线批处理模式根据既定规则对这些数据进行分析。而如今的最新趋势则倾向于添加某种形式的机器学习方案,从而利用在线 / 流式处理,对实时数据进行分析以区分威胁行为与正常行为。 8 | 9 | ## 实时超大规模用户行为分析的技术挑战 10 | 11 | 实际应用中,由于部分技术挑战的存在,目前机器学习模型在这一领域中尚未能带来可观的助益。此类挑战具体包括: 12 | 13 | 1. 输入信息规模过大(往往包含来自十余个领域的上万名独立用户); 14 | 2. 实际需求往往需要以实时方式检测攻击活动(例如在反欺诈场景中,需要实时监控用户的交易数据); 15 | 3. 检测逻辑需要将黑名单、业务逻辑规则以及机器学习算法加以结合 ; 16 | 4. 检测逻辑需要以近实时方式进行定制化调整。 17 | 18 | 那么,我们该如何解决上述挑战?又为何选择 Flink? 19 | 20 | 首先我们需要一个吞吐量大且资源消耗低效率高的流处理引擎。这一点 Flink 作为新一代的流处理引擎完全符合我们的需求。其次,面对不同的用户数据格式,我们必须支持多种数据源,这一点上 Flink 内置的对多种数据源的支持(CSV,Kafka,Hbase,Text,Socket 数据等)也为用户数据的接入提供了便利。第三,Flink 内置的 RocksDB 数据存储格式使其数据处速度快且资源消耗少。第四,Flink 强大的窗口机制(包括翻转窗口,滑动窗口,两者的组合,全窗口以及用户自定义窗口)可以满足复杂的业务逻辑,使得用户可以编写复杂的业务规则。同时 Flink 对算子(operator)的高可控性,使得用户可以灵活添加删除或更改算子。 21 | 22 | 下面来看我们这套解决方案的具体架构。 23 | 24 | ![Flink架构](/images/4.构建企业安全/4-如何利用Flink实现大规模用户行为分析/01.jpg) 25 | 26 | 如大家所见,我们在左侧列出了作为输入信息的多种不同的数据类型。中部位置为核心引擎,而 Flink 则处于底部。上方为三种 ETL 类型:统计指标、实体关系与序列。我们可以将这些 ETL 类型转换为由 Drools 引擎运行并配合部分机器学习算法的 Scenario 规则。同时在生产环境当中需要为用户提供良好的 Web 界面。因此,我们设计出这样一套界面以帮助用户进行规则配置、响应安全事件并对数据进行可视化展示。 27 | 28 | ## Drools 规则引擎在 CEP 中的应用 29 | 30 | 规则引擎方面我们有两个选择:Flink 原生 CEP 和 Drools。那么两者各有什么优势和劣势呢? 31 | 32 | Flink CEP 是一套极具通用性、易于使用的实时流式事件处理方案。作为 Flink 的原生组件,省去了第三方库与 Flink 配合使用时可能会导致的各种问题。但其功能现阶段看来还比较基础,不能表达复杂的业务场景,同时它不能够做到动态更新。而 Drools 作为一个完备的规则引擎,在功能全面性上更胜一筹,同时其动态更新的设计方针,能够保证我们在无需对系统进行重新编译及重启的前提下将其部署在运行中的系统当中。 33 | 好的,接下来我们将深入探讨如何利用 Drools 来实现用户行为分析系统。 34 | 35 | ### Drools 究竟是什么? 36 | 37 | Drools 是一套业务规则管理系统(简称 BRMS),且可基于规则引擎实现向前与向后推理。这是一套基于 JVM 的系统,其语义与 Java 非常相似。 38 | 39 | ```java 40 | package com.example; 41 | import com.example.Person 42 | 43 | rule "example rule" 44 | when 45 | p: Person(name == "Michael") 46 | then 47 | p.name = "other"; 48 | System.out.println(p.name); 49 | end 50 | 51 | declare EventA 52 | @role( event ) 53 | end 54 | 55 | rule "Timeout EventA" 56 | when 57 | $a1 : EventA() 58 | $a2 : EventA(this after[5s,10s] $a1) 59 | then 60 | retract($a1); 61 | end 62 | ``` 63 | 64 | Drools 的最大优势在于,它语法规则简单,类似 Java,因此编写门槛不高、能够无缝化与 Java 集成,且用户可以对 Drools 规则进行动态配置。但这套方案也存在着自己的不足,例如其内置聚合功能速度缓慢,不适合我们自身或者客户使用场景下的大量聚合操作任务。另外,其内置事件序列处理机制也需要消耗大量内存资源。 65 | 66 | 作为常用的业务场景,我们需要将三种 ETL 类型翻译成对应的 Drools 规则。具体来讲,事件 / 数据中的每一行都需要由三种 ETL 类型进行处理:统计指标、实体关系与序列,并借此将内容转换为实际行为。 67 | 68 | 统计指标:特定翻转窗口内的聚合值,例如一小时内的登录次数。 69 | 70 | 实体关系:两个实体之间的关联,例如用户使用哪台设备。 71 | 72 | 序列:事件经过过滤并按时间戳排序后,被转换为有序状态。 73 | 74 | 以上三种 ETL 皆在场景规则当中进行定义,以 drools 规则文件的形式被部属到系统中。如何做到这一点呢,Flink 的 CoFlatMapFunction 提供了完美的解决方案,我们可以利用该功能同时处理两种数据流:事件流与规则流。 75 | 76 | 听起来不错,很多朋友可能认为 Flink 与 Drools 的配合可能完美无瑕。但事实并非如此——大家在实际使用中可能遇到以下问题: 77 | 78 | 1. 需要在特定时段之内维持原有窗口状态(作为 Drools 规则引擎的中间结果)。 79 | 2. Flink 内置的窗口机制会在窗口结束时发送输出结果并清除窗口状态。 80 | 3. Flink 内置的 RocksDB 后端会在窗口清除时删除所有记录。 81 | 4. 来自 Flink 的结果会被不断的注入 Drools 规则引擎进行规则匹配,事件一多就会快速耗尽内存资源。 82 | 83 | 当然,我们可以对 Flink 进行修改以克服上述问题。举例来说,我们可以为 RocksDB 添加“TTL“属性,保证其不再直接删除各条目。另外,我们还可以为内存内能够容纳的条目数量设定阈值,同时及时清除未使用的条目,从而优化 Drools 的内存管理。 84 | 85 | ### Flink 原生 CEP 组件 86 | 87 | 以上是使用 Drools 的方案,那么我们是否只能选择 Drools?还有没有其它更好的解决方案? 88 | 89 | 就目前来看,我们也可以使用 Flink 1.4 中提供的 Flink CEP 新特性。 90 | 91 | Flink 近期推出了一系列新功能,我们可以利用其解决“无法热部署“的难题。 92 | 93 | 1. 触发保存点、取消作业,更新规则,恢复作业。 94 | 2. 保存点内惟一标识运算符状态。 95 | 3. [FLINK-6927] 在 CEP Flink 1.4 中支持模式组。 96 | 4. [FLINK-7129] 动态变更模式开放发布。 97 | 利用上述新特性,我们可以设计出一套新的 Flink CEP 系统,其工作流程如下: 98 | 99 | ![Flink架构-CEP 组件](/images/4.构建企业安全/4-如何利用Flink实现大规模用户行为分析/02.jpg) 100 | 101 | 用户利用我们定义的语言编写场景规则,此后我们将这些规则翻译为 Java 代码。接下来,我们对代码进行编译并打包为 jar 文件。最后,我们触发保存点并撤销当前正在运行的作业,部署新规则 jar 而后恢复该作业。 102 | 103 | 为了将这一思路付诸行动,我们进行了具体实验并发现了一些有趣的现象。如果我们为每种规则创建一条独立的规则流,那么规则数量一旦过多(上千)即会导致初始化缓慢以及内存不足的问题。 104 | 105 | 那么如何将多条规则纳入同一流? 106 | 107 | 1. CEP API 仅允许单规则 = 单流 108 | 2. Flink CEP 1.4 提供 GroupPattern 将多种规则合而为一 109 | 3. 目前尚无法对多模式进行优化 110 | 111 | 因此总结来讲,这套解决方案拥有以下优势与弊端: 112 | 113 | 优势: 114 | 115 | 1. 易于实现,代码量仅为 Drools 版本的五分之一。 116 | 2. 可扩展性与并发性更出色,不存在单一大负载的算子。 117 | 3. 易于获取各模式中的运行时指标 。 118 | 119 | 弊端: 120 | 121 | 1. 保存点与恢复部署流程会造成数秒延迟。 -------------------------------------------------------------------------------- /docs/4.构建企业安全/5-APT 攻击基础科普.md: -------------------------------------------------------------------------------- 1 | # 5-APT攻击基础科普 2 | 3 | 作者:backlion 4 | 5 | ## APT 的历史起源背景 6 | 7 | APT 这个词汇最早起源于:2005 年英国和美国的 CERT 组织发布了关于有 针对性的社交工程电子邮件,放弃特洛伊木马以泄露敏感信息的第一个警告,尽管没有使用“APT”这个名字。但 “先进的持续威胁”一词被广泛引用,2006 年的美国空军 Greg Rattray 上校经常被引用为创造该术语的个人。后来,在 Stuxnet 震网事件就是专门针对伊朗的核计划的黑客攻击就是一个 APT 攻击例 子。在计算机安全领域以及越来越多的媒体中,APT 这个术语几乎总是用来指 向针对政府,公司和政治活动家的黑客攻击的高级持续模式,而且也延伸到涉及 到群体这些攻击背后。作为一个术语,高级持续威胁(APT)可以被转移焦点到 攻击出现次数。一个常见的误解是 APT 只针对西方国家。西方国家可能会更多地宣传针对西方国家的技术性 APT,但许多国家的行为者都将网络空间安全作 为收集有关个人和群体的情报的手段。在美国,网络司令部的任务是协调美国军 方,应对高级持续网络威胁,也就是 APT 攻击。 8 | -------------------------------------------------------------------------------- /docs/5.附录/01.相关术语.md: -------------------------------------------------------------------------------- 1 | 2 | # 01.相关术语 3 | 4 | 作者:mour 5 | 6 | 协作:Lost Maniac 7 | 8 | --- 9 | 10 | ## SDL 11 | 12 | SDL是在软件开发过程中帮助开发人员构建更安全的软件并解决安全问题,同时降低开发成本的一套流程方法。 13 | 14 | > The Security Development Lifecycle (SDL) is a software development process that helps developers build more secure software and address security compliance requirements while reducing development cost 15 | 16 | ## ROI 17 | 18 | 投资回报率(ROI)是指一些资源投资产生的净利润和投资成本之间的比率。高投资回报率意味着投资收益与其成本相比有利。作为绩效衡量指标,ROI用于评估投资效率或比较几种不同投资的效率。从纯粹的经济角度来看,它是将利润与资本投资联系起来的一种方式。投资回报是企业用来确定投资效率或不同投资数量的绩效指标。 19 | 20 | ## ATT&CK 21 | 22 | ATT&CK是Adversarial Tactics, Techniques & Common Knowledge的缩写,由MITRE提供的关于对抗战术,技术以及常识性攻防知识 23 | 24 | > MITRE’s Adversarial Tactics, Techniques, and Common Knowledge (ATT&CK™) is a curated knowledge base and model for cyber adversary behavior, reflecting the various phases of an adversary’s lifecycle and the platforms they are known to target. ATT&CK is useful for understanding security risk against known adversary behavior, for planning security improvements, and verifying defenses work as expected 25 | 26 | ## STRIDE 27 | STRIDE是由微软的提出的典型的威胁建模方法 28 | * S: Spoofing(欺骗) 29 | * T: Tampering(篡改) 30 | * R: Repudiation(否认) 31 | * I: Information Disclosure(信息泄露) 32 | * D: Denial of Service(拒绝服务) 33 | * E: Elevation of Privilege(提权) 34 | 35 | ## STIX 36 | 37 | STIX是A structured language for cyber threat intelligence的缩写,目前最新为2.0标准,主要用于交换分享网络威胁情报。 38 | 39 | > Structured Threat Information Expression (STIX™) is a language and serialization format used to exchange cyber threat intelligence (CTI). 40 | 41 | ## 引用 42 | 43 | * [应用安全与微软SDL-IT流程](https://blogs.technet.microsoft.com/gcrsec/2008/09/22/sdl-it/) 44 | * [SDL](https://www.microsoft.com/en-us/sdl) 45 | * [Adversarial Tactics, Techniques & Common Knowledge](https://attack.mitre.org/wiki/Main_Page) 46 | * [OWASP](https://www.owasp.org/) 47 | * [STIX](https://oasis-open.github.io/) 48 | * [MISP](http://www.misp-project.org/) -------------------------------------------------------------------------------- /docs/5.附录/02.文档变更规范.md: -------------------------------------------------------------------------------- 1 | 2 | # 02.文档变更规范 3 | 4 | 作者:Lost Maniac 5 | 6 | 协作: 7 | 8 | ----- 9 | 10 | 为了确保大家不会误操作导致问题,特此规范如下 11 | 12 | 13 | ### 如何增加大纲内容 14 | 15 | 16 | 需要创建问卷调查,详细描述大纲内容需要增加到哪里,详细阐述原因,选项为:同意或不同意 ,投票不得低于20人,得票多的方可增加大纲内容。 17 | 18 | --- 19 | 20 | ### 目录规范 21 | 22 | 目录应该严格按照大纲内容进行命名 23 | 24 | 目前有 25 | 26 | 1. SDL介绍 27 | 28 | 2. SDL规范文档 29 | 30 | 3. SDL落地方案 31 | 32 | 4. 快速构建企业安全 33 | 34 | 5. 附录 35 | 36 | 37 | 五个文件夹 38 | 39 | 另外一个临时文件夹名称用来存放临时文件,经过评审后方可移动到对应目录。 40 | 41 | --- 42 | 43 | ### 文件名规范 44 | 45 | 文件命名每个目录都有对应编号,文件名称应该由编号和题目两个内容组成,中间用半角字符“.”进行分割。例如 “12.安全管理规范”,编号由需要创建文章的文件夹内最大数字加一 46 | 47 | --- 48 | 49 | ### 如何添加文章(创建) 50 | 51 | --- 52 | 首先fork分支到自己本地目录。修改后提交到自己fork的项目。 53 | 54 | --- 55 | 56 | ### 如何修改文章 57 | 58 | 首先fork分支到自己本地目录。修改后提交到自己fork的项目。 59 | 60 | 61 | --- 62 | 63 | ### 获得投票权利 64 | 加入SDL China群内即可获得投票权利 65 | 66 | --- 67 | 68 | ### 获得修改权利 69 | 70 | 加入群聊后,需要提出至少五条文档建议,增加或修改。错别字不在此范围内。 71 | 72 | --- 73 | 74 | ### 权限回收 75 | 76 | 一个月内未对文档作出改进、创建、编辑等操作,会被回收文档编辑权限,重新获得只需要提交一条建议。权限被回收后原则上邮箱不会被收回,作为以前为文档作出贡献的激励。原则上勋章墙不会被撤销。 77 | 78 | --- 79 | 80 | ### 不遵循规范处罚办法 81 | 82 | 第一次不遵循规范,取消文档编辑权限 83 | 84 | 第二次不遵循规范,取消投票权利 85 | -------------------------------------------------------------------------------- /docs/5.附录/03.GitHub工作流.md: -------------------------------------------------------------------------------- 1 | 2 | # 03.Github工作流 3 | 4 | 作者:Pa55w0rd 5 | 6 | 7 | 8 | 9 | fork项目到自己账户,修改后提交给主分支,审核后即可展示。 10 | 提交可以多种方式,如web、命令、客户端,这里演示web提交方式 11 | 提交SDL落地方案-产品设计 12 | 1. 选择相应的文件,所有文档都在**_post**目录下 13 | ``` 14 | sdlchina-web/_posts/3.SDL落地方案/2018-08-17-SDL-3-产品设计.md 15 | ``` 16 | 17 | 选择**edit**或者**create new file**,文件名必须要符合: ```YEAR-MONTH-DAY-title.md``` 18 | 19 | ![图片1](/images/2018/10/github/1.png) 20 | 21 | 2. 编辑文档 22 | 所有博客文章顶部必须有一段YAML头信息(YAML front- matter),文章可以使用markdown格式编写 23 | ``` 24 | --- 25 | date: 2018-08-17 26 | # 03.产品设计 27 | categories: 28 | - 3.SDL落地方案 29 | description: 和研发同学进行产品设计定框架部分应该怎么去执行 30 | type: Document 31 | --- 32 | ``` 33 | 34 | 编辑完成之后点击**commit changes**(同命令```git add . && git commit -m "添加产品设计" && git pusht origin master```) 35 | 36 | ![图片2](/images/2018/10/github/2.png) 37 | 38 | 3. 提交pull请求 39 | 点击**New pull request** 40 | 41 | ![图片3](/images/2018/10/github/3.png) 42 | 43 | 检查没有问题,点击**Create pull request** 44 | 45 | ![图片4](/images/2018/10/github/4.png) 46 | 47 | 提交成功,等待管理员**Merge**之后就成功了 48 | 49 | ![图片5](/images/2018/10/github/5.png) 50 | -------------------------------------------------------------------------------- /docs/6.Project/1-内部钓鱼系统.md: -------------------------------------------------------------------------------- 1 | 2 | # 01.内部钓鱼系统 3 | 4 | 作者:Lost Maniac 5 | 6 | 协作: 7 | 8 | ----- 9 | 10 | ## 简介 11 | --- 12 | 13 | 本项目是基于thinkphp写的一个内部钓鱼网站系统。用来测试甲方公司内部钓鱼,请勿用于非法用途。 14 | 15 | ## 项目源码 16 | 17 | 本项目托管在GitHub,地址为:https://github.com/SecurityPaper/mail_fishing 18 | 19 | ## 部署方法 20 | --- 21 | 22 | 支持**windows**、**linux**、**MAC**。 23 | 24 | 克隆项目到本地 25 | ```bash 26 | git clone https://github.com/MSG-maniac/mail_fishing.git 27 | ``` 28 | 部署目录为项目根目录的public目录 29 | 30 | 具体参考thinkphp部署方法 31 | ```url 32 | https://www.kancloud.cn/manual/thinkphp5/336757 33 | ``` 34 | 35 | ### 举个栗子 36 | --- 37 | 如果当前终端在/usr/share/nginx目录下 38 | 39 | 执行命令 40 | ```bash 41 | git clone https://github.com/MSG-maniac/mail_fishing.git 42 | ``` 43 | 44 | nginx配置文件如下 45 | ```nginx 46 | server { 47 | #默认http请求自动跳转到https 48 | listen 80; 49 | server_name oa.xxx.com; 50 | rewrite ^(.*)$ https://$host$1 permanent; 51 | } 52 | 53 | server { 54 | listen 443 ssl; 55 | server_name oa.xxx.com; 56 | 57 | #需要配置证书 58 | ssl on; 59 | ssl_certificate /opt/ssl/oa.crt; 60 | ssl_certificate_key /opt/ssl/oa.key; 61 | 62 | location / { 63 | root /usr/share/nginx/mail_fishing/public; 64 | index index.php index.html index.htm; 65 | if (!-e $request_filename) { 66 | rewrite ^(.*)$ /index.php?s=/$1 last; 67 | break; 68 | } 69 | } 70 | 71 | 72 | # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000 73 | # 74 | location ~ \.php$ { 75 | root /usr/share/nginx/mail_fishing/public; 76 | fastcgi_pass 127.0.0.1:9000; 77 | fastcgi_index index.php; 78 | fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; 79 | include fastcgi_params; 80 | } 81 | } 82 | ``` 83 | 84 | ## 模板文件替换 85 | 86 | 文件路径 87 | ```file 88 | application\index\view\index.html 89 | ``` 90 | 模板内需要包含一个html的form表单 91 | 92 | 默认是一个极简内容页,新模板一定要包含: 93 | ```html 94 |
    95 | ``` 96 | 97 | 仿制页面时候请把静态文件放入到目录,或者自定义目录: 98 | ``` 99 | public\static 100 | ``` 101 | 102 | ## 配置数据库 103 | 104 | 数据库文件在根目录,导入即可: 105 | ``` 106 | mail.sql 107 | ``` 108 | 109 | 配置数据库连接: 110 | ``` 111 | 文件路径: 112 | config/database.php 113 | 114 | 默认如下 115 | // 数据库类型 116 | 'type' => 'mysql', 117 | // 服务器地址 118 | 'hostname' => '127.0.0.1', 119 | // 数据库名 120 | 'database' => 'mail', 121 | // 用户名 122 | 'username' => 'root', 123 | // 密码 124 | 'password' => '', 125 | ``` 126 | 127 | ## 部署完成 128 | 129 | 到此部署完成,可以找邮箱开始给公司同事发邮件了。 130 | 131 | ## 中招查看 132 | 133 | ``` 134 | http://oa.xxx.com/superhack/index/search?key=fcvxz657o54ewn123cvb432lg 135 | ``` 136 | 自己替换域名 -------------------------------------------------------------------------------- /docs/6.Project/3-泰式感知.md: -------------------------------------------------------------------------------- 1 | 2 | # 03.泰式感知 3 | 4 | 5 | 作者:Lost Maniac 6 | 7 | 协作: 8 | 9 | ----- 10 | 11 | ## 简介 12 | 13 | 泰式感知,命名是由玄道发起,经过十几个名字的激烈讨论和投票,最终获胜。 14 | 15 | ## 功能 16 | 17 | 泰式感知系统收集互联网大量安全舆情,通过订阅关键字,精准推送到订阅用户手中。让用户第一时间知晓安全舆情。 18 | 19 | ## 使用方法 20 | 21 | 内测中,测试完成开放。 -------------------------------------------------------------------------------- /docs/7.安全前瞻/1-BeyondCorp-以全新方式保障企业安全.md: -------------------------------------------------------------------------------- 1 | # BeyondCorp -以全新方式保障企业安全 2 | 3 | 翻译:lmowen 4 | 5 | ## 作者 6 | 7 | **Rory Ward**是一名谷歌爱尔兰的站点可靠性工程经理。他曾经就职于Valista@爱尔兰,AOL@硅谷,Netscape,KIVA,General Magic,以及Retix@洛杉矶。他持有爱尔兰都柏林城市大学的计算机应用理学士学位。roryward@google.com 8 | 9 | **Betsy Beyer**是一位纽约技术作家,专长于谷歌SRE软件的虚拟化方向。她曾负责为谷歌数据中心以及硬件操作团队提供文章。在搬到纽约之前,Betsy曾是斯坦福大学的技术写作讲师。她持有斯坦福大学和杜兰大学的学位。bbeyer@google.com 10 | 11 | ## 简介 12 | 13 | 目前,事实上每个公司都通过使用防火墙来实现边界安全管控。然而,这种安全模型是有问题的,因为当该边界被攻入后,攻击者会拥有对公司私有内部网络相对容易的访问权限。而随着公司采用移动和云技术,边界区域变得越来越难以实施。谷歌正在采取一种不同的方法来实现网络安全。我们正在移除私有内部网络的需求,并公司应用转向互联网。 14 | 15 | 企业从IT基础设施的早期就已经使用边界安全来保护和管控内部资源的访问。边界安全模型经常被比作一座中世纪城堡:一堵有厚墙的堡垒,四周有护城河,有严密的守卫,设有唯一的单点进出口。任何位于城墙之外的东西都被认为是危险的,而认为墙内任何东西都是可信的。任何人都经过了吊桥便具备使用城堡内所有资源的权利。 16 | 17 | 当所有的员工都在公司大楼里工作时,边界安全模型是很适用的。然而,随着移动办公的出现,和激增各种移动办公设备,以及越来越多地使用基于云的服务,新型攻击向量已经出现,将传统的范式扩展到再非单点。边界安全模型的关键假设不再成立:边界不再只代表企业的物理位置,而且边界内也不能继续被认为是个人计算机和企业应用存在的绝对安全场所。 18 | 19 | 当大多数企业认为内部网络是一个安全的环境时,谷歌的经验证明这种观念是错误的。相反,我们应该假设内部网络和公众一样充满危险,并基于这个假设构建所有企业应用。 20 | 21 | Google的BeyondCorp方案目标正在转向一种新的模式,不再使用私有企业网络。相反,访问仅依赖于设备和用户证书,而不管用户的网络位置——无论是企业办公地、家庭网络还是酒店,或者咖啡店。对企业资源的所有访问都经过完全认证、完全授权,以及基于设备状态和用户证书进行完全加密。我们可以加强细粒度的访问控制,用以访问不同等级的企业资源。因此,所有谷歌员工都可以成功地在任何网络环境下工作,而不需要传统的VPN连接到所谓的私有网络中。企业本地访问与远程访问之间,除了可能的网络延迟不同之外,用户体验几乎一致。 22 | 23 | 24 | ## BeyondCorp的主要构成 25 | 26 | BeyondCorp由许多协作的组件构成,用以确保仅恰当授权过的设备和用户才允许访问所需的企业应用。下面描述每个组件(见图1)。 27 | 28 | ![图1 BeyondCorp组件与访问流](/images/7.安全前瞻/1-BeyondCorp-以全新方式保障企业安全/1.png "BeyondCorp组件与访问流") 29 | 30 | ## 安全地设备识别 31 | 32 | ### 设备资产数据库 33 | 34 | BeyondCorp使用“受控设备”这样一个概念,指的是企业采购和主动管理的设备。只有受控设备才能访问公司应用程序。一套围绕着设备跟踪和采购的流程是该模型运转起设备库资产数据库是的基石。一个设备的整个生命周期中,谷歌持续跟踪对它进行的任何变更。该信息被监控、分析,并可用于BeyondCorp的其他部分。因为谷歌有多个资产数据库,元-资产数据库用于合并和规范来自这些多个源的设备信息,并使这些信息可用于BeyondCorp的下游组件。由于这个元-资产的存在,我们有能力知道所有那些需要访问我们的企业设备。 35 | 36 | ### 设备识别 37 | 38 | 所有受控设备都需要以唯一的方式识别并对应到设备资产数据库中的记录。一种实现此唯一标识的办法是每个设备都需要配备唯一标识的设备证书。要想得到证书,一个设备必须存在于设备资产数据库中,并且状态正常。证书存储于硬件或可信平台模块(TPM)软件上,或者其他合格的证书仓库。设备鉴权流程验证证书仓库的有效性,并且只有被认为足够安全的设备可以被归类为受控设备。这些检查也与证书更新一同定期更新而强制执行。一旦安装,证书用于企业服务的所有通信。证书用于唯一标识设备,但它不仅是单方面地授予访问权限;相反,它被用作关联设备的一组信息的密钥。 39 | 40 | ## 安全地用户识别 41 | 42 | ### 用户与组数据库 43 | 44 | BeyondCorp还跟踪和管理用户与用户组数据库中的所有用户。这个数据库系统与Google的人力资源流程紧密的关联着,而Google的人力资源流程正是负责管理所有用户的工作分类、用户名和组成员资格。当员工加入公司,改变角色或责任,或离开公司,这个数据库被更新。该系统告知BeyondCorp关于需要接入我们企业用户的所有恰当/相关信息。 45 | 46 | ### 单点登录系统 47 | 48 | 一个外部化的单点登录(SSO)系统是集中式的用户身份验证门户,该门户为请求访问我们企业资源的用户验证主要和次要因素凭证。通过对用户和群组数据库进行验证后,SSO系统生成临时令牌,该令牌可以作为特定授权过程的一部分。 49 | 50 | ## 移除信任网络 51 | 52 | ### 部署无私有网络 53 | 54 | 为使本地和远程访问相同,BeyondCorp定义和部署一个无私有网络,非常类似外部网络但使用私有地址空间。无私有网络仅连接到因特网、有限的基础设施服务(例如,DNS、DHCP和NTP),以及 55 | 配置管理系统,如Puppet。所有设备都被被分配给这个网络中,即使其物理位置位于谷歌大厦内。在这个网络和谷歌的其他部分之间存在着一个严格管理的ACL(访问控制列表)。 56 | 57 | ### 有线/无线网络802.1x接入认证 58 | 59 | 对于有线和无线接入,Google都基于802.1x认证使用RADIUS服务器将设备分配至向适当的网络。我们使用动态的而非静态的VLAN分配。这种方法意味着,对于已验证的设备我们使用RADIUS服务器通知交换机适当的VLAN分配,而不是依赖于交换机/端口静态配置。受控设备提供证书作为802.1x握手协议的一部分,并被分配到无私有网络,而企业网络中未识别和非受控的设备的设备则被分配到后补网络或者访客网络中。 60 | 61 | ## 外部化应用程序和工作流 62 | 63 | ### 面向Internet的访问代理 64 | 65 | 谷歌的所有企业应用程序都同时面向外部和内部客户端,通过面向Internet的访问代理,强制执行客户端和应用程序之间的加密。访问代理为每个应用程序配置并提供公共的功能,比如全局可达性、负载均衡、访问控制检查、应用程序健康检查和拒绝服务保护。该代理在完成访问控制检查后(下方详述),将适当的请求代理发给后端应用程序。 66 | 67 | ### 公共DNS入口 68 | 69 | 谷歌所有的企业应用程序都对外可达,注册在公共DNS中,并伴有一个CNAME通过面向因特网的接入搭理指向该应用程序。 70 | 71 | ## 实施基于资产的访问控制 72 | 73 | ### 基于设备和用户的信任推理 74 | 75 | 对单个用户或者单个设备的访问级别可以随着时间的推移而改变。通过询问多个数据源,我们能够动态地推断配给设备或用户的信任级别。接下来访问控制引擎(下方详述)可以使用该信任级别作为其决策过程的一部分。例如,没有升级到最新操作系统补丁包的设备可能被降级信任级别。一类特定的设备,如特定型号的手机或平板电脑,可能被分配特定的信任级别。用户若从新的地理位置访问应用程序可能会被分配一个不同的信任级别。我们同时使用静态规则和启发式规则来确定这些信任级别。 76 | 77 | ### 访问控制引擎 78 | 79 | 访问代理中的访问控制引擎基于每个访问请求为企业级应用程序提供服务级别授权。授权决策对于用户、用户所属的组、设备证书,以及来自设备资产数据库中的记录做出断言。如果需要,访问控制引擎也可以执行基于位置的访问控制。对用户和设备推断的信任水平也包含在授权决策中。例如,谷歌的bug跟踪系统可以仅限于全职工程师使用工程设备才能访问。对财务应用的访问,可以限制仅金融操作组中的全职和兼职雇员使用受控的非工程设备访问。访问控制引擎也可以以不同的方式限制应用程序的各个功能部分。例如,在我们的bug跟踪系统中,与更新或搜索相同的bug跟踪系统比较,查看一个条目需要不那么严格的访问控制。 80 | 81 | ### 管道输入访问控制引擎 82 | 83 | 访问控制引擎不间断的从一个管道中获取信息,这个管道正是用来动态地提取用于做出访问决策的有用信息。该信息包括证书白名单、设备和用户的信任级别,以及关于设备和用户的资产细节以及其他各种因素。 84 | 85 | ## 端到端的例子 86 | 87 | ### 应用 88 | 89 | 对于这个例子,让我们假设一个应用程序将被BeyondCorp采用。工程师们使用的该应用程序进行审查源代码,注释代码,更新代码,以及经审稿人批准,提交代码。应用程序codereview.corp.google.com, 只限于全职和兼职的工程师使用任何受控设备可访问 90 | 91 | ### 配置面向Internet的访问代理 92 | 93 | codereview.corp.google.com的应用负责人配置访问代理。配置指定后台的位置,以及后台能够接受的最大流量。codereview.corp.google.com在公共DNS中注册,并拥有CNAME指向该访问代理。举例: 94 | 95 | ```shell 96 | $ dig @8.8.8.8 codereview.corp.google.com 97 | ; <<>> DiG 9.8.1-P1 <<>> @8.8.8.8 codereview.corp.google.com 98 | ; (1 server found) 99 | ;; global options: +cmd 100 | ;; Got answer: 101 | ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 12976 102 | ;; flags: qr rd ra; QUERY: 1, ANSWER: 2, AUTHORITY: 0, 103 | ADDITIONAL: 0 104 | ;; QUESTION SECTION: 105 | ;codereview.corp.google.com. IN A 106 | ;; ANSWER SECTION: 107 | codereview.corp.google.com. 21599 IN CNAME 108 | accessproxy.l.google.com. 109 | accessproxy.l.google.com. 299 IN A 74.125.136.129 110 | ;; Query time: 10 msec 111 | ;; SERVER: 8.8.8.8#53(8.8.8.8) 112 | ;; WHEN: Wed Aug 20 19:30:06 2014 113 | ;; MSG SIZE rcvd: 86 114 | ``` 115 | 116 | ### 配置访问控制引擎 117 | 118 | 访问控制引擎提供了一条默认规则,该规则定义了全职员工使用受控设备访问的限制。codereview.corp.google.com的应用负责人提出了一个更加具体的规则,包括两种方式:对具有最高信任级别的受控设备,以及对具有最高信任级别的全职和兼职工程师。 119 | 120 | ### 工程师访问网络 121 | 122 | **如果网络处于企业办公地外的物理区域:**工程师使用谷歌提供的笔记本电脑访问任何WiFi网络。例如,这个网络可能是机场的有限门户的WiFi网络,或者是咖啡店的WiFi。不需要设置VPN就能连接到企业网络。 123 | 124 | **如果网络位于企业办公地内的物理区域:**一名工程师访问使用谷歌提供的笔记本或台式机访问企业网络。笔记本在802.1x握手协议中提供其设备证书给RADIUS服务器。由于提供了有效的证书,笔记本被在无私有网络中分配到一个地址。如果设备不是公司提供的笔记本,或者它的证书过期了,设备将被在补充网络中分配一个地址,仅具有非常有限的访问权限。 125 | 126 | ### 任意网络访问应用程序 127 | 128 | 一名工程师使用公司授予的笔记本电脑访问应用codereview.corp.google.com。其过程你可以参考图1中的流程。 129 | 130 | 1. 请求被指向访问代理。笔记本提供其设备证书。 131 | 2. 访问代理不能识别用户并重定向到SSO系统。 132 | 3. 工程师提供他/她的双因素身份认证凭据,由SSO系统认证和颁发令牌,并被重定向回访问代理。 133 | 4. 访问代理现在具有设备证书(标识设备)和SSO令牌(标识用户)。 134 | 5. 访问控制引擎执行指定授权检查,该检查由应用codereview.corp.google.com所配置。 135 | 136 | 这个授权检查是在每一个请求上进行的: 137 | 138 | a. 用户被确认属于工程组内成员 139 | b. 用户被确认拥有足够的信任级别 140 | c. 该设备被确认是状态正常的受控设备 141 | d. 该设备被证实具有足够的信任级别。 142 | e. 如果所有这些检查通过,则请求被传递到适当的后台完成服务。 143 | f. 如果上述检查中的任何一项失败,则拒绝该请求。 144 | 145 | 通过这种方法,我们在基于每个请求基础上执行丰富的服务等级认证和授权检查 146 | 147 | 148 | ## 迁移至BeyondCorp 149 | 150 | 像世界上几乎所有其他企业一样,谷歌维护着一个客户端和应用程序之前的私有网络。这一范式对公司日常工作至关重要的基础设施来说,产生了显著的意义。而公司的所有组成部分都将迁移至BeyondCorp,一次性将所有网络用户和所有应用程序都迁移到BeyondCorp环境将会对业务连续性带来较大的风险。因为这个原因,谷歌投入了大量的成本来进行分阶段迁移,并且成功地实现了零生产力的影响将大部分网络用户组织转移到BeyondCorp。以下部分,如图2所示,详细说明我们所做的一些工作。 151 | 152 | ![图 2 迁移至BeyondCorp](/images/7.安全前瞻/1-BeyondCorp-以全新方式保障企业安全/2.png "图 2 迁移至BeyondCorp") 153 | 154 | ### 工作流验证 155 | 156 | 谷歌使用的所有应用程序都需要通过访问代理。BeyondCorp发起审查和检验这些应用程序,完成的任务范围覆盖从简单的(例如,支持HTTPS流量)到更困难的(例如,SSO集成)。每个应用程序都需要一套访问代理配置,并且在许多情况下,配置特定的访问控制引擎。每个应用程序都经过了以下阶段: 157 | 158 | 1. 从私有网络直接访问和通过VPN外部访问。 159 | 2. 从私有网络直接访问,以及外部和非私有网络访问代理通过访问代理访问。在这种情况下,我们使用分开的DNS。内网DNS直接指向应用程序和外部DNS指向访问代理。 160 | 3. 所有外部、私有网络或非私有网络都通过访问代理访问 161 | 162 | ### 工作职能分析 163 | 164 | 通过梳理整个公司的工作职能,并参照工作流验证,我们能够排定用户群体进行迁移的优先级。那个时候我们能够基于对用户工作流和BeyondCorp能力的透彻理解而从财务、销售、法务或工程师团队中选择用户。 165 | 166 | ### 浅谈VPN的使用 167 | 168 | 随着越来越多的应用程序可以通过访问代理访问,我们开始主动限制用户使用VPN,具体采用以下策略: 169 | 170 | 1. 我们限制了只有被证明实在有必要的用户才可使用VPN的访问。 171 | 2. 我们监控了VPN的使用,并删除了未在定义的周期内使用VPN用户的访问权限。 172 | 3. 我们监控VPN活跃用户的使用情况。如果他们所有的工作流程均可通过访问代理完成,我们强烈建议用户放弃他们的VPN访问权限。 173 | 174 | ### 流量分析管道 175 | 176 | 我们把用户转移到非私有网络时,仅当我们确定(或非常接近确定)他们所有的工作流程都可以从这个网络上获得时,这点很重要。为了建立相对的确定度,我们建立了流量分析管道。作为这个管道的输入,我们从公司的每个交换机捕获了采样的NetFlow数据。然后这部分数据被用于和对在非私有网络和公司网络的其余部分之间网络的标准ACL进行比对分析。这个分析使我们能够识别出通过ACL的总交通量,以及一个没能通过ACL的有序列表。然后,未通过流量可以附加到特定的工作流和/或特定的用户和/或特定的设备。我们接着逐步解决未通过的清单,使之在BeyondCorp环境中发挥作用。 177 | 178 | ### 非私有网络模拟 179 | 180 | 为了增加流量分析管道,该管道使用采样交换机的数据,我们也模拟了非私有网络行为监控器在公司的流量,通过安装在所有连接到谷歌网络的用户设备上的流量监视器。这个流量监视器基于每个设备针对非私有网络和公司的网络检查所有传入和传出流量,并记录了没有通过的流量。监控器有两种模式: 181 | 182 | 1. 记录模式:捕获不合格的流量,但仍然允许说设备访问。 183 | 2. 强制模式:捕获并丢弃不合格的流量 184 | 185 | ### 迁移策略 186 | 187 | 有了流量分析管道和非私有网络模拟,我们定义了已经分阶段执行了迁移策略,包括以下内容: 188 | 189 | 1. 通过工作职能,工作流或位置信息识别潜在候选集 190 | 2. 在记录模式下操作模拟器,识别出连续30天达到99.9%个合格流量设备的那些用户 191 | 3. 为连续30天达到99.9%个合格流量设备的那些用户开启强制模式。如有必要,用户可以将模拟器恢复到记录模式。 192 | 4. 在将模拟器在强制模式下成功运行30天后,将该情况记录进设备资产库中。 193 | 5. 除了在候选集合中包含之外,在模拟器的强制模式下30天的成功操作提供了一个非常强烈的信号,当下一个802.1x认证请求由RADIUS服务器服务时,设备应该被分配给非私用网络。 194 | 195 | ### 例外处置 196 | 197 | 除了自动化将用户和设备进行网络迁移之外,我们也尽可能地为用户提供了一个简单暂时免除此迁移的例外申请流程。我们维护了一张在BeyondCorp环境中尚未合格的工作流程的列表。用户可以搜索这些列表,并以合理的审批后,标明自己和自己的设备作为某个工作流的合法存在。当该工作流最终合格时,其用户被通知进行迁移。 198 | 199 | ### 完成BeyondCorp 200 | 201 | 谷歌企业向BeyondCorp的迁移正在进行中,它所需要的大部分工作已经完成。我们的迁移工具和策略允许我们主动地将用户、设备和工作流移到BeyondCorp,而且并不影响到日常生产力。 202 | 203 | 我们预期到工作流长尾效应该还需要一些时间来完全实现向BeyondCorp的迁移。例如,使用专有协议来与服务器通讯的胖客户端应用程序就将是一个挑战。 -------------------------------------------------------------------------------- /docs/_headers: -------------------------------------------------------------------------------- 1 | /* 2 | Cache-Control : public, max-age=604800 , must-revalidate -------------------------------------------------------------------------------- /docs/images/2018/08/01.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SecurityPaper/SecurityPaper-web/cbe1d19c3b8090e38e70b319a31c78248528fea6/docs/images/2018/08/01.png -------------------------------------------------------------------------------- /docs/images/2018/08/02.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SecurityPaper/SecurityPaper-web/cbe1d19c3b8090e38e70b319a31c78248528fea6/docs/images/2018/08/02.png -------------------------------------------------------------------------------- /docs/images/2018/08/03.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SecurityPaper/SecurityPaper-web/cbe1d19c3b8090e38e70b319a31c78248528fea6/docs/images/2018/08/03.png -------------------------------------------------------------------------------- /docs/images/2018/08/04.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SecurityPaper/SecurityPaper-web/cbe1d19c3b8090e38e70b319a31c78248528fea6/docs/images/2018/08/04.png -------------------------------------------------------------------------------- /docs/images/2018/08/05.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SecurityPaper/SecurityPaper-web/cbe1d19c3b8090e38e70b319a31c78248528fea6/docs/images/2018/08/05.png -------------------------------------------------------------------------------- /docs/images/2018/08/06.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SecurityPaper/SecurityPaper-web/cbe1d19c3b8090e38e70b319a31c78248528fea6/docs/images/2018/08/06.png -------------------------------------------------------------------------------- /docs/images/2018/08/07.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SecurityPaper/SecurityPaper-web/cbe1d19c3b8090e38e70b319a31c78248528fea6/docs/images/2018/08/07.png -------------------------------------------------------------------------------- /docs/images/2018/08/08.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SecurityPaper/SecurityPaper-web/cbe1d19c3b8090e38e70b319a31c78248528fea6/docs/images/2018/08/08.jpg -------------------------------------------------------------------------------- /docs/images/2018/09/01.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SecurityPaper/SecurityPaper-web/cbe1d19c3b8090e38e70b319a31c78248528fea6/docs/images/2018/09/01.png -------------------------------------------------------------------------------- /docs/images/2018/09/02.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SecurityPaper/SecurityPaper-web/cbe1d19c3b8090e38e70b319a31c78248528fea6/docs/images/2018/09/02.png -------------------------------------------------------------------------------- /docs/images/2018/10/01.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SecurityPaper/SecurityPaper-web/cbe1d19c3b8090e38e70b319a31c78248528fea6/docs/images/2018/10/01.jpeg -------------------------------------------------------------------------------- /docs/images/2018/10/02.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SecurityPaper/SecurityPaper-web/cbe1d19c3b8090e38e70b319a31c78248528fea6/docs/images/2018/10/02.jpeg -------------------------------------------------------------------------------- /docs/images/2018/10/github/1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SecurityPaper/SecurityPaper-web/cbe1d19c3b8090e38e70b319a31c78248528fea6/docs/images/2018/10/github/1.png -------------------------------------------------------------------------------- /docs/images/2018/10/github/2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SecurityPaper/SecurityPaper-web/cbe1d19c3b8090e38e70b319a31c78248528fea6/docs/images/2018/10/github/2.png -------------------------------------------------------------------------------- /docs/images/2018/10/github/3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SecurityPaper/SecurityPaper-web/cbe1d19c3b8090e38e70b319a31c78248528fea6/docs/images/2018/10/github/3.png -------------------------------------------------------------------------------- /docs/images/2018/10/github/4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SecurityPaper/SecurityPaper-web/cbe1d19c3b8090e38e70b319a31c78248528fea6/docs/images/2018/10/github/4.png -------------------------------------------------------------------------------- /docs/images/2018/10/github/5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SecurityPaper/SecurityPaper-web/cbe1d19c3b8090e38e70b319a31c78248528fea6/docs/images/2018/10/github/5.png -------------------------------------------------------------------------------- /docs/images/4.构建企业安全/4-如何利用Flink实现大规模用户行为分析/01.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SecurityPaper/SecurityPaper-web/cbe1d19c3b8090e38e70b319a31c78248528fea6/docs/images/4.构建企业安全/4-如何利用Flink实现大规模用户行为分析/01.jpg -------------------------------------------------------------------------------- /docs/images/4.构建企业安全/4-如何利用Flink实现大规模用户行为分析/02.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SecurityPaper/SecurityPaper-web/cbe1d19c3b8090e38e70b319a31c78248528fea6/docs/images/4.构建企业安全/4-如何利用Flink实现大规模用户行为分析/02.jpg -------------------------------------------------------------------------------- /docs/images/7.安全前瞻/1-BeyondCorp-以全新方式保障企业安全/1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SecurityPaper/SecurityPaper-web/cbe1d19c3b8090e38e70b319a31c78248528fea6/docs/images/7.安全前瞻/1-BeyondCorp-以全新方式保障企业安全/1.png -------------------------------------------------------------------------------- /docs/images/7.安全前瞻/1-BeyondCorp-以全新方式保障企业安全/2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SecurityPaper/SecurityPaper-web/cbe1d19c3b8090e38e70b319a31c78248528fea6/docs/images/7.安全前瞻/1-BeyondCorp-以全新方式保障企业安全/2.png -------------------------------------------------------------------------------- /docs/images/head/1024.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SecurityPaper/SecurityPaper-web/cbe1d19c3b8090e38e70b319a31c78248528fea6/docs/images/head/1024.jpg -------------------------------------------------------------------------------- /docs/images/head/108haili.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SecurityPaper/SecurityPaper-web/cbe1d19c3b8090e38e70b319a31c78248528fea6/docs/images/head/108haili.jpeg -------------------------------------------------------------------------------- /docs/images/head/God.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SecurityPaper/SecurityPaper-web/cbe1d19c3b8090e38e70b319a31c78248528fea6/docs/images/head/God.jpeg -------------------------------------------------------------------------------- /docs/images/head/I.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SecurityPaper/SecurityPaper-web/cbe1d19c3b8090e38e70b319a31c78248528fea6/docs/images/head/I.png -------------------------------------------------------------------------------- /docs/images/head/Jun6l3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SecurityPaper/SecurityPaper-web/cbe1d19c3b8090e38e70b319a31c78248528fea6/docs/images/head/Jun6l3.jpg -------------------------------------------------------------------------------- /docs/images/head/Minggle.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SecurityPaper/SecurityPaper-web/cbe1d19c3b8090e38e70b319a31c78248528fea6/docs/images/head/Minggle.jpg -------------------------------------------------------------------------------- /docs/images/head/Murviet.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SecurityPaper/SecurityPaper-web/cbe1d19c3b8090e38e70b319a31c78248528fea6/docs/images/head/Murviet.png -------------------------------------------------------------------------------- /docs/images/head/Weiho.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SecurityPaper/SecurityPaper-web/cbe1d19c3b8090e38e70b319a31c78248528fea6/docs/images/head/Weiho.png -------------------------------------------------------------------------------- /docs/images/head/backlion.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SecurityPaper/SecurityPaper-web/cbe1d19c3b8090e38e70b319a31c78248528fea6/docs/images/head/backlion.jpg -------------------------------------------------------------------------------- /docs/images/head/chuanguosuiyuebulao.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SecurityPaper/SecurityPaper-web/cbe1d19c3b8090e38e70b319a31c78248528fea6/docs/images/head/chuanguosuiyuebulao.jpeg -------------------------------------------------------------------------------- /docs/images/head/cloudwafs.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SecurityPaper/SecurityPaper-web/cbe1d19c3b8090e38e70b319a31c78248528fea6/docs/images/head/cloudwafs.jpeg -------------------------------------------------------------------------------- /docs/images/head/corporation/hansight.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SecurityPaper/SecurityPaper-web/cbe1d19c3b8090e38e70b319a31c78248528fea6/docs/images/head/corporation/hansight.png -------------------------------------------------------------------------------- /docs/images/head/corporation/yidonganquan.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SecurityPaper/SecurityPaper-web/cbe1d19c3b8090e38e70b319a31c78248528fea6/docs/images/head/corporation/yidonganquan.png -------------------------------------------------------------------------------- /docs/images/head/doubiduo.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SecurityPaper/SecurityPaper-web/cbe1d19c3b8090e38e70b319a31c78248528fea6/docs/images/head/doubiduo.jpeg -------------------------------------------------------------------------------- /docs/images/head/dubbo.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SecurityPaper/SecurityPaper-web/cbe1d19c3b8090e38e70b319a31c78248528fea6/docs/images/head/dubbo.jpeg -------------------------------------------------------------------------------- /docs/images/head/fengzi.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SecurityPaper/SecurityPaper-web/cbe1d19c3b8090e38e70b319a31c78248528fea6/docs/images/head/fengzi.jpeg -------------------------------------------------------------------------------- /docs/images/head/fengzi1.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SecurityPaper/SecurityPaper-web/cbe1d19c3b8090e38e70b319a31c78248528fea6/docs/images/head/fengzi1.jpeg -------------------------------------------------------------------------------- /docs/images/head/fireeye.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SecurityPaper/SecurityPaper-web/cbe1d19c3b8090e38e70b319a31c78248528fea6/docs/images/head/fireeye.jpg -------------------------------------------------------------------------------- /docs/images/head/hzkey.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SecurityPaper/SecurityPaper-web/cbe1d19c3b8090e38e70b319a31c78248528fea6/docs/images/head/hzkey.jpeg -------------------------------------------------------------------------------- /docs/images/head/johnathan.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SecurityPaper/SecurityPaper-web/cbe1d19c3b8090e38e70b319a31c78248528fea6/docs/images/head/johnathan.jpeg -------------------------------------------------------------------------------- /docs/images/head/jsp-shell.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SecurityPaper/SecurityPaper-web/cbe1d19c3b8090e38e70b319a31c78248528fea6/docs/images/head/jsp-shell.jpg -------------------------------------------------------------------------------- /docs/images/head/k4n5ha0.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SecurityPaper/SecurityPaper-web/cbe1d19c3b8090e38e70b319a31c78248528fea6/docs/images/head/k4n5ha0.jpeg -------------------------------------------------------------------------------- /docs/images/head/lmowen.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SecurityPaper/SecurityPaper-web/cbe1d19c3b8090e38e70b319a31c78248528fea6/docs/images/head/lmowen.jpeg -------------------------------------------------------------------------------- /docs/images/head/lost_maniac.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SecurityPaper/SecurityPaper-web/cbe1d19c3b8090e38e70b319a31c78248528fea6/docs/images/head/lost_maniac.jpeg -------------------------------------------------------------------------------- /docs/images/head/pa55w0rd.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SecurityPaper/SecurityPaper-web/cbe1d19c3b8090e38e70b319a31c78248528fea6/docs/images/head/pa55w0rd.jpeg -------------------------------------------------------------------------------- /docs/images/head/realjac.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SecurityPaper/SecurityPaper-web/cbe1d19c3b8090e38e70b319a31c78248528fea6/docs/images/head/realjac.jpg -------------------------------------------------------------------------------- /docs/images/head/tinker.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SecurityPaper/SecurityPaper-web/cbe1d19c3b8090e38e70b319a31c78248528fea6/docs/images/head/tinker.jpeg -------------------------------------------------------------------------------- /docs/images/head/xiaoletian.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SecurityPaper/SecurityPaper-web/cbe1d19c3b8090e38e70b319a31c78248528fea6/docs/images/head/xiaoletian.jpeg -------------------------------------------------------------------------------- /docs/images/head/xiatao.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SecurityPaper/SecurityPaper-web/cbe1d19c3b8090e38e70b319a31c78248528fea6/docs/images/head/xiatao.jpeg -------------------------------------------------------------------------------- /docs/images/head/xuandao.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SecurityPaper/SecurityPaper-web/cbe1d19c3b8090e38e70b319a31c78248528fea6/docs/images/head/xuandao.jpeg -------------------------------------------------------------------------------- /docs/images/head/yiming.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SecurityPaper/SecurityPaper-web/cbe1d19c3b8090e38e70b319a31c78248528fea6/docs/images/head/yiming.png -------------------------------------------------------------------------------- /docs/images/head/yitiaoyu.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SecurityPaper/SecurityPaper-web/cbe1d19c3b8090e38e70b319a31c78248528fea6/docs/images/head/yitiaoyu.jpeg -------------------------------------------------------------------------------- /docs/images/head/zhanzhexizao.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SecurityPaper/SecurityPaper-web/cbe1d19c3b8090e38e70b319a31c78248528fea6/docs/images/head/zhanzhexizao.png -------------------------------------------------------------------------------- /docs/images/weixin.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SecurityPaper/SecurityPaper-web/cbe1d19c3b8090e38e70b319a31c78248528fea6/docs/images/weixin.jpg -------------------------------------------------------------------------------- /docs/update.md: -------------------------------------------------------------------------------- 1 | # 更新日志 2 | 3 | ## 2019年8月26日 4 | 5 | 更新内容: 6 | 7 | 1. 增加“SDL落地方案-代码编写”部分 8 | 9 | ## 2019年4月25日 10 | 11 | 更新内容: 12 | 13 | 1. 增加应用安全业务自查checklist 14 | 2. 增加成员realjac 15 | 3. 更新copyright时间 16 | 17 | ## 2019年4月8日 18 | 19 | 更新内容: 20 | 21 | 1. 增加996.ICU license 22 | 23 | 24 | ## 2019年3月1日 25 | 26 | 更新内容: 27 | 28 | 1. 增加成员移动安全联盟 29 | 30 | 31 | ## 2019年2月23日 32 | 33 | 更新内容: 34 | 35 | 1. 增加成员Cloudwafs 36 | 2. 增加php安全规范 37 | 38 | ## 2019年2月21日 39 | 40 | 更新内容: 41 | 42 | 1. 增加成员穿过岁月不老 43 | 2. 增加SDL落地方案-上线发布部分 44 | 3. 增加成员Torjan 45 | 46 | 47 | ## 2018年12月17日 48 | 49 | 更新内容: 50 | 51 | 1. 增加公司贡献成员瀚思科技 52 | 2. 增加新文档,瀚思科技贡献《利用Flink实现超大规模用户行为分析》 53 | 3. 增加新文档,成员backlion贡献《APT 攻击基础科普》 54 | 55 | ## 2018年12月10日 56 | 57 | 更新内容: 58 | 59 | 1. 增加新成员lmowen 60 | 2. 增加新文档,《BeyondCorp -以全新方式保障企业安全》 61 | 62 | 63 | ## 2018年12月02日 64 | 65 | 更新内容: 66 | 67 | 1. 整合安卓和IOS安全规范为移动安全规范。 68 | 69 | ## 2018年11月20日 70 | 71 | 更新内容: 72 | 73 | 1. 完善了php安全规范 74 | 75 | ## 2018年11月8日 76 | 77 | 更新内容: 78 | 79 | 1. 增加新成员tinker 80 | 81 | ## 2018年11月7日 82 | 83 | 更新内容: 84 | 85 | 1. 添加防止短信接口被滥用的措施 86 | 87 | ## 2018年10月17日 88 | 89 | 更新内容: 90 | 91 | 1. 增加SDL落地流程文档 92 | 2. 修复bootcss挂掉问题 93 | 94 | --- 95 | 96 | ## 2018年10月16日 97 | 98 | 更新内容: 99 | 100 | 1. 去掉单个文章计数统计 101 | 2. 增加首页不蒜子连接 102 | 103 | --- 104 | 105 | ## 2018年10月15日 106 | 107 | 更新内容: 108 | 109 | 1. 增加“泰式感知”说明页面 110 | 2. 增加GitHub工作流。 111 | 112 | --- 113 | 114 | ## 2018年9月26日 115 | 116 | 更新内容: 117 | 118 | 1. 删除福利相关,隐藏但是可以用:) 119 | 2. 增加安全意识培训浏览器安全。 120 | 3. 更新大量安全培训相关知识 121 | 4. 增加mysql安全配置 122 | 5. 增加大量贡献文档修改建议的小伙伴 123 | 124 | --- 125 | 126 | ## 2018年9月25日 127 | 128 | 更新内容: 129 | 130 | 1. 增加about页面加入方法,贡献文档等等说明 131 | 2. 修改首页slogan 132 | 133 | ## 2018年9月23日 134 | 135 | 更新内容: 136 | 137 | 1. 修改样式,代码框下部增加20px 138 | 2. 更新java编码规范 139 | 140 | --- 141 | 142 | ## 2018年9月11日 143 | 144 | 更新内容: 145 | 146 | 1. 工作流自动化代码审计 147 | 148 | --- 149 | 150 | ## 2018年9月02日 151 | 152 | 更新内容: 153 | 154 | 1. 增加文档 IOS安全规范文档 155 | 156 | --- 157 | 158 | ## 2018年8月31日 159 | 160 | 更新内容: 161 | 162 | 1. 增加文档 Android安全规范文档 163 | 2. 增加应急响应文档 164 | 165 | --- 166 | 167 | ## 2018年8月30日 168 | 169 | 更新内容: 170 | 171 | 1. 增加文档 哪些企业需要SDL 172 | 2. 新增python代码安全规范 173 | 174 | --- 175 | 176 | ## 2018年8月26日 177 | 178 | 更新内容: 179 | 180 | 1. 增加内部钓鱼系统部署文档 181 | 2. 增加php代码审计工具的文档 182 | 3. 增加导航栏类目,Project 183 | 4. 增加企业为什么需要SDL 184 | 5. 增加成员Murviet 185 | 186 | --- 187 | 188 | ## 2018年8月26日 189 | 190 | 更新内容: 191 | 192 | 1. 新增文档《互联网企业安全运营的思考》 193 | 2. 修复文档《内功修炼第二步-引起重视》中的错误日期 194 | 195 | --- 196 | 197 | ## 2018年8月23日 198 | 199 | 新增内容: 200 | 201 | 1. 增加团队成员枫子 202 | 2. 增加渗透测试章节 203 | 3. 安全设计--密码找回增加一条 204 | 4. 安全培训--增加一些条目 205 | 206 | 网站优化: 207 | 208 | 1. 优化css加载方式 209 | 2. 优化jq的js文件加载方式 210 | 3. 优化谷歌字体加载方式 211 | 212 | --- 213 | 214 | ## 2018年8月22日 215 | 216 | 1. 增加安全培训--APP安全开发培训 217 | 2. 增加安全培训--web安全开发培训 218 | 3. 增加安全培训--产品经理安全培训 219 | 220 | --- 221 | 222 | ## 2018年08月21日 223 | 224 | 新增内容: 225 | 226 | 1. 安全培训-运维安全培训 227 | 2. 相关术语增加 SDL 、ROI、ATT&CK 、STRIDE内容 228 | 229 | --- 230 | 231 | ## 2018年08月20日 232 | 233 | 修改内容: 234 | 235 | 1. 增加安全设计checklist内容 236 | 237 | 网站优化: 238 | 239 | 1. 增加网站About页面成员css样式 240 | 2. 增加网站About页面成员 241 | 242 | --- 243 | 244 | ## 2018年08月19日 245 | 246 | 新增文章内容: 247 | 248 | 1. 什么是SDL 249 | 2. 落地方案--安全培训(安全意识培训) 250 | 251 | --- 252 | 253 | ## 2018年08月18日 254 | 255 | 新增文章内容: 256 | 257 | 1. 安全设计Chechklist 258 | 259 | --- 260 | 261 | ## 2018年08月17日 262 | 263 | 更新主体大纲内容 264 | 265 | --- 266 | 267 | ## 2018年08月16日 268 | 269 | SDL China成立 270 | 271 | ----- 272 | -------------------------------------------------------------------------------- /mkdocs.yml: -------------------------------------------------------------------------------- 1 | site_name: Security Paper 2 | site_description: 所有文档均由中国互联网一线安全工程师编写整理 3 | site_author: Security Paper 4 | site_url: https://www.securitypaper.org 5 | 6 | # Repository 7 | repo_name: SecurityPaper/SecurityPaper-web 8 | repo_url: https://github.com/SecurityPaper/SecurityPaper-web 9 | edit_uri: "https://github.com/SecurityPaper/SecurityPaper-web" 10 | 11 | # Copyright 12 | copyright: 'Copyright © 2016 - 2019 SecurityPaper' 13 | 14 | # Configuration 15 | theme: 16 | name: null 17 | custom_dir: SecurityPaper-themes 18 | 19 | logo: "/images/logo.svg" 20 | # feature: 21 | # tabs: true 22 | 23 | # 404 page 24 | static_templates: 25 | - 404.html 26 | 27 | # Don't include MkDocs' JavaScript 28 | include_search_page: false 29 | search_index_only: true 30 | 31 | # Default values, taken from mkdocs_theme.yml 32 | language: zh 33 | feature: 34 | tabs: true 35 | palette: 36 | primary: light blue 37 | accent: light blue 38 | font: 39 | text: Roboto 40 | code: Roboto Mono 41 | favicon: assets/images/favicon.png 42 | highlightjs: true 43 | 44 | 45 | # Customization 46 | # extra: 47 | # social: 48 | # - type: globe 49 | # link: https://www.securitypaper.org/ 50 | # - type: github-alt 51 | # link: https://github.com/SecurityPaper/SecurityPaper-web/ 52 | 53 | 54 | # Extensions 55 | # markdown_extensions: 56 | # - markdown.extensions.admonition 57 | # - markdown.extensions.codehilite: 58 | # guess_lang: false 59 | # - markdown.extensions.def_list 60 | # - markdown.extensions.footnotes 61 | # - markdown.extensions.meta 62 | # - markdown.extensions.toc: 63 | # permalink: true 64 | # - pymdownx.arithmatex 65 | # - pymdownx.betterem: 66 | # smart_enable: all 67 | # - pymdownx.caret 68 | # - pymdownx.critic 69 | # - pymdownx.details 70 | # # - pymdownx.emoji: 71 | # # emoji_generator: !!python/name:pymdownx.emoji.to_svg 72 | # - pymdownx.inlinehilite 73 | # - pymdownx.keys 74 | # - pymdownx.magiclink 75 | # - pymdownx.mark 76 | # - pymdownx.smartsymbols 77 | # - pymdownx.superfences 78 | # - pymdownx.tasklist: 79 | # custom_checkbox: true 80 | # - pymdownx.tilde 81 | 82 | # markdown_extensions: 83 | # - admonition 84 | # - codehilite: 85 | # guess_lang: false 86 | # - toc: 87 | # permalink: true 88 | 89 | # Page tree 90 | # nav: 91 | # - 首页: index.md 92 | # - Extensions: 93 | # - Admonition: SDL_introduction/1.什么是SDL.md 94 | # - CodeHilite: SDL_introduction/2.企业为什么需求SDL.md 95 | # - Footnotes: SDL_introduction/footnotes.md 96 | # - Metadata: SDL_introduction/metadata.md 97 | # - Permalinks: SDL_introduction/permalinks.md 98 | # - PyMdown: SDL_introduction/pymdown.md 99 | # - Specimen: specimen.md 100 | # - Customization: customization.md 101 | # - Compliance with GDPR: compliance.md 102 | # - Release notes: release-notes.md 103 | # - Author's notes: authors-notes.md 104 | # - Contributing: contributing.md 105 | # - License: license.md 106 | 107 | # Google Analytics 108 | google_analytics: 109 | - !!python/object/apply:os.getenv ["GOOGLE_ANALYTICS_KEY"] 110 | - auto 111 | -------------------------------------------------------------------------------- /requirements.txt: -------------------------------------------------------------------------------- 1 | mkdocs --------------------------------------------------------------------------------