<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet href="/rss.xsl" type="text/xsl"?>
<rss version="2.0">
  <channel>
    <title>IT瘾web推荐</title>
    <link>https://itindex.net/categories/web</link>
    <description>IT社区推荐资讯 - ITIndex.net</description>
    <language>zh</language>
    <copyright>https://itindex.net/</copyright>
    <generator>https://itindex.net/</generator>
    <docs>http://backend.userland.com/rss</docs>
    <image>
      <url>https://itindex.net/images/logo.gif</url>
      <title>IT社区推荐资讯 - ITIndex.net</title>
      <link>https://itindex.net/categories/web</link>
    </image>
    <item>
      <title>如何使用claude code开发完整的响应式web应用</title>
      <link>https://itindex.net/detail/63026-claude-code-%E5%BC%80%E5%8F%91</link>
      <description>&lt;div&gt;Claude Code 是由 Anthropic 开发的一款智能编码工具，能够通过自然语言指令辅助开发者快速生成代码、优化工作流程并构建应用。以下是一个基于 Claude Code 开发完整响应式 Web 应用的指南，结合了现代 Web 开发技术（如 React 和 Tailwind CSS），并通过实际案例展示具体步骤。以下内容基于 Claude Code 的功能特性，参考了网络资源和社区实践。&lt;/div&gt; &lt;div&gt;  &lt;br /&gt;&lt;/div&gt; &lt;div&gt;  &lt;br /&gt;&lt;/div&gt; &lt;div&gt;  &lt;br /&gt;&lt;/div&gt; &lt;div&gt;# 使用 Claude Code 开发完整的响应式 Web 应用&lt;/div&gt; &lt;div&gt;  &lt;br /&gt;&lt;/div&gt; &lt;div&gt;本指南将通过构建一个简单的响应式电影展示 Web 应用，展示如何利用 Claude Code 的智能代码生成、调试和优化功能，结合 React 和 Tailwind CSS，快速开发一个现代化的全栈应用。应用将包括前端界面、后端 API 以及响应式设计，确保在不同设备上都能良好运行。&lt;/div&gt; &lt;div&gt;  &lt;br /&gt;&lt;/div&gt; &lt;div&gt;## 准备工作&lt;/div&gt; &lt;div&gt;  &lt;br /&gt;&lt;/div&gt; &lt;div&gt;### 系统要求&lt;/div&gt; &lt;div&gt;- 安装 Node.js（建议版本 18 或以上）&lt;/div&gt; &lt;div&gt;- 安装一个支持 Claude Code 的开发环境（如 VS Code 或终端）&lt;/div&gt; &lt;div&gt;- 确保已安装 Git 用于版本控制&lt;/div&gt; &lt;div&gt;- （可选）Docker，用于快速部署或测试&lt;/div&gt; &lt;div&gt;- 访问 Claude API 或 Claude Code 工具（通过 Anthropic 官网申请或使用支持的 IDE 插件）&lt;/div&gt; &lt;div&gt;  &lt;br /&gt;&lt;/div&gt; &lt;div&gt;### 安装 Claude Code&lt;/div&gt; &lt;div&gt;1. **获取 Claude Code**：&lt;/div&gt; &lt;div&gt;   - 访问 Anthropic 官网（https://www.anthropic.com/api）申请 Claude API 密钥，或使用支持 Claude Code 的 IDE 插件（如 VS Code 的 Claude Code 扩展）。&lt;/div&gt; &lt;div&gt;   - 如果使用免费 API，可参考 Slack 获取方式（需要注意使用限制）。[](https://explinks.com/blog/unlocking-claudes-free-api-model-from-getting-started-to-practical-application/)&lt;/div&gt; &lt;div&gt;2. **配置开发环境**：&lt;/div&gt; &lt;div&gt;   - 在终端或 IDE 中安装 Claude Code，按照官方文档配置环境变量（如 API 密钥）。&lt;/div&gt; &lt;div&gt;   - 示例配置（.env 文件）：&lt;/div&gt; &lt;div&gt;     ```&lt;/div&gt; &lt;div&gt;     CLAUDE_API_KEY=your_api_key_here&lt;/div&gt; &lt;div&gt;     ```&lt;/div&gt; &lt;div&gt;3. **安装项目依赖**：&lt;/div&gt; &lt;div&gt;   - 初始化一个 React 项目：&lt;/div&gt; &lt;div&gt;     ```bash&lt;/div&gt; &lt;div&gt;     npx create-react-app movie-app&lt;/div&gt; &lt;div&gt;     cd movie-app&lt;/div&gt; &lt;div&gt;     ```&lt;/div&gt; &lt;div&gt;   - 安装 Tailwind CSS：&lt;/div&gt; &lt;div&gt;     ```bash&lt;/div&gt; &lt;div&gt;     npm install -D tailwindcss&lt;/div&gt; &lt;div&gt;     npx tailwindcss init&lt;/div&gt; &lt;div&gt;     ```&lt;/div&gt; &lt;div&gt;   - 配置 `tailwind.config.js`：&lt;/div&gt; &lt;div&gt;     ```javascript&lt;/div&gt; &lt;div&gt;     /** @type {import(&amp;apos;tailwindcss&amp;apos;).Config} */&lt;/div&gt; &lt;div&gt;     module.exports = {&lt;/div&gt; &lt;div&gt;       content: [&amp;quot;./src/**/*.{js,jsx,ts,tsx}&amp;quot;],&lt;/div&gt; &lt;div&gt;       theme: { extend: {} },&lt;/div&gt; &lt;div&gt;       plugins: [],&lt;/div&gt; &lt;div&gt;     };&lt;/div&gt; &lt;div&gt;     ```&lt;/div&gt; &lt;div&gt;   - 添加 Tailwind 指令到 `src/index.css`：&lt;/div&gt; &lt;div&gt;     ```css&lt;/div&gt; &lt;div&gt;     @tailwind base;&lt;/div&gt; &lt;div&gt;     @tailwind components;&lt;/div&gt; &lt;div&gt;     @tailwind utilities;&lt;/div&gt; &lt;div&gt;     ```&lt;/div&gt; &lt;div&gt;  &lt;br /&gt;&lt;/div&gt; &lt;div&gt;## 使用 Claude Code 开发应用&lt;/div&gt; &lt;div&gt;  &lt;br /&gt;&lt;/div&gt; &lt;div&gt;### 1. 设计应用原型&lt;/div&gt; &lt;div&gt;Claude Code 支持通过自然语言生成代码和原型设计。我们将构建一个电影展示应用，包含以下功能：&lt;/div&gt; &lt;div&gt;- 首页：显示电影列表（从公开 API 获取数据）&lt;/div&gt; &lt;div&gt;- 详情页：展示单部电影的详细信息&lt;/div&gt; &lt;div&gt;- 响应式布局：适配桌面端和移动端&lt;/div&gt; &lt;div&gt;  &lt;br /&gt;&lt;/div&gt; &lt;div&gt;**提示 Claude Code 生成原型**：&lt;/div&gt; &lt;div&gt;在 Claude Code 界面或终端输入：&lt;/div&gt; &lt;div&gt;&amp;gt; &amp;quot;为我生成一个基于 React 和 Tailwind CSS 的响应式电影展示应用原型，包含首页电影列表和详情页，使用免费的 TMDB API 获取数据。&amp;quot;&lt;/div&gt; &lt;div&gt;  &lt;br /&gt;&lt;/div&gt; &lt;div&gt;Claude Code 将生成以下结构（可能需要调整提示词以优化输出）：&lt;/div&gt; &lt;div&gt;- 项目结构：&lt;/div&gt; &lt;div&gt;  ```&lt;/div&gt; &lt;div&gt;  movie-app/&lt;/div&gt; &lt;div&gt;  ├── src/&lt;/div&gt; &lt;div&gt;  │   ├── components/&lt;/div&gt; &lt;div&gt;  │   │   ├── MovieList.js&lt;/div&gt; &lt;div&gt;  │   │   ├── MovieCard.js&lt;/div&gt; &lt;div&gt;  │   │   ├── MovieDetails.js&lt;/div&gt; &lt;div&gt;  │   ├── App.js&lt;/div&gt; &lt;div&gt;  │   ├── index.js&lt;/div&gt; &lt;div&gt;  │   ├── index.css&lt;/div&gt; &lt;div&gt;  ├── public/&lt;/div&gt; &lt;div&gt;  ├── package.json&lt;/div&gt; &lt;div&gt;  ├── tailwind.config.js&lt;/div&gt; &lt;div&gt;  ```&lt;/div&gt; &lt;div&gt;  &lt;br /&gt;&lt;/div&gt; &lt;div&gt;### 2. 生成前端代码&lt;/div&gt; &lt;div&gt;**使用 Claude Code 生成组件**：&lt;/div&gt; &lt;div&gt;- 输入提示：&lt;/div&gt; &lt;div&gt;  &amp;gt; &amp;quot;生成一个 React 组件 `MovieCard.js`，使用 Tailwind CSS 设计响应式卡片，显示电影海报、标题和评分，适配移动端和桌面端。&amp;quot;&lt;/div&gt; &lt;div&gt;- Claude Code 输出（示例）：&lt;/div&gt; &lt;div&gt;  &lt;br /&gt;&lt;/div&gt; &lt;div&gt;import React from &amp;apos;react&amp;apos;;&lt;/div&gt; &lt;div&gt;  &lt;br /&gt;&lt;/div&gt; &lt;div&gt;const MovieCard = ({ movie }) =&amp;gt; {&lt;/div&gt; &lt;div&gt;  return (&lt;/div&gt; &lt;div&gt;    &amp;lt;div className=&amp;quot;max-w-sm rounded overflow-hidden shadow-lg m-4 hover:scale-105 transition-transform&amp;quot;&amp;gt;&lt;/div&gt; &lt;div&gt;      &amp;lt;img&lt;/div&gt; &lt;div&gt;        className=&amp;quot;w-full h-64 object-cover&amp;quot;&lt;/div&gt; &lt;div&gt;        src={`https://image.tmdb.org/t/p/w500${movie.poster_path}`}&lt;/div&gt; &lt;div&gt;        alt={movie.title}&lt;/div&gt; &lt;div&gt;      /&amp;gt;&lt;/div&gt; &lt;div&gt;      &amp;lt;div className=&amp;quot;px-6 py-4&amp;quot;&amp;gt;&lt;/div&gt; &lt;div&gt;        &amp;lt;div className=&amp;quot;font-bold text-xl mb-2&amp;quot;&amp;gt;{movie.title}&amp;lt;/div&amp;gt;&lt;/div&gt; &lt;div&gt;        &amp;lt;p className=&amp;quot;text-gray-700 text-base&amp;quot;&amp;gt;评分: {movie.vote_average}&amp;lt;/p&amp;gt;&lt;/div&gt; &lt;div&gt;      &amp;lt;/div&amp;gt;&lt;/div&gt; &lt;div&gt;    &amp;lt;/div&amp;gt;&lt;/div&gt; &lt;div&gt;  );&lt;/div&gt; &lt;div&gt;};&lt;/div&gt; &lt;div&gt;  &lt;br /&gt;&lt;/div&gt; &lt;div&gt;export default MovieCard;&lt;/div&gt; &lt;div&gt;  &lt;br /&gt;&lt;/div&gt; &lt;div&gt;  &lt;br /&gt;&lt;/div&gt; &lt;div&gt;- 类似地，生成 `MovieList.js` 和 `MovieDetails.js`，用于展示电影列表和详情页。&lt;/div&gt; &lt;div&gt;  &lt;br /&gt;&lt;/div&gt; &lt;div&gt;### 3. 集成后端 API&lt;/div&gt; &lt;div&gt;使用 TMDB API（https://www.themoviedb.org/documentation/api）获取电影数据。&lt;/div&gt; &lt;div&gt;- **提示 Claude Code 生成 API 调用代码**：&lt;/div&gt; &lt;div&gt;  &amp;gt; &amp;quot;为 React 应用生成一个使用 fetch 调用 TMDB API 的函数，获取热门电影列表，并处理错误。&amp;quot;&lt;/div&gt; &lt;div&gt;- 示例输出：&lt;/div&gt; &lt;div&gt;```javascript&lt;/div&gt; &lt;div&gt;const API_KEY = &amp;apos;your_tmdb_api_key_here&amp;apos;;&lt;/div&gt; &lt;div&gt;const BASE_URL = &amp;apos;https://api.themoviedb.org/3&amp;apos;;&lt;/div&gt; &lt;div&gt;  &lt;br /&gt;&lt;/div&gt; &lt;div&gt;export const fetchMovies = async () =&amp;gt; {&lt;/div&gt; &lt;div&gt;  try {&lt;/div&gt; &lt;div&gt;    const response = await fetch(`${BASE_URL}/movie/popular?api_key=${API_KEY}`);&lt;/div&gt; &lt;div&gt;    if (!response.ok) throw new Error(&amp;apos;Failed to fetch movies&amp;apos;);&lt;/div&gt; &lt;div&gt;    const data = await response.json();&lt;/div&gt; &lt;div&gt;    return data.results;&lt;/div&gt; &lt;div&gt;  } catch (error) {&lt;/div&gt; &lt;div&gt;    console.error(&amp;apos;Error fetching movies:&amp;apos;, error);&lt;/div&gt; &lt;div&gt;    return [];&lt;/div&gt; &lt;div&gt;  }&lt;/div&gt; &lt;div&gt;};&lt;/div&gt; &lt;div&gt;```&lt;/div&gt; &lt;div&gt;  &lt;br /&gt;&lt;/div&gt; &lt;div&gt;- 在 `MovieList.js` 中集成：&lt;/div&gt; &lt;div&gt;  ```javascript&lt;/div&gt; &lt;div&gt;  import React, { useState, useEffect } from &amp;apos;react&amp;apos;;&lt;/div&gt; &lt;div&gt;  import MovieCard from &amp;apos;./MovieCard&amp;apos;;&lt;/div&gt; &lt;div&gt;  import { fetchMovies } from &amp;apos;./api&amp;apos;;&lt;/div&gt; &lt;div&gt;  &lt;br /&gt;&lt;/div&gt; &lt;div&gt;  const MovieList = () =&amp;gt; {&lt;/div&gt; &lt;div&gt;    const [movies, setMovies] = useState([]);&lt;/div&gt; &lt;div&gt;  &lt;br /&gt;&lt;/div&gt; &lt;div&gt;    useEffect(() =&amp;gt; {&lt;/div&gt; &lt;div&gt;      const loadMovies = async () =&amp;gt; {&lt;/div&gt; &lt;div&gt;        const data = await fetchMovies();&lt;/div&gt; &lt;div&gt;        setMovies(data);&lt;/div&gt; &lt;div&gt;      };&lt;/div&gt; &lt;div&gt;      loadMovies();&lt;/div&gt; &lt;div&gt;    }, []);&lt;/div&gt; &lt;div&gt;  &lt;br /&gt;&lt;/div&gt; &lt;div&gt;    return (&lt;/div&gt; &lt;div&gt;      &amp;lt;div className=&amp;quot;grid grid-cols-1 sm:grid-cols-2 md:grid-cols-3 lg:grid-cols-4 gap-4 p-4&amp;quot;&amp;gt;&lt;/div&gt; &lt;div&gt;        {movies.map((movie) =&amp;gt; (&lt;/div&gt; &lt;div&gt;          &amp;lt;MovieCard key={movie.id} movie={movie} /&amp;gt;&lt;/div&gt; &lt;div&gt;        ))}&lt;/div&gt; &lt;div&gt;      &amp;lt;/div&amp;gt;&lt;/div&gt; &lt;div&gt;    );&lt;/div&gt; &lt;div&gt;  };&lt;/div&gt; &lt;div&gt;  &lt;br /&gt;&lt;/div&gt; &lt;div&gt;  export default MovieList;&lt;/div&gt; &lt;div&gt;  ```&lt;/div&gt; &lt;div&gt;  &lt;br /&gt;&lt;/div&gt; &lt;div&gt;### 4. 实现响应式设计&lt;/div&gt; &lt;div&gt;Tailwind CSS 提供内置的响应式工具类（如 `sm:`, `md:`, `lg:`），确保应用在不同设备上的适配。&lt;/div&gt; &lt;div&gt;- **优化布局**：&lt;/div&gt; &lt;div&gt;  - 使用 `grid-cols-*` 实现动态网格布局。&lt;/div&gt; &lt;div&gt;  - 示例：`grid grid-cols-1 sm:grid-cols-2 md:grid-cols-3 lg:grid-cols-4` 确保小屏幕单列，大屏幕多列。&lt;/div&gt; &lt;div&gt;- **提示 Claude Code 优化响应式样式**：&lt;/div&gt; &lt;div&gt;  &amp;gt; &amp;quot;为 MovieCard 组件优化 Tailwind CSS 样式，确保在移动端和桌面端都有良好的视觉效果。&amp;quot;&lt;/div&gt; &lt;div&gt;- Claude Code 可能会建议添加：&lt;/div&gt; &lt;div&gt;  ```css&lt;/div&gt; &lt;div&gt;  @media (max-width: 640px) {&lt;/div&gt; &lt;div&gt;    .max-w-sm { max-width: 100%; }&lt;/div&gt; &lt;div&gt;    .h-64 { height: 16rem; }&lt;/div&gt; &lt;div&gt;  }&lt;/div&gt; &lt;div&gt;  ```&lt;/div&gt; &lt;div&gt;  &lt;br /&gt;&lt;/div&gt; &lt;div&gt;### 5. 测试与调试&lt;/div&gt; &lt;div&gt;- **使用 Claude Code 调试**：&lt;/div&gt; &lt;div&gt;  - 输入提示：“检查我的 React 代码，找出潜在的性能问题或错误。”&lt;/div&gt; &lt;div&gt;  - Claude Code 可识别问题，如未处理的 API 错误、重复渲染等，并建议优化方案。&lt;/div&gt; &lt;div&gt;- **运行测试**：&lt;/div&gt; &lt;div&gt;  - 运行项目：`npm start`&lt;/div&gt; &lt;div&gt;  - 检查移动端响应式效果：使用浏览器的开发者工具模拟不同设备。&lt;/div&gt; &lt;div&gt;- **自动化测试**：&lt;/div&gt; &lt;div&gt;  - 提示 Claude Code 生成测试用例：&lt;/div&gt; &lt;div&gt;    &amp;gt; &amp;quot;为 MovieList 组件生成 Jest 测试用例，测试 API 数据加载和渲染。&amp;quot;&lt;/div&gt; &lt;div&gt;  - 示例输出：&lt;/div&gt; &lt;div&gt;```javascript&lt;/div&gt; &lt;div&gt;import { render, screen, waitFor } from &amp;apos;@testing-library/react&amp;apos;;&lt;/div&gt; &lt;div&gt;import MovieList from &amp;apos;./MovieList&amp;apos;;&lt;/div&gt; &lt;div&gt;import { fetchMovies } from &amp;apos;./api&amp;apos;;&lt;/div&gt; &lt;div&gt;  &lt;br /&gt;&lt;/div&gt; &lt;div&gt;jest.mock(&amp;apos;./api&amp;apos;);&lt;/div&gt; &lt;div&gt;  &lt;br /&gt;&lt;/div&gt; &lt;div&gt;test(&amp;apos;renders movie list after fetching data&amp;apos;, async () =&amp;gt; {&lt;/div&gt; &lt;div&gt;  fetchMovies.mockResolvedValue([{ id: 1, title: &amp;apos;Test Movie&amp;apos;, vote_average: 8.0, poster_path: &amp;apos;/test.jpg&amp;apos; }]);&lt;/div&gt; &lt;div&gt;  render(&amp;lt;MovieList /&amp;gt;);&lt;/div&gt; &lt;div&gt;  await waitFor(() =&amp;gt; {&lt;/div&gt; &lt;div&gt;    expect(screen.getByText(&amp;apos;Test Movie&amp;apos;)).toBeInTheDocument();&lt;/div&gt; &lt;div&gt;  });&lt;/div&gt; &lt;div&gt;});&lt;/div&gt; &lt;div&gt;```&lt;/div&gt; &lt;div&gt;  &lt;br /&gt;&lt;/div&gt; &lt;div&gt;### 6. 部署应用&lt;/div&gt; &lt;div&gt;- **使用 Claude Code 编写部署脚本**：&lt;/div&gt; &lt;div&gt;  - 提示：“生成一个用于将 React 应用部署到 Vercel 的脚本。”&lt;/div&gt; &lt;div&gt;  - 示例输出：&lt;/div&gt; &lt;div&gt;```json&lt;/div&gt; &lt;div&gt;{&lt;/div&gt; &lt;div&gt;  &amp;quot;version&amp;quot;: 2,&lt;/div&gt; &lt;div&gt;  &amp;quot;builds&amp;quot;: [{ &amp;quot;src&amp;quot;: &amp;quot;package.json&amp;quot;, &amp;quot;use&amp;quot;: &amp;quot;@vercel/node&amp;quot; }],&lt;/div&gt; &lt;div&gt;  &amp;quot;routes&amp;quot;: [{ &amp;quot;src&amp;quot;: &amp;quot;/(.*)&amp;quot;, &amp;quot;dest&amp;quot;: &amp;quot;/&amp;quot; }]&lt;/div&gt; &lt;div&gt;}&lt;/div&gt; &lt;div&gt;```&lt;/div&gt; &lt;div&gt;- 部署步骤：&lt;/div&gt; &lt;div&gt;  1. 安装 Vercel CLI：`npm i -g vercel`&lt;/div&gt; &lt;div&gt;  2. 运行 `vercel` 命令，按照提示登录并部署。&lt;/div&gt; &lt;div&gt;  &lt;br /&gt;&lt;/div&gt; &lt;div&gt;## 优化与进阶&lt;/div&gt; &lt;div&gt;- **使用 Claude Code 优化代码**：&lt;/div&gt; &lt;div&gt;  - 提示：“优化 MovieList 组件，减少 API 调用次数并添加加载状态。”&lt;/div&gt; &lt;div&gt;  - Claude Code 可能建议添加加载状态和 memoization：&lt;/div&gt; &lt;div&gt;    ```javascript&lt;/div&gt; &lt;div&gt;    import React, { useState, useEffect, useMemo } from &amp;apos;react&amp;apos;;&lt;/div&gt; &lt;div&gt;    const MovieList = () =&amp;gt; {&lt;/div&gt; &lt;div&gt;      const [movies, setMovies] = useState([]);&lt;/div&gt; &lt;div&gt;      const [loading, setLoading] = useState(true);&lt;/div&gt; &lt;div&gt;  &lt;br /&gt;&lt;/div&gt; &lt;div&gt;      useEffect(() =&amp;gt; {&lt;/div&gt; &lt;div&gt;        const loadMovies = async () =&amp;gt; {&lt;/div&gt; &lt;div&gt;          setLoading(true);&lt;/div&gt; &lt;div&gt;          const data = await fetchMovies();&lt;/div&gt; &lt;div&gt;          setMovies(data);&lt;/div&gt; &lt;div&gt;          setLoading(false);&lt;/div&gt; &lt;div&gt;        };&lt;/div&gt; &lt;div&gt;        loadMovies();&lt;/div&gt; &lt;div&gt;      }, []);&lt;/div&gt; &lt;div&gt;  &lt;br /&gt;&lt;/div&gt; &lt;div&gt;      const memoizedMovies = useMemo(() =&amp;gt; movies, [movies]);&lt;/div&gt; &lt;div&gt;  &lt;br /&gt;&lt;/div&gt; &lt;div&gt;      return (&lt;/div&gt; &lt;div&gt;        &amp;lt;div&amp;gt;&lt;/div&gt; &lt;div&gt;          {loading ? (&lt;/div&gt; &lt;div&gt;            &amp;lt;p className=&amp;quot;text-center&amp;quot;&amp;gt;加载中...&amp;lt;/p&amp;gt;&lt;/div&gt; &lt;div&gt;          ) : (&lt;/div&gt; &lt;div&gt;            &amp;lt;div className=&amp;quot;grid grid-cols-1 sm:grid-cols-2 md:grid-cols-3 lg:grid-cols-4 gap-4 p-4&amp;quot;&amp;gt;&lt;/div&gt; &lt;div&gt;              {memoizedMovies.map((movie) =&amp;gt; (&lt;/div&gt; &lt;div&gt;                &amp;lt;MovieCard key={movie.id} movie={movie} /&amp;gt;&lt;/div&gt; &lt;div&gt;              ))}&lt;/div&gt; &lt;div&gt;            &amp;lt;/div&amp;gt;&lt;/div&gt; &lt;div&gt;          )}&lt;/div&gt; &lt;div&gt;        &amp;lt;/div&amp;gt;&lt;/div&gt; &lt;div&gt;      );&lt;/div&gt; &lt;div&gt;    };&lt;/div&gt; &lt;div&gt;    ```&lt;/div&gt; &lt;div&gt;- **集成 MCP（Model Context Protocol）**：&lt;/div&gt; &lt;div&gt;  - 如果需要更复杂的 AI 交互，可使用 MCP 协议连接 Claude Code 与数据源。[](https://www.apframework.com/blog/essay/2024-12-15-Claude-MCP)&lt;/div&gt; &lt;div&gt;  - 提示：“生成一个 MCP 配置文件，用于连接 Claude Code 和 Supabase 数据库。”&lt;/div&gt; &lt;div&gt;  - 示例输出：&lt;/div&gt; &lt;div&gt;```json&lt;/div&gt; &lt;div&gt;{&lt;/div&gt; &lt;div&gt;  &amp;quot;protocol&amp;quot;: &amp;quot;mcp&amp;quot;,&lt;/div&gt; &lt;div&gt;  &amp;quot;version&amp;quot;: &amp;quot;1.0&amp;quot;,&lt;/div&gt; &lt;div&gt;  &amp;quot;connections&amp;quot;: [&lt;/div&gt; &lt;div&gt;    {&lt;/div&gt; &lt;div&gt;      &amp;quot;type&amp;quot;: &amp;quot;database&amp;quot;,&lt;/div&gt; &lt;div&gt;      &amp;quot;provider&amp;quot;: &amp;quot;supabase&amp;quot;,&lt;/div&gt; &lt;div&gt;      &amp;quot;url&amp;quot;: &amp;quot;your_supabase_url&amp;quot;,&lt;/div&gt; &lt;div&gt;      &amp;quot;api_key&amp;quot;: &amp;quot;your_supabase_api_key&amp;quot;&lt;/div&gt; &lt;div&gt;    }&lt;/div&gt; &lt;div&gt;  ]&lt;/div&gt; &lt;div&gt;}&lt;/div&gt; &lt;div&gt;```&lt;/div&gt; &lt;div&gt;  &lt;br /&gt;&lt;/div&gt; &lt;div&gt;## 注意事项&lt;/div&gt; &lt;div&gt;- **API 限制**：Claude Code 的免费 API 可能有调用次数限制，建议升级到付费计划以获得更高配额。[](https://explinks.com/blog/unlocking-claudes-free-api-model-from-getting-started-to-practical-application/)&lt;/div&gt; &lt;div&gt;- **错误处理**：始终检查 Claude Code 生成的代码，确保错误处理逻辑完整。&lt;/div&gt; &lt;div&gt;- **安全性**：不要在前端代码中暴露 API 密钥，建议使用环境变量。&lt;/div&gt; &lt;div&gt;- **社区资源**：参考 Anthropic 官方手册和社区指南（如 GitHub 的 Claude Code Guide）获取更多高级功能。&lt;/div&gt; &lt;div&gt;  &lt;br /&gt;&lt;/div&gt; &lt;div&gt;## 总结&lt;/div&gt; &lt;div&gt;通过 Claude Code 的智能代码生成、调试和优化功能，结合 React 和 Tailwind CSS，您可以快速构建一个响应式的电影展示 Web 应用。Claude Code 的自然语言处理能力和终端集成使其成为开发者的强大助手，尤其适合快速原型设计和全栈开发。继续探索 Claude Code 的高级功能（如 MCP 集成和自动化测试），将进一步提升开发效率。&lt;/div&gt; &lt;div&gt;  &lt;br /&gt;&lt;/div&gt; &lt;div&gt;&amp;lt;/xaiArtifact&amp;gt;&lt;/div&gt; &lt;div&gt;  &lt;br /&gt;&lt;/div&gt; &lt;div&gt;**运行项目**：&lt;/div&gt; &lt;div&gt;1. 确保所有依赖已安装（`npm install`）。&lt;/div&gt; &lt;div&gt;2. 替换 `api.js` 中的 TMDB API 密钥（可从 TMDB 官网获取）。&lt;/div&gt; &lt;div&gt;3. 运行 `npm start` 启动开发服务器。&lt;/div&gt; &lt;div&gt;4. 访问 `http://localhost:3000` 查看应用。&lt;/div&gt; &lt;div&gt;  &lt;br /&gt;&lt;/div&gt; &lt;div&gt;**进一步学习**：&lt;/div&gt; &lt;div&gt;- 查阅 Anthropic 官方文档（https://www.anthropic.com/api）了解更多 Claude Code 功能。&lt;/div&gt; &lt;div&gt;- 参考社区教程，如 GitHub 上的 Claude Code Guide 或知乎上的最佳实践指南。[](https://zhuanlan.zhihu.com/p/1920263182062163086)&lt;/div&gt; &lt;div&gt;  &lt;br /&gt;&lt;/div&gt; &lt;div&gt;如果需要更详细的代码片段或特定功能的实现，请随时提供进一步的需求！&lt;/div&gt;
     
    &lt;div&gt; &lt;a href="https://itindex.net/"  title="IT 资讯"&gt;&lt;img src="https://itindex.net/images/iconWarning.gif" title="IT 资讯" border="0"/&gt; &lt;/a&gt;</description>
      <category />
      <guid isPermaLink="true">https://itindex.net/detail/63026-claude-code-%E5%BC%80%E5%8F%91</guid>
      <pubDate>Fri, 11 Jul 2025 13:53:48 CST</pubDate>
    </item>
    <item>
      <title>the-book-of-secret-knowledge: A collection of inspiring lists, manuals, cheatsheets, blogs, hacks, one-liners, cli/web tools and more.</title>
      <link>https://itindex.net/detail/62893-the-book-of</link>
      <description>&lt;p align="center"&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge"&gt;      &lt;img alt="Master" src="https://github.com/trimstray/the-book-of-secret-knowledge/raw/master/static/img/the-book-of-secret-knowledge-preview.png"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p align="center"&gt;&amp;quot;    &lt;em&gt;Knowledge is powerful, be careful how you use it!&lt;/em&gt;&amp;quot;&lt;/p&gt;  &lt;h4&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#a-collection-of-inspiring-lists-manuals-cheatsheets-blogs-hacks-one-liners-cliweb-tools-and-more"&gt;&lt;/a&gt;A collection of inspiring lists, manuals, cheatsheets, blogs, hacks, one-liners, cli/web tools, and more.&lt;/h4&gt;  &lt;br /&gt;  &lt;p align="center"&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge/pulls"&gt;      &lt;img alt="Pull Requests" src="https://camo.githubusercontent.com/d29d75f2930f80fe8a37354d3d3d44518d4e6b4a31f8b646b90c56e7e0d1e463/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f5052732d77656c636f6d652d627269676874677265656e2e7376673f6c6f6e6743616368653d74727565"&gt;&lt;/img&gt;&lt;/a&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge/blob/master/LICENSE.md"&gt;      &lt;img alt="MIT License" src="https://camo.githubusercontent.com/2ee5364f0e08ac47e00119204cf1ab24dd21ec87b4fb81bb657feae43ec88ed4/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f4c6963656e73652d4d49542d6c69676874677265792e7376673f6c6f6e6743616368653d74727565"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p align="center"&gt;    &lt;a href="https://twitter.com/trimstray" rel="nofollow"&gt;      &lt;img src="https://camo.githubusercontent.com/c43b110bed909475c271c4eeb9255d8aa76e2e14be650239653f02cdab85ae4c/68747470733a2f2f696d672e736869656c64732e696f2f747769747465722f666f6c6c6f772f7472696d73747261792e7376673f6c6f676f3d74776974746572"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;  &lt;div align="center"&gt;    &lt;sub&gt;Created by      &lt;a href="https://twitter.com/trimstray" rel="nofollow"&gt;trimstray&lt;/a&gt;and      &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge/graphs/contributors"&gt;contributors&lt;/a&gt;&lt;/sub&gt;&lt;/div&gt;  &lt;br /&gt;  &lt;hr&gt;&lt;/hr&gt;  &lt;h2&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#notebook_with_decorative_cover-what-is-it"&gt;&lt;/a&gt;📔  What is it?&lt;/h2&gt;  &lt;p&gt;This repository is a collection of various materials and tools that I use every day in my work. It contains a lot of useful information gathered in one piece. It is an invaluable source of knowledge for me that I often look back on.&lt;/p&gt;  &lt;h2&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#restroom-for-whom"&gt;&lt;/a&gt;🚻  For whom?&lt;/h2&gt;  &lt;p&gt;For everyone, really. Here everyone can find their favourite tastes. But to be perfectly honest, it is aimed towards System and Network administrators, DevOps, Pentesters, and Security Researchers.&lt;/p&gt;  &lt;h2&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#information_source-contributing"&gt;&lt;/a&gt;ℹ️  Contributing&lt;/h2&gt;  &lt;p&gt;If you find something which doesn&amp;apos;t make sense, or something doesn&amp;apos;t seem right, please make a pull request and please add valid and well-reasoned explanations about your changes or comments.&lt;/p&gt;  &lt;p&gt;A few simple rules for this project:&lt;/p&gt;  &lt;ul&gt;    &lt;li&gt;inviting and clear&lt;/li&gt;    &lt;li&gt;not tiring&lt;/li&gt;    &lt;li&gt;useful&lt;/li&gt;&lt;/ul&gt;  &lt;p&gt;These below rules may be better:&lt;/p&gt;  &lt;ul&gt;    &lt;li&gt;easy to contribute to (Markdown + HTML ...)&lt;/li&gt;    &lt;li&gt;easy to find (simple TOC, maybe it&amp;apos;s worth extending them?)&lt;/li&gt;&lt;/ul&gt;  &lt;p&gt;Url marked    &lt;strong&gt;*&lt;/strong&gt;is temporary unavailable. Please don&amp;apos;t delete it without confirming that it has permanently expired.&lt;/p&gt;  &lt;p&gt;Before adding a pull request, please see the    &lt;strong&gt;      &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge/blob/master/.github/CONTRIBUTING.md"&gt;contributing guidelines&lt;/a&gt;&lt;/strong&gt;. You should also remember about this:&lt;/p&gt;  &lt;div&gt;    &lt;pre&gt;+This repository is not meant to contain everything but only good quality stuff.&lt;/pre&gt;&lt;/div&gt;  &lt;p&gt;All    &lt;strong&gt;suggestions/PR&lt;/strong&gt;are welcome!&lt;/p&gt;  &lt;h3&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#code-contributors"&gt;&lt;/a&gt;Code Contributors&lt;/h3&gt;  &lt;p&gt;This project exists thanks to all the people who contribute.&lt;/p&gt;  &lt;p&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge/graphs/contributors"&gt;      &lt;img src="https://camo.githubusercontent.com/23f91fbb60428c31d42b1aee2b55ad8b5c8e608e3251fc9b7f98787544a69b36/68747470733a2f2f6f70656e636f6c6c6563746976652e636f6d2f7468652d626f6f6b2d6f662d7365637265742d6b6e6f776c656467652f636f6e7472696275746f72732e7376673f77696474683d38393026627574746f6e3d66616c7365"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;  &lt;h3&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#financial-contributors"&gt;&lt;/a&gt;Financial Contributors&lt;/h3&gt;  &lt;p align="left"&gt;    &lt;a href="https://opencollective.com/the-book-of-secret-knowledge" rel="nofollow"&gt;      &lt;img src="https://camo.githubusercontent.com/c58aafdd95d3cd3b92addd48c6c5d5266f03fb2e64e0f801ea32edc55663aff5/68747470733a2f2f696d672e736869656c64732e696f2f6f70656e636f6c6c6563746976652f6261636b6572732f7468652d626f6f6b2d6f662d7365637265742d6b6e6f776c656467653f7374796c653d666f722d7468652d626164676526636f6c6f723d464634353030266c6162656c436f6c6f723d413941394139"&gt;&lt;/img&gt;&lt;/a&gt;    &lt;a href="https://opencollective.com/the-book-of-secret-knowledge" rel="nofollow"&gt;      &lt;img src="https://camo.githubusercontent.com/524932ccd706f5f80ba885f4b3ec574a4a010ae083f3cf4f5e6eb241d28141b2/68747470733a2f2f696d672e736869656c64732e696f2f6f70656e636f6c6c6563746976652f73706f6e736f72732f7468652d626f6f6b2d6f662d7365637265742d6b6e6f776c656467653f7374796c653d666f722d7468652d626164676526636f6c6f723d464634353030266c6162656c436f6c6f723d413941394139"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;  &lt;h2&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#newspaper-rss-feed--updates"&gt;&lt;/a&gt;📰  RSS Feed &amp;amp; Updates&lt;/h2&gt;  &lt;p&gt;GitHub exposes an    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge/commits.atom"&gt;RSS/Atom&lt;/a&gt;feed of the commits, which may also be useful if you want to be kept informed about all changes.&lt;/p&gt;  &lt;h2&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#ballot_box_with_check-todo"&gt;&lt;/a&gt;☑️  ToDo&lt;/h2&gt;  &lt;ul&gt;    &lt;li&gt;      &lt;input disabled="" type="checkbox"&gt;&lt;/input&gt;Add new stuff...&lt;/li&gt;    &lt;li&gt;      &lt;input disabled="" type="checkbox"&gt;&lt;/input&gt;Add useful shell functions&lt;/li&gt;    &lt;li&gt;      &lt;input disabled="" type="checkbox"&gt;&lt;/input&gt;Add one-liners for collection tools (eg. CLI Tools)&lt;/li&gt;    &lt;li&gt;      &lt;input disabled="" type="checkbox"&gt;&lt;/input&gt;Sort order in lists&lt;/li&gt;&lt;/ul&gt;  &lt;p&gt;New items are also added on a regular basis.&lt;/p&gt;  &lt;h2&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#anger-table-of-contents"&gt;&lt;/a&gt;💢  Table of Contents&lt;/h2&gt;  &lt;p&gt;Only main chapters:&lt;/p&gt;  &lt;ul&gt;    &lt;li&gt;      &lt;strong&gt;        &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#cli-tools-toc"&gt;CLI Tools&lt;/a&gt;&lt;/strong&gt;&lt;/li&gt;    &lt;li&gt;      &lt;strong&gt;        &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#gui-tools-toc"&gt;GUI Tools&lt;/a&gt;&lt;/strong&gt;&lt;/li&gt;    &lt;li&gt;      &lt;strong&gt;        &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#web-tools-toc"&gt;Web Tools&lt;/a&gt;&lt;/strong&gt;&lt;/li&gt;    &lt;li&gt;      &lt;strong&gt;        &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#systemsservices-toc"&gt;Systems/Services&lt;/a&gt;&lt;/strong&gt;&lt;/li&gt;    &lt;li&gt;      &lt;strong&gt;        &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#networks-toc"&gt;Networks&lt;/a&gt;&lt;/strong&gt;&lt;/li&gt;    &lt;li&gt;      &lt;strong&gt;        &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#containersorchestration-toc"&gt;Containers/Orchestration&lt;/a&gt;&lt;/strong&gt;&lt;/li&gt;    &lt;li&gt;      &lt;strong&gt;        &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#manualshowtostutorials-toc"&gt;Manuals/Howtos/Tutorials&lt;/a&gt;&lt;/strong&gt;&lt;/li&gt;    &lt;li&gt;      &lt;strong&gt;        &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#inspiring-lists-toc"&gt;Inspiring Lists&lt;/a&gt;&lt;/strong&gt;&lt;/li&gt;    &lt;li&gt;      &lt;strong&gt;        &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#blogspodcastsvideos-toc"&gt;Blogs/Podcasts/Videos&lt;/a&gt;&lt;/strong&gt;&lt;/li&gt;    &lt;li&gt;      &lt;strong&gt;        &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#hackingpenetration-testing-toc"&gt;Hacking/Penetration Testing&lt;/a&gt;&lt;/strong&gt;&lt;/li&gt;    &lt;li&gt;      &lt;strong&gt;        &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#your-daily-knowledge-and-news-toc"&gt;Your daily knowledge and news&lt;/a&gt;&lt;/strong&gt;&lt;/li&gt;    &lt;li&gt;      &lt;strong&gt;        &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#other-cheat-sheets-toc"&gt;Other Cheat Sheets&lt;/a&gt;&lt;/strong&gt;&lt;/li&gt;    &lt;li&gt;      &lt;strong&gt;        &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#shell-one-liners-toc"&gt;Shell One-liners&lt;/a&gt;&lt;/strong&gt;&lt;/li&gt;    &lt;li&gt;      &lt;strong&gt;        &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#shell-tricks-toc"&gt;Shell Tricks&lt;/a&gt;&lt;/strong&gt;&lt;/li&gt;    &lt;li&gt;      &lt;strong&gt;        &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#shell-functions-toc"&gt;Shell Functions&lt;/a&gt;&lt;/strong&gt;&lt;/li&gt;&lt;/ul&gt;  &lt;h2&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#trident-the-book-of-secret-knowledge-chapters"&gt;&lt;/a&gt;🔱  The Book of Secret Knowledge (Chapters)&lt;/h2&gt;  &lt;h4&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#cli-tools-toc"&gt;&lt;/a&gt;CLI Tools      &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#anger-table-of-contents"&gt;      &lt;sup&gt;[TOC]&lt;/sup&gt;&lt;/a&gt;&lt;/h4&gt;  &lt;h5&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#black_small_square-shells"&gt;&lt;/a&gt;▪️ Shells&lt;/h5&gt;  &lt;p&gt;  :small_orange_diamond:    &lt;a href="https://www.gnu.org/software/bash/" rel="nofollow"&gt;      &lt;strong&gt;GNU Bash&lt;/strong&gt;&lt;/a&gt;- is an sh-compatible shell that incorporates useful features from the Korn shell and C shell.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://www.zsh.org/" rel="nofollow"&gt;      &lt;strong&gt;Zsh&lt;/strong&gt;&lt;/a&gt;- is a shell designed for interactive use, although it is also a powerful scripting language.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://tcl-lang.org/" rel="nofollow"&gt;      &lt;strong&gt;tclsh&lt;/strong&gt;&lt;/a&gt;- is a very powerful cross-platform shell, suitable for a huge range of uses.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://github.com/Bash-it/bash-it"&gt;      &lt;strong&gt;bash-it&lt;/strong&gt;&lt;/a&gt;- is a framework for using, developing and maintaining shell scripts and custom commands.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://ohmyz.sh/" rel="nofollow"&gt;      &lt;strong&gt;Oh My ZSH!&lt;/strong&gt;&lt;/a&gt;- is the best framework for managing your Zsh configuration.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://github.com/oh-my-fish/oh-my-fish"&gt;      &lt;strong&gt;Oh My Fish&lt;/strong&gt;&lt;/a&gt;- the Fishshell framework.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://github.com/starship/starship"&gt;      &lt;strong&gt;Starship&lt;/strong&gt;&lt;/a&gt;- the cross-shell prompt written in Rust.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://github.com/romkatv/powerlevel10k"&gt;      &lt;strong&gt;powerlevel10k&lt;/strong&gt;&lt;/a&gt;- is a fast reimplementation of Powerlevel9k ZSH theme.    &lt;br /&gt;&lt;/p&gt;  &lt;h5&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#black_small_square-shell-plugins"&gt;&lt;/a&gt;▪️ Shell plugins&lt;/h5&gt;  &lt;p&gt;  :small_orange_diamond:    &lt;a href="https://github.com/rupa/z"&gt;      &lt;strong&gt;z&lt;/strong&gt;&lt;/a&gt;- tracks the folder you use the most and allow you to jump, without having to type the whole path.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://github.com/junegunn/fzf"&gt;      &lt;strong&gt;fzf&lt;/strong&gt;&lt;/a&gt;- is a general-purpose command-line fuzzy finder.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://github.com/zsh-users/zsh-autosuggestions"&gt;      &lt;strong&gt;zsh-autosuggestions&lt;/strong&gt;&lt;/a&gt;- Fish-like autosuggestions for Zsh.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://github.com/zsh-users/zsh-syntax-highlighting"&gt;      &lt;strong&gt;zsh-syntax-highlighting&lt;/strong&gt;&lt;/a&gt;- Fish shell like syntax highlighting for Zsh.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://github.com/unixorn/awesome-zsh-plugins"&gt;      &lt;strong&gt;Awesome ZSH Plugins&lt;/strong&gt;&lt;/a&gt;- A list of frameworks, plugins, themes and tutorials for ZSH.    &lt;br /&gt;&lt;/p&gt;  &lt;h5&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#black_small_square-managers"&gt;&lt;/a&gt;▪️ Managers&lt;/h5&gt;  &lt;p&gt;  :small_orange_diamond:    &lt;a href="https://midnight-commander.org/" rel="nofollow"&gt;      &lt;strong&gt;Midnight Commander&lt;/strong&gt;&lt;/a&gt;- is a visual file manager, licensed under GNU General Public License.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://github.com/ranger/ranger"&gt;      &lt;strong&gt;ranger&lt;/strong&gt;&lt;/a&gt;- is a VIM-inspired filemanager for the console.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://github.com/jarun/nnn"&gt;      &lt;strong&gt;nnn&lt;/strong&gt;&lt;/a&gt;- is a tiny, lightning fast, feature-packed file manager.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://www.gnu.org/software/screen/" rel="nofollow"&gt;      &lt;strong&gt;screen&lt;/strong&gt;&lt;/a&gt;- is a full-screen window manager that multiplexes a physical terminal.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://github.com/tmux/tmux/wiki"&gt;      &lt;strong&gt;tmux&lt;/strong&gt;&lt;/a&gt;- is a terminal multiplexer, lets you switch easily between several programs in one terminal.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://github.com/peikk0/tmux-cssh"&gt;      &lt;strong&gt;tmux-cssh&lt;/strong&gt;&lt;/a&gt;- is a tool to set comfortable and easy to use functionality, clustering and synchronizing tmux-sessions.    &lt;br /&gt;&lt;/p&gt;  &lt;h5&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#black_small_square-text-editors"&gt;&lt;/a&gt;▪️ Text editors&lt;/h5&gt;  &lt;p&gt;  :small_orange_diamond:    &lt;a href="http://ex-vi.sourceforge.net/" rel="nofollow"&gt;      &lt;strong&gt;vi&lt;/strong&gt;&lt;/a&gt;- is one of the most common text editors on Unix.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://www.vim.org/" rel="nofollow"&gt;      &lt;strong&gt;vim&lt;/strong&gt;&lt;/a&gt;- is a highly configurable text editor.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://www.gnu.org/software/emacs/" rel="nofollow"&gt;      &lt;strong&gt;emacs&lt;/strong&gt;&lt;/a&gt;- is an extensible, customizable, free/libre text editor, and more.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://github.com/zyedidia/micro"&gt;      &lt;strong&gt;micro&lt;/strong&gt;&lt;/a&gt;- is a modern and intuitive terminal-based text editor.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://neovim.io/" rel="nofollow"&gt;      &lt;strong&gt;neovim&lt;/strong&gt;&lt;/a&gt;- is a free open source, powerful, extensible and usable code editor.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://www.spacemacs.org/" rel="nofollow"&gt;      &lt;strong&gt;spacemacs&lt;/strong&gt;&lt;/a&gt;- a community-driven Emacs distribution.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://spacevim.org/" rel="nofollow"&gt;      &lt;strong&gt;spacevim&lt;/strong&gt;&lt;/a&gt;- a community-driven vim distribution.    &lt;br /&gt;&lt;/p&gt;  &lt;h5&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#black_small_square-files-and-directories"&gt;&lt;/a&gt;▪️ Files and directories&lt;/h5&gt;  &lt;p&gt;  :small_orange_diamond:    &lt;a href="https://github.com/sharkdp/fd"&gt;      &lt;strong&gt;fd&lt;/strong&gt;&lt;/a&gt;- is a simple, fast and user-friendly alternative to find.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://dev.yorhel.nl/ncdu" rel="nofollow"&gt;      &lt;strong&gt;ncdu&lt;/strong&gt;&lt;/a&gt;- is an easy to use, fast disk usage analyzer.    &lt;br /&gt;&lt;/p&gt;  &lt;h5&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#black_small_square-network"&gt;&lt;/a&gt;▪️ Network&lt;/h5&gt;  &lt;p&gt;  :small_orange_diamond:    &lt;a href="https://www.putty.org/" rel="nofollow"&gt;      &lt;strong&gt;PuTTY&lt;/strong&gt;&lt;/a&gt;- is an SSH and telnet client, developed originally by Simon Tatham.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://mosh.org/" rel="nofollow"&gt;      &lt;strong&gt;Mosh&lt;/strong&gt;&lt;/a&gt;- is a SSH wrapper designed to keep a SSH session alive over a volatile connection.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://eternalterminal.dev/" rel="nofollow"&gt;      &lt;strong&gt;Eternal Terminal&lt;/strong&gt;&lt;/a&gt;- enables mouse-scrolling and tmux commands inside the SSH session.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://nmap.org/" rel="nofollow"&gt;      &lt;strong&gt;nmap&lt;/strong&gt;&lt;/a&gt;- is a free and open source (license) utility for network discovery and security auditing.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://github.com/zmap/zmap"&gt;      &lt;strong&gt;zmap&lt;/strong&gt;&lt;/a&gt;- is a fast single packet network scanner designed for Internet-wide network surveys.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://github.com/RustScan/RustScan"&gt;      &lt;strong&gt;Rust Scan&lt;/strong&gt;&lt;/a&gt;- to find all open ports faster than Nmap.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://github.com/robertdavidgraham/masscan"&gt;      &lt;strong&gt;masscan&lt;/strong&gt;&lt;/a&gt;- is the fastest Internet port scanner, spews SYN packets asynchronously.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://github.com/gvb84/pbscan"&gt;      &lt;strong&gt;pbscan&lt;/strong&gt;&lt;/a&gt;- is a faster and more efficient stateless SYN scanner and banner grabber.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="http://www.hping.org/" rel="nofollow"&gt;      &lt;strong&gt;hping&lt;/strong&gt;&lt;/a&gt;- is a command-line oriented TCP/IP packet assembler/analyzer.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://github.com/traviscross/mtr"&gt;      &lt;strong&gt;mtr&lt;/strong&gt;&lt;/a&gt;- is a tool that combines the functionality of the &amp;apos;traceroute&amp;apos; and &amp;apos;ping&amp;apos; programs in a single tool.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://github.com/mehrdadrad/mylg"&gt;      &lt;strong&gt;mylg&lt;/strong&gt;&lt;/a&gt;- utility which combines the functions of the different network probes in one diagnostic tool.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="http://netcat.sourceforge.net/" rel="nofollow"&gt;      &lt;strong&gt;netcat&lt;/strong&gt;&lt;/a&gt;- utility which reads and writes data across network connections, using the TCP/IP protocol.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="http://www.dest-unreach.org/socat/" rel="nofollow"&gt;      &lt;strong&gt;socat&lt;/strong&gt;&lt;/a&gt;- utility which transfers data between two objects.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://www.tcpdump.org/" rel="nofollow"&gt;      &lt;strong&gt;tcpdump&lt;/strong&gt;&lt;/a&gt;- is a powerful command-line packet analyzer.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://www.wireshark.org/docs/man-pages/tshark.html" rel="nofollow"&gt;      &lt;strong&gt;tshark&lt;/strong&gt;&lt;/a&gt;- is a tool that allows us to dump and analyze network traffic (wireshark cli).    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://termshark.io/" rel="nofollow"&gt;      &lt;strong&gt;Termshark&lt;/strong&gt;&lt;/a&gt;- is a simple terminal user-interface for tshark.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://github.com/jpr5/ngrep"&gt;      &lt;strong&gt;ngrep&lt;/strong&gt;&lt;/a&gt;- is like GNU grep applied to the network layer.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="http://netsniff-ng.org/" rel="nofollow"&gt;      &lt;strong&gt;netsniff-ng&lt;/strong&gt;&lt;/a&gt;- is a Swiss army knife for your daily Linux network plumbing if you will.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://github.com/mechpen/sockdump"&gt;      &lt;strong&gt;sockdump&lt;/strong&gt;&lt;/a&gt;- dump unix domain socket traffic.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://github.com/google/stenographer"&gt;      &lt;strong&gt;stenographer&lt;/strong&gt;&lt;/a&gt;- is a packet capture solution which aims to quickly spool all packets to disk.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://github.com/sachaos/tcpterm"&gt;      &lt;strong&gt;tcpterm&lt;/strong&gt;&lt;/a&gt;- visualize packets in TUI.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://github.com/tgraf/bmon"&gt;      &lt;strong&gt;bmon&lt;/strong&gt;&lt;/a&gt;- is a monitoring and debugging tool to capture networking related statistics and prepare them visually.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="http://iptraf.seul.org/2.6/manual.html#installation" rel="nofollow"&gt;      &lt;strong&gt;iptraf-ng&lt;/strong&gt;&lt;/a&gt;- is a console-based network monitoring program for Linux that displays information about IP traffic.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://github.com/vergoh/vnstat"&gt;      &lt;strong&gt;vnstat&lt;/strong&gt;&lt;/a&gt;- is a network traffic monitor for Linux and BSD.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://iperf.fr/" rel="nofollow"&gt;      &lt;strong&gt;iPerf3&lt;/strong&gt;&lt;/a&gt;- is a tool for active measurements of the maximum achievable bandwidth on IP networks.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://github.com/Microsoft/Ethr"&gt;      &lt;strong&gt;ethr&lt;/strong&gt;&lt;/a&gt;- is a Network Performance Measurement Tool for TCP, UDP &amp;amp; HTTP.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://github.com/jwbensley/Etherate"&gt;      &lt;strong&gt;Etherate&lt;/strong&gt;&lt;/a&gt;- is a Linux CLI based Ethernet and MPLS traffic testing tool.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://github.com/mpolden/echoip"&gt;      &lt;strong&gt;echoip&lt;/strong&gt;&lt;/a&gt;- is a IP address lookup service.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://github.com/troglobit/nemesis"&gt;      &lt;strong&gt;Nemesis&lt;/strong&gt;&lt;/a&gt;- packet manipulation CLI tool; craft and inject packets of several protocols.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://github.com/packetfu/packetfu"&gt;      &lt;strong&gt;packetfu&lt;/strong&gt;&lt;/a&gt;- a mid-level packet manipulation library for Ruby.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://scapy.net/" rel="nofollow"&gt;      &lt;strong&gt;Scapy&lt;/strong&gt;&lt;/a&gt;- packet manipulation library; forge, send, decode, capture packets of a wide number of protocols.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://github.com/SecureAuthCorp/impacket"&gt;      &lt;strong&gt;impacket&lt;/strong&gt;&lt;/a&gt;- is a collection of Python classes for working with network protocols.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://github.com/arthepsy/ssh-audit"&gt;      &lt;strong&gt;ssh-audit&lt;/strong&gt;&lt;/a&gt;- is a tool for SSH server auditing.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://aria2.github.io/" rel="nofollow"&gt;      &lt;strong&gt;aria2&lt;/strong&gt;&lt;/a&gt;- is a lightweight multi-protocol &amp;amp; multi-source command-line download utility.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://github.com/x-way/iptables-tracer"&gt;      &lt;strong&gt;iptables-tracer&lt;/strong&gt;&lt;/a&gt;- observe the path of packets through the iptables chains.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://github.com/proabiral/inception"&gt;      &lt;strong&gt;inception&lt;/strong&gt;&lt;/a&gt;- a highly configurable tool to check for whatever you like against any number of hosts.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://mremoteng.org/" rel="nofollow"&gt;      &lt;strong&gt;mRemoteNG&lt;/strong&gt;&lt;/a&gt;- a fork of mRemote, multi-tabbed PuTTy on steroids!    &lt;br /&gt;&lt;/p&gt;  &lt;h5&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#black_small_square-network-dns"&gt;&lt;/a&gt;▪️ Network (DNS)&lt;/h5&gt;  &lt;p&gt;  :small_orange_diamond:    &lt;a href="https://github.com/farrokhi/dnsdiag"&gt;      &lt;strong&gt;dnsdiag&lt;/strong&gt;&lt;/a&gt;- is a DNS diagnostics and performance measurement tools.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://github.com/mschwager/fierce"&gt;      &lt;strong&gt;fierce&lt;/strong&gt;&lt;/a&gt;- is a DNS reconnaissance tool for locating non-contiguous IP space.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://github.com/subfinder/subfinder"&gt;      &lt;strong&gt;subfinder&lt;/strong&gt;&lt;/a&gt;- is a subdomain discovery tool that discovers valid subdomains for websites.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://github.com/aboul3la/Sublist3r"&gt;      &lt;strong&gt;sublist3r&lt;/strong&gt;&lt;/a&gt;- is a fast subdomains enumeration tool for penetration testers.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://github.com/OWASP/Amass"&gt;      &lt;strong&gt;amass&lt;/strong&gt;&lt;/a&gt;- is tool that obtains subdomain names by scraping data sources, crawling web archives, and more.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://github.com/google/namebench"&gt;      &lt;strong&gt;namebench&lt;/strong&gt;&lt;/a&gt;- provides personalized DNS server recommendations based on your browsing history.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://github.com/blechschmidt/massdns"&gt;      &lt;strong&gt;massdns&lt;/strong&gt;&lt;/a&gt;- is a high-performance DNS stub resolver for bulk lookups and reconnaissance.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://github.com/guelfoweb/knock"&gt;      &lt;strong&gt;knock&lt;/strong&gt;&lt;/a&gt;- is a tool to enumerate subdomains on a target domain through a wordlist.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://github.com/DNS-OARC/dnsperf"&gt;      &lt;strong&gt;dnsperf&lt;/strong&gt;&lt;/a&gt;- DNS performance testing tools.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://github.com/jedisct1/dnscrypt-proxy"&gt;      &lt;strong&gt;dnscrypt-proxy 2&lt;/strong&gt;&lt;/a&gt;- a flexible DNS proxy, with support for encrypted DNS protocols.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://github.com/dnsdb/dnsdbq"&gt;      &lt;strong&gt;dnsdbq&lt;/strong&gt;&lt;/a&gt;- API client providing access to passive DNS database systems.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://github.com/looterz/grimd"&gt;      &lt;strong&gt;grimd&lt;/strong&gt;&lt;/a&gt;- fast dns proxy, built to black-hole internet advertisements and malware servers.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://github.com/elceef/dnstwist"&gt;      &lt;strong&gt;dnstwist&lt;/strong&gt;&lt;/a&gt;- detect typosquatters, phishing attacks, fraud, and brand impersonation.    &lt;br /&gt;&lt;/p&gt;  &lt;h5&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#black_small_square-network-http"&gt;&lt;/a&gt;▪️ Network (HTTP)&lt;/h5&gt;  &lt;p&gt;  :small_orange_diamond:    &lt;a href="https://curl.haxx.se/" rel="nofollow"&gt;      &lt;strong&gt;curl&lt;/strong&gt;&lt;/a&gt;- is a command line tool and library for transferring data with URLs.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://gitlab.com/davidjpeacock/kurly" rel="nofollow"&gt;      &lt;strong&gt;kurly&lt;/strong&gt;&lt;/a&gt;- is an alternative to the widely popular curl program, written in Golang.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://github.com/jakubroztocil/httpie"&gt;      &lt;strong&gt;HTTPie&lt;/strong&gt;&lt;/a&gt;- is an user-friendly HTTP client.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://github.com/asciimoo/wuzz"&gt;      &lt;strong&gt;wuzz&lt;/strong&gt;&lt;/a&gt;- is an interactive cli tool for HTTP inspection.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://github.com/summerwind/h2spec"&gt;      &lt;strong&gt;h2spec&lt;/strong&gt;&lt;/a&gt;- is a conformance testing tool for HTTP/2 implementation.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://github.com/gildasio/h2t"&gt;      &lt;strong&gt;h2t&lt;/strong&gt;&lt;/a&gt;- is a simple tool to help sysadmins to hardening their websites.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://github.com/trimstray/htrace.sh"&gt;      &lt;strong&gt;htrace.sh&lt;/strong&gt;&lt;/a&gt;- is a simple Swiss Army knife for http/https troubleshooting and profiling.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://github.com/reorx/httpstat"&gt;      &lt;strong&gt;httpstat&lt;/strong&gt;&lt;/a&gt;- is a tool that visualizes curl statistics in a way of beauty and clarity.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://github.com/gchaincl/httplab"&gt;      &lt;strong&gt;httplab&lt;/strong&gt;&lt;/a&gt;- is an interactive web server.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://lynx.browser.org/" rel="nofollow"&gt;      &lt;strong&gt;Lynx&lt;/strong&gt;&lt;/a&gt;- is a text browser for the World Wide Web.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://github.com/browsh-org/browsh/"&gt;      &lt;strong&gt;Browsh&lt;/strong&gt;&lt;/a&gt;- is a fully interactive, real-time, and modern text-based browser.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://github.com/dhamaniasad/HeadlessBrowsers"&gt;      &lt;strong&gt;HeadlessBrowsers&lt;/strong&gt;&lt;/a&gt;- a list of (almost) all headless web browsers in existence.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://httpd.apache.org/docs/2.4/programs/ab.html" rel="nofollow"&gt;      &lt;strong&gt;ab&lt;/strong&gt;&lt;/a&gt;- is a single-threaded command line tool for measuring the performance of HTTP web servers.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://www.joedog.org/siege-home/" rel="nofollow"&gt;      &lt;strong&gt;siege&lt;/strong&gt;&lt;/a&gt;- is an http load testing and benchmarking utility.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://github.com/wg/wrk"&gt;      &lt;strong&gt;wrk&lt;/strong&gt;&lt;/a&gt;- is a modern HTTP benchmarking tool capable of generating significant load.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://github.com/giltene/wrk2"&gt;      &lt;strong&gt;wrk2&lt;/strong&gt;&lt;/a&gt;- is a constant throughput, correct latency recording variant of wrk.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://github.com/tsenart/vegeta"&gt;      &lt;strong&gt;vegeta&lt;/strong&gt;&lt;/a&gt;- is a constant throughput, correct latency recording variant of wrk.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://github.com/codesenberg/bombardier"&gt;      &lt;strong&gt;bombardier&lt;/strong&gt;&lt;/a&gt;- is a fast cross-platform HTTP benchmarking tool written in Go.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://github.com/cmpxchg16/gobench"&gt;      &lt;strong&gt;gobench&lt;/strong&gt;&lt;/a&gt;- http/https load testing and benchmarking tool.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://github.com/rakyll/hey"&gt;      &lt;strong&gt;hey&lt;/strong&gt;&lt;/a&gt;- HTTP load generator, ApacheBench (ab) replacement, formerly known as rakyll/boom.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://github.com/tarekziade/boom"&gt;      &lt;strong&gt;boom&lt;/strong&gt;&lt;/a&gt;- is a script you can use to quickly smoke-test your web app deployment.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://github.com/shekyan/slowhttptest"&gt;      &lt;strong&gt;SlowHTTPTest&lt;/strong&gt;&lt;/a&gt;- is a tool that simulates some Application Layer Denial of Service attacks by prolonging HTTP.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://github.com/OJ/gobuster"&gt;      &lt;strong&gt;gobuster&lt;/strong&gt;&lt;/a&gt;- is a free and open source directory/file &amp;amp; DNS busting tool written in Go.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://github.com/ssllabs/ssllabs-scan"&gt;      &lt;strong&gt;ssllabs-scan&lt;/strong&gt;&lt;/a&gt;- command-line reference-implementation client for SSL Labs APIs.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://github.com/mozilla/http-observatory"&gt;      &lt;strong&gt;http-observatory&lt;/strong&gt;&lt;/a&gt;- Mozilla HTTP Observatory cli version.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://hurl.dev" rel="nofollow"&gt;      &lt;strong&gt;Hurl&lt;/strong&gt;&lt;/a&gt;- is a command line tool to run and test HTTP requests with plain text.    &lt;br /&gt;&lt;/p&gt;  &lt;h5&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#black_small_square-ssl"&gt;&lt;/a&gt;▪️ SSL&lt;/h5&gt;  &lt;p&gt;  :small_orange_diamond:    &lt;a href="https://www.openssl.org/" rel="nofollow"&gt;      &lt;strong&gt;openssl&lt;/strong&gt;&lt;/a&gt;- is a robust, commercial-grade, and full-featured toolkit for the TLS and SSL protocols.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://gnutls.org/manual/html_node/gnutls_002dcli-Invocation.html" rel="nofollow"&gt;      &lt;strong&gt;gnutls-cli&lt;/strong&gt;&lt;/a&gt;- client program to set up a TLS connection to some other computer.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://github.com/nabla-c0d3/sslyze"&gt;      &lt;strong&gt;sslyze&lt;/strong&gt;&lt;/a&gt;- fast and powerful SSL/TLS server scanning library.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://github.com/rbsec/sslscan"&gt;      &lt;strong&gt;sslscan&lt;/strong&gt;&lt;/a&gt;- tests SSL/TLS enabled services to discover supported cipher suites.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://github.com/drwetter/testssl.sh"&gt;      &lt;strong&gt;testssl.sh&lt;/strong&gt;&lt;/a&gt;- testing TLS/SSL encryption anywhere on any port.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://github.com/mozilla/cipherscan"&gt;      &lt;strong&gt;cipherscan&lt;/strong&gt;&lt;/a&gt;- a very simple way to find out which SSL ciphersuites are supported by a target.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="http://www.tarsnap.com/spiped.html" rel="nofollow"&gt;      &lt;strong&gt;spiped&lt;/strong&gt;&lt;/a&gt;- is a utility for creating symmetrically encrypted and authenticated pipes between socket addresses.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://github.com/certbot/certbot"&gt;      &lt;strong&gt;Certbot&lt;/strong&gt;&lt;/a&gt;- is EFF&amp;apos;s tool to obtain certs from Let&amp;apos;s Encrypt and (optionally) auto-enable HTTPS on your server.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://github.com/FiloSottile/mkcert"&gt;      &lt;strong&gt;mkcert&lt;/strong&gt;&lt;/a&gt;- simple zero-config tool to make locally trusted development certificates with any names you&amp;apos;d like.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://github.com/square/certstrap"&gt;      &lt;strong&gt;certstrap&lt;/strong&gt;&lt;/a&gt;- tools to bootstrap CAs, certificate requests, and signed certificates.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://github.com/yassineaboukir/sublert"&gt;      &lt;strong&gt;Sublert&lt;/strong&gt;&lt;/a&gt;- is a security and reconnaissance tool to automatically monitor new subdomains.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://github.com/trimstray/mkchain"&gt;      &lt;strong&gt;mkchain&lt;/strong&gt;&lt;/a&gt;- open source tool to help you build a valid SSL certificate chain.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://github.com/Matty9191/ssl-cert-check"&gt;      &lt;strong&gt;ssl-cert-check&lt;/strong&gt;&lt;/a&gt;- SSL Certification Expiration Checker.    &lt;br /&gt;&lt;/p&gt;  &lt;h5&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#black_small_square-security"&gt;&lt;/a&gt;▪️ Security&lt;/h5&gt;  &lt;p&gt;  :small_orange_diamond:    &lt;a href="https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/5/html/deployment_guide/ch-selinux" rel="nofollow"&gt;      &lt;strong&gt;SELinux&lt;/strong&gt;&lt;/a&gt;- provides a flexible Mandatory Access Control (MAC) system built into the Linux kernel.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://wiki.ubuntu.com/AppArmor" rel="nofollow"&gt;      &lt;strong&gt;AppArmor&lt;/strong&gt;&lt;/a&gt;- proactively protects the operating system and applications from external or internal threats.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://github.com/grapheneX/grapheneX"&gt;      &lt;strong&gt;grapheneX&lt;/strong&gt;&lt;/a&gt;- Automated System Hardening Framework.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://github.com/dev-sec/"&gt;      &lt;strong&gt;DevSec Hardening Framework&lt;/strong&gt;&lt;/a&gt;- Security + DevOps: Automatic Server Hardening.    &lt;br /&gt;&lt;/p&gt;  &lt;h5&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#black_small_square-auditing-tools"&gt;&lt;/a&gt;▪️ Auditing Tools&lt;/h5&gt;  &lt;p&gt;  :small_orange_diamond:    &lt;a href="https://www.ossec.net/" rel="nofollow"&gt;      &lt;strong&gt;ossec&lt;/strong&gt;&lt;/a&gt;- actively monitoring all aspects of system activity with file integrity monitoring.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/6/html/security_guide/chap-system_auditing" rel="nofollow"&gt;      &lt;strong&gt;auditd&lt;/strong&gt;&lt;/a&gt;- provides a way to track security-relevant information on your system.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://www.nongnu.org/tiger/" rel="nofollow"&gt;      &lt;strong&gt;Tiger&lt;/strong&gt;&lt;/a&gt;- is a security tool that can be use both as a security audit and intrusion detection system.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://cisofy.com/lynis/" rel="nofollow"&gt;      &lt;strong&gt;Lynis&lt;/strong&gt;&lt;/a&gt;- battle-tested security tool for systems running Linux, macOS, or Unix-based operating system.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://github.com/rebootuser/LinEnum"&gt;      &lt;strong&gt;LinEnum&lt;/strong&gt;&lt;/a&gt;- scripted Local Linux Enumeration &amp;amp; Privilege Escalation Checks.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://github.com/installation/rkhunter"&gt;      &lt;strong&gt;Rkhunter&lt;/strong&gt;&lt;/a&gt;- scanner tool for Linux systems that scans backdoors, rootkits and local exploits on your systems.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://github.com/hasherezade/pe-sieve"&gt;      &lt;strong&gt;PE-sieve&lt;/strong&gt;&lt;/a&gt;- is a light-weight tool that helps to detect malware running on the system.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://github.com/carlospolop/privilege-escalation-awesome-scripts-suite"&gt;      &lt;strong&gt;PEASS&lt;/strong&gt;&lt;/a&gt;- privilege escalation tools for Windows and Linux/Unix and MacOS.    &lt;br /&gt;&lt;/p&gt;  &lt;h5&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#black_small_square-system-diagnosticsdebuggers"&gt;&lt;/a&gt;▪️ System Diagnostics/Debuggers&lt;/h5&gt;  &lt;p&gt;  :small_orange_diamond:    &lt;a href="https://github.com/strace/strace"&gt;      &lt;strong&gt;strace&lt;/strong&gt;&lt;/a&gt;- diagnostic, debugging and instructional userspace utility for Linux.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="http://dtrace.org/blogs/about/" rel="nofollow"&gt;      &lt;strong&gt;DTrace&lt;/strong&gt;&lt;/a&gt;- is a performance analysis and troubleshooting tool.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://en.wikipedia.org/wiki/Ltrace" rel="nofollow"&gt;      &lt;strong&gt;ltrace&lt;/strong&gt;&lt;/a&gt;- is a library call tracer, used to trace calls made by programs to library functions.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://github.com/brainsmoke/ptrace-burrito"&gt;      &lt;strong&gt;ptrace-burrito&lt;/strong&gt;&lt;/a&gt;- is a friendly wrapper around ptrace.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://github.com/brendangregg/perf-tools"&gt;      &lt;strong&gt;perf-tools&lt;/strong&gt;&lt;/a&gt;- performance analysis tools based on Linux perf_events (aka perf) and ftrace.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://github.com/iovisor/bpftrace"&gt;      &lt;strong&gt;bpftrace&lt;/strong&gt;&lt;/a&gt;- high-level tracing language for Linux eBPF.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://github.com/draios/sysdig"&gt;      &lt;strong&gt;sysdig&lt;/strong&gt;&lt;/a&gt;- system exploration and troubleshooting tool with first class support for containers.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="http://www.valgrind.org/" rel="nofollow"&gt;      &lt;strong&gt;Valgrind&lt;/strong&gt;&lt;/a&gt;- is an instrumentation framework for building dynamic analysis tools.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://github.com/gperftools/gperftools"&gt;      &lt;strong&gt;gperftools&lt;/strong&gt;&lt;/a&gt;- high-performance multi-threaded malloc() implementation, plus some performance analysis tools.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://nicolargo.github.io/glances/" rel="nofollow"&gt;      &lt;strong&gt;glances&lt;/strong&gt;&lt;/a&gt;- cross-platform system monitoring tool written in Python.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://github.com/hishamhm/htop"&gt;      &lt;strong&gt;htop&lt;/strong&gt;&lt;/a&gt;- interactive text-mode process viewer for Unix systems. It aims to be a better &amp;apos;top&amp;apos;.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://github.com/aristocratos/bashtop"&gt;      &lt;strong&gt;bashtop&lt;/strong&gt;&lt;/a&gt;- Linux resource monitor written in pure Bash.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="http://nmon.sourceforge.net/pmwiki.php" rel="nofollow"&gt;      &lt;strong&gt;nmon&lt;/strong&gt;&lt;/a&gt;- a single executable for performance monitoring and data analysis.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://www.atoptool.nl/" rel="nofollow"&gt;      &lt;strong&gt;atop&lt;/strong&gt;&lt;/a&gt;- ASCII performance monitor. Includes statistics for CPU, memory, disk, swap, network, and processes.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://en.wikipedia.org/wiki/Lsof" rel="nofollow"&gt;      &lt;strong&gt;lsof&lt;/strong&gt;&lt;/a&gt;- displays in its output information about files that are opened by processes.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="http://www.brendangregg.com/flamegraphs.html" rel="nofollow"&gt;      &lt;strong&gt;FlameGraph&lt;/strong&gt;&lt;/a&gt;- stack trace visualizer.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://github.com/zevv/lsofgraph"&gt;      &lt;strong&gt;lsofgraph&lt;/strong&gt;&lt;/a&gt;- convert Unix lsof output to a graph showing FIFO and UNIX interprocess communication.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://github.com/mozilla/rr"&gt;      &lt;strong&gt;rr&lt;/strong&gt;&lt;/a&gt;- is a lightweight tool for recording, replaying and debugging execution of applications.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://pcp.io/index.html" rel="nofollow"&gt;      &lt;strong&gt;Performance Co-Pilot&lt;/strong&gt;&lt;/a&gt;- a system performance analysis toolkit.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://github.com/sharkdp/hexyl"&gt;      &lt;strong&gt;hexyl&lt;/strong&gt;&lt;/a&gt;- a command-line hex viewer.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://github.com/p403n1x87/austin"&gt;      &lt;strong&gt;Austin&lt;/strong&gt;&lt;/a&gt;- Python frame stack sampler for CPython.    &lt;br /&gt;&lt;/p&gt;  &lt;h5&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#black_small_square-log-analyzers"&gt;&lt;/a&gt;▪️ Log Analyzers&lt;/h5&gt;  &lt;p&gt;  :small_orange_diamond:    &lt;a href="https://github.com/rcoh/angle-grinder"&gt;      &lt;strong&gt;angle-grinder&lt;/strong&gt;&lt;/a&gt;- slice and dice log files on the command line.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://lnav.org" rel="nofollow"&gt;      &lt;strong&gt;lnav&lt;/strong&gt;&lt;/a&gt;- log file navigator with search and automatic refresh.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://goaccess.io/" rel="nofollow"&gt;      &lt;strong&gt;GoAccess&lt;/strong&gt;&lt;/a&gt;- real-time web log analyzer and interactive viewer that runs in a terminal.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://github.com/lebinh/ngxtop"&gt;      &lt;strong&gt;ngxtop&lt;/strong&gt;&lt;/a&gt;- real-time metrics for nginx server.    &lt;br /&gt;&lt;/p&gt;  &lt;h5&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#black_small_square-databases"&gt;&lt;/a&gt;▪️ Databases&lt;/h5&gt;  &lt;p&gt;  :small_orange_diamond:    &lt;a href="https://github.com/xo/usql"&gt;      &lt;strong&gt;usql&lt;/strong&gt;&lt;/a&gt;- universal command-line interface for SQL databases.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://github.com/dbcli/pgcli"&gt;      &lt;strong&gt;pgcli&lt;/strong&gt;&lt;/a&gt;- postgres CLI with autocompletion and syntax highlighting.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://github.com/dbcli/mycli"&gt;      &lt;strong&gt;mycli&lt;/strong&gt;&lt;/a&gt;- terminal client for MySQL with autocompletion and syntax highlighting.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://github.com/dbcli/litecli"&gt;      &lt;strong&gt;litecli&lt;/strong&gt;&lt;/a&gt;- SQLite CLI with autocompletion and syntax highlighting.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://github.com/dbcli/mssql-cli"&gt;      &lt;strong&gt;mssql-cli&lt;/strong&gt;&lt;/a&gt;- SQL Server CLI with autocompletion and syntax highlighting.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://github.com/osquery/osquery"&gt;      &lt;strong&gt;OSQuery&lt;/strong&gt;&lt;/a&gt;- is a SQL powered operating system instrumentation, monitoring, and analytics framework.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://github.com/ankane/pgsync"&gt;      &lt;strong&gt;pgsync&lt;/strong&gt;&lt;/a&gt;- sync data from one Postgres database to another.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://github.com/laixintao/iredis"&gt;      &lt;strong&gt;iredis&lt;/strong&gt;&lt;/a&gt;- a terminal client for redis with autocompletion and syntax highlighting.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://www.schemacrawler.com/diagramming.html" rel="nofollow"&gt;      &lt;strong&gt;SchemaCrawler&lt;/strong&gt;&lt;/a&gt;- generates an E-R diagram of your database.    &lt;br /&gt;&lt;/p&gt;  &lt;h5&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#black_small_square-tor"&gt;&lt;/a&gt;▪️ TOR&lt;/h5&gt;  &lt;p&gt;  :small_orange_diamond:    &lt;a href="https://github.com/GouveaHeitor/nipe"&gt;      &lt;strong&gt;Nipe&lt;/strong&gt;&lt;/a&gt;- script to make Tor Network your default gateway.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://github.com/trimstray/multitor"&gt;      &lt;strong&gt;multitor&lt;/strong&gt;&lt;/a&gt;- a tool that lets you create multiple TOR instances with a load-balancing.    &lt;br /&gt;&lt;/p&gt;  &lt;h5&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#black_small_square-messengersirc-clients"&gt;&lt;/a&gt;▪️ Messengers/IRC Clients&lt;/h5&gt;  &lt;p&gt;  :small_orange_diamond:    &lt;a href="https://irssi.org" rel="nofollow"&gt;      &lt;strong&gt;Irssi&lt;/strong&gt;&lt;/a&gt;- is a free open source terminal based IRC client.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://weechat.org/" rel="nofollow"&gt;      &lt;strong&gt;WeeChat&lt;/strong&gt;&lt;/a&gt;- is an extremely extensible and lightweight IRC client.    &lt;br /&gt;&lt;/p&gt;  &lt;h5&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#black_small_square-productivity"&gt;&lt;/a&gt;▪️ Productivity&lt;/h5&gt;  &lt;p&gt;  :small_orange_diamond:    &lt;a href="https://taskwarrior.org" rel="nofollow"&gt;      &lt;strong&gt;taskwarrior&lt;/strong&gt;&lt;/a&gt;- task management system, todo list    &lt;br /&gt;&lt;/p&gt;  &lt;h5&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#black_small_square-other"&gt;&lt;/a&gt;▪️ Other&lt;/h5&gt;  &lt;p&gt;  :small_orange_diamond:    &lt;a href="https://github.com/skx/sysadmin-util"&gt;      &lt;strong&gt;sysadmin-util&lt;/strong&gt;&lt;/a&gt;- tools for Linux/Unix sysadmins.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="http://inotify.aiken.cz/" rel="nofollow"&gt;      &lt;strong&gt;incron&lt;/strong&gt;&lt;/a&gt;- is an inode-based filesystem notification technology.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://github.com/axkibe/lsyncd"&gt;      &lt;strong&gt;lsyncd&lt;/strong&gt;&lt;/a&gt;- synchronizes local directories with remote targets (Live Syncing Daemon).    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://github.com/rgburke/grv"&gt;      &lt;strong&gt;GRV&lt;/strong&gt;&lt;/a&gt;- is a terminal based interface for viewing Git repositories.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://jonas.github.io/tig/" rel="nofollow"&gt;      &lt;strong&gt;Tig&lt;/strong&gt;&lt;/a&gt;- text-mode interface for Git.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://github.com/tldr-pages/tldr"&gt;      &lt;strong&gt;tldr&lt;/strong&gt;&lt;/a&gt;- simplified and community-driven man pages.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://github.com/mholt/archiver"&gt;      &lt;strong&gt;archiver&lt;/strong&gt;&lt;/a&gt;- easily create and extract .zip, .tar, .tar.gz, .tar.bz2, .tar.xz, .tar.lz4, .tar.sz, and .rar.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://github.com/tj/commander.js"&gt;      &lt;strong&gt;commander.js&lt;/strong&gt;&lt;/a&gt;- minimal CLI creator in JavaScript.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://github.com/tomnomnom/gron"&gt;      &lt;strong&gt;gron&lt;/strong&gt;&lt;/a&gt;- make JSON greppable!    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://github.com/itchyny/bed"&gt;      &lt;strong&gt;bed&lt;/strong&gt;&lt;/a&gt;- binary editor written in Go.    &lt;br /&gt;&lt;/p&gt;  &lt;h4&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#gui-tools-toc"&gt;&lt;/a&gt;GUI Tools      &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#anger-table-of-contents"&gt;      &lt;sup&gt;[TOC]&lt;/sup&gt;&lt;/a&gt;&lt;/h4&gt;  &lt;h5&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#black_small_square-terminal-emulators"&gt;&lt;/a&gt;▪️ Terminal emulators&lt;/h5&gt;  &lt;p&gt;  :small_orange_diamond:    &lt;a href="https://github.com/Guake/guake"&gt;      &lt;strong&gt;Guake&lt;/strong&gt;&lt;/a&gt;- is a dropdown terminal made for the GNOME desktop environment.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://gnometerminator.blogspot.com/p/introduction.html" rel="nofollow"&gt;      &lt;strong&gt;Terminator&lt;/strong&gt;&lt;/a&gt;- is based on GNOME Terminal, useful features for sysadmins and other users.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://sw.kovidgoyal.net/kitty/" rel="nofollow"&gt;      &lt;strong&gt;Kitty&lt;/strong&gt;&lt;/a&gt;- is a GPU based terminal emulator that supports smooth scrolling and images.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://github.com/alacritty/alacritty"&gt;      &lt;strong&gt;Alacritty&lt;/strong&gt;&lt;/a&gt;- is a fast, cross-platform, OpenGL terminal emulator.    &lt;br /&gt;&lt;/p&gt;  &lt;h5&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#black_small_square-network-1"&gt;&lt;/a&gt;▪️ Network&lt;/h5&gt;  &lt;p&gt;  :small_orange_diamond:    &lt;a href="https://www.wireshark.org/" rel="nofollow"&gt;      &lt;strong&gt;Wireshark&lt;/strong&gt;&lt;/a&gt;- is the world’s foremost and widely-used network protocol analyzer.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://www.ettercap-project.org/" rel="nofollow"&gt;      &lt;strong&gt;Ettercap&lt;/strong&gt;&lt;/a&gt;- is a comprehensive network monitor tool.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://etherape.sourceforge.io/" rel="nofollow"&gt;      &lt;strong&gt;EtherApe&lt;/strong&gt;&lt;/a&gt;- is a graphical network monitoring solution.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://packetsender.com/" rel="nofollow"&gt;      &lt;strong&gt;Packet Sender&lt;/strong&gt;&lt;/a&gt;- is a networking utility for packet generation and built-in UDP/TCP/SSL client and servers.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://ostinato.org/" rel="nofollow"&gt;      &lt;strong&gt;Ostinato&lt;/strong&gt;&lt;/a&gt;- is a packet crafter and traffic generator.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://jmeter.apache.org/" rel="nofollow"&gt;      &lt;strong&gt;JMeter™&lt;/strong&gt;&lt;/a&gt;- open source software to load test functional behavior and measure performance.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://github.com/locustio/locust"&gt;      &lt;strong&gt;locust&lt;/strong&gt;&lt;/a&gt;- scalable user load testing tool written in Python.    &lt;br /&gt;&lt;/p&gt;  &lt;h5&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#black_small_square-browsers"&gt;&lt;/a&gt;▪️ Browsers&lt;/h5&gt;  &lt;p&gt;  :small_orange_diamond:    &lt;a href="https://www.torproject.org/" rel="nofollow"&gt;      &lt;strong&gt;TOR Browser&lt;/strong&gt;&lt;/a&gt;- protect your privacy and defend yourself against network surveillance and traffic analysis.    &lt;br /&gt;&lt;/p&gt;  &lt;h5&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#black_small_square-password-managers"&gt;&lt;/a&gt;▪️ Password Managers&lt;/h5&gt;  &lt;p&gt;  :small_orange_diamond:    &lt;a href="https://keepassxc.org/" rel="nofollow"&gt;      &lt;strong&gt;KeePassXC&lt;/strong&gt;&lt;/a&gt;- store your passwords safely and auto-type them into your everyday websites and apps.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://bitwarden.com/" rel="nofollow"&gt;      &lt;strong&gt;Bitwarden&lt;/strong&gt;&lt;/a&gt;- open source password manager with built-in sync.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://github.com/dani-garcia/vaultwarden/"&gt;      &lt;strong&gt;Vaultwarden&lt;/strong&gt;&lt;/a&gt;- unofficial Bitwarden compatible server written in Rust.    &lt;br /&gt;&lt;/p&gt;  &lt;h5&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#black_small_square-messengersirc-clients-1"&gt;&lt;/a&gt;▪️ Messengers/IRC Clients&lt;/h5&gt;  &lt;p&gt;  :small_orange_diamond:    &lt;a href="https://hexchat.github.io/index.html" rel="nofollow"&gt;      &lt;strong&gt;HexChat&lt;/strong&gt;&lt;/a&gt;- is an IRC client based on XChat.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://pidgin.im/" rel="nofollow"&gt;      &lt;strong&gt;Pidgin&lt;/strong&gt;&lt;/a&gt;- is an easy to use and free chat client used by millions.    &lt;br /&gt;&lt;/p&gt;  &lt;h5&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#black_small_square-messengers-end-to-end-encryption"&gt;&lt;/a&gt;▪️ Messengers (end-to-end encryption)&lt;/h5&gt;  &lt;p&gt;  :small_orange_diamond:    &lt;a href="https://www.signal.org/" rel="nofollow"&gt;      &lt;strong&gt;Signal&lt;/strong&gt;&lt;/a&gt;- is an encrypted communications app.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://wire.com/en/" rel="nofollow"&gt;      &lt;strong&gt;Wire&lt;/strong&gt;&lt;/a&gt;- secure messaging, file sharing, voice calls and video conferences. All protected with end-to-end encryption.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://github.com/prof7bit/TorChat"&gt;      &lt;strong&gt;TorChat&lt;/strong&gt;&lt;/a&gt;- decentralized anonymous instant messenger on top of Tor Hidden Services.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://matrix.org/" rel="nofollow"&gt;      &lt;strong&gt;Matrix&lt;/strong&gt;&lt;/a&gt;- an open network for secure, decentralized, real-time communication.    &lt;br /&gt;&lt;/p&gt;  &lt;h5&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#black_small_square-text-editors-1"&gt;&lt;/a&gt;▪️ Text editors&lt;/h5&gt;  &lt;p&gt;  :small_orange_diamond:    &lt;a href="https://www.sublimetext.com/3" rel="nofollow"&gt;      &lt;strong&gt;Sublime Text&lt;/strong&gt;&lt;/a&gt;- is a lightweight, cross-platform code editor known for its speed, ease of use.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://code.visualstudio.com/" rel="nofollow"&gt;      &lt;strong&gt;Visual Studio Code&lt;/strong&gt;&lt;/a&gt;- an open-source and free source code editor developed by Microsoft.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://atom.io/" rel="nofollow"&gt;      &lt;strong&gt;Atom&lt;/strong&gt;&lt;/a&gt;- a hackable text editor for the 21st Century.    &lt;br /&gt;&lt;/p&gt;  &lt;h4&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#web-tools-toc"&gt;&lt;/a&gt;Web Tools      &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#anger-table-of-contents"&gt;      &lt;sup&gt;[TOC]&lt;/sup&gt;&lt;/a&gt;&lt;/h4&gt;  &lt;h5&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#black_small_square-browsers-1"&gt;&lt;/a&gt;▪️ Browsers&lt;/h5&gt;  &lt;p&gt;  :small_orange_diamond:    &lt;a href="https://www.ssllabs.com/ssltest/viewMyClient.html" rel="nofollow"&gt;      &lt;strong&gt;SSL/TLS Capabilities of Your Browser&lt;/strong&gt;&lt;/a&gt;- test your browser&amp;apos;s SSL implementation.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://caniuse.com/" rel="nofollow"&gt;      &lt;strong&gt;Can I use&lt;/strong&gt;&lt;/a&gt;- provides up-to-date browser support tables for support of front-end web technologies.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://panopticlick.eff.org/" rel="nofollow"&gt;      &lt;strong&gt;Panopticlick 3.0&lt;/strong&gt;&lt;/a&gt;- is your browser safe against tracking?    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://privacy.net/analyzer/" rel="nofollow"&gt;      &lt;strong&gt;Privacy Analyzer&lt;/strong&gt;&lt;/a&gt;- see what data is exposed from your browser.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://browserleaks.com/" rel="nofollow"&gt;      &lt;strong&gt;Web Browser Security&lt;/strong&gt;&lt;/a&gt;- it&amp;apos;s all about Web Browser fingerprinting.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://www.howsmyssl.com/" rel="nofollow"&gt;      &lt;strong&gt;How&amp;apos;s My SSL?&lt;/strong&gt;&lt;/a&gt;- help a web server developer learn what real world TLS clients were capable of.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://suche.org/sslClientInfo" rel="nofollow"&gt;      &lt;strong&gt;sslClientInfo&lt;/strong&gt;&lt;/a&gt;- client test (incl TLSv1.3 information).    &lt;br /&gt;&lt;/p&gt;  &lt;h5&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#black_small_square-sslsecurity"&gt;&lt;/a&gt;▪️ SSL/Security&lt;/h5&gt;  &lt;p&gt;  :small_orange_diamond:    &lt;a href="https://www.ssllabs.com/ssltest/" rel="nofollow"&gt;      &lt;strong&gt;SSLLabs Server Test&lt;/strong&gt;&lt;/a&gt;- performs a deep analysis of the configuration of any SSL web server.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://dev.ssllabs.com/ssltest/" rel="nofollow"&gt;      &lt;strong&gt;SSLLabs Server Test (DEV)&lt;/strong&gt;&lt;/a&gt;- performs a deep analysis of the configuration of any SSL web server.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://www.immuniweb.com/ssl/" rel="nofollow"&gt;      &lt;strong&gt;ImmuniWeb® SSLScan&lt;/strong&gt;&lt;/a&gt;- test SSL/TLS (PCI DSS, HIPAA and NIST).    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://www.jitbit.com/sslcheck/" rel="nofollow"&gt;      &lt;strong&gt;SSL Check&lt;/strong&gt;&lt;/a&gt;- scan your website for non-secure content.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="http://www.ssltools.com" rel="nofollow"&gt;      &lt;strong&gt;SSL Scanner&lt;/strong&gt;&lt;/a&gt;- analyze website security.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://cryptcheck.fr/" rel="nofollow"&gt;      &lt;strong&gt;CryptCheck&lt;/strong&gt;&lt;/a&gt;- test your TLS server configuration (e.g. ciphers).    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://urlscan.io/" rel="nofollow"&gt;      &lt;strong&gt;urlscan.io&lt;/strong&gt;&lt;/a&gt;- service to scan and analyse websites.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://report-uri.com/home/tools" rel="nofollow"&gt;      &lt;strong&gt;Report URI&lt;/strong&gt;&lt;/a&gt;- monitoring security policies like CSP and HPKP.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://csp-evaluator.withgoogle.com/" rel="nofollow"&gt;      &lt;strong&gt;CSP Evaluator&lt;/strong&gt;&lt;/a&gt;- allows developers and security experts to check if a Content Security Policy.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://uselesscsp.com/" rel="nofollow"&gt;      &lt;strong&gt;Useless CSP&lt;/strong&gt;&lt;/a&gt;- public list about CSP in some big players (might make them care a bit more).    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://whynohttps.com/" rel="nofollow"&gt;      &lt;strong&gt;Why No HTTPS?&lt;/strong&gt;&lt;/a&gt;- top 100 websites by Alexa rank not automatically redirecting insecure requests.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://ciphersuite.info/" rel="nofollow"&gt;      &lt;strong&gt;TLS Cipher Suite Search&lt;/strong&gt;&lt;/a&gt;- cipher suite search engine.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://github.com/RaymiiOrg/cipherli.st"&gt;      &lt;strong&gt;cipherli.st&lt;/strong&gt;&lt;/a&gt;- strong ciphers for Apache, Nginx, Lighttpd, and more.    &lt;strong&gt;*&lt;/strong&gt;    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://2ton.com.au/dhtool/" rel="nofollow"&gt;      &lt;strong&gt;dhtool&lt;/strong&gt;&lt;/a&gt;- public Diffie-Hellman parameter service/tool.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://badssl.com/" rel="nofollow"&gt;      &lt;strong&gt;badssl.com&lt;/strong&gt;&lt;/a&gt;- memorable site for testing clients against bad SSL configs.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://tlsfun.de/" rel="nofollow"&gt;      &lt;strong&gt;tlsfun.de&lt;/strong&gt;&lt;/a&gt;- registered for various tests regarding the TLS/SSL protocol.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://sslmate.com/caa/" rel="nofollow"&gt;      &lt;strong&gt;CAA Record Helper&lt;/strong&gt;&lt;/a&gt;- generate a CAA policy.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://ccadb.org/resources" rel="nofollow"&gt;      &lt;strong&gt;Common CA Database&lt;/strong&gt;&lt;/a&gt;- repository of information about CAs, and their root and intermediate certificates.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://certstream.calidog.io/" rel="nofollow"&gt;      &lt;strong&gt;CERTSTREAM&lt;/strong&gt;&lt;/a&gt;- real-time certificate transparency log update stream.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://crt.sh/" rel="nofollow"&gt;      &lt;strong&gt;crt.sh&lt;/strong&gt;&lt;/a&gt;- discovers certificates by continually monitoring all of the publicly known CT.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://www.hardenize.com/" rel="nofollow"&gt;      &lt;strong&gt;Hardenize&lt;/strong&gt;&lt;/a&gt;- deploy the security standards.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://cryptcheck.fr/suite/" rel="nofollow"&gt;      &lt;strong&gt;Cipher suite compatibility&lt;/strong&gt;&lt;/a&gt;- test TLS cipher suite compatibility.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://www.urlvoid.com/" rel="nofollow"&gt;      &lt;strong&gt;urlvoid&lt;/strong&gt;&lt;/a&gt;- this service helps you detect potentially malicious websites.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://securitytxt.org/" rel="nofollow"&gt;      &lt;strong&gt;security.txt&lt;/strong&gt;&lt;/a&gt;- a proposed standard (generator) which allows websites to define security policies.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://github.com/mozilla/ssl-config-generator"&gt;      &lt;strong&gt;ssl-config-generator&lt;/strong&gt;&lt;/a&gt;- help you follow the Mozilla Server Side TLS configuration guidelines.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://github.com/mjol/TLScan"&gt;      &lt;strong&gt;TLScan&lt;/strong&gt;&lt;/a&gt;- pure python, SSL/TLS protocol and cipher scanner/enumerator.    &lt;br /&gt;&lt;/p&gt;  &lt;h5&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#black_small_square-http-headers--web-linters"&gt;&lt;/a&gt;▪️ HTTP Headers &amp;amp; Web Linters&lt;/h5&gt;  &lt;p&gt;  :small_orange_diamond:    &lt;a href="https://securityheaders.com/" rel="nofollow"&gt;      &lt;strong&gt;Security Headers&lt;/strong&gt;&lt;/a&gt;- analyse the HTTP response headers (with rating system to the results).    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://observatory.mozilla.org/" rel="nofollow"&gt;      &lt;strong&gt;Observatory by Mozilla&lt;/strong&gt;&lt;/a&gt;- set of tools to analyze your website.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://webhint.io/" rel="nofollow"&gt;      &lt;strong&gt;webhint&lt;/strong&gt;&lt;/a&gt;- is a linting tool that will help you with your site&amp;apos;s accessibility, speed, security, and more.    &lt;br /&gt;&lt;/p&gt;  &lt;h5&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#black_small_square-dns"&gt;&lt;/a&gt;▪️ DNS&lt;/h5&gt;  &lt;p&gt;  :small_orange_diamond:    &lt;a href="http://viewdns.info/" rel="nofollow"&gt;      &lt;strong&gt;ViewDNS&lt;/strong&gt;&lt;/a&gt;- one source for free DNS related tools and information.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://dnslookup.org/" rel="nofollow"&gt;      &lt;strong&gt;DNSLookup&lt;/strong&gt;&lt;/a&gt;- is an advanced DNS lookup tool.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://dnslytics.com/" rel="nofollow"&gt;      &lt;strong&gt;DNSlytics&lt;/strong&gt;&lt;/a&gt;- online DNS investigation tool.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://dnsspy.io/" rel="nofollow"&gt;      &lt;strong&gt;DNS Spy&lt;/strong&gt;&lt;/a&gt;- monitor, validate and verify your DNS configurations.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://zonemaster.iis.se/en/" rel="nofollow"&gt;      &lt;strong&gt;Zonemaster&lt;/strong&gt;&lt;/a&gt;- helps you to control how your DNS works.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="http://leafdns.com/" rel="nofollow"&gt;      &lt;strong&gt;Leaf DNS&lt;/strong&gt;&lt;/a&gt;- comprehensive DNS tester.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://findsubdomains.com/" rel="nofollow"&gt;      &lt;strong&gt;Find subdomains online&lt;/strong&gt;&lt;/a&gt;- find subdomains for security assessment penetration test.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://dnsdumpster.com/" rel="nofollow"&gt;      &lt;strong&gt;DNSdumpster&lt;/strong&gt;&lt;/a&gt;- dns recon &amp;amp; research, find &amp;amp; lookup dns records.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://dnstable.com/" rel="nofollow"&gt;      &lt;strong&gt;DNS Table online&lt;/strong&gt;&lt;/a&gt;- search for DNS records by domain, IP, CIDR, ISP.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://intodns.com/" rel="nofollow"&gt;      &lt;strong&gt;intoDNS&lt;/strong&gt;&lt;/a&gt;- DNS and mail server health checker.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="http://www.zonecut.net/dns/" rel="nofollow"&gt;      &lt;strong&gt;DNS Bajaj&lt;/strong&gt;&lt;/a&gt;- check the delegation of your domain.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://www.buddyns.com/delegation-lab/" rel="nofollow"&gt;      &lt;strong&gt;BuddyDNS Delegation LAB&lt;/strong&gt;&lt;/a&gt;- check, trace and visualize delegation of your domain.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://dnssec-debugger.verisignlabs.com/" rel="nofollow"&gt;      &lt;strong&gt;dnssec-debugger&lt;/strong&gt;&lt;/a&gt;- DS or DNSKEY records validator.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="http://ptrarchive.com/" rel="nofollow"&gt;      &lt;strong&gt;PTRarchive.com&lt;/strong&gt;&lt;/a&gt;- this site is responsible for the safekeeping of historical reverse DNS records.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="http://xip.io/" rel="nofollow"&gt;      &lt;strong&gt;xip.io&lt;/strong&gt;&lt;/a&gt;- wildcard DNS for everyone.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://nip.io/" rel="nofollow"&gt;      &lt;strong&gt;nip.io&lt;/strong&gt;&lt;/a&gt;- dead simple wildcard DNS for any IP Address.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://ceipam.eu/en/dnslookup.php" rel="nofollow"&gt;      &lt;strong&gt;dnslookup (ceipam)&lt;/strong&gt;&lt;/a&gt;- one of the best DNS propagation checker (and not only).    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://whatsmydns.com" rel="nofollow"&gt;      &lt;strong&gt;What&amp;apos;s My DNS&lt;/strong&gt;&lt;/a&gt;- DNS propagation checking tool.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://blog.erbbysam.com/index.php/2019/02/09/dnsgrep/" rel="nofollow"&gt;      &lt;strong&gt;DNSGrep&lt;/strong&gt;&lt;/a&gt;- quickly searching large DNS datasets.    &lt;br /&gt;&lt;/p&gt;  &lt;h5&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#black_small_square-mail"&gt;&lt;/a&gt;▪️ Mail&lt;/h5&gt;  &lt;p&gt;  :small_orange_diamond:    &lt;a href="https://luxsci.com/smtp-tls-checker" rel="nofollow"&gt;      &lt;strong&gt;smtp-tls-checker&lt;/strong&gt;&lt;/a&gt;- check an email domain for SMTP TLS support.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://mxtoolbox.com/SuperTool.aspx" rel="nofollow"&gt;      &lt;strong&gt;MX Toolbox&lt;/strong&gt;&lt;/a&gt;- all of your MX record, DNS, blacklist and SMTP diagnostics in one integrated tool.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://www.checktls.com/index.html" rel="nofollow"&gt;      &lt;strong&gt;Secure Email&lt;/strong&gt;&lt;/a&gt;- complete email test tools for email technicians.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="http://www.blacklistalert.org/" rel="nofollow"&gt;      &lt;strong&gt;blacklistalert&lt;/strong&gt;&lt;/a&gt;- checks to see if your domain is on a Real Time Spam Blacklist.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="http://multirbl.valli.org/" rel="nofollow"&gt;      &lt;strong&gt;MultiRBL&lt;/strong&gt;&lt;/a&gt;- complete IP check for sending Mailservers.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://dkimvalidator.com/" rel="nofollow"&gt;      &lt;strong&gt;DKIM SPF &amp;amp; Spam Assassin Validator&lt;/strong&gt;&lt;/a&gt;- checks mail authentication and scores messages with Spam Assassin.    &lt;br /&gt;&lt;/p&gt;  &lt;h5&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#black_small_square-encodersdecoders-and-regex-testing"&gt;&lt;/a&gt;▪️ Encoders/Decoders and Regex testing&lt;/h5&gt;  &lt;p&gt;  :small_orange_diamond:    &lt;a href="https://www.url-encode-decode.com/" rel="nofollow"&gt;      &lt;strong&gt;URL Encode/Decode&lt;/strong&gt;&lt;/a&gt;- tool from above to either encode or decode a string of text.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://uncoder.io/" rel="nofollow"&gt;      &lt;strong&gt;Uncoder&lt;/strong&gt;&lt;/a&gt;- the online translator for search queries on log data.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://regex101.com/" rel="nofollow"&gt;      &lt;strong&gt;Regex101&lt;/strong&gt;&lt;/a&gt;- online regex tester and debugger: PHP, PCRE, Python, Golang and JavaScript.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://regexr.com/" rel="nofollow"&gt;      &lt;strong&gt;RegExr&lt;/strong&gt;&lt;/a&gt;- online tool to learn, build, &amp;amp; test Regular Expressions (RegEx / RegExp).    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://www.regextester.com/" rel="nofollow"&gt;      &lt;strong&gt;RegEx Testing&lt;/strong&gt;&lt;/a&gt;- online regex testing tool.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://www.regexpal.com/" rel="nofollow"&gt;      &lt;strong&gt;RegEx Pal&lt;/strong&gt;&lt;/a&gt;- online regex testing tool + other tools.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://gchq.github.io/CyberChef/" rel="nofollow"&gt;      &lt;strong&gt;The Cyber Swiss Army Knife&lt;/strong&gt;&lt;/a&gt;- a web app for encryption, encoding, compression and data analysis.    &lt;br /&gt;&lt;/p&gt;  &lt;h5&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#black_small_square-net-tools"&gt;&lt;/a&gt;▪️ Net-tools&lt;/h5&gt;  &lt;p&gt;  :small_orange_diamond:    &lt;a href="https://toolbar.netcraft.com/site_report" rel="nofollow"&gt;      &lt;strong&gt;Netcraft&lt;/strong&gt;&lt;/a&gt;- detailed report about the site, helping you to make informed choices about their integrity.    &lt;strong&gt;*&lt;/strong&gt;    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://atlas.ripe.net/" rel="nofollow"&gt;      &lt;strong&gt;RIPE NCC Atlas&lt;/strong&gt;&lt;/a&gt;- a global, open, distributed Internet measurement platform.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://www.robtex.com/" rel="nofollow"&gt;      &lt;strong&gt;Robtex&lt;/strong&gt;&lt;/a&gt;- uses various sources to gather public information about IP numbers, domain names, host names, etc.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://securitytrails.com/" rel="nofollow"&gt;      &lt;strong&gt;Security Trails&lt;/strong&gt;&lt;/a&gt;- APIs for Security Companies, Researchers and Teams.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://tools.keycdn.com/curl" rel="nofollow"&gt;      &lt;strong&gt;Online Curl&lt;/strong&gt;&lt;/a&gt;- curl test, analyze HTTP Response Headers.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://extendsclass.com/" rel="nofollow"&gt;      &lt;strong&gt;Online Tools for Developers&lt;/strong&gt;&lt;/a&gt;- HTTP API tools, testers, encoders, converters, formatters, and other tools.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://ping.eu/" rel="nofollow"&gt;      &lt;strong&gt;Ping.eu&lt;/strong&gt;&lt;/a&gt;- online Ping, Traceroute, DNS lookup, WHOIS and others.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://network-tools.com/" rel="nofollow"&gt;      &lt;strong&gt;Network-Tools&lt;/strong&gt;&lt;/a&gt;- network tools for webmasters, IT technicians &amp;amp; geeks.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://bgpview.io/" rel="nofollow"&gt;      &lt;strong&gt;BGPview&lt;/strong&gt;&lt;/a&gt;- search for any ASN, IP, Prefix or Resource name.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://isbgpsafeyet.com/" rel="nofollow"&gt;      &lt;strong&gt;Is BGP safe yet?&lt;/strong&gt;&lt;/a&gt;- check BGP (RPKI) security of ISPs and other major Internet players.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://riseup.net/" rel="nofollow"&gt;      &lt;strong&gt;Riseup&lt;/strong&gt;&lt;/a&gt;- provides online communication tools for people and groups working on liberatory social change.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://www.virustotal.com/gui/home/upload" rel="nofollow"&gt;      &lt;strong&gt;VirusTotal&lt;/strong&gt;&lt;/a&gt;- analyze suspicious files and URLs to detect types of malware.    &lt;br /&gt;&lt;/p&gt;  &lt;h5&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#black_small_square-privacy"&gt;&lt;/a&gt;▪️ Privacy&lt;/h5&gt;  &lt;p&gt;  :small_orange_diamond:    &lt;a href="https://www.privacyguides.org/" rel="nofollow"&gt;      &lt;strong&gt;privacyguides.org&lt;/strong&gt;&lt;/a&gt;- provides knowledge and tools to protect your privacy against global mass surveillance.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://dnsprivacy.org/wiki/display/DP/DNS+Privacy+Test+Servers" rel="nofollow"&gt;      &lt;strong&gt;DNS Privacy Test Servers&lt;/strong&gt;&lt;/a&gt;- DNS privacy recursive servers list (with a &amp;apos;no logging&amp;apos; policy).    &lt;br /&gt;&lt;/p&gt;  &lt;h5&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#black_small_square-code-parsersplaygrounds"&gt;&lt;/a&gt;▪️ Code parsers/playgrounds&lt;/h5&gt;  &lt;p&gt;  :small_orange_diamond:    &lt;a href="https://www.shellcheck.net/" rel="nofollow"&gt;      &lt;strong&gt;ShellCheck&lt;/strong&gt;&lt;/a&gt;- finds bugs in your shell scripts.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://explainshell.com/" rel="nofollow"&gt;      &lt;strong&gt;explainshell&lt;/strong&gt;&lt;/a&gt;- get interactive help texts for shell commands.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://jsbin.com/?html,output" rel="nofollow"&gt;      &lt;strong&gt;jsbin&lt;/strong&gt;&lt;/a&gt;- live pastebin for HTML, CSS &amp;amp; JavaScript, and more.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://codesandbox.io/" rel="nofollow"&gt;      &lt;strong&gt;CodeSandbox&lt;/strong&gt;&lt;/a&gt;- online code editor for web application development.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="http://sandbox.onlinephpfunctions.com/" rel="nofollow"&gt;      &lt;strong&gt;PHP Sandbox&lt;/strong&gt;&lt;/a&gt;- test your PHP code with this code tester.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://www.repl.it/" rel="nofollow"&gt;      &lt;strong&gt;Repl.it&lt;/strong&gt;&lt;/a&gt;- an instant IDE to learn, build, collaborate, and host all in one place.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="http://www.vclfiddle.net/" rel="nofollow"&gt;      &lt;strong&gt;vclFiddle&lt;/strong&gt;&lt;/a&gt;- is an online tool for experimenting with the Varnish Cache VCL.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://github.com/hadolint/hadolint"&gt;      &lt;strong&gt;Haskell Dockerfile Linter&lt;/strong&gt;&lt;/a&gt;- a smarter Dockerfile linter that helps you build best practice Docker images.    &lt;br /&gt;&lt;/p&gt;  &lt;h5&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#black_small_square-performance"&gt;&lt;/a&gt;▪️ Performance&lt;/h5&gt;  &lt;p&gt;  :small_orange_diamond:    &lt;a href="https://gtmetrix.com/" rel="nofollow"&gt;      &lt;strong&gt;GTmetrix&lt;/strong&gt;&lt;/a&gt;- analyze your site’s speed and make it faster.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://performance.sucuri.net/" rel="nofollow"&gt;      &lt;strong&gt;Sucuri loadtimetester&lt;/strong&gt;&lt;/a&gt;- test here the
performance of any of your sites from across the globe.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://tools.pingdom.com/" rel="nofollow"&gt;      &lt;strong&gt;Pingdom Tools&lt;/strong&gt;&lt;/a&gt;- analyze your site’s speed around the world.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://pingme.io/" rel="nofollow"&gt;      &lt;strong&gt;PingMe.io&lt;/strong&gt;&lt;/a&gt;- run website latency tests across multiple geographic regions.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://developers.google.com/speed/pagespeed/insights/" rel="nofollow"&gt;      &lt;strong&gt;PageSpeed Insights&lt;/strong&gt;&lt;/a&gt;- analyze your site’s speed and make it faster.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://web.dev/" rel="nofollow"&gt;      &lt;strong&gt;web.dev&lt;/strong&gt;&lt;/a&gt;- helps developers like you learn and apply the web&amp;apos;s modern capabilities to your own sites and apps.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://github.com/GoogleChrome/lighthouse"&gt;      &lt;strong&gt;Lighthouse&lt;/strong&gt;&lt;/a&gt;- automated auditing, performance metrics, and best practices for the web.    &lt;br /&gt;&lt;/p&gt;  &lt;h5&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#black_small_square-mass-scanners-search-engines"&gt;&lt;/a&gt;▪️ Mass scanners (search engines)&lt;/h5&gt;  &lt;p&gt;  :small_orange_diamond:    &lt;a href="https://censys.io/" rel="nofollow"&gt;      &lt;strong&gt;Censys&lt;/strong&gt;&lt;/a&gt;- platform that helps information security practitioners discover, monitor, and analyze devices.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://www.shodan.io/" rel="nofollow"&gt;      &lt;strong&gt;Shodan&lt;/strong&gt;&lt;/a&gt;- the world&amp;apos;s first search engine for Internet-connected devices.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://2000.shodan.io/#/" rel="nofollow"&gt;      &lt;strong&gt;Shodan 2000&lt;/strong&gt;&lt;/a&gt;- this tool looks for randomly generated data from Shodan.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://viz.greynoise.io/table" rel="nofollow"&gt;      &lt;strong&gt;GreyNoise&lt;/strong&gt;&lt;/a&gt;- mass scanner such as Shodan and Censys.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://www.zoomeye.org/" rel="nofollow"&gt;      &lt;strong&gt;ZoomEye&lt;/strong&gt;&lt;/a&gt;- search engine for cyberspace that lets the user find specific network components.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://netograph.io/" rel="nofollow"&gt;      &lt;strong&gt;netograph&lt;/strong&gt;&lt;/a&gt;- tools to monitor and understand deep structure of the web.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://fofa.so/" rel="nofollow"&gt;      &lt;strong&gt;FOFA&lt;/strong&gt;&lt;/a&gt;- is a cyberspace search engine.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://www.onyphe.io/" rel="nofollow"&gt;      &lt;strong&gt;onyphe&lt;/strong&gt;&lt;/a&gt;- is a search engine for open-source and cyber threat intelligence data collected.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://intelx.io/" rel="nofollow"&gt;      &lt;strong&gt;IntelligenceX&lt;/strong&gt;&lt;/a&gt;- is a search engine and data archive.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://app.binaryedge.io/" rel="nofollow"&gt;      &lt;strong&gt;binaryedge&lt;/strong&gt;&lt;/a&gt;- it scan the entire internet space and create real-time threat intelligence streams and reports.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://spyse.com/" rel="nofollow"&gt;      &lt;strong&gt;Spyse&lt;/strong&gt;&lt;/a&gt;- Internet assets registry: networks, threats, web objects, etc.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://wigle.net/" rel="nofollow"&gt;      &lt;strong&gt;wigle&lt;/strong&gt;&lt;/a&gt;- is a submission-based catalog of wireless networks. All the networks. Found by Everyone.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://publicwww.com/" rel="nofollow"&gt;      &lt;strong&gt;PublicWWW&lt;/strong&gt;&lt;/a&gt;- find any alphanumeric snippet, signature or keyword in the web pages HTML, JS and CSS code.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://inteltechniques.com/index.html" rel="nofollow"&gt;      &lt;strong&gt;IntelTechniques&lt;/strong&gt;&lt;/a&gt;- this repository contains hundreds of online search utilities.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://hunter.io/" rel="nofollow"&gt;      &lt;strong&gt;hunter&lt;/strong&gt;&lt;/a&gt;- lets you find email addresses in seconds and connect with the people that matter for your business.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://ghostproject.fr/" rel="nofollow"&gt;      &lt;strong&gt;GhostProject?&lt;/strong&gt;&lt;/a&gt;- search by full email address or username.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://www.databreaches.live/" rel="nofollow"&gt;      &lt;strong&gt;databreaches&lt;/strong&gt;&lt;/a&gt;- was my email affected by data breach?    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://weleakinfo.com" rel="nofollow"&gt;      &lt;strong&gt;We Leak Info&lt;/strong&gt;&lt;/a&gt;- world&amp;apos;s fastest and largest data breach search engine.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://pulsedive.com/" rel="nofollow"&gt;      &lt;strong&gt;Pulsedive&lt;/strong&gt;&lt;/a&gt;- scans of malicious URLs, IPs, and domains, including port scans and web requests.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://buckets.grayhatwarfare.com/" rel="nofollow"&gt;      &lt;strong&gt;Buckets by Grayhatwarfar&lt;/strong&gt;&lt;/a&gt;- database with public search for Open Amazon S3 Buckets and their contents.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://vigilante.pw/" rel="nofollow"&gt;      &lt;strong&gt;Vigilante.pw&lt;/strong&gt;&lt;/a&gt;- the breached database directory.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://builtwith.com/" rel="nofollow"&gt;      &lt;strong&gt;builtwith&lt;/strong&gt;&lt;/a&gt;- find out what websites are built with.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://nerdydata.com/" rel="nofollow"&gt;      &lt;strong&gt;NerdyData&lt;/strong&gt;&lt;/a&gt;- search the web&amp;apos;s source code for technologies, across millions of sites.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="http://zorexeye.com/" rel="nofollow"&gt;      &lt;strong&gt;zorexeye&lt;/strong&gt;&lt;/a&gt;- search for sites, images, apps, softwares &amp;amp; more.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://www.mmnt.net/" rel="nofollow"&gt;      &lt;strong&gt;Mamont&amp;apos;s open FTP Index&lt;/strong&gt;&lt;/a&gt;- if a target has an open FTP site with accessible content it will be listed here.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://osintframework.com/" rel="nofollow"&gt;      &lt;strong&gt;OSINT Framework&lt;/strong&gt;&lt;/a&gt;- focused on gathering information from free tools or resources.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://www.maltiverse.com/search" rel="nofollow"&gt;      &lt;strong&gt;maltiverse&lt;/strong&gt;&lt;/a&gt;- is a service oriented to cybersecurity analysts for the advanced analysis of indicators of compromise.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://leakedsource.ru/main/" rel="nofollow"&gt;      &lt;strong&gt;Leaked Source&lt;/strong&gt;&lt;/a&gt;- is a collaboration of data found online in the form of a lookup.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://search.weleakinfo.com/" rel="nofollow"&gt;      &lt;strong&gt;We Leak Info&lt;/strong&gt;&lt;/a&gt;- to help everyday individuals secure their online life, avoiding getting hacked.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://pipl.com/" rel="nofollow"&gt;      &lt;strong&gt;pipl&lt;/strong&gt;&lt;/a&gt;- is the place to find the person behind the email address, social username or phone number.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://abuse.ch/" rel="nofollow"&gt;      &lt;strong&gt;abuse.ch&lt;/strong&gt;&lt;/a&gt;- is operated by a random swiss guy fighting malware for non-profit.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="http://malc0de.com/database/" rel="nofollow"&gt;      &lt;strong&gt;malc0de&lt;/strong&gt;&lt;/a&gt;- malware search engine.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://cybercrime-tracker.net/index.php" rel="nofollow"&gt;      &lt;strong&gt;Cybercrime Tracker&lt;/strong&gt;&lt;/a&gt;- monitors and tracks various malware families that are used to perpetrate cyber crimes.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://github.com/eth0izzle/shhgit/"&gt;      &lt;strong&gt;shhgit&lt;/strong&gt;&lt;/a&gt;- find GitHub secrets in real time.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://searchcode.com/" rel="nofollow"&gt;      &lt;strong&gt;searchcode&lt;/strong&gt;&lt;/a&gt;- helping you find real world examples of functions, API&amp;apos;s and libraries.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="http://www.insecam.org/" rel="nofollow"&gt;      &lt;strong&gt;Insecam&lt;/strong&gt;&lt;/a&gt;- the world biggest directory of online surveillance security cameras.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="http://index-of.es/" rel="nofollow"&gt;      &lt;strong&gt;index-of&lt;/strong&gt;&lt;/a&gt;- contains great stuff like: security, hacking, reverse engineering, cryptography, programming etc.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://opendata.rapid7.com/" rel="nofollow"&gt;      &lt;strong&gt;Rapid7 Labs Open Data&lt;/strong&gt;&lt;/a&gt;- is a great resources of datasets from Project Sonar.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://webtechsurvey.com/common-response-headers" rel="nofollow"&gt;      &lt;strong&gt;Common Response Headers&lt;/strong&gt;&lt;/a&gt;- the largest database of HTTP response headers.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://labs.inquest.net" rel="nofollow"&gt;      &lt;strong&gt;InQuest Labs&lt;/strong&gt;&lt;/a&gt;- InQuest Labs is an open, interactive, and API driven data portal for security researchers.    &lt;br /&gt;&lt;/p&gt;  &lt;h5&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#black_small_square-generators"&gt;&lt;/a&gt;▪️ Generators&lt;/h5&gt;  &lt;p&gt;  :small_orange_diamond:    &lt;a href="https://thispersondoesnotexist.com/" rel="nofollow"&gt;      &lt;strong&gt;thispersondoesnotexist&lt;/strong&gt;&lt;/a&gt;- generate fake faces in one click - endless possibilities.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://generated.photos" rel="nofollow"&gt;      &lt;strong&gt;AI Generated Photos&lt;/strong&gt;&lt;/a&gt;- 100.000 AI generated faces.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://www.fakenamegenerator.com/" rel="nofollow"&gt;      &lt;strong&gt;fakenamegenerator&lt;/strong&gt;&lt;/a&gt;- your randomly generated identity.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://tools.intigriti.io/redirector/" rel="nofollow"&gt;      &lt;strong&gt;Intigriti Redirector&lt;/strong&gt;&lt;/a&gt;- open redirect/SSRF payload generator.    &lt;br /&gt;&lt;/p&gt;  &lt;h5&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#black_small_square-passwords"&gt;&lt;/a&gt;▪️ Passwords&lt;/h5&gt;  &lt;p&gt;  :small_orange_diamond:    &lt;a href="https://haveibeenpwned.com/" rel="nofollow"&gt;      &lt;strong&gt;have i been pwned?&lt;/strong&gt;&lt;/a&gt;- check if you have an account that has been compromised in a data breach.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://www.dehashed.com/" rel="nofollow"&gt;      &lt;strong&gt;dehashed&lt;/strong&gt;&lt;/a&gt;- is a hacked database search engine.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://leakedsource.ru/" rel="nofollow"&gt;      &lt;strong&gt;Leaked Source&lt;/strong&gt;&lt;/a&gt;- is a collaboration of data found online in the form of a lookup.    &lt;br /&gt;&lt;/p&gt;  &lt;h5&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#black_small_square-cveexploits-databases"&gt;&lt;/a&gt;▪️ CVE/Exploits databases&lt;/h5&gt;  &lt;p&gt;  :small_orange_diamond:    &lt;a href="https://cve.mitre.org/" rel="nofollow"&gt;      &lt;strong&gt;CVE Mitre&lt;/strong&gt;&lt;/a&gt;- list of publicly known cybersecurity vulnerabilities.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://www.cvedetails.com/" rel="nofollow"&gt;      &lt;strong&gt;CVE Details&lt;/strong&gt;&lt;/a&gt;- CVE security vulnerability advanced database.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://www.exploit-db.com/" rel="nofollow"&gt;      &lt;strong&gt;Exploit DB&lt;/strong&gt;&lt;/a&gt;- CVE compliant archive of public exploits and corresponding vulnerable software.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://0day.today/" rel="nofollow"&gt;      &lt;strong&gt;0day.today&lt;/strong&gt;&lt;/a&gt;- exploits market provides you the possibility to buy/sell zero-day exploits.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://sploitus.com/" rel="nofollow"&gt;      &lt;strong&gt;sploitus&lt;/strong&gt;&lt;/a&gt;- the exploit and tools database.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://cxsecurity.com/exploit/" rel="nofollow"&gt;      &lt;strong&gt;cxsecurity&lt;/strong&gt;&lt;/a&gt;- free vulnerability database.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://www.vulncode-db.com/" rel="nofollow"&gt;      &lt;strong&gt;Vulncode-DB&lt;/strong&gt;&lt;/a&gt;- is a database for vulnerabilities and their corresponding source code if available.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://cveapi.com/" rel="nofollow"&gt;      &lt;strong&gt;cveapi&lt;/strong&gt;&lt;/a&gt;- free API for CVE data.    &lt;br /&gt;&lt;/p&gt;  &lt;h5&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#black_small_square-mobile-apps-scanners"&gt;&lt;/a&gt;▪️ Mobile apps scanners&lt;/h5&gt;  &lt;p&gt;  :small_orange_diamond:    &lt;a href="https://www.immuniweb.com/mobile/" rel="nofollow"&gt;      &lt;strong&gt;ImmuniWeb® Mobile App Scanner&lt;/strong&gt;&lt;/a&gt;- test security and privacy of mobile apps (iOS &amp;amp; Android).    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://vulnerabilitytest.quixxi.com/" rel="nofollow"&gt;      &lt;strong&gt;Quixxi&lt;/strong&gt;&lt;/a&gt;- free Mobile App Vulnerability Scanner for Android &amp;amp; iOS.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://www.ostorlab.co/scan/mobile/" rel="nofollow"&gt;      &lt;strong&gt;Ostorlab&lt;/strong&gt;&lt;/a&gt;- analyzes mobile application to identify vulnerabilities and potential weaknesses.    &lt;br /&gt;&lt;/p&gt;  &lt;h5&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#black_small_square-private-search-engines"&gt;&lt;/a&gt;▪️ Private Search Engines&lt;/h5&gt;  &lt;p&gt;  :small_orange_diamond:    &lt;a href="https://www.startpage.com/" rel="nofollow"&gt;      &lt;strong&gt;Startpage&lt;/strong&gt;&lt;/a&gt;- the world&amp;apos;s most private search engine.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://searx.me/" rel="nofollow"&gt;      &lt;strong&gt;searX&lt;/strong&gt;&lt;/a&gt;- a privacy-respecting, hackable metasearch engine.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://darksearch.io/" rel="nofollow"&gt;      &lt;strong&gt;darksearch&lt;/strong&gt;&lt;/a&gt;- the 1st real Dark Web search engine.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://www.qwant.com/" rel="nofollow"&gt;      &lt;strong&gt;Qwant&lt;/strong&gt;&lt;/a&gt;- the search engine that respects your privacy.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://duckduckgo.com/" rel="nofollow"&gt;      &lt;strong&gt;DuckDuckGo&lt;/strong&gt;&lt;/a&gt;- the search engine that doesn&amp;apos;t track you.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://swisscows.com/" rel="nofollow"&gt;      &lt;strong&gt;Swisscows&lt;/strong&gt;&lt;/a&gt;- privacy safe web search    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://search.disconnect.me/" rel="nofollow"&gt;      &lt;strong&gt;Disconnect&lt;/strong&gt;&lt;/a&gt;- the search engine that anonymizes your searches.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://metager.org/" rel="nofollow"&gt;      &lt;strong&gt;MetaGer&lt;/strong&gt;&lt;/a&gt;- the search engine that uses anonymous proxy and hidden Tor branches.    &lt;br /&gt;&lt;/p&gt;  &lt;h5&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#black_small_square-secure-webmail-providers"&gt;&lt;/a&gt;▪️ Secure Webmail Providers&lt;/h5&gt;  &lt;p&gt;  :small_orange_diamond:    &lt;a href="https://countermail.com/" rel="nofollow"&gt;      &lt;strong&gt;CounterMail&lt;/strong&gt;&lt;/a&gt;- online email service, designed to provide maximum security and privacy.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="http://mail2tor.com/" rel="nofollow"&gt;      &lt;strong&gt;Mail2Tor&lt;/strong&gt;&lt;/a&gt;- is a Tor Hidden Service that allows anyone to send and receive emails anonymously.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://tutanota.com/" rel="nofollow"&gt;      &lt;strong&gt;Tutanota&lt;/strong&gt;&lt;/a&gt;- is the world&amp;apos;s most secure email service and amazingly easy to use.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://protonmail.com/" rel="nofollow"&gt;      &lt;strong&gt;Protonmail&lt;/strong&gt;&lt;/a&gt;- is the world&amp;apos;s largest secure email service, developed by CERN and MIT scientists.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://www.startmail.com/en/" rel="nofollow"&gt;      &lt;strong&gt;Startmail&lt;/strong&gt;&lt;/a&gt;- private &amp;amp; encrypted email made easy.    &lt;br /&gt;&lt;/p&gt;  &lt;h5&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#black_small_square-crypto"&gt;&lt;/a&gt;▪️ Crypto&lt;/h5&gt;  &lt;p&gt;  :small_orange_diamond:    &lt;a href="https://keybase.io/" rel="nofollow"&gt;      &lt;strong&gt;Keybase&lt;/strong&gt;&lt;/a&gt;- it&amp;apos;s open source and powered by public-key cryptography.    &lt;br /&gt;&lt;/p&gt;  &lt;h5&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#black_small_square-pgp-keyservers"&gt;&lt;/a&gt;▪️ PGP Keyservers&lt;/h5&gt;  &lt;p&gt;  :small_orange_diamond:    &lt;a href="https://keyserver.ubuntu.com/" rel="nofollow"&gt;      &lt;strong&gt;SKS OpenPGP Key server&lt;/strong&gt;&lt;/a&gt;- services for the SKS keyservers used by OpenPGP.    &lt;br /&gt;&lt;/p&gt;  &lt;h4&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#systemsservices-toc"&gt;&lt;/a&gt;Systems/Services      &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#anger-table-of-contents"&gt;      &lt;sup&gt;[TOC]&lt;/sup&gt;&lt;/a&gt;&lt;/h4&gt;  &lt;h5&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#black_small_square-operating-systems"&gt;&lt;/a&gt;▪️ Operating Systems&lt;/h5&gt;  &lt;p&gt;  :small_orange_diamond:    &lt;a href="http://www.slackware.com/" rel="nofollow"&gt;      &lt;strong&gt;Slackware&lt;/strong&gt;&lt;/a&gt;- the most &amp;quot;Unix-like&amp;quot; Linux distribution.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://www.openbsd.org/" rel="nofollow"&gt;      &lt;strong&gt;OpenBSD&lt;/strong&gt;&lt;/a&gt;- multi-platform 4.4BSD-based UNIX-like operating system.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://hardenedbsd.org/" rel="nofollow"&gt;      &lt;strong&gt;HardenedBSD&lt;/strong&gt;&lt;/a&gt;- HardenedBSD aims to implement innovative exploit mitigation and security solutions.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://www.kali.org/" rel="nofollow"&gt;      &lt;strong&gt;Kali Linux&lt;/strong&gt;&lt;/a&gt;- Linux distribution used for Penetration Testing, Ethical Hacking and network security assessments.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://www.parrotsec.org/" rel="nofollow"&gt;      &lt;strong&gt;Parrot Security OS&lt;/strong&gt;&lt;/a&gt;- cyber security GNU/Linux environment.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://www.backbox.org/" rel="nofollow"&gt;      &lt;strong&gt;Backbox Linux&lt;/strong&gt;&lt;/a&gt;- penetration test and security assessment oriented Ubuntu-based Linux distribution.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://blackarch.org/" rel="nofollow"&gt;      &lt;strong&gt;BlackArch&lt;/strong&gt;&lt;/a&gt;- is an Arch Linux-based penetration testing distribution for penetration testers.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://www.pentoo.ch/" rel="nofollow"&gt;      &lt;strong&gt;Pentoo&lt;/strong&gt;&lt;/a&gt;- is a security-focused livecd based on Gentoo.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://securityonion.net/" rel="nofollow"&gt;      &lt;strong&gt;Security Onion&lt;/strong&gt;&lt;/a&gt;- Linux distro for intrusion detection, enterprise security monitoring, and log management.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://tails.boum.org/" rel="nofollow"&gt;      &lt;strong&gt;Tails&lt;/strong&gt;&lt;/a&gt;- is a live system that aims to preserve your privacy and anonymity.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://github.com/vedetta-com/vedetta"&gt;      &lt;strong&gt;vedetta&lt;/strong&gt;&lt;/a&gt;- OpenBSD router boilerplate.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://www.qubes-os.org" rel="nofollow"&gt;      &lt;strong&gt;Qubes OS&lt;/strong&gt;&lt;/a&gt;- is a security-oriented OS that uses Xen-based virtualization.    &lt;br /&gt;&lt;/p&gt;  &lt;h5&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#black_small_square-https-services"&gt;&lt;/a&gt;▪️ HTTP(s) Services&lt;/h5&gt;  &lt;p&gt;  :small_orange_diamond:    &lt;a href="https://varnish-cache.org/" rel="nofollow"&gt;      &lt;strong&gt;Varnish Cache&lt;/strong&gt;&lt;/a&gt;- HTTP accelerator designed for content-heavy dynamic web sites.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://nginx.org/" rel="nofollow"&gt;      &lt;strong&gt;Nginx&lt;/strong&gt;&lt;/a&gt;- open source web and reverse proxy server that is similar to Apache, but very light weight.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://openresty.org/en/" rel="nofollow"&gt;      &lt;strong&gt;OpenResty&lt;/strong&gt;&lt;/a&gt;- is a dynamic web platform based on NGINX and LuaJIT.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://github.com/alibaba/tengine"&gt;      &lt;strong&gt;Tengine&lt;/strong&gt;&lt;/a&gt;- a distribution of Nginx with some advanced features.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://caddyserver.com/" rel="nofollow"&gt;      &lt;strong&gt;Caddy Server&lt;/strong&gt;&lt;/a&gt;- is an open source, HTTP/2-enabled web server with HTTPS by default.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://www.haproxy.org/" rel="nofollow"&gt;      &lt;strong&gt;HAProxy&lt;/strong&gt;&lt;/a&gt;- the reliable, high performance TCP/HTTP load balancer.    &lt;br /&gt;&lt;/p&gt;  &lt;h5&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#black_small_square-dns-services"&gt;&lt;/a&gt;▪️ DNS Services&lt;/h5&gt;  &lt;p&gt;  :small_orange_diamond:    &lt;a href="https://nlnetlabs.nl/projects/unbound/about/" rel="nofollow"&gt;      &lt;strong&gt;Unbound&lt;/strong&gt;&lt;/a&gt;- validating, recursive, and caching DNS resolver (with TLS).    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://www.knot-resolver.cz/" rel="nofollow"&gt;      &lt;strong&gt;Knot Resolver&lt;/strong&gt;&lt;/a&gt;- caching full resolver implementation, including both a resolver library and a daemon.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://www.powerdns.com/" rel="nofollow"&gt;      &lt;strong&gt;PowerDNS&lt;/strong&gt;&lt;/a&gt;- is an open source authoritative DNS server, written in C++ and licensed under the GPL.    &lt;br /&gt;&lt;/p&gt;  &lt;h5&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#black_small_square-other-services"&gt;&lt;/a&gt;▪️ Other Services&lt;/h5&gt;  &lt;p&gt;  :small_orange_diamond:    &lt;a href="https://github.com/z3APA3A/3proxy"&gt;      &lt;strong&gt;3proxy&lt;/strong&gt;&lt;/a&gt;- tiny free proxy server.    &lt;br /&gt;&lt;/p&gt;  &lt;h5&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#black_small_square-securityhardening"&gt;&lt;/a&gt;▪️ Security/hardening&lt;/h5&gt;  &lt;p&gt;  :small_orange_diamond:    &lt;a href="https://twitter.com/EmeraldOnion" rel="nofollow"&gt;      &lt;strong&gt;Emerald Onion&lt;/strong&gt;&lt;/a&gt;- is a 501(c)(3) nonprofit organization and transit internet service provider (ISP).    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://github.com/pi-hole/pi-hole"&gt;      &lt;strong&gt;pi-hole&lt;/strong&gt;&lt;/a&gt;- the Pi-hole® is a DNS sinkhole that protects your devices from unwanted content.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://github.com/stamparm/maltrail"&gt;      &lt;strong&gt;maltrail&lt;/strong&gt;&lt;/a&gt;- malicious traffic detection system.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://github.com/Netflix/security_monkey"&gt;      &lt;strong&gt;security_monkey&lt;/strong&gt;&lt;/a&gt;- monitors AWS, GCP, OpenStack, and GitHub orgs for assets and their changes over time.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://github.com/firecracker-microvm/firecracker"&gt;      &lt;strong&gt;firecracker&lt;/strong&gt;&lt;/a&gt;- secure and fast microVMs for serverless computing.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://github.com/StreisandEffect/streisand"&gt;      &lt;strong&gt;streisand&lt;/strong&gt;&lt;/a&gt;- sets up a new server running your choice of WireGuard, OpenSSH, OpenVPN, and more.    &lt;br /&gt;&lt;/p&gt;  &lt;h4&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#networks-toc"&gt;&lt;/a&gt;Networks      &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#anger-table-of-contents"&gt;      &lt;sup&gt;[TOC]&lt;/sup&gt;&lt;/a&gt;&lt;/h4&gt;  &lt;h5&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#black_small_square-tools"&gt;&lt;/a&gt;▪️ Tools&lt;/h5&gt;  &lt;p&gt;  :small_orange_diamond:    &lt;a href="https://www.capanalysis.net/ca/" rel="nofollow"&gt;      &lt;strong&gt;CapAnalysis&lt;/strong&gt;&lt;/a&gt;- web visual tool to analyze large amounts of captured network traffic (PCAP analyzer).    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://github.com/digitalocean/netbox"&gt;      &lt;strong&gt;netbox&lt;/strong&gt;&lt;/a&gt;- IP address management (IPAM) and data center infrastructure management (DCIM) tool.    &lt;br /&gt;&lt;/p&gt;  &lt;h5&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#black_small_square-labs"&gt;&lt;/a&gt;▪️ Labs&lt;/h5&gt;  &lt;p&gt;  :small_orange_diamond:    &lt;a href="https://labs.networkreliability.engineering/" rel="nofollow"&gt;      &lt;strong&gt;NRE Labs&lt;/strong&gt;&lt;/a&gt;- learn automation by doing it. Right now, right here, in your browser.    &lt;br /&gt;&lt;/p&gt;  &lt;h5&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#black_small_square-other-1"&gt;&lt;/a&gt;▪️ Other&lt;/h5&gt;  &lt;p&gt;  :small_orange_diamond:    &lt;a href="https://ee.lbl.gov/" rel="nofollow"&gt;      &lt;strong&gt;LBNL&amp;apos;s Network Research Group&lt;/strong&gt;&lt;/a&gt;- home page of the Network Research Group (NRG).    &lt;br /&gt;&lt;/p&gt;  &lt;h4&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#containersorchestration-toc"&gt;&lt;/a&gt;Containers/Orchestration      &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#anger-table-of-contents"&gt;      &lt;sup&gt;[TOC]&lt;/sup&gt;&lt;/a&gt;&lt;/h4&gt;  &lt;h5&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#black_small_square-cli-tools"&gt;&lt;/a&gt;▪️ CLI Tools&lt;/h5&gt;  &lt;p&gt;  :small_orange_diamond:    &lt;a href="https://github.com/google/gvisor"&gt;      &lt;strong&gt;gvisor&lt;/strong&gt;&lt;/a&gt;- container runtime sandbox.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://github.com/bcicen/ctop"&gt;      &lt;strong&gt;ctop&lt;/strong&gt;&lt;/a&gt;- top-like interface for container metrics.    &lt;br /&gt;&lt;/p&gt;  &lt;h5&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#black_small_square-web-tools"&gt;&lt;/a&gt;▪️ Web Tools&lt;/h5&gt;  &lt;p&gt;  :small_orange_diamond:    &lt;a href="https://github.com/moby/moby"&gt;      &lt;strong&gt;Moby&lt;/strong&gt;&lt;/a&gt;- a collaborative project for the container ecosystem to assemble container-based system.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://traefik.io/" rel="nofollow"&gt;      &lt;strong&gt;Traefik&lt;/strong&gt;&lt;/a&gt;- open source reverse proxy/load balancer provides easier integration with Docker and Let&amp;apos;s encrypt.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://github.com/Kong/kong"&gt;      &lt;strong&gt;kong&lt;/strong&gt;&lt;/a&gt;- The Cloud-Native API Gateway.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://github.com/rancher/rancher"&gt;      &lt;strong&gt;rancher&lt;/strong&gt;&lt;/a&gt;- complete container management platform.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://github.com/portainer/portainer"&gt;      &lt;strong&gt;portainer&lt;/strong&gt;&lt;/a&gt;- making Docker management easy.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://github.com/jwilder/nginx-proxy"&gt;      &lt;strong&gt;nginx-proxy&lt;/strong&gt;&lt;/a&gt;- automated nginx proxy for Docker containers using docker-gen.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://github.com/bunkerity/bunkerized-nginx"&gt;      &lt;strong&gt;bunkerized-nginx&lt;/strong&gt;&lt;/a&gt;- nginx docker image &amp;quot;secure by default&amp;quot;.    &lt;br /&gt;&lt;/p&gt;  &lt;h5&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#black_small_square-security-1"&gt;&lt;/a&gt;▪️ Security&lt;/h5&gt;  &lt;p&gt;  :small_orange_diamond:    &lt;a href="https://github.com/docker/docker-bench-security"&gt;      &lt;strong&gt;docker-bench-security&lt;/strong&gt;&lt;/a&gt;- checks for dozens of common best-practices around deploying Docker.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://github.com/aquasecurity/trivy"&gt;      &lt;strong&gt;trivy&lt;/strong&gt;&lt;/a&gt;- vulnerability scanner for containers, suitable for CI.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://goharbor.io/" rel="nofollow"&gt;      &lt;strong&gt;Harbor&lt;/strong&gt;&lt;/a&gt;- cloud native registry project that stores, signs, and scans content.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://houdini.secsi.io/" rel="nofollow"&gt;      &lt;strong&gt;Houdini&lt;/strong&gt;&lt;/a&gt;- hundreds of offensive and useful docker images for network intrusion.    &lt;br /&gt;&lt;/p&gt;  &lt;h5&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#black_small_square-manualstutorialsbest-practices"&gt;&lt;/a&gt;▪️ Manuals/Tutorials/Best Practices&lt;/h5&gt;  &lt;p&gt;  :small_orange_diamond:    &lt;a href="https://github.com/wsargent/docker-cheat-sheet"&gt;      &lt;strong&gt;docker-cheat-sheet&lt;/strong&gt;&lt;/a&gt;- a quick reference cheat sheet on Docker.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://github.com/veggiemonk/awesome-docker"&gt;      &lt;strong&gt;awesome-docker&lt;/strong&gt;&lt;/a&gt;- a curated list of Docker resources and projects.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://github.com/yeasy/docker_practice"&gt;      &lt;strong&gt;docker_practice&lt;/strong&gt;&lt;/a&gt;- learn and understand Docker technologies, with real DevOps practice!    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://github.com/docker/labs"&gt;      &lt;strong&gt;labs&lt;/strong&gt;&lt;/a&gt;- is a collection of tutorials for learning how to use Docker with various tools.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://github.com/jessfraz/dockerfiles"&gt;      &lt;strong&gt;dockerfiles&lt;/strong&gt;&lt;/a&gt;- various Dockerfiles I use on the desktop and on servers.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://github.com/kelseyhightower/kubernetes-the-hard-way"&gt;      &lt;strong&gt;kubernetes-the-hard-way&lt;/strong&gt;&lt;/a&gt;- bootstrap Kubernetes the hard way on Google Cloud Platform. No scripts.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://github.com/jamesward/kubernetes-the-easy-way"&gt;      &lt;strong&gt;kubernetes-the-easy-way&lt;/strong&gt;&lt;/a&gt;- bootstrap Kubernetes the easy way on Google Cloud Platform. No scripts.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://github.com/dennyzhang/cheatsheet-kubernetes-A4"&gt;      &lt;strong&gt;cheatsheet-kubernetes-A4&lt;/strong&gt;&lt;/a&gt;- Kubernetes CheatSheets in A4.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://github.com/kabachook/k8s-security"&gt;      &lt;strong&gt;k8s-security&lt;/strong&gt;&lt;/a&gt;- kubernetes security notes and best practices.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://learnk8s.io/production-best-practices/" rel="nofollow"&gt;      &lt;strong&gt;kubernetes-production-best-practices&lt;/strong&gt;&lt;/a&gt;- checklists with best-practices for production-ready Kubernetes.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://github.com/freach/kubernetes-security-best-practice"&gt;      &lt;strong&gt;kubernetes-production-best-practices&lt;/strong&gt;&lt;/a&gt;- kubernetes security - best practice guide.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://github.com/hjacobs/kubernetes-failure-stories"&gt;      &lt;strong&gt;kubernetes-failure-stories&lt;/strong&gt;&lt;/a&gt;- is a compilation of public failure/horror stories related to Kubernetes.    &lt;br /&gt;&lt;/p&gt;  &lt;h4&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#manualshowtostutorials-toc"&gt;&lt;/a&gt;Manuals/Howtos/Tutorials      &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#anger-table-of-contents"&gt;      &lt;sup&gt;[TOC]&lt;/sup&gt;&lt;/a&gt;&lt;/h4&gt;  &lt;h5&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#black_small_square-shellcommand-line"&gt;&lt;/a&gt;▪️ Shell/Command line&lt;/h5&gt;  &lt;p&gt;  :small_orange_diamond:    &lt;a href="https://github.com/dylanaraps/pure-bash-bible"&gt;      &lt;strong&gt;pure-bash-bible&lt;/strong&gt;&lt;/a&gt;- is a collection of pure bash alternatives to external processes.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://github.com/dylanaraps/pure-sh-bible"&gt;      &lt;strong&gt;pure-sh-bible&lt;/strong&gt;&lt;/a&gt;- is a collection of pure POSIX sh alternatives to external processes.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://github.com/Idnan/bash-guide"&gt;      &lt;strong&gt;bash-guide&lt;/strong&gt;&lt;/a&gt;- is a guide to learn bash.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://github.com/denysdovhan/bash-handbook"&gt;      &lt;strong&gt;bash-handbook&lt;/strong&gt;&lt;/a&gt;- for those who wanna learn Bash.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://wiki.bash-hackers.org/start" rel="nofollow"&gt;      &lt;strong&gt;The Bash Hackers Wiki&lt;/strong&gt;&lt;/a&gt;- hold documentation of any kind about GNU Bash.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="http://pubs.opengroup.org/onlinepubs/9699919799/utilities/contents.html" rel="nofollow"&gt;      &lt;strong&gt;Shell &amp;amp; Utilities&lt;/strong&gt;&lt;/a&gt;- describes the commands offered to application programs by POSIX-conformant systems.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://github.com/jlevy/the-art-of-command-line"&gt;      &lt;strong&gt;the-art-of-command-line&lt;/strong&gt;&lt;/a&gt;- master the command line, in one page.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://google.github.io/styleguide/shellguide.html" rel="nofollow"&gt;      &lt;strong&gt;Shell Style Guide&lt;/strong&gt;&lt;/a&gt;- a shell style guide for Google-originated open-source projects.    &lt;br /&gt;&lt;/p&gt;  &lt;h5&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#black_small_square-text-editors-2"&gt;&lt;/a&gt;▪️ Text Editors&lt;/h5&gt;  &lt;p&gt;  :small_orange_diamond:    &lt;a href="https://vim.rtorr.com/" rel="nofollow"&gt;      &lt;strong&gt;Vim Cheat Sheet&lt;/strong&gt;&lt;/a&gt;- great multi language vim guide.    &lt;br /&gt;&lt;/p&gt;  &lt;h5&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#black_small_square-python"&gt;&lt;/a&gt;▪️ Python&lt;/h5&gt;  &lt;p&gt;  :small_orange_diamond:    &lt;a href="https://awesome-python.com/" rel="nofollow"&gt;      &lt;strong&gt;Awesome Python&lt;/strong&gt;&lt;/a&gt;- a curated list of awesome Python frameworks, libraries, software and resources.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://github.com/gto76/python-cheatsheet"&gt;      &lt;strong&gt;python-cheatsheet&lt;/strong&gt;&lt;/a&gt;- comprehensive Python cheatsheet.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://www.pythoncheatsheet.org/" rel="nofollow"&gt;      &lt;strong&gt;pythoncheatsheet.org&lt;/strong&gt;&lt;/a&gt;- basic reference for beginner and advanced developers.    &lt;br /&gt;&lt;/p&gt;  &lt;h5&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#black_small_square-sed--awk--other"&gt;&lt;/a&gt;▪️ Sed &amp;amp; Awk &amp;amp; Other&lt;/h5&gt;  &lt;p&gt;  :small_orange_diamond:    &lt;a href="https://posts.specterops.io/fawk-yeah-advanced-sed-and-awk-usage-parsing-for-pentesters-3-e5727e11a8ad?gi=c8f9506b26b6" rel="nofollow"&gt;      &lt;strong&gt;F’Awk Yeah!&lt;/strong&gt;&lt;/a&gt;- advanced sed and awk usage (Parsing for Pentesters 3).    &lt;br /&gt;&lt;/p&gt;  &lt;h5&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#black_small_square-nix--network"&gt;&lt;/a&gt;▪️ *nix &amp;amp; Network&lt;/h5&gt;  &lt;p&gt;  :small_orange_diamond:    &lt;a href="https://www.cyberciti.biz/" rel="nofollow"&gt;      &lt;strong&gt;nixCraft&lt;/strong&gt;&lt;/a&gt;- linux and unix tutorials for new and seasoned sysadmin.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://www.tecmint.com/" rel="nofollow"&gt;      &lt;strong&gt;TecMint&lt;/strong&gt;&lt;/a&gt;- the ideal Linux blog for Sysadmins &amp;amp; Geeks.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="http://www.omnisecu.com/index.php" rel="nofollow"&gt;      &lt;strong&gt;Omnisecu&lt;/strong&gt;&lt;/a&gt;- free Networking, System Administration and Security tutorials.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://github.com/cirosantilli/linux-cheat"&gt;      &lt;strong&gt;linux-cheat&lt;/strong&gt;&lt;/a&gt;- Linux tutorials and cheatsheets. Minimal examples. Mostly user-land CLI utilities.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://github.com/snori74/linuxupskillchallenge"&gt;      &lt;strong&gt;linuxupskillchallenge&lt;/strong&gt;&lt;/a&gt;- learn the skills required to sysadmin.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="http://cb.vu/unixtoolbox.xhtml" rel="nofollow"&gt;      &lt;strong&gt;Unix Toolbox&lt;/strong&gt;&lt;/a&gt;- Unix/Linux/BSD commands and tasks which are useful for IT work or for advanced users.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://linux-kernel-labs.github.io/refs/heads/master/index.html" rel="nofollow"&gt;      &lt;strong&gt;Linux Kernel Teaching&lt;/strong&gt;&lt;/a&gt;- is a collection of lectures and labs Linux kernel topics.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://peteris.rocks/blog/htop/" rel="nofollow"&gt;      &lt;strong&gt;htop explained&lt;/strong&gt;&lt;/a&gt;- explanation of everything you can see in htop/top on Linux.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://linuxguideandhints.com/" rel="nofollow"&gt;      &lt;strong&gt;Linux Guide and Hints&lt;/strong&gt;&lt;/a&gt;- tutorials on system administration in Fedora and CentOS.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://github.com/NanXiao/strace-little-book"&gt;      &lt;strong&gt;strace-little-book&lt;/strong&gt;&lt;/a&gt;- a little book which introduces strace.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://github.com/goldshtn/linux-tracing-workshop"&gt;      &lt;strong&gt;linux-tracing-workshop&lt;/strong&gt;&lt;/a&gt;- examples and hands-on labs for Linux tracing tools workshops.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://github.com/bagder/http2-explained"&gt;      &lt;strong&gt;http2-explained&lt;/strong&gt;&lt;/a&gt;- a detailed document explaining and documenting HTTP/2.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://github.com/bagder/http3-explained"&gt;      &lt;strong&gt;http3-explained&lt;/strong&gt;&lt;/a&gt;- a document describing the HTTP/3 and QUIC protocols.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://www.manning.com/books/http2-in-action" rel="nofollow"&gt;      &lt;strong&gt;HTTP/2 in Action&lt;/strong&gt;&lt;/a&gt;- an excellent introduction to the new HTTP/2 standard.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://www.saminiir.com/lets-code-tcp-ip-stack-1-ethernet-arp/" rel="nofollow"&gt;      &lt;strong&gt;Let&amp;apos;s code a TCP/IP stack&lt;/strong&gt;&lt;/a&gt;- great stuff to learn network and system programming at a deeper level.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://github.com/trimstray/nginx-admins-handbook"&gt;      &lt;strong&gt;Nginx Admin&amp;apos;s Handbook&lt;/strong&gt;&lt;/a&gt;- how to improve NGINX performance, security and other important things.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://github.com/digitalocean/nginxconfig.io"&gt;      &lt;strong&gt;nginxconfig.io&lt;/strong&gt;&lt;/a&gt;- NGINX config generator on steroids.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://infosec.mozilla.org/guidelines/openssh" rel="nofollow"&gt;      &lt;strong&gt;openssh guideline&lt;/strong&gt;&lt;/a&gt;- is to help operational teams with the configuration of OpenSSH server and client.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://gravitational.com/blog/ssh-handshake-explained/" rel="nofollow"&gt;      &lt;strong&gt;SSH Handshake Explained&lt;/strong&gt;&lt;/a&gt;- is a relatively brief description of the SSH handshake.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://kb.isc.org/docs/using-this-knowledgebase" rel="nofollow"&gt;      &lt;strong&gt;ISC&amp;apos;s Knowledgebase&lt;/strong&gt;&lt;/a&gt;- you&amp;apos;ll find some general information about BIND 9, ISC DHCP, and Kea DHCP.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://packetlife.net/" rel="nofollow"&gt;      &lt;strong&gt;PacketLife.net&lt;/strong&gt;&lt;/a&gt;- a place to record notes while studying for Cisco&amp;apos;s CCNP certification.    &lt;br /&gt;&lt;/p&gt;  &lt;h5&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#black_small_square-microsoft"&gt;&lt;/a&gt;▪️ Microsoft&lt;/h5&gt;  &lt;p&gt;  :small_orange_diamond:    &lt;a href="https://github.com/infosecn1nja/AD-Attack-Defense"&gt;      &lt;strong&gt;AD-Attack-Defense&lt;/strong&gt;&lt;/a&gt;- attack and defend active directory using modern post exploitation activity.    &lt;br /&gt;&lt;/p&gt;  &lt;h5&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#black_small_square-large-scale-systems"&gt;&lt;/a&gt;▪️ Large-scale systems&lt;/h5&gt;  &lt;p&gt;  :small_orange_diamond:    &lt;a href="https://github.com/donnemartin/system-design-primer"&gt;      &lt;strong&gt;The System Design Primer&lt;/strong&gt;&lt;/a&gt;- learn how to design large-scale systems.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://github.com/binhnguyennus/awesome-scalability"&gt;      &lt;strong&gt;Awesome Scalability&lt;/strong&gt;&lt;/a&gt;- best practices in building High Scalability, High Availability, High Stability, and more.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://engineering.videoblocks.com/web-architecture-101-a3224e126947?gi=a896808d22a" rel="nofollow"&gt;      &lt;strong&gt;Web Architecture 101&lt;/strong&gt;&lt;/a&gt;- the basic architecture concepts.    &lt;br /&gt;&lt;/p&gt;  &lt;h5&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#black_small_square-system-hardening"&gt;&lt;/a&gt;▪️ System hardening&lt;/h5&gt;  &lt;p&gt;  :small_orange_diamond:    &lt;a href="https://www.cisecurity.org/cis-benchmarks/" rel="nofollow"&gt;      &lt;strong&gt;CIS Benchmarks&lt;/strong&gt;&lt;/a&gt;- secure configuration settings for over 100 technologies, available as a free PDF.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://highon.coffee/blog/security-harden-centos-7/" rel="nofollow"&gt;      &lt;strong&gt;Security Harden CentOS 7&lt;/strong&gt;&lt;/a&gt;- this walks you through the steps required to security harden CentOS.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://www.lisenet.com/2017/centos-7-server-hardening-guide/" rel="nofollow"&gt;      &lt;strong&gt;CentOS 7 Server Hardening Guide&lt;/strong&gt;&lt;/a&gt;- great guide for hardening CentOS; familiar with OpenSCAP.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://github.com/decalage2/awesome-security-hardening"&gt;      &lt;strong&gt;awesome-security-hardening&lt;/strong&gt;&lt;/a&gt;- is a collection of security hardening guides, tools and other resources.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://github.com/trimstray/the-practical-linux-hardening-guide"&gt;      &lt;strong&gt;The Practical Linux Hardening Guide&lt;/strong&gt;&lt;/a&gt;- provides a high-level overview of hardening GNU/Linux systems.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://madaidans-insecurities.github.io/guides/linux-hardening.html" rel="nofollow"&gt;      &lt;strong&gt;Linux Hardening Guide&lt;/strong&gt;&lt;/a&gt;- how to harden Linux as much as possible for security and privacy.    &lt;br /&gt;&lt;/p&gt;  &lt;h5&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#black_small_square-security--privacy"&gt;&lt;/a&gt;▪️ Security &amp;amp; Privacy&lt;/h5&gt;  &lt;p&gt;  :small_orange_diamond:    &lt;a href="https://www.hackingarticles.in/" rel="nofollow"&gt;      &lt;strong&gt;Hacking Articles&lt;/strong&gt;&lt;/a&gt;- LRaj Chandel&amp;apos;s Security &amp;amp; Hacking Blog.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://github.com/toniblyx/my-arsenal-of-aws-security-tools"&gt;      &lt;strong&gt;AWS security tools&lt;/strong&gt;&lt;/a&gt;- make your AWS cloud environment more secure.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://inventory.rawsec.ml/index.html" rel="nofollow"&gt;      &lt;strong&gt;Rawsec&amp;apos;s CyberSecurity Inventory&lt;/strong&gt;&lt;/a&gt;- an inventory of tools and resources about CyberSecurity.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://tls.ulfheim.net/" rel="nofollow"&gt;      &lt;strong&gt;The Illustrated TLS Connection&lt;/strong&gt;&lt;/a&gt;- every byte of a TLS connection explained and reproduced.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://github.com/ssllabs/research/wiki/SSL-and-TLS-Deployment-Best-Practices"&gt;      &lt;strong&gt;SSL Research&lt;/strong&gt;&lt;/a&gt;- SSL and TLS Deployment Best Practices by SSL Labs.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="http://selinuxgame.org/index.html" rel="nofollow"&gt;      &lt;strong&gt;SELinux Game&lt;/strong&gt;&lt;/a&gt;- learn SELinux by doing. Solve Puzzles, show skillz.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://smallstep.com/blog/everything-pki.html" rel="nofollow"&gt;      &lt;strong&gt;Certificates and PKI&lt;/strong&gt;&lt;/a&gt;- everything you should know about certificates and PKI but are too afraid to ask.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://appsecco.com/books/subdomain-enumeration/" rel="nofollow"&gt;      &lt;strong&gt;The Art of Subdomain Enumeration&lt;/strong&gt;&lt;/a&gt;- a reference for subdomain enumeration techniques.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://lifehacker.com/the-comprehensive-guide-to-quitting-google-1830001964" rel="nofollow"&gt;      &lt;strong&gt;Quitting Google&lt;/strong&gt;&lt;/a&gt;- the comprehensive guide to quitting Google.    &lt;br /&gt;&lt;/p&gt;  &lt;h5&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#black_small_square-web-apps"&gt;&lt;/a&gt;▪️ Web Apps&lt;/h5&gt;  &lt;p&gt;  :small_orange_diamond:    &lt;a href="https://www.owasp.org/index.php/Main_Page" rel="nofollow"&gt;      &lt;strong&gt;OWASP&lt;/strong&gt;&lt;/a&gt;- worldwide not-for-profit charitable organization focused on improving the security of software.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://www.owasp.org/index.php/Category:OWASP_Application_Security_Verification_Standard_Project" rel="nofollow"&gt;      &lt;strong&gt;OWASP ASVS 3.0.1&lt;/strong&gt;&lt;/a&gt;- OWASP Application Security Verification Standard Project.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://github.com/Santandersecurityresearch/asvs"&gt;      &lt;strong&gt;OWASP ASVS 3.0.1 Web App&lt;/strong&gt;&lt;/a&gt;- simple web app that helps developers understand the ASVS requirements.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://github.com/OWASP/ASVS/tree/master/4.0"&gt;      &lt;strong&gt;OWASP ASVS 4.0&lt;/strong&gt;&lt;/a&gt;- is a list of application security requirements or tests.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://www.owasp.org/index.php/OWASP_Testing_Project" rel="nofollow"&gt;      &lt;strong&gt;OWASP Testing Guide v4&lt;/strong&gt;&lt;/a&gt;- includes a &amp;quot;best practice&amp;quot; penetration testing framework.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://github.com/OWASP/DevGuide"&gt;      &lt;strong&gt;OWASP Dev Guide&lt;/strong&gt;&lt;/a&gt;- this is the development version of the OWASP Developer Guide.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://github.com/OWASP/wstg"&gt;      &lt;strong&gt;OWASP WSTG&lt;/strong&gt;&lt;/a&gt;- is a comprehensive open source guide to testing the security of web apps.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://www.owasp.org/index.php/OWASP_API_Security_Project" rel="nofollow"&gt;      &lt;strong&gt;OWASP API Security Project&lt;/strong&gt;&lt;/a&gt;- focuses specifically on the top ten vulnerabilities in API security.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://infosec.mozilla.org/guidelines/web_security.html" rel="nofollow"&gt;      &lt;strong&gt;Mozilla Web Security&lt;/strong&gt;&lt;/a&gt;- help operational teams with creating secure web applications.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://github.com/Netflix/security-bulletins"&gt;      &lt;strong&gt;security-bulletins&lt;/strong&gt;&lt;/a&gt;- security bulletins that relate to Netflix Open Source.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://github.com/shieldfy/API-Security-Checklist"&gt;      &lt;strong&gt;API-Security-Checklist&lt;/strong&gt;&lt;/a&gt;- security countermeasures when designing, testing, and releasing your API.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://enable-cors.org/index.html" rel="nofollow"&gt;      &lt;strong&gt;Enable CORS&lt;/strong&gt;&lt;/a&gt;- enable cross-origin resource sharing.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://appsecwiki.com/#/" rel="nofollow"&gt;      &lt;strong&gt;Application Security Wiki&lt;/strong&gt;&lt;/a&gt;- is an initiative to provide all application security related resources at one place.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://github.com/GrrrDog/weird_proxies/wiki"&gt;      &lt;strong&gt;Weird Proxies&lt;/strong&gt;&lt;/a&gt;- reverse proxy related attacks; it is a result of analysis of various proxies.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://dfir.it/blog/2015/08/12/webshell-every-time-the-same-purpose/" rel="nofollow"&gt;      &lt;strong&gt;Webshells&lt;/strong&gt;&lt;/a&gt;- great series about malicious payloads.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://portswigger.net/blog/practical-web-cache-poisoning" rel="nofollow"&gt;      &lt;strong&gt;Practical Web Cache Poisoning&lt;/strong&gt;&lt;/a&gt;- show you how to compromise websites by using esoteric web features.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://github.com/bl4de/research/tree/master/hidden_directories_leaks"&gt;      &lt;strong&gt;Hidden directories and files&lt;/strong&gt;&lt;/a&gt;- as a source of sensitive information about web application.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://bo0om.ru/en/" rel="nofollow"&gt;      &lt;strong&gt;Explosive blog&lt;/strong&gt;&lt;/a&gt;- great blog about cybersec and pentests.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://www.netsparker.com/security-cookies-whitepaper/" rel="nofollow"&gt;      &lt;strong&gt;Security Cookies&lt;/strong&gt;&lt;/a&gt;- this paper will take a close look at cookie security.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://github.com/GitGuardian/APISecurityBestPractices"&gt;      &lt;strong&gt;APISecurityBestPractices&lt;/strong&gt;&lt;/a&gt;- help you keep secrets (API keys, db credentials, certificates) out of source code.    &lt;br /&gt;&lt;/p&gt;  &lt;h5&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#black_small_square-all-in-one"&gt;&lt;/a&gt;▪️ All-in-one&lt;/h5&gt;  &lt;p&gt;  :small_orange_diamond:    &lt;a href="https://lzone.de/cheat-sheet/" rel="nofollow"&gt;      &lt;strong&gt;LZone Cheat Sheets&lt;/strong&gt;&lt;/a&gt;- all cheat sheets.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://github.com/rstacruz/cheatsheets"&gt;      &lt;strong&gt;Dan’s Cheat Sheets’s&lt;/strong&gt;&lt;/a&gt;- massive cheat sheets documentation.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://devhints.io/" rel="nofollow"&gt;      &lt;strong&gt;Rico&amp;apos;s cheatsheets&lt;/strong&gt;&lt;/a&gt;- this is a modest collection of cheatsheets.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://devdocs.io/" rel="nofollow"&gt;      &lt;strong&gt;DevDocs API&lt;/strong&gt;&lt;/a&gt;- combines multiple API documentations in a fast, organized, and searchable interface.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://cheat.sh/" rel="nofollow"&gt;      &lt;strong&gt;cheat.sh&lt;/strong&gt;&lt;/a&gt;- the only cheat sheet you need.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://gnulinux.guru/" rel="nofollow"&gt;      &lt;strong&gt;gnulinux.guru&lt;/strong&gt;&lt;/a&gt;- collection of cheat sheets about bash, vim and networking.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://andreasbm.github.io/web-skills/" rel="nofollow"&gt;      &lt;strong&gt;Web Skills&lt;/strong&gt;&lt;/a&gt;- visual overview of useful skills to learn as a web developer.    &lt;br /&gt;&lt;/p&gt;  &lt;h5&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#black_small_square-ebooks"&gt;&lt;/a&gt;▪️ Ebooks&lt;/h5&gt;  &lt;p&gt;  :small_orange_diamond:    &lt;a href="https://github.com/EbookFoundation/free-programming-books"&gt;      &lt;strong&gt;free-programming-books&lt;/strong&gt;&lt;/a&gt;- list of free learning resources in many languages.    &lt;br /&gt;&lt;/p&gt;  &lt;h5&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#black_small_square-other-2"&gt;&lt;/a&gt;▪️ Other&lt;/h5&gt;  &lt;p&gt;  :small_orange_diamond:    &lt;a href="https://bitvijays.github.io/LFC-VulnerableMachines.html" rel="nofollow"&gt;      &lt;strong&gt;CTF Series : Vulnerable Machines&lt;/strong&gt;&lt;/a&gt;- the steps below could be followed to find vulnerabilities and exploits.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://github.com/manoelt/50M_CTF_Writeup"&gt;      &lt;strong&gt;50M_CTF_Writeup&lt;/strong&gt;&lt;/a&gt;- $50 million CTF from Hackerone - writeup.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://github.com/j00ru/ctf-tasks"&gt;      &lt;strong&gt;ctf-tasks&lt;/strong&gt;&lt;/a&gt;- an archive of low-level CTF challenges developed over the years.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://hshrzd.wordpress.com/how-to-start/" rel="nofollow"&gt;      &lt;strong&gt;How to start RE/malware analysis?&lt;/strong&gt;&lt;/a&gt;- collection of some hints and useful links for the beginners.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="http://www.kegel.com/c10k.html" rel="nofollow"&gt;      &lt;strong&gt;The C10K problem&lt;/strong&gt;&lt;/a&gt;- it&amp;apos;s time for web servers to handle ten thousand clients simultaneously, don&amp;apos;t you think?    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://blog.benjojo.co.uk/post/why-is-ethernet-mtu-1500" rel="nofollow"&gt;      &lt;strong&gt;How 1500 bytes became the MTU of the internet&lt;/strong&gt;&lt;/a&gt;- great story about the Maximum Transmission Unit.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="http://poormansprofiler.org/" rel="nofollow"&gt;      &lt;strong&gt;poor man&amp;apos;s profiler&lt;/strong&gt;&lt;/a&gt;- like dtrace&amp;apos;s don&amp;apos;t really provide methods to see what programs are blocking on.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://nickcraver.com/blog/2017/05/22/https-on-stack-overflow/" rel="nofollow"&gt;      &lt;strong&gt;HTTPS on Stack Overflow&lt;/strong&gt;&lt;/a&gt;- this is the story of a long journey regarding the implementation of SSL.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://drawings.jvns.ca/" rel="nofollow"&gt;      &lt;strong&gt;Julia&amp;apos;s Drawings&lt;/strong&gt;&lt;/a&gt;- some drawings about programming and unix world, zines about systems &amp;amp; debugging tools.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://github.com/corkami/collisions"&gt;      &lt;strong&gt;Hash collisions&lt;/strong&gt;&lt;/a&gt;- this great repository is focused on hash collisions exploitation.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://github.com/in3rsha/sha256-animation"&gt;      &lt;strong&gt;sha256-animation&lt;/strong&gt;&lt;/a&gt;- animation of the SHA-256 hash function in your terminal.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://sha256algorithm.com/" rel="nofollow"&gt;      &lt;strong&gt;sha256algorithm&lt;/strong&gt;&lt;/a&gt;- sha256 algorithm explained online step by step visually.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://labs.ripe.net/Members/cteusche/bgp-meets-cat" rel="nofollow"&gt;      &lt;strong&gt;BGP Meets Cat&lt;/strong&gt;&lt;/a&gt;- after 3072 hours of manipulating BGP, Job Snijders has succeeded in drawing a Nyancat.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://github.com/benjojo/bgp-battleships"&gt;      &lt;strong&gt;bgp-battleships&lt;/strong&gt;&lt;/a&gt;- playing battleships over BGP.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://github.com/alex/what-happens-when"&gt;      &lt;strong&gt;What happens when...&lt;/strong&gt;&lt;/a&gt;- you type google.com into your browser and press enter?    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://github.com/vasanthk/how-web-works"&gt;      &lt;strong&gt;how-web-works&lt;/strong&gt;&lt;/a&gt;- based on the &amp;apos;What happens when...&amp;apos; repository.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://robertheaton.com/2018/11/28/https-in-the-real-world/" rel="nofollow"&gt;      &lt;strong&gt;HTTPS in the real world&lt;/strong&gt;&lt;/a&gt;- great tutorial explain how HTTPS works in the real world.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://about.gitlab.com/2018/11/14/how-we-spent-two-weeks-hunting-an-nfs-bug/" rel="nofollow"&gt;      &lt;strong&gt;Gitlab and NFS bug&lt;/strong&gt;&lt;/a&gt;- how we spent two weeks hunting an NFS bug in the Linux kernel.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://about.gitlab.com/2017/02/10/postmortem-of-database-outage-of-january-31/" rel="nofollow"&gt;      &lt;strong&gt;Gitlab melts down&lt;/strong&gt;&lt;/a&gt;- postmortem on the database outage of January 31 2017 with the lessons we learned.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="http://www.catb.org/esr/faqs/hacker-howto.html" rel="nofollow"&gt;      &lt;strong&gt;How To Become A Hacker&lt;/strong&gt;&lt;/a&gt;- if you want to be a hacker, keep reading.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="http://ithare.com/infographics-operation-costs-in-cpu-clock-cycles/" rel="nofollow"&gt;      &lt;strong&gt;Operation Costs in CPU&lt;/strong&gt;&lt;/a&gt;- should help to estimate costs of certain operations in CPU clocks.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://cstack.github.io/db_tutorial/" rel="nofollow"&gt;      &lt;strong&gt;Let&amp;apos;s Build a Simple Database&lt;/strong&gt;&lt;/a&gt;- writing a sqlite clone from scratch in C.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://djhworld.github.io/post/2019/05/21/i-dont-know-how-cpus-work-so-i-simulated-one-in-code/" rel="nofollow"&gt;      &lt;strong&gt;simple-computer&lt;/strong&gt;&lt;/a&gt;- great resource to understand how computers work under the hood.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://www.troyhunt.com/working-with-154-million-records-on/" rel="nofollow"&gt;      &lt;strong&gt;The story of &amp;quot;Have I been pwned?&amp;quot;&lt;/strong&gt;&lt;/a&gt;- working with 154 million records on Azure Table Storage.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://www.top500.org/" rel="nofollow"&gt;      &lt;strong&gt;TOP500 Supercomputers&lt;/strong&gt;&lt;/a&gt;- shows the 500 most powerful commercially available computer systems known to us.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://www.shellntel.com/blog/2017/2/8/how-to-build-a-8-gpu-password-cracker" rel="nofollow"&gt;      &lt;strong&gt;How to build a 8 GPU password cracker&lt;/strong&gt;&lt;/a&gt;- any &amp;quot;black magic&amp;quot; or hours of frustration like desktop components do.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://home.cern/science/computing" rel="nofollow"&gt;      &lt;strong&gt;CERN Data Centre&lt;/strong&gt;&lt;/a&gt;- 3D visualizations of the CERN computing environments (and more).    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="http://howfuckedismydatabase.com/" rel="nofollow"&gt;      &lt;strong&gt;How fucked is my database&lt;/strong&gt;&lt;/a&gt;- evaluate how fucked your database is with this handy website.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://krisbuytaert.be/blog/linux-troubleshooting-101-2016-edition/index.html" rel="nofollow"&gt;      &lt;strong&gt;Linux Troubleshooting 101 , 2016 Edition&lt;/strong&gt;&lt;/a&gt;- everything is a DNS Problem...    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://open.buffer.com/5-whys-process/" rel="nofollow"&gt;      &lt;strong&gt;Five Whys&lt;/strong&gt;&lt;/a&gt;- you know what the problem is, but you cannot solve it?    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://gvnshtn.com/maersk-me-notpetya/" rel="nofollow"&gt;      &lt;strong&gt;Maersk, me &amp;amp; notPetya&lt;/strong&gt;&lt;/a&gt;- how did ransomware successfully hijack hundreds of domain controllers?    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://howhttps.works/" rel="nofollow"&gt;      &lt;strong&gt;howhttps.works&lt;/strong&gt;&lt;/a&gt;- how HTTPS works ...in a comic!    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://howdns.works/" rel="nofollow"&gt;      &lt;strong&gt;howdns.works&lt;/strong&gt;&lt;/a&gt;- a fun and colorful explanation of how DNS works.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://postgresqlco.nf/en/doc/param/" rel="nofollow"&gt;      &lt;strong&gt;POSTGRESQLCO.NF&lt;/strong&gt;&lt;/a&gt;- your postgresql.conf documentation and recommendations.    &lt;br /&gt;&lt;/p&gt;  &lt;h4&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#inspiring-lists-toc"&gt;&lt;/a&gt;Inspiring Lists      &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#anger-table-of-contents"&gt;      &lt;sup&gt;[TOC]&lt;/sup&gt;&lt;/a&gt;&lt;/h4&gt;  &lt;h5&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#black_small_square-sysopsdevops"&gt;&lt;/a&gt;▪️ SysOps/DevOps&lt;/h5&gt;  &lt;p&gt;  :small_orange_diamond:    &lt;a href="https://github.com/kahun/awesome-sysadmin"&gt;      &lt;strong&gt;Awesome Sysadmin&lt;/strong&gt;&lt;/a&gt;- amazingly awesome open source sysadmin resources.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://github.com/alebcay/awesome-shell"&gt;      &lt;strong&gt;Awesome Shell&lt;/strong&gt;&lt;/a&gt;- awesome command-line frameworks, toolkits, guides and gizmos.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://github.com/learnbyexample/Command-line-text-processing"&gt;      &lt;strong&gt;Command-line-text-processing&lt;/strong&gt;&lt;/a&gt;- finding text to search and replace, sorting to beautifying, and more.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://github.com/caesar0301/awesome-pcaptools"&gt;      &lt;strong&gt;Awesome Pcaptools&lt;/strong&gt;&lt;/a&gt;- collection of tools developed by other researchers to process network traces.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://github.com/zoidbergwill/awesome-ebpf"&gt;      &lt;strong&gt;awesome-ebpf&lt;/strong&gt;&lt;/a&gt;- a curated list of awesome projects related to eBPF.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://github.com/leandromoreira/linux-network-performance-parameters"&gt;      &lt;strong&gt;Linux Network Performance&lt;/strong&gt;&lt;/a&gt;- where some of the network sysctl variables fit into the Linux/Kernel network flow.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://github.com/dhamaniasad/awesome-postgres"&gt;      &lt;strong&gt;Awesome Postgres&lt;/strong&gt;&lt;/a&gt;- list of awesome PostgreSQL software, libraries, tools and resources.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://github.com/enochtangg/quick-SQL-cheatsheet"&gt;      &lt;strong&gt;quick-SQL-cheatsheet&lt;/strong&gt;&lt;/a&gt;- a quick reminder of all SQL queries and examples on how to use them.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://github.com/Kickball/awesome-selfhosted"&gt;      &lt;strong&gt;Awesome-Selfhosted&lt;/strong&gt;&lt;/a&gt;- list of Free Software network services and web applications which can be hosted locally.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://wiki.archlinux.org/index.php/List_of_applications" rel="nofollow"&gt;      &lt;strong&gt;List of applications&lt;/strong&gt;&lt;/a&gt;- huge list of apps sorted by category, as a reference for those looking for packages.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://github.com/InterviewMap/CS-Interview-Knowledge-Map"&gt;      &lt;strong&gt;CS-Interview-Knowledge-Map&lt;/strong&gt;&lt;/a&gt;- build the best interview map.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://github.com/Tikam02/DevOps-Guide"&gt;      &lt;strong&gt;DevOps-Guide&lt;/strong&gt;&lt;/a&gt;- DevOps Guide from basic to advanced with Interview Questions and Notes.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://issue.freebsdfoundation.org/publication/?m=33057&amp;l=1&amp;view=issuelistBrowser" rel="nofollow"&gt;      &lt;strong&gt;FreeBSD Journal&lt;/strong&gt;&lt;/a&gt;- it is a great list of periodical magazines about FreeBSD and other important things.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://github.com/bregman-arie/devops-interview-questions"&gt;      &lt;strong&gt;devops-interview-questions&lt;/strong&gt;&lt;/a&gt;- contains interview questions on various DevOps and SRE related topics.    &lt;br /&gt;&lt;/p&gt;  &lt;h5&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#black_small_square-developers"&gt;&lt;/a&gt;▪️ Developers&lt;/h5&gt;  &lt;p&gt;  :small_orange_diamond:    &lt;a href="https://github.com/kamranahmedse/developer-roadmap"&gt;      &lt;strong&gt;Web Developer Roadmap&lt;/strong&gt;&lt;/a&gt;- roadmaps, articles and resources to help you choose your path, learn and improve.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://github.com/thedaviddias/Front-End-Checklist"&gt;      &lt;strong&gt;Front-End-Checklist&lt;/strong&gt;&lt;/a&gt;- the perfect Front-End Checklist for modern websites and meticulous developers.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://github.com/thedaviddias/Front-End-Performance-Checklist"&gt;      &lt;strong&gt;Front-End-Performance-Checklist&lt;/strong&gt;&lt;/a&gt;- Front-End Performance Checklist that runs faster than the others.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://rszalski.github.io/magicmethods/" rel="nofollow"&gt;      &lt;strong&gt;Python&amp;apos;s Magic Methods&lt;/strong&gt;&lt;/a&gt;- what are magic methods? They&amp;apos;re everything in object-oriented Python.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://github.com/satwikkansal/wtfpython"&gt;      &lt;strong&gt;wtfpython&lt;/strong&gt;&lt;/a&gt;- a collection of surprising Python snippets and lesser-known features.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://github.com/twhite96/js-dev-reads"&gt;      &lt;strong&gt;js-dev-reads&lt;/strong&gt;&lt;/a&gt;- a list of books and articles for the discerning web developer to read.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://github.com/RomuloOliveira/commit-messages-guide"&gt;      &lt;strong&gt;Commit messages guide&lt;/strong&gt;&lt;/a&gt;- a guide to understand the importance of commit messages.    &lt;br /&gt;&lt;/p&gt;  &lt;h5&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#black_small_square-securitypentesting"&gt;&lt;/a&gt;▪️ Security/Pentesting&lt;/h5&gt;  &lt;p&gt;  :small_orange_diamond:    &lt;a href="https://github.com/qazbnm456/awesome-web-security"&gt;      &lt;strong&gt;Awesome Web Security&lt;/strong&gt;&lt;/a&gt;- a curated list of Web Security materials and resources.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://github.com/joe-shenouda/awesome-cyber-skills"&gt;      &lt;strong&gt;awesome-cyber-skills&lt;/strong&gt;&lt;/a&gt;- a curated list of hacking environments where you can train your cyber skills.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://github.com/devsecops/awesome-devsecops"&gt;      &lt;strong&gt;awesome-devsecops&lt;/strong&gt;&lt;/a&gt;- an authoritative list of awesome devsecops tools.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://github.com/jivoi/awesome-osint"&gt;      &lt;strong&gt;awesome-osint&lt;/strong&gt;&lt;/a&gt;- is a curated list of amazingly awesome OSINT.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://github.com/HolyBugx/HolyTips"&gt;      &lt;strong&gt;HolyTips&lt;/strong&gt;&lt;/a&gt;- tips and tutorials on Bug Bounty Hunting and Web App Security.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://github.com/hslatman/awesome-threat-intelligence"&gt;      &lt;strong&gt;awesome-threat-intelligence&lt;/strong&gt;&lt;/a&gt;- a curated list of Awesome Threat Intelligence resources.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://github.com/infosecn1nja/Red-Teaming-Toolkit"&gt;      &lt;strong&gt;Red-Teaming-Toolkit&lt;/strong&gt;&lt;/a&gt;- a collection of open source and commercial tools that aid in red team operations.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://github.com/snoopysecurity/awesome-burp-extensions"&gt;      &lt;strong&gt;awesome-burp-extensions&lt;/strong&gt;&lt;/a&gt;- a curated list of amazingly awesome Burp Extensions.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://github.com/Hack-with-Github/Free-Security-eBooks"&gt;      &lt;strong&gt;Free Security eBooks&lt;/strong&gt;&lt;/a&gt;- list of a Free Security and Hacking eBooks.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://github.com/yeahhub/Hacking-Security-Ebooks"&gt;      &lt;strong&gt;Hacking-Security-Ebooks&lt;/strong&gt;&lt;/a&gt;- top 100 Hacking &amp;amp; Security E-Books.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://github.com/nikitavoloboev/privacy-respecting"&gt;      &lt;strong&gt;privacy-respecting&lt;/strong&gt;&lt;/a&gt;- curated list of privacy respecting services and software.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://github.com/wtsxDev/reverse-engineering"&gt;      &lt;strong&gt;reverse-engineering&lt;/strong&gt;&lt;/a&gt;- list of awesome reverse engineering resources.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://github.com/michalmalik/linux-re-101"&gt;      &lt;strong&gt;linux-re-101&lt;/strong&gt;&lt;/a&gt;- a collection of resources for linux reverse engineering.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://github.com/onethawt/reverseengineering-reading-list"&gt;      &lt;strong&gt;reverseengineering-reading-list&lt;/strong&gt;&lt;/a&gt;- a list of Reverse Engineering articles, books, and papers.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://github.com/0xInfection/Awesome-WAF"&gt;      &lt;strong&gt;Awesome-WAF&lt;/strong&gt;&lt;/a&gt;- a curated list of awesome web-app firewall (WAF) stuff.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://github.com/jakejarvis/awesome-shodan-queries"&gt;      &lt;strong&gt;awesome-shodan-queries&lt;/strong&gt;&lt;/a&gt;- interesting, funny, and depressing search queries to plug into shodan.io.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://github.com/danielmiessler/RobotsDisallowed"&gt;      &lt;strong&gt;RobotsDisallowed&lt;/strong&gt;&lt;/a&gt;- a curated list of the most common and most interesting robots.txt disallowed directories.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://github.com/Kayzaks/HackingNeuralNetworks"&gt;      &lt;strong&gt;HackingNeuralNetworks&lt;/strong&gt;&lt;/a&gt;- is a small course on exploiting and defending neural networks.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://gist.github.com/joepie91/7e5cad8c0726fd6a5e90360a754fc568"&gt;      &lt;strong&gt;wildcard-certificates&lt;/strong&gt;&lt;/a&gt;- why you probably shouldn&amp;apos;t use a wildcard certificate.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://gist.github.com/joepie91/5a9909939e6ce7d09e29"&gt;      &lt;strong&gt;Don&amp;apos;t use VPN services&lt;/strong&gt;&lt;/a&gt;-  which is what every third-party &amp;quot;VPN provider&amp;quot; does.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://github.com/InQuest/awesome-yara"&gt;      &lt;strong&gt;awesome-yara&lt;/strong&gt;&lt;/a&gt;- a curated list of awesome YARA rules, tools, and people.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://github.com/drduh/macOS-Security-and-Privacy-Guide"&gt;      &lt;strong&gt;macOS-Security-and-Privacy-Guide&lt;/strong&gt;&lt;/a&gt;- guide to securing and improving privacy on macOS.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://github.com/usnistgov/macos_security"&gt;      &lt;strong&gt;macos_security&lt;/strong&gt;&lt;/a&gt;- macOS Security Compliance Project.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://github.com/PaulSec/awesome-sec-talks"&gt;      &lt;strong&gt;awesome-sec-talks&lt;/strong&gt;&lt;/a&gt;- is a collected list of awesome security talks.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://github.com/k4m4/movies-for-hackers"&gt;      &lt;strong&gt;Movies for Hackers&lt;/strong&gt;&lt;/a&gt;- list of movies every hacker &amp;amp; cyberpunk must watch.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://github.com/danieldizzy/Cryptography_1"&gt;      &lt;strong&gt;Cryptography_1&lt;/strong&gt;&lt;/a&gt;- materials used whilst taking Prof. Dan Boneh Stanford Crypto course.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://github.com/ashutosh1206/Crypton"&gt;      &lt;strong&gt;Crypton&lt;/strong&gt;&lt;/a&gt;- library to learn and practice Offensive and Defensive Cryptography.    &lt;br /&gt;&lt;/p&gt;  &lt;h5&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#black_small_square-other-3"&gt;&lt;/a&gt;▪️ Other&lt;/h5&gt;  &lt;p&gt;  :small_orange_diamond:    &lt;a href="https://www.cheatography.com/" rel="nofollow"&gt;      &lt;strong&gt;Cheatography&lt;/strong&gt;&lt;/a&gt;- over 3,000 free cheat sheets, revision aids and quick references.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://github.com/mre/awesome-static-analysis"&gt;      &lt;strong&gt;awesome-static-analysis&lt;/strong&gt;&lt;/a&gt;- static analysis tools for all programming languages.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://github.com/ossu/computer-science"&gt;      &lt;strong&gt;computer-science&lt;/strong&gt;&lt;/a&gt;- path to a free self-taught education in Computer Science.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://github.com/danluu/post-mortems"&gt;      &lt;strong&gt;post-mortems&lt;/strong&gt;&lt;/a&gt;- is a collection of postmortems (config errors, hardware failures, and more).    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://github.com/danistefanovic/build-your-own-x"&gt;      &lt;strong&gt;build-your-own-x&lt;/strong&gt;&lt;/a&gt;- build your own (insert technology here).    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://github.com/rby90/Project-Based-Tutorials-in-C"&gt;      &lt;strong&gt;Project-Based-Tutorials-in-C&lt;/strong&gt;&lt;/a&gt;- is a curated list of project-based tutorials in C.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://github.com/kylelobo/The-Documentation-Compendium"&gt;      &lt;strong&gt;The-Documentation-Compendium&lt;/strong&gt;&lt;/a&gt;- various README templates &amp;amp; tips on writing high-quality documentation.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://github.com/mahmoud/awesome-python-applications"&gt;      &lt;strong&gt;awesome-python-applications&lt;/strong&gt;&lt;/a&gt;- free software that works great, and also happens to be open-source Python.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://github.com/awesomedata/awesome-public-datasets"&gt;      &lt;strong&gt;awesome-public-datasets&lt;/strong&gt;&lt;/a&gt;- a topic-centric list of HQ open datasets.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://github.com/Sahith02/machine-learning-algorithms"&gt;      &lt;strong&gt;machine-learning-algorithms&lt;/strong&gt;&lt;/a&gt;- a curated list of all machine learning algorithms and concepts.    &lt;br /&gt;&lt;/p&gt;  &lt;h4&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#blogspodcastsvideos-toc"&gt;&lt;/a&gt;Blogs/Podcasts/Videos      &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#anger-table-of-contents"&gt;      &lt;sup&gt;[TOC]&lt;/sup&gt;&lt;/a&gt;&lt;/h4&gt;  &lt;h5&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#black_small_square-sysopsdevops-1"&gt;&lt;/a&gt;▪️ SysOps/DevOps&lt;/h5&gt;  &lt;p&gt;  :small_orange_diamond:    &lt;a href="https://www.youtube.com/watch?v=nAFpkV5-vuI" rel="nofollow"&gt;      &lt;strong&gt;Varnish for PHP developers&lt;/strong&gt;&lt;/a&gt;- very interesting presentation of Varnish by Mattias Geniar.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://www.youtube.com/watch?v=CZ3wIuvmHeM" rel="nofollow"&gt;      &lt;strong&gt;A Netflix Guide to Microservices&lt;/strong&gt;&lt;/a&gt;- talks about the chaotic and vibrant world of microservices at Netflix.    &lt;br /&gt;&lt;/p&gt;  &lt;h5&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#black_small_square-developers-1"&gt;&lt;/a&gt;▪️ Developers&lt;/h5&gt;  &lt;p&gt;  :small_orange_diamond:    &lt;a href="https://www.youtube.com/watch?v=yOyaJXpAYZQ" rel="nofollow"&gt;      &lt;strong&gt;Comparing C to machine lang&lt;/strong&gt;&lt;/a&gt;- compare a simple C app with the compiled machine code of that program.    &lt;br /&gt;&lt;/p&gt;  &lt;h5&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#black_small_square-geeky-persons"&gt;&lt;/a&gt;▪️ Geeky Persons&lt;/h5&gt;  &lt;p&gt;  :small_orange_diamond:    &lt;a href="http://www.brendangregg.com/" rel="nofollow"&gt;      &lt;strong&gt;Brendan Gregg&amp;apos;s Blog&lt;/strong&gt;&lt;/a&gt;- is an industry expert in computing performance and cloud computing.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://gynvael.coldwind.pl/" rel="nofollow"&gt;      &lt;strong&gt;Gynvael &amp;quot;GynDream&amp;quot; Coldwind&lt;/strong&gt;&lt;/a&gt;- is a IT security engineer at Google.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="http://lcamtuf.coredump.cx/" rel="nofollow"&gt;      &lt;strong&gt;Michał &amp;quot;lcamtuf&amp;quot; Zalewski&lt;/strong&gt;&lt;/a&gt;- white hat hacker, computer security expert.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://ma.ttias.be/" rel="nofollow"&gt;      &lt;strong&gt;Mattias Geniar&lt;/strong&gt;&lt;/a&gt;- developer, sysadmin, blogger, podcaster and public speaker.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://nickcraver.com/" rel="nofollow"&gt;      &lt;strong&gt;Nick Craver&lt;/strong&gt;&lt;/a&gt;- software developer and systems administrator for Stack Exchange.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://scotthelme.co.uk/" rel="nofollow"&gt;      &lt;strong&gt;Scott Helme&lt;/strong&gt;&lt;/a&gt;- security researcher, speaker and founder of securityheaders.com and report-uri.com.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://krebsonsecurity.com/" rel="nofollow"&gt;      &lt;strong&gt;Brian Krebs&lt;/strong&gt;&lt;/a&gt;- The Washington Post and now an Independent investigative journalist.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://www.schneier.com/" rel="nofollow"&gt;      &lt;strong&gt;Bruce Schneier&lt;/strong&gt;&lt;/a&gt;- is an internationally renowned security technologist, called a &amp;quot;security guru&amp;quot;.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://chrissymorgan.co.uk/" rel="nofollow"&gt;      &lt;strong&gt;Chrissy Morgan&lt;/strong&gt;&lt;/a&gt;- advocate of practical learning, Chrissy also takes part in bug bounty programs.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://blog.zsec.uk/" rel="nofollow"&gt;      &lt;strong&gt;Andy Gill&lt;/strong&gt;&lt;/a&gt;- is a hacker at heart who works as a senior penetration tester.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://danielmiessler.com/" rel="nofollow"&gt;      &lt;strong&gt;Daniel Miessler&lt;/strong&gt;&lt;/a&gt;- cybersecurity expert and writer.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://samy.pl/" rel="nofollow"&gt;      &lt;strong&gt;Samy Kamkar&lt;/strong&gt;&lt;/a&gt;-  is an American privacy and security researcher, computer hacker.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://www.j4vv4d.com/" rel="nofollow"&gt;      &lt;strong&gt;Javvad Malik&lt;/strong&gt;&lt;/a&gt;- is a security advocate at AlienVault, a blogger event speaker and industry commentator.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://www.grahamcluley.com/" rel="nofollow"&gt;      &lt;strong&gt;Graham Cluley&lt;/strong&gt;&lt;/a&gt;- public speaker and independent computer security analyst.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://security.szurek.pl/" rel="nofollow"&gt;      &lt;strong&gt;Kacper Szurek&lt;/strong&gt;&lt;/a&gt;- detection engineer at ESET.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://www.troyhunt.com/" rel="nofollow"&gt;      &lt;strong&gt;Troy Hunt&lt;/strong&gt;&lt;/a&gt;- web security expert known for public education and outreach on security topics.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://raymii.org/s/index.html" rel="nofollow"&gt;      &lt;strong&gt;raymii.org&lt;/strong&gt;&lt;/a&gt;- sysadmin specializing in building high availability cloud environments.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://robert.penz.name/" rel="nofollow"&gt;      &lt;strong&gt;Robert Penz&lt;/strong&gt;&lt;/a&gt;- IT security expert.    &lt;br /&gt;&lt;/p&gt;  &lt;h5&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#black_small_square-geeky-blogs"&gt;&lt;/a&gt;▪️ Geeky Blogs&lt;/h5&gt;  &lt;p&gt;  :small_orange_diamond:    &lt;a href="https://linux-audit.com/" rel="nofollow"&gt;      &lt;strong&gt;Linux Audit&lt;/strong&gt;&lt;/a&gt;- the Linux security blog about auditing, hardening and compliance by Michael Boelen.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://linuxsecurity.expert/" rel="nofollow"&gt;      &lt;strong&gt;Linux Security Expert&lt;/strong&gt;&lt;/a&gt;- trainings, howtos, checklists, security tools, and more.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="http://www.grymoire.com/" rel="nofollow"&gt;      &lt;strong&gt;The Grymoire&lt;/strong&gt;&lt;/a&gt;- collection of useful incantations for wizards, be you computer wizards, magicians, or whatever.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://www.secjuice.com" rel="nofollow"&gt;      &lt;strong&gt;Secjuice&lt;/strong&gt;&lt;/a&gt;- is the only non-profit, independent and volunteer led publication in the information security space.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://duo.com/decipher" rel="nofollow"&gt;      &lt;strong&gt;Decipher&lt;/strong&gt;&lt;/a&gt;- security news that informs and inspires.    &lt;br /&gt;&lt;/p&gt;  &lt;h5&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#black_small_square-geeky-vendor-blogs"&gt;&lt;/a&gt;▪️ Geeky Vendor Blogs&lt;/h5&gt;  &lt;p&gt;  :small_orange_diamond:    &lt;a href="https://www.tenable.com/podcast" rel="nofollow"&gt;      &lt;strong&gt;Tenable Podcast&lt;/strong&gt;&lt;/a&gt;- conversations and interviews related to Cyber Exposure, and more.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://nakedsecurity.sophos.com/" rel="nofollow"&gt;      &lt;strong&gt;Sophos&lt;/strong&gt;&lt;/a&gt;- threat news room, giving you news, opinion, advice and research on computer security issues.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://www.tripwire.com/state-of-security/" rel="nofollow"&gt;      &lt;strong&gt;Tripwire State of Security&lt;/strong&gt;&lt;/a&gt;- blog featuring the latest news, trends and insights on current security issues.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://blog.malwarebytes.com/" rel="nofollow"&gt;      &lt;strong&gt;Malwarebytes Labs Blog&lt;/strong&gt;&lt;/a&gt;- security blog aims to provide insider news about cybersecurity.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://www.trustedsec.com/category/articles/" rel="nofollow"&gt;      &lt;strong&gt;TrustedSec&lt;/strong&gt;&lt;/a&gt;- latest news, and trends about cybersecurity.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://portswigger.net/blog" rel="nofollow"&gt;      &lt;strong&gt;PortSwigger Web Security Blog&lt;/strong&gt;&lt;/a&gt;- about web app security vulns and top tips from our team of web security.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://www.alienvault.com/blogs" rel="nofollow"&gt;      &lt;strong&gt;AT&amp;amp;T Cybersecurity blog&lt;/strong&gt;&lt;/a&gt;- news on emerging threats and practical advice to simplify threat detection.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://thycotic.com/company/blog/" rel="nofollow"&gt;      &lt;strong&gt;Thycotic&lt;/strong&gt;&lt;/a&gt;- where CISOs and IT Admins come to learn about industry trends, IT security, and more.    &lt;br /&gt;&lt;/p&gt;  &lt;h5&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#black_small_square-geeky-cybersecurity-podcasts"&gt;&lt;/a&gt;▪️ Geeky Cybersecurity Podcasts&lt;/h5&gt;  &lt;p&gt;  :small_orange_diamond:    &lt;a href="https://risky.biz/netcasts/risky-business/" rel="nofollow"&gt;      &lt;strong&gt;Risky Business&lt;/strong&gt;&lt;/a&gt;- is a weekly information security podcast featuring news and in-depth interviews.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://www.vice.com/en_us/topic/cyber" rel="nofollow"&gt;      &lt;strong&gt;Cyber, by Motherboard&lt;/strong&gt;&lt;/a&gt;- stories, and focus on the ideas  about cybersecurity.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://www.tenable.com/podcast" rel="nofollow"&gt;      &lt;strong&gt;Tenable Podcast&lt;/strong&gt;&lt;/a&gt;- conversations and interviews related to Cyber Exposure, and more.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://podcasts.apple.com/gb/podcast/cybercrime-investigations/id1428801405" rel="nofollow"&gt;      &lt;strong&gt;Cybercrime Investigations&lt;/strong&gt;&lt;/a&gt;- podcast by Geoff White about cybercrimes.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://themanyhats.club/tag/episodes/" rel="nofollow"&gt;      &lt;strong&gt;The many hats club&lt;/strong&gt;&lt;/a&gt;- featuring stories from a wide range of Infosec people (Whitehat, Greyhat and Blackhat).    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://darknetdiaries.com/" rel="nofollow"&gt;      &lt;strong&gt;Darknet Diaries&lt;/strong&gt;&lt;/a&gt;- true stories from the dark side of the Internet.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://www.youtube.com/playlist?list=PL423I_gHbWUXah3dmt_q_XNp0NlGAKjis" rel="nofollow"&gt;      &lt;strong&gt;OSINTCurious Webcasts&lt;/strong&gt;&lt;/a&gt;- is the investigative curiosity that helps people be successful in OSINT.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://www.youtube.com/user/SecurityWeeklyTV" rel="nofollow"&gt;      &lt;strong&gt;Security Weekly&lt;/strong&gt;&lt;/a&gt;- the latest information security and hacking news.    &lt;br /&gt;&lt;/p&gt;  &lt;h5&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#black_small_square-geeky-cybersecurity-video-blogs"&gt;&lt;/a&gt;▪️ Geeky Cybersecurity Video Blogs&lt;/h5&gt;  &lt;p&gt;  :small_orange_diamond:    &lt;a href="https://www.youtube.com/channel/UCzvJStjySZVvOBsPl-Vgj0g" rel="nofollow"&gt;      &lt;strong&gt;rev3rse security&lt;/strong&gt;&lt;/a&gt;- offensive, binary exploitation, web app security, hardening, red team, blue team.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://www.youtube.com/channel/UClcE-kVhqyiHCcjYwcpfj9w" rel="nofollow"&gt;      &lt;strong&gt;LiveOverflow&lt;/strong&gt;&lt;/a&gt;- a lot more advanced topics than what is typically offered in paid online courses - but for free.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://www.youtube.com/infoseccynic" rel="nofollow"&gt;      &lt;strong&gt;J4vv4D&lt;/strong&gt;&lt;/a&gt;- the important information regarding our internet security.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://cybertalks.co.uk/" rel="nofollow"&gt;      &lt;strong&gt;CyberTalks&lt;/strong&gt;&lt;/a&gt;- talks, interviews, and article about cybersecurity.    &lt;br /&gt;&lt;/p&gt;  &lt;h5&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#black_small_square-best-personal-twitter-accounts"&gt;&lt;/a&gt;▪️ Best Personal Twitter Accounts&lt;/h5&gt;  &lt;p&gt;  :small_orange_diamond:    &lt;a href="https://twitter.com/blackroomsec" rel="nofollow"&gt;      &lt;strong&gt;@blackroomsec&lt;/strong&gt;&lt;/a&gt;- a white-hat hacker/pentester. Intergalactic Minesweeper Champion 1990.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://twitter.com/MarcoCiappelli" rel="nofollow"&gt;      &lt;strong&gt;@MarcoCiappelli&lt;/strong&gt;&lt;/a&gt;- Co-Founder @ITSPmagazine, at the intersection of IT security and society.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://twitter.com/binitamshah" rel="nofollow"&gt;      &lt;strong&gt;@binitamshah&lt;/strong&gt;&lt;/a&gt;- Linux Evangelist. Malwares. Kernel Dev. Security Enthusiast.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://twitter.com/joe_carson" rel="nofollow"&gt;      &lt;strong&gt;@joe_carson&lt;/strong&gt;&lt;/a&gt;- an InfoSec Professional and Tech Geek.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://twitter.com/mikko" rel="nofollow"&gt;      &lt;strong&gt;@mikko&lt;/strong&gt;&lt;/a&gt;- CRO at F-Secure, Reverse Engineer, TED Speaker, Supervillain.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://twitter.com/esrtweet" rel="nofollow"&gt;      &lt;strong&gt;@esrtweet&lt;/strong&gt;&lt;/a&gt;- often referred to as ESR, is an American software developer, and open-source software advocate.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://twitter.com/gynvael" rel="nofollow"&gt;      &lt;strong&gt;@gynvael&lt;/strong&gt;&lt;/a&gt;- security researcher/programmer, @DragonSectorCTF founder/player, technical streamer.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://twitter.com/x0rz" rel="nofollow"&gt;      &lt;strong&gt;@x0rz&lt;/strong&gt;&lt;/a&gt;- Security Researcher &amp;amp; Cyber Observer.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://twitter.com/hasherezade" rel="nofollow"&gt;      &lt;strong&gt;@hasherezade&lt;/strong&gt;&lt;/a&gt;- programmer, malware analyst. Author of PEbear, PEsieve, libPeConv.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://twitter.com/TinkerSec" rel="nofollow"&gt;      &lt;strong&gt;@TinkerSec&lt;/strong&gt;&lt;/a&gt;- tinkerer, cypherpunk, hacker.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://twitter.com/alisaesage" rel="nofollow"&gt;      &lt;strong&gt;@alisaesage&lt;/strong&gt;&lt;/a&gt;- independent hacker and researcher.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://twitter.com/SwiftOnSecurity" rel="nofollow"&gt;      &lt;strong&gt;@SwiftOnSecurity&lt;/strong&gt;&lt;/a&gt;- systems security, industrial safety, sysadmin, author of decentsecurity.com.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://twitter.com/dakami" rel="nofollow"&gt;      &lt;strong&gt;@dakami&lt;/strong&gt;&lt;/a&gt;- is one of just seven people with the authority to restore the DNS root keys.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://twitter.com/samykamkar" rel="nofollow"&gt;      &lt;strong&gt;@samykamkar&lt;/strong&gt;&lt;/a&gt;- is a famous &amp;quot;grey hat&amp;quot; hacker, security researcher, creator of the MySpace &amp;quot;Samy&amp;quot; worm.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://twitter.com/securityweekly" rel="nofollow"&gt;      &lt;strong&gt;@securityweekly&lt;/strong&gt;&lt;/a&gt;- founder &amp;amp; CTO of Security Weekly podcast network.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://twitter.com/jack_daniel" rel="nofollow"&gt;      &lt;strong&gt;@jack_daniel&lt;/strong&gt;&lt;/a&gt;- @SecurityBSides co-founder.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://twitter.com/thegrugq" rel="nofollow"&gt;      &lt;strong&gt;@thegrugq&lt;/strong&gt;&lt;/a&gt;- Security Researcher.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://twitter.com/matthew_d_green" rel="nofollow"&gt;      &lt;strong&gt;@matthew_d_green&lt;/strong&gt;&lt;/a&gt;- a cryptographer and professor at Johns Hopkins University.    &lt;br /&gt;&lt;/p&gt;  &lt;h5&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#black_small_square-best-commercial-twitter-accounts"&gt;&lt;/a&gt;▪️ Best Commercial Twitter Accounts&lt;/h5&gt;  &lt;p&gt;  :small_orange_diamond:    &lt;a href="https://twitter.com/haveibeenpwned" rel="nofollow"&gt;      &lt;strong&gt;@haveibeenpwned&lt;/strong&gt;&lt;/a&gt;- check if you have an account that has been compromised in a data breach.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://twitter.com/bugcrowd" rel="nofollow"&gt;      &lt;strong&gt;@bugcrowd&lt;/strong&gt;&lt;/a&gt;- trusted by more of the Fortune 500 than any other crowdsourced security platform.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://twitter.com/Malwarebytes" rel="nofollow"&gt;      &lt;strong&gt;@Malwarebytes&lt;/strong&gt;&lt;/a&gt;- most trusted security company. Unmatched threat visibility.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://twitter.com/sansforensics" rel="nofollow"&gt;      &lt;strong&gt;@sansforensics&lt;/strong&gt;&lt;/a&gt;- the world&amp;apos;s leading Digital Forensics and Incident Response provider.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://twitter.com/attcyber" rel="nofollow"&gt;      &lt;strong&gt;@attcyber&lt;/strong&gt;&lt;/a&gt;- AT&amp;amp;T Cybersecurity’s Edge-to-Edge technologies provide threat intelligence, and more.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://twitter.com/TheManyHatsClub" rel="nofollow"&gt;      &lt;strong&gt;@TheManyHatsClub&lt;/strong&gt;&lt;/a&gt;- an information security focused podcast and group of individuals from all walks of life.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://twitter.com/hedgehogsec" rel="nofollow"&gt;      &lt;strong&gt;@hedgehogsec&lt;/strong&gt;&lt;/a&gt;- Hedgehog Cyber. Gibraltar and Manchester&amp;apos;s top boutique information security firm.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://twitter.com/NCSC" rel="nofollow"&gt;      &lt;strong&gt;@NCSC&lt;/strong&gt;&lt;/a&gt;- the National Cyber Security Centre. Helping to make the UK the safest place to live and work online.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://twitter.com/Synacktiv" rel="nofollow"&gt;      &lt;strong&gt;@Synacktiv&lt;/strong&gt;&lt;/a&gt;- IT security experts.    &lt;br /&gt;&lt;/p&gt;  &lt;h5&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#black_small_square-a-piece-of-history"&gt;&lt;/a&gt;▪️ A piece of history&lt;/h5&gt;  &lt;p&gt;  :small_orange_diamond:    &lt;a href="http://web.archive.org/web/20190221103734/https://ftp.arl.army.mil/~mike/howto/" rel="nofollow"&gt;      &lt;strong&gt;How to Do Things at ARL&lt;/strong&gt;&lt;/a&gt;- how to configure modems, scan images, record CD-ROMs, and other.    &lt;strong&gt;*&lt;/strong&gt;    &lt;br /&gt;&lt;/p&gt;  &lt;h5&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#black_small_square-other-4"&gt;&lt;/a&gt;▪️ Other&lt;/h5&gt;  &lt;p&gt;  :small_orange_diamond:    &lt;a href="https://www.youtube.com/watch?v=3QnD2c4Xovk" rel="nofollow"&gt;      &lt;strong&gt;Diffie-Hellman Key Exchange (short version)&lt;/strong&gt;&lt;/a&gt;- how Diffie-Hellman Key Exchange worked.    &lt;br /&gt;&lt;/p&gt;  &lt;h4&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#hackingpenetration-testing-toc"&gt;&lt;/a&gt;Hacking/Penetration Testing      &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#anger-table-of-contents"&gt;      &lt;sup&gt;[TOC]&lt;/sup&gt;&lt;/a&gt;&lt;/h4&gt;  &lt;h5&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#black_small_square-pentesters-arsenal-tools"&gt;&lt;/a&gt;▪️ Pentesters arsenal tools&lt;/h5&gt;  &lt;p&gt;  :small_orange_diamond:    &lt;a href="http://www.syhunt.com/sandcat/" rel="nofollow"&gt;      &lt;strong&gt;Sandcat Browser&lt;/strong&gt;&lt;/a&gt;- a penetration-oriented browser with plenty of advanced functionality already built in.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://www.metasploit.com/" rel="nofollow"&gt;      &lt;strong&gt;Metasploit&lt;/strong&gt;&lt;/a&gt;- tool and framework for pentesting system, web and many more, contains a lot a ready to use exploit.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://portswigger.net/burp" rel="nofollow"&gt;      &lt;strong&gt;Burp Suite&lt;/strong&gt;&lt;/a&gt;- tool for testing web app security, intercepting proxy to replay, inject, scan and fuzz.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://www.owasp.org/index.php/OWASP_Zed_Attack_Proxy_Project" rel="nofollow"&gt;      &lt;strong&gt;OWASP Zed Attack Proxy&lt;/strong&gt;&lt;/a&gt;- intercepting proxy to replay, inject, scan and fuzz HTTP requests.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="http://w3af.org/" rel="nofollow"&gt;      &lt;strong&gt;w3af&lt;/strong&gt;&lt;/a&gt;- is a Web Application Attack and Audit Framework.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://mitmproxy.org/" rel="nofollow"&gt;      &lt;strong&gt;mitmproxy&lt;/strong&gt;&lt;/a&gt;- an interactive TLS-capable intercepting HTTP proxy for penetration testers.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://cirt.net/Nikto2" rel="nofollow"&gt;      &lt;strong&gt;Nikto2&lt;/strong&gt;&lt;/a&gt;- web server scanner which performs comprehensive tests against web servers for multiple items.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="http://sqlmap.org/" rel="nofollow"&gt;      &lt;strong&gt;sqlmap&lt;/strong&gt;&lt;/a&gt;- tool that automates the process of detecting and exploiting SQL injection flaws.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://github.com/lanmaster53/recon-ng"&gt;      &lt;strong&gt;Recon-ng&lt;/strong&gt;&lt;/a&gt;- is a full-featured Web Reconnaissance framework written in Python.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://github.com/Tib3rius/AutoRecon"&gt;      &lt;strong&gt;AutoRecon&lt;/strong&gt;&lt;/a&gt;- is a network reconnaissance tool which performs automated enumeration of services.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://www.faradaysec.com/" rel="nofollow"&gt;      &lt;strong&gt;Faraday&lt;/strong&gt;&lt;/a&gt;- an Integrated Multiuser Pentest Environment.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://github.com/s0md3v/Photon"&gt;      &lt;strong&gt;Photon&lt;/strong&gt;&lt;/a&gt;- incredibly fast crawler designed for OSINT.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://github.com/s0md3v/XSStrike"&gt;      &lt;strong&gt;XSStrike&lt;/strong&gt;&lt;/a&gt;- most advanced XSS detection suite.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://github.com/1N3/Sn1per"&gt;      &lt;strong&gt;Sn1per&lt;/strong&gt;&lt;/a&gt;- automated pentest framework for offensive security experts.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://github.com/future-architect/vuls"&gt;      &lt;strong&gt;vuls&lt;/strong&gt;&lt;/a&gt;- is an agent-less vulnerability scanner for Linux, FreeBSD, and other.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://github.com/google/tsunami-security-scanner"&gt;      &lt;strong&gt;tsunami&lt;/strong&gt;&lt;/a&gt;- is a general purpose network security scanner with an extensible plugin system.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://github.com/michenriksen/aquatone"&gt;      &lt;strong&gt;aquatone&lt;/strong&gt;&lt;/a&gt;- a tool for domain flyovers.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://github.com/GitHackTools/BillCipher"&gt;      &lt;strong&gt;BillCipher&lt;/strong&gt;&lt;/a&gt;- information gathering tool for a website or IP address.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://github.com/Ekultek/WhatWaf"&gt;      &lt;strong&gt;WhatWaf&lt;/strong&gt;&lt;/a&gt;- detect and bypass web application firewalls and protection systems.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://github.com/s0md3v/Corsy"&gt;      &lt;strong&gt;Corsy&lt;/strong&gt;&lt;/a&gt;- CORS misconfiguration scanner.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://github.com/evyatarmeged/Raccoon"&gt;      &lt;strong&gt;Raccoon&lt;/strong&gt;&lt;/a&gt;- is a high performance offensive security tool for reconnaissance and vulnerability scanning.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://github.com/Nekmo/dirhunt"&gt;      &lt;strong&gt;dirhunt&lt;/strong&gt;&lt;/a&gt;- find web directories without bruteforce.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://www.openwall.com/john/" rel="nofollow"&gt;      &lt;strong&gt;John The Ripper&lt;/strong&gt;&lt;/a&gt;- is a fast password cracker, currently available for many flavors of Unix, Windows, and other.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://hashcat.net/hashcat/" rel="nofollow"&gt;      &lt;strong&gt;hashcat&lt;/strong&gt;&lt;/a&gt;- world&amp;apos;s fastest and most advanced password recovery utility.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="http://lcamtuf.coredump.cx/p0f3/" rel="nofollow"&gt;      &lt;strong&gt;p0f&lt;/strong&gt;&lt;/a&gt;- is a tool to identify the players behind any incidental TCP/IP communications.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://github.com/mozilla/ssh_scan"&gt;      &lt;strong&gt;ssh_scan&lt;/strong&gt;&lt;/a&gt;- a prototype SSH configuration and policy scanner.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://github.com/woj-ciech/LeakLooker"&gt;      &lt;strong&gt;LeakLooker&lt;/strong&gt;&lt;/a&gt;- find open databases - powered by Binaryedge.io    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://github.com/offensive-security/exploitdb"&gt;      &lt;strong&gt;exploitdb&lt;/strong&gt;&lt;/a&gt;- searchable archive from The Exploit Database.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://github.com/vulnersCom/getsploit"&gt;      &lt;strong&gt;getsploit&lt;/strong&gt;&lt;/a&gt;- is a command line utility for searching and downloading exploits.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://github.com/zardus/ctf-tools"&gt;      &lt;strong&gt;ctf-tools&lt;/strong&gt;&lt;/a&gt;- some setup scripts for security research tools.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://github.com/Gallopsled/pwntools"&gt;      &lt;strong&gt;pwntools&lt;/strong&gt;&lt;/a&gt;- CTF framework and exploit development library.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://github.com/bl4de/security-tools"&gt;      &lt;strong&gt;security-tools&lt;/strong&gt;&lt;/a&gt;- collection of small security tools created mostly in Python. CTFs, pentests and so on.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://github.com/leonteale/pentestpackage"&gt;      &lt;strong&gt;pentestpackage&lt;/strong&gt;&lt;/a&gt;- is a package of Pentest scripts.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://github.com/dloss/python-pentest-tools"&gt;      &lt;strong&gt;python-pentest-tools&lt;/strong&gt;&lt;/a&gt;- python tools for penetration testers.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://github.com/fuzzdb-project/fuzzdb"&gt;      &lt;strong&gt;fuzzdb&lt;/strong&gt;&lt;/a&gt;- dictionary of attack patterns and primitives for black-box application fault injection.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://github.com/google/AFL"&gt;      &lt;strong&gt;AFL&lt;/strong&gt;&lt;/a&gt;- is a free software fuzzer maintained by Google.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://github.com/AFLplusplus/AFLplusplus"&gt;      &lt;strong&gt;AFL++&lt;/strong&gt;&lt;/a&gt;- is AFL with community patches.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://github.com/google/syzkaller"&gt;      &lt;strong&gt;syzkaller&lt;/strong&gt;&lt;/a&gt;- is an unsupervised, coverage-guided kernel fuzzer.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://github.com/pwndbg/pwndbg"&gt;      &lt;strong&gt;pwndbg&lt;/strong&gt;&lt;/a&gt;- exploit development and reverse engineering with GDB made easy.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://github.com/longld/peda"&gt;      &lt;strong&gt;GDB PEDA&lt;/strong&gt;&lt;/a&gt;- Python Exploit Development Assistance for GDB.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://www.hex-rays.com/products/ida/index.shtml" rel="nofollow"&gt;      &lt;strong&gt;IDA&lt;/strong&gt;&lt;/a&gt;- multi-processor disassembler and debugger useful for reverse engineering malware.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://github.com/radare/radare2"&gt;      &lt;strong&gt;radare2&lt;/strong&gt;&lt;/a&gt;- framework for reverse-engineering and analyzing binaries.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://github.com/threat9/routersploit"&gt;      &lt;strong&gt;routersploit&lt;/strong&gt;&lt;/a&gt;- exploitation framework for embedded devices.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://github.com/NationalSecurityAgency/ghidra"&gt;      &lt;strong&gt;Ghidra&lt;/strong&gt;&lt;/a&gt;- is a software reverse engineering (SRE) framework.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://cutter.re/" rel="nofollow"&gt;      &lt;strong&gt;Cutter&lt;/strong&gt;&lt;/a&gt;- is an SRE platform integrating Ghidra&amp;apos;s decompiler.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://github.com/salesforce/vulnreport"&gt;      &lt;strong&gt;Vulnreport&lt;/strong&gt;&lt;/a&gt;- open-source pentesting management and automation platform by Salesforce Product Security.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://github.com/sc0tfree/mentalist"&gt;      &lt;strong&gt;Mentalist&lt;/strong&gt;&lt;/a&gt;- is a graphical tool for custom wordlist generation.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://github.com/archerysec/archerysec"&gt;      &lt;strong&gt;archerysec&lt;/strong&gt;&lt;/a&gt;- vulnerability assessment and management helps to perform scans and manage vulnerabilities.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://github.com/j3ssie/Osmedeus"&gt;      &lt;strong&gt;Osmedeus&lt;/strong&gt;&lt;/a&gt;- fully automated offensive security tool for reconnaissance and vulnerability scanning.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://github.com/beefproject/beef"&gt;      &lt;strong&gt;beef&lt;/strong&gt;&lt;/a&gt;- the browser exploitation framework project.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://github.com/NullArray/AutoSploit"&gt;      &lt;strong&gt;AutoSploit&lt;/strong&gt;&lt;/a&gt;- automated mass exploiter.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://github.com/TH3xACE/SUDO_KILLER"&gt;      &lt;strong&gt;SUDO_KILLER&lt;/strong&gt;&lt;/a&gt;- is a tool to identify and exploit sudo rules&amp;apos; misconfigurations and vulnerabilities.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://github.com/VirusTotal/yara"&gt;      &lt;strong&gt;yara&lt;/strong&gt;&lt;/a&gt;- the pattern matching swiss knife.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://github.com/gentilkiwi/mimikatz"&gt;      &lt;strong&gt;mimikatz&lt;/strong&gt;&lt;/a&gt;- a little tool to play with Windows security.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://github.com/sherlock-project/sherlock"&gt;      &lt;strong&gt;sherlock&lt;/strong&gt;&lt;/a&gt;- hunt down social media accounts by username across social networks.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://owasp.org/www-project-threat-dragon/" rel="nofollow"&gt;      &lt;strong&gt;OWASP Threat Dragon&lt;/strong&gt;&lt;/a&gt;- is a tool used to create threat model diagrams and to record possible threats.    &lt;br /&gt;&lt;/p&gt;  &lt;h5&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#black_small_square-pentests-bookmarks-collection"&gt;&lt;/a&gt;▪️ Pentests bookmarks collection&lt;/h5&gt;  &lt;p&gt;  :small_orange_diamond:    &lt;a href="http://www.pentest-standard.org/index.php/Main_Page" rel="nofollow"&gt;      &lt;strong&gt;PTES&lt;/strong&gt;&lt;/a&gt;- the penetration testing execution standard.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://www.amanhardikar.com/mindmaps/Practice.html" rel="nofollow"&gt;      &lt;strong&gt;Pentests MindMap&lt;/strong&gt;&lt;/a&gt;- amazing mind map with vulnerable apps and systems.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://www.amanhardikar.com/mindmaps/webapptest.html" rel="nofollow"&gt;      &lt;strong&gt;WebApps Security Tests MindMap&lt;/strong&gt;&lt;/a&gt;- incredible mind map for WebApps security tests.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://brutelogic.com.br/blog/" rel="nofollow"&gt;      &lt;strong&gt;Brute XSS&lt;/strong&gt;&lt;/a&gt;- master the art of Cross Site Scripting.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://portswigger.net/web-security/cross-site-scripting/cheat-sheet" rel="nofollow"&gt;      &lt;strong&gt;XSS cheat sheet&lt;/strong&gt;&lt;/a&gt;- contains many vectors that can help you bypass WAFs and filters.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://jivoi.github.io/2015/07/03/offensive-security-bookmarks/" rel="nofollow"&gt;      &lt;strong&gt;Offensive Security Bookmarks&lt;/strong&gt;&lt;/a&gt;- security bookmarks collection, all things that author need to pass OSCP.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://github.com/coreb1t/awesome-pentest-cheat-sheets"&gt;      &lt;strong&gt;Awesome Pentest Cheat Sheets&lt;/strong&gt;&lt;/a&gt;- collection of the cheat sheets useful for pentesting.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://github.com/Hack-with-Github/Awesome-Hacking"&gt;      &lt;strong&gt;Awesome Hacking by HackWithGithub&lt;/strong&gt;&lt;/a&gt;- awesome lists for hackers, pentesters and security researchers.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://github.com/carpedm20/awesome-hacking"&gt;      &lt;strong&gt;Awesome Hacking by carpedm20&lt;/strong&gt;&lt;/a&gt;- a curated list of awesome hacking tutorials, tools and resources.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://github.com/vitalysim/Awesome-Hacking-Resources"&gt;      &lt;strong&gt;Awesome Hacking Resources&lt;/strong&gt;&lt;/a&gt;- collection of hacking/penetration testing resources to make you better.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://github.com/enaqx/awesome-pentest"&gt;      &lt;strong&gt;Awesome Pentest&lt;/strong&gt;&lt;/a&gt;- collection of awesome penetration testing resources, tools and other shiny things.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://github.com/m4ll0k/Awesome-Hacking-Tools"&gt;      &lt;strong&gt;Awesome-Hacking-Tools&lt;/strong&gt;&lt;/a&gt;- is a curated list of awesome Hacking Tools.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://github.com/ksanchezcld/Hacking_Cheat_Sheet"&gt;      &lt;strong&gt;Hacking Cheat Sheet&lt;/strong&gt;&lt;/a&gt;- author hacking and pentesting notes.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://github.com/toolswatch/blackhat-arsenal-tools"&gt;      &lt;strong&gt;blackhat-arsenal-tools&lt;/strong&gt;&lt;/a&gt;- official Black Hat arsenal security tools repository.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://www.peerlyst.com/posts/the-complete-list-of-infosec-related-cheat-sheets-claus-cramon" rel="nofollow"&gt;      &lt;strong&gt;Penetration Testing and WebApp Cheat Sheets&lt;/strong&gt;&lt;/a&gt;- the complete list of Infosec related cheat sheets.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://github.com/The-Art-of-Hacking/h4cker"&gt;      &lt;strong&gt;Cyber Security Resources&lt;/strong&gt;&lt;/a&gt;- includes thousands of cybersecurity-related references and resources.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://github.com/jhaddix/pentest-bookmarks"&gt;      &lt;strong&gt;Pentest Bookmarks&lt;/strong&gt;&lt;/a&gt;- there are a LOT of pentesting blogs.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://github.com/OlivierLaflamme/Cheatsheet-God"&gt;      &lt;strong&gt;Cheatsheet-God&lt;/strong&gt;&lt;/a&gt;- Penetration Testing Reference Bank - OSCP/PTP &amp;amp; PTX Cheatsheet.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://github.com/Cyb3rWard0g/ThreatHunter-Playbook"&gt;      &lt;strong&gt;ThreatHunter-Playbook&lt;/strong&gt;&lt;/a&gt;- to aid the development of techniques and hypothesis for hunting campaigns.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://github.com/hmaverickadams/Beginner-Network-Pentesting"&gt;      &lt;strong&gt;Beginner-Network-Pentesting&lt;/strong&gt;&lt;/a&gt;- notes for beginner network pentesting course.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://github.com/rewardone/OSCPRepo"&gt;      &lt;strong&gt;OSCPRepo&lt;/strong&gt;&lt;/a&gt;- is a list of resources that author have been gathering in preparation for the OSCP.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://github.com/swisskyrepo/PayloadsAllTheThings"&gt;      &lt;strong&gt;PayloadsAllTheThings&lt;/strong&gt;&lt;/a&gt;- a list of useful payloads and bypass for Web Application Security and Pentest/CTF.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://github.com/foospidy/payloads"&gt;      &lt;strong&gt;payloads&lt;/strong&gt;&lt;/a&gt;- git all the Payloads! A collection of web attack payloads.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://github.com/payloadbox/command-injection-payload-list"&gt;      &lt;strong&gt;command-injection-payload-list&lt;/strong&gt;&lt;/a&gt;- command injection payload list.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://github.com/jakejarvis/awesome-shodan-queries"&gt;      &lt;strong&gt;Awesome Shodan Search Queries&lt;/strong&gt;&lt;/a&gt;- great search queries to plug into Shodan.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://github.com/s0md3v/AwesomeXSS"&gt;      &lt;strong&gt;AwesomeXSS&lt;/strong&gt;&lt;/a&gt;- is a collection of Awesome XSS resources.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://github.com/JohnTroony/php-webshells"&gt;      &lt;strong&gt;php-webshells&lt;/strong&gt;&lt;/a&gt;- common php webshells.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://highon.coffee/blog/penetration-testing-tools-cheat-sheet/" rel="nofollow"&gt;      &lt;strong&gt;Pentesting Tools Cheat Sheet&lt;/strong&gt;&lt;/a&gt;- a quick reference high level overview for typical penetration testing.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://cheatsheetseries.owasp.org/" rel="nofollow"&gt;      &lt;strong&gt;OWASP Cheat Sheet Series&lt;/strong&gt;&lt;/a&gt;- is a collection of high value information on specific application security topics.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://jeremylong.github.io/DependencyCheck/index.html" rel="nofollow"&gt;      &lt;strong&gt;OWASP dependency-check&lt;/strong&gt;&lt;/a&gt;- is an open source solution the OWASP Top 10 2013 entry.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://www.owasp.org/index.php/OWASP_Proactive_Controls" rel="nofollow"&gt;      &lt;strong&gt;OWASP ProActive Controls&lt;/strong&gt;&lt;/a&gt;- OWASP Top 10 Proactive Controls 2018.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://github.com/blaCCkHatHacEEkr/PENTESTING-BIBLE"&gt;      &lt;strong&gt;PENTESTING-BIBLE&lt;/strong&gt;&lt;/a&gt;- hacking &amp;amp; penetration testing &amp;amp; red team &amp;amp; cyber security resources.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://github.com/nixawk/pentest-wiki"&gt;      &lt;strong&gt;pentest-wiki&lt;/strong&gt;&lt;/a&gt;- is a free online security knowledge library for pentesters/researchers.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://media.defcon.org/" rel="nofollow"&gt;      &lt;strong&gt;DEF CON Media Server&lt;/strong&gt;&lt;/a&gt;- great stuff from DEFCON.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://github.com/rshipp/awesome-malware-analysis"&gt;      &lt;strong&gt;Awesome Malware Analysis&lt;/strong&gt;&lt;/a&gt;- a curated list of awesome malware analysis tools and resources.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://www.netsparker.com/blog/web-security/sql-injection-cheat-sheet/" rel="nofollow"&gt;      &lt;strong&gt;SQL Injection Cheat Sheet&lt;/strong&gt;&lt;/a&gt;- detailed technical stuff about the many different variants of the SQL Injection.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="http://kb.entersoft.co.in/" rel="nofollow"&gt;      &lt;strong&gt;Entersoft Knowledge Base&lt;/strong&gt;&lt;/a&gt;- great and detailed reference about vulnerabilities.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="http://html5sec.org/" rel="nofollow"&gt;      &lt;strong&gt;HTML5 Security Cheatsheet&lt;/strong&gt;&lt;/a&gt;- a collection of HTML5 related XSS attack vectors.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="http://evuln.com/tools/xss-encoder/" rel="nofollow"&gt;      &lt;strong&gt;XSS String Encoder&lt;/strong&gt;&lt;/a&gt;- for generating XSS code to check your input validation filters against XSS.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://gtfobins.github.io/" rel="nofollow"&gt;      &lt;strong&gt;GTFOBins&lt;/strong&gt;&lt;/a&gt;- list of Unix binaries that can be exploited by an attacker to bypass local security restrictions.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://guif.re/" rel="nofollow"&gt;      &lt;strong&gt;Guifre Ruiz Notes&lt;/strong&gt;&lt;/a&gt;- collection of security, system, network and pentest cheatsheets.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="http://blog.safebuff.com/2016/07/03/SSRF-Tips/index.html" rel="nofollow"&gt;      &lt;strong&gt;SSRF Tips&lt;/strong&gt;&lt;/a&gt;- a collection of SSRF Tips.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="http://shell-storm.org/repo/CTF/" rel="nofollow"&gt;      &lt;strong&gt;shell-storm repo CTF&lt;/strong&gt;&lt;/a&gt;- great archive of CTFs.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://github.com/bl4de/ctf"&gt;      &lt;strong&gt;ctf&lt;/strong&gt;&lt;/a&gt;- CTF (Capture The Flag) writeups, code snippets, notes, scripts.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://github.com/orangetw/My-CTF-Web-Challenges"&gt;      &lt;strong&gt;My-CTF-Web-Challenges&lt;/strong&gt;&lt;/a&gt;- collection of CTF Web challenges.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://github.com/OWASP/owasp-mstg"&gt;      &lt;strong&gt;MSTG&lt;/strong&gt;&lt;/a&gt;- The Mobile Security Testing Guide (MSTG) is a comprehensive manual for mobile app security testing.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://github.com/sdcampbell/Internal-Pentest-Playbook"&gt;      &lt;strong&gt;Internal-Pentest-Playbook&lt;/strong&gt;&lt;/a&gt;- notes on the most common things for an Internal Network Penetration Test.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://github.com/streaak/keyhacks"&gt;      &lt;strong&gt;KeyHacks&lt;/strong&gt;&lt;/a&gt;- shows quick ways in which API keys leaked by a bug bounty program can be checked.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://github.com/securitum/research"&gt;      &lt;strong&gt;securitum/research&lt;/strong&gt;&lt;/a&gt;- various Proof of Concepts of security research performed by Securitum.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://github.com/juliocesarfort/public-pentesting-reports"&gt;      &lt;strong&gt;public-pentesting-reports&lt;/strong&gt;&lt;/a&gt;- is a list of public pentest reports released by several consulting security groups.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://github.com/djadmin/awesome-bug-bounty"&gt;      &lt;strong&gt;awesome-bug-bounty&lt;/strong&gt;&lt;/a&gt;- is a comprehensive curated list of available Bug Bounty.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://github.com/ngalongc/bug-bounty-reference"&gt;      &lt;strong&gt;bug-bounty-reference&lt;/strong&gt;&lt;/a&gt;- is a list of bug bounty write-ups.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://github.com/devanshbatham/Awesome-Bugbounty-Writeups"&gt;      &lt;strong&gt;Awesome-Bugbounty-Writeups&lt;/strong&gt;&lt;/a&gt;- is a curated list of bugbounty writeups.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://pentester.land/list-of-bug-bounty-writeups.html" rel="nofollow"&gt;      &lt;strong&gt;Bug bounty writeups&lt;/strong&gt;&lt;/a&gt;- list of bug bounty writeups (2012-2020).    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://hackso.me/" rel="nofollow"&gt;      &lt;strong&gt;hackso.me&lt;/strong&gt;&lt;/a&gt;- a great journey into security.    &lt;br /&gt;&lt;/p&gt;  &lt;h5&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#black_small_square-backdoorsexploits"&gt;&lt;/a&gt;▪️ Backdoors/exploits&lt;/h5&gt;  &lt;p&gt;  :small_orange_diamond:    &lt;a href="https://github.com/bartblaze/PHP-backdoors"&gt;      &lt;strong&gt;PHP-backdoors&lt;/strong&gt;&lt;/a&gt;- a collection of PHP backdoors. For educational or testing purposes only.    &lt;br /&gt;&lt;/p&gt;  &lt;h5&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#black_small_square-wordlists-and-weak-passwords"&gt;&lt;/a&gt;▪️ Wordlists and Weak passwords&lt;/h5&gt;  &lt;p&gt;  :small_orange_diamond:    &lt;a href="https://weakpass.com/" rel="nofollow"&gt;      &lt;strong&gt;Weakpass&lt;/strong&gt;&lt;/a&gt;- for any kind of bruteforce find wordlists or unleash the power of them all at once!    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://hashes.org/" rel="nofollow"&gt;      &lt;strong&gt;Hashes.org&lt;/strong&gt;&lt;/a&gt;- is a free online hash resolving service incorporating many unparalleled techniques.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://github.com/danielmiessler/SecLists"&gt;      &lt;strong&gt;SecLists&lt;/strong&gt;&lt;/a&gt;- collection of multiple types of lists used during security assessments, collected in one place.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://github.com/berzerk0/Probable-Wordlists"&gt;      &lt;strong&gt;Probable-Wordlists&lt;/strong&gt;&lt;/a&gt;- sorted by probability originally created for password generation and testing.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://wiki.skullsecurity.org/index.php?title=Passwords" rel="nofollow"&gt;      &lt;strong&gt;skullsecurity passwords&lt;/strong&gt;&lt;/a&gt;- password dictionaries and leaked passwords repository.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://bezpieka.org/polski-slownik-premium-polish-wordlist" rel="nofollow"&gt;      &lt;strong&gt;Polish PREMIUM Dictionary&lt;/strong&gt;&lt;/a&gt;- official dictionary created by the team on the forum bezpieka.org.    &lt;strong&gt;*&lt;/strong&gt;    &lt;sup&gt;      &lt;a href="https://sourceforge.net/projects/kali-linux/files/Wordlist/" rel="nofollow"&gt;1&lt;/a&gt;&lt;/sup&gt;    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://github.com/insidetrust/statistically-likely-usernames"&gt;      &lt;strong&gt;statistically-likely-usernames&lt;/strong&gt;&lt;/a&gt;- wordlists for creating statistically likely username lists.    &lt;br /&gt;&lt;/p&gt;  &lt;h5&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#black_small_square-bounty-platforms"&gt;&lt;/a&gt;▪️ Bounty platforms&lt;/h5&gt;  &lt;p&gt;  :small_orange_diamond:    &lt;a href="https://www.yeswehack.com/" rel="nofollow"&gt;      &lt;strong&gt;YesWeHack&lt;/strong&gt;&lt;/a&gt;- bug bounty platform with infosec jobs.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://www.openbugbounty.org/" rel="nofollow"&gt;      &lt;strong&gt;Openbugbounty&lt;/strong&gt;&lt;/a&gt;- allows any security researcher reporting a vulnerability on any website.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://www.hackerone.com/" rel="nofollow"&gt;      &lt;strong&gt;hackerone&lt;/strong&gt;&lt;/a&gt;- global hacker community to surface the most relevant security issues.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://www.bugcrowd.com/" rel="nofollow"&gt;      &lt;strong&gt;bugcrowd&lt;/strong&gt;&lt;/a&gt;- crowdsourced cybersecurity for the enterprise.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://crowdshield.com/" rel="nofollow"&gt;      &lt;strong&gt;Crowdshield&lt;/strong&gt;&lt;/a&gt;- crowdsourced security &amp;amp; bug bounty management.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://www.synack.com/" rel="nofollow"&gt;      &lt;strong&gt;Synack&lt;/strong&gt;&lt;/a&gt;- crowdsourced security &amp;amp; bug bounty programs, crowd security intelligence platform, and more.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://hacktrophy.com/en/" rel="nofollow"&gt;      &lt;strong&gt;Hacktrophy&lt;/strong&gt;&lt;/a&gt;- bug bounty platform.    &lt;br /&gt;&lt;/p&gt;  &lt;h5&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#black_small_square-web-training-apps-local-installation"&gt;&lt;/a&gt;▪️ Web Training Apps (local installation)&lt;/h5&gt;  &lt;p&gt;  :small_orange_diamond:    &lt;a href="https://www.owasp.org/index.php/OWASP_Vulnerable_Web_Applications_Directory_Project" rel="nofollow"&gt;      &lt;strong&gt;OWASP-VWAD&lt;/strong&gt;&lt;/a&gt;- comprehensive and well maintained registry of all known vulnerable web applications.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="http://www.dvwa.co.uk/" rel="nofollow"&gt;      &lt;strong&gt;DVWA&lt;/strong&gt;&lt;/a&gt;- PHP/MySQL web application that is damn vulnerable.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://metasploit.help.rapid7.com/docs/metasploitable-2" rel="nofollow"&gt;      &lt;strong&gt;metasploitable2&lt;/strong&gt;&lt;/a&gt;- vulnerable web application amongst security researchers.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://github.com/rapid7/metasploitable3"&gt;      &lt;strong&gt;metasploitable3&lt;/strong&gt;&lt;/a&gt;- is a VM that is built from the ground up with a large amount of security vulnerabilities.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://github.com/stamparm/DSVW"&gt;      &lt;strong&gt;DSVW&lt;/strong&gt;&lt;/a&gt;- is a deliberately vulnerable web application written in under 100 lines of code.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://sourceforge.net/projects/mutillidae/" rel="nofollow"&gt;      &lt;strong&gt;OWASP Mutillidae II&lt;/strong&gt;&lt;/a&gt;- free, open source, deliberately vulnerable web-application.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://www.owasp.org/index.php/OWASP_Juice_Shop_Project" rel="nofollow"&gt;      &lt;strong&gt;OWASP Juice Shop Project&lt;/strong&gt;&lt;/a&gt;- the most bug-free vulnerable application in existence.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://www.owasp.org/index.php/Projects/OWASP_Node_js_Goat_Project" rel="nofollow"&gt;      &lt;strong&gt;OWASP Node js Goat Project&lt;/strong&gt;&lt;/a&gt;- OWASP Top 10 security risks apply to web apps developed using Node.js.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://github.com/iteratec/juicy-ctf"&gt;      &lt;strong&gt;juicy-ctf&lt;/strong&gt;&lt;/a&gt;- run Capture the Flags and Security Trainings with OWASP Juice Shop.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://github.com/OWASP/SecurityShepherd"&gt;      &lt;strong&gt;SecurityShepherd&lt;/strong&gt;&lt;/a&gt;- web and mobile application security training platform.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://github.com/opendns/Security_Ninjas_AppSec_Training"&gt;      &lt;strong&gt;Security Ninjas&lt;/strong&gt;&lt;/a&gt;- open source application security training program.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://github.com/rapid7/hackazon"&gt;      &lt;strong&gt;hackazon&lt;/strong&gt;&lt;/a&gt;- a modern vulnerable web app.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://github.com/appsecco/dvna"&gt;      &lt;strong&gt;dvna&lt;/strong&gt;&lt;/a&gt;- damn vulnerable NodeJS application.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://github.com/DefectDojo/django-DefectDojo"&gt;      &lt;strong&gt;django-DefectDojo&lt;/strong&gt;&lt;/a&gt;- is an open-source application vulnerability correlation and security orchestration tool.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://google-gruyere.appspot.com/" rel="nofollow"&gt;      &lt;strong&gt;Google Gruyere&lt;/strong&gt;&lt;/a&gt;- web application exploits and defenses.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://github.com/amolnaik4/bodhi"&gt;      &lt;strong&gt;Bodhi&lt;/strong&gt;&lt;/a&gt;- is a playground focused on learning the exploitation of client-side web vulnerabilities.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://websploit.h4cker.org/" rel="nofollow"&gt;      &lt;strong&gt;Websploit&lt;/strong&gt;&lt;/a&gt;- single vm lab with the purpose of combining several vulnerable appliations in one environment.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://github.com/vulhub/vulhub"&gt;      &lt;strong&gt;vulhub&lt;/strong&gt;&lt;/a&gt;- pre-built Vulnerable Environments based on docker-compose.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://rhinosecuritylabs.com/aws/introducing-cloudgoat-2/" rel="nofollow"&gt;      &lt;strong&gt;CloudGoat 2&lt;/strong&gt;&lt;/a&gt;- the new &amp;amp; improved &amp;quot;Vulnerable by Design&amp;quot;
AWS deployment tool.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://github.com/globocom/secDevLabs"&gt;      &lt;strong&gt;secDevLabs&lt;/strong&gt;&lt;/a&gt;- is a laboratory for learning secure web development in a practical manner.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://github.com/incredibleindishell/CORS-vulnerable-Lab"&gt;      &lt;strong&gt;CORS-vulnerable-Lab&lt;/strong&gt;&lt;/a&gt;- sample vulnerable code and its exploit code.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://github.com/moloch--/RootTheBox"&gt;      &lt;strong&gt;RootTheBox&lt;/strong&gt;&lt;/a&gt;- a Game of Hackers (CTF Scoreboard &amp;amp; Game Manager).    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://application.security/" rel="nofollow"&gt;      &lt;strong&gt;KONTRA&lt;/strong&gt;&lt;/a&gt;- application security training (OWASP Top Web &amp;amp; Api).    &lt;br /&gt;&lt;/p&gt;  &lt;h5&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#black_small_square-labs-ethical-hacking-platformstrainingsctfs"&gt;&lt;/a&gt;▪️ Labs (ethical hacking platforms/trainings/CTFs)&lt;/h5&gt;  &lt;p&gt;  :small_orange_diamond:    &lt;a href="https://www.offensive-security.com/" rel="nofollow"&gt;      &lt;strong&gt;Offensive Security&lt;/strong&gt;&lt;/a&gt;- true performance-based penetration testing training for over a decade.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://www.hackthebox.eu/" rel="nofollow"&gt;      &lt;strong&gt;Hack The Box&lt;/strong&gt;&lt;/a&gt;- online platform allowing you to test your penetration testing skills.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://www.hacking-lab.com/index.html" rel="nofollow"&gt;      &lt;strong&gt;Hacking-Lab&lt;/strong&gt;&lt;/a&gt;- online ethical hacking, computer network and security challenge platform.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="http://pwnable.kr/index.php" rel="nofollow"&gt;      &lt;strong&gt;pwnable.kr&lt;/strong&gt;&lt;/a&gt;- non-commercial wargame site which provides various pwn challenges.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://pwnable.tw/" rel="nofollow"&gt;      &lt;strong&gt;Pwnable.tw&lt;/strong&gt;&lt;/a&gt;- is a wargame site for hackers to test and expand their binary exploiting skills.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://picoctf.com/" rel="nofollow"&gt;      &lt;strong&gt;picoCTF&lt;/strong&gt;&lt;/a&gt;- is a free computer security game targeted at middle and high school students.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://ctflearn.com/" rel="nofollow"&gt;      &lt;strong&gt;CTFlearn&lt;/strong&gt;&lt;/a&gt;- is an online platform built to help ethical hackers learn and practice their cybersecurity knowledge.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://ctftime.org/" rel="nofollow"&gt;      &lt;strong&gt;ctftime&lt;/strong&gt;&lt;/a&gt;- CTF archive and a place, where you can get some another CTF-related info.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://silesiasecuritylab.com/" rel="nofollow"&gt;      &lt;strong&gt;Silesia Security Lab&lt;/strong&gt;&lt;/a&gt;- high quality security testing services.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://practicalpentestlabs.com/" rel="nofollow"&gt;      &lt;strong&gt;Practical Pentest Labs&lt;/strong&gt;&lt;/a&gt;- pentest lab, take your Hacking skills to the next level.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://www.root-me.org/?lang=en" rel="nofollow"&gt;      &lt;strong&gt;Root Me&lt;/strong&gt;&lt;/a&gt;- the fast, easy, and affordable way to train your hacking skills.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://rozwal.to/login" rel="nofollow"&gt;      &lt;strong&gt;rozwal.to&lt;/strong&gt;&lt;/a&gt;- a great platform to train your pentesting skills.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://tryhackme.com/" rel="nofollow"&gt;      &lt;strong&gt;TryHackMe&lt;/strong&gt;&lt;/a&gt;- learning Cyber Security made easy.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://hackxor.net/" rel="nofollow"&gt;      &lt;strong&gt;hackxor&lt;/strong&gt;&lt;/a&gt;- is a realistic web application hacking game, designed to help players of all abilities develop their skills.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="http://hack-yourself-first.com/" rel="nofollow"&gt;      &lt;strong&gt;Hack Yourself First&lt;/strong&gt;&lt;/a&gt;- it&amp;apos;s full of nasty app sec holes.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="http://overthewire.org/wargames/" rel="nofollow"&gt;      &lt;strong&gt;OverTheWire&lt;/strong&gt;&lt;/a&gt;- can help you to learn and practice security concepts in the form of fun-filled games.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://labs.wizard-security.net/" rel="nofollow"&gt;      &lt;strong&gt;Wizard Labs&lt;/strong&gt;&lt;/a&gt;- is an online Penetration Testing Lab.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://pentesterlab.com/" rel="nofollow"&gt;      &lt;strong&gt;PentesterLab&lt;/strong&gt;&lt;/a&gt;- provides vulnerable systems that can be used to test and understand vulnerabilities.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://ringzer0ctf.com/" rel="nofollow"&gt;      &lt;strong&gt;RingZer0&lt;/strong&gt;&lt;/a&gt;- tons of challenges designed to test and improve your hacking skills.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="http://www.try2hack.nl/" rel="nofollow"&gt;      &lt;strong&gt;try2hack&lt;/strong&gt;&lt;/a&gt;- several security-oriented challenges for your entertainment.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://www.ubeeri.com/preconfig-labs" rel="nofollow"&gt;      &lt;strong&gt;Ubeeri&lt;/strong&gt;&lt;/a&gt;- preconfigured lab environments.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://lab.pentestit.ru/" rel="nofollow"&gt;      &lt;strong&gt;Pentestit&lt;/strong&gt;&lt;/a&gt;- emulate IT infrastructures of real companies for legal pen testing and improving pentest skills.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://microcorruption.com/login" rel="nofollow"&gt;      &lt;strong&gt;Microcorruption&lt;/strong&gt;&lt;/a&gt;- reversal challenges done in the web interface.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://crackmes.one/" rel="nofollow"&gt;      &lt;strong&gt;Crackmes&lt;/strong&gt;&lt;/a&gt;- download crackmes to help improve your reverse engineering skills.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://domgo.at/cxss/intro" rel="nofollow"&gt;      &lt;strong&gt;DomGoat&lt;/strong&gt;&lt;/a&gt;- DOM XSS security learning and practicing platform.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://chall.stypr.com" rel="nofollow"&gt;      &lt;strong&gt;Stereotyped Challenges&lt;/strong&gt;&lt;/a&gt;- upgrade your web hacking techniques today!    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://www.vulnhub.com/" rel="nofollow"&gt;      &lt;strong&gt;Vulnhub&lt;/strong&gt;&lt;/a&gt;- allows anyone to gain practical &amp;apos;hands-on&amp;apos; experience in digital security.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://w3challs.com/" rel="nofollow"&gt;      &lt;strong&gt;W3Challs&lt;/strong&gt;&lt;/a&gt;- is a penetration testing training platform, which offers various computer challenges.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://ringzer0ctf.com/challenges" rel="nofollow"&gt;      &lt;strong&gt;RingZer0 CTF&lt;/strong&gt;&lt;/a&gt;- offers you tons of challenges designed to test and improve your hacking skills.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://hack.me/" rel="nofollow"&gt;      &lt;strong&gt;Hack.me&lt;/strong&gt;&lt;/a&gt;- a platform where you can build, host and share vulnerable web apps for educational purposes.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://www.hackthis.co.uk/levels/" rel="nofollow"&gt;      &lt;strong&gt;HackThis!&lt;/strong&gt;&lt;/a&gt;- discover how hacks, dumps and defacements are performed and secure your website.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://www.enigmagroup.org/#" rel="nofollow"&gt;      &lt;strong&gt;Enigma Group WebApp Training&lt;/strong&gt;&lt;/a&gt;- these challenges cover the exploits listed in the OWASP Top 10 Project.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://challenges.re/" rel="nofollow"&gt;      &lt;strong&gt;Reverse Engineering Challenges&lt;/strong&gt;&lt;/a&gt;- challenges, exercises, problems and tasks - by level, by type, and more.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://0x00sec.org/" rel="nofollow"&gt;      &lt;strong&gt;0x00sec&lt;/strong&gt;&lt;/a&gt;- the home of the Hacker - Malware, Reverse Engineering, and Computer Science.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://www.wechall.net/challs" rel="nofollow"&gt;      &lt;strong&gt;We Chall&lt;/strong&gt;&lt;/a&gt;- there are exist a lots of different challenge types.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://www.hackergateway.com/" rel="nofollow"&gt;      &lt;strong&gt;Hacker Gateway&lt;/strong&gt;&lt;/a&gt;- is the go-to place for hackers who want to test their skills.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://www.hacker101.com/" rel="nofollow"&gt;      &lt;strong&gt;Hacker101&lt;/strong&gt;&lt;/a&gt;- is a free class for web security.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://contained.af/" rel="nofollow"&gt;      &lt;strong&gt;contained.af&lt;/strong&gt;&lt;/a&gt;- a stupid game for learning about containers, capabilities, and syscalls.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="http://flaws.cloud/" rel="nofollow"&gt;      &lt;strong&gt;flAWS challenge!&lt;/strong&gt;&lt;/a&gt;- a series of levels you&amp;apos;ll learn about common mistakes and gotchas when using AWS.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://cybersecurity.wtf" rel="nofollow"&gt;      &lt;strong&gt;CyberSec WTF&lt;/strong&gt;&lt;/a&gt;- provides web hacking challenges derived from bounty write-ups.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://ctfchallenge.co.uk/login" rel="nofollow"&gt;      &lt;strong&gt;CTF Challenge&lt;/strong&gt;&lt;/a&gt;- CTF Web App challenges.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://capturetheflag.withgoogle.com" rel="nofollow"&gt;      &lt;strong&gt;gCTF&lt;/strong&gt;&lt;/a&gt;- most of the challenges used in the Google CTF 2017.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://www.hackthissite.org/pages/index/index.php" rel="nofollow"&gt;      &lt;strong&gt;Hack This Site&lt;/strong&gt;&lt;/a&gt;- is a free, safe and legal training ground for hackers.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://attackdefense.com" rel="nofollow"&gt;      &lt;strong&gt;Attack &amp;amp; Defense&lt;/strong&gt;&lt;/a&gt;- is a browser-based cloud labs.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://cryptohack.org/" rel="nofollow"&gt;      &lt;strong&gt;Cryptohack&lt;/strong&gt;&lt;/a&gt;- a fun platform for learning modern cryptography.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://cryptopals.com/" rel="nofollow"&gt;      &lt;strong&gt;Cryptopals&lt;/strong&gt;&lt;/a&gt;- the cryptopals crypto challenges.    &lt;br /&gt;&lt;/p&gt;  &lt;h5&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#black_small_square-ctf-platforms"&gt;&lt;/a&gt;▪️ CTF platforms&lt;/h5&gt;  &lt;p&gt;  :small_orange_diamond:    &lt;a href="https://github.com/facebook/fbctf"&gt;      &lt;strong&gt;fbctf&lt;/strong&gt;&lt;/a&gt;- platform to host Capture the Flag competitions.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://github.com/google/ctfscoreboard"&gt;      &lt;strong&gt;ctfscoreboard&lt;/strong&gt;&lt;/a&gt;- scoreboard for Capture The Flag competitions.    &lt;br /&gt;&lt;/p&gt;  &lt;h5&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#black_small_square-other-resources"&gt;&lt;/a&gt;▪️ Other resources&lt;/h5&gt;  &lt;p&gt;  :small_orange_diamond:    &lt;a href="https://github.com/bugcrowd/bugcrowd_university"&gt;      &lt;strong&gt;Bugcrowd University&lt;/strong&gt;&lt;/a&gt;- open source education content for the researcher community.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://github.com/rewardone/OSCPRepo"&gt;      &lt;strong&gt;OSCPRepo&lt;/strong&gt;&lt;/a&gt;- a list of resources and scripts that I have been gathering in preparation for the OSCP.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://medium.com/@cxosmo/owasp-top-10-real-world-examples-part-1-a540c4ea2df5" rel="nofollow"&gt;      &lt;strong&gt;OWASP Top 10: Real-World Examples&lt;/strong&gt;&lt;/a&gt;- test your web apps with real-world examples (two-part series).    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="http://phrack.org/index.html" rel="nofollow"&gt;      &lt;strong&gt;phrack.org&lt;/strong&gt;&lt;/a&gt;- an awesome collection of articles from several respected hackers and other thinkers.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://github.com/Gr1mmie/Practical-Ethical-Hacking-Resources"&gt;      &lt;strong&gt;Practical-Ethical-Hacking-Resources&lt;/strong&gt;&lt;/a&gt;- compilation of resources from TCM&amp;apos;s Udemy Course.    &lt;br /&gt;&lt;/p&gt;  &lt;h4&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#your-daily-knowledge-and-news-toc"&gt;&lt;/a&gt;Your daily knowledge and news      &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#anger-table-of-contents"&gt;      &lt;sup&gt;[TOC]&lt;/sup&gt;&lt;/a&gt;&lt;/h4&gt;  &lt;h5&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#black_small_square-rss-readers"&gt;&lt;/a&gt;▪️ RSS Readers&lt;/h5&gt;  &lt;p&gt;  :small_orange_diamond:    &lt;a href="https://feedly.com/" rel="nofollow"&gt;      &lt;strong&gt;Feedly&lt;/strong&gt;&lt;/a&gt;- organize, read and share what matters to you.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://www.inoreader.com/" rel="nofollow"&gt;      &lt;strong&gt;Inoreader&lt;/strong&gt;&lt;/a&gt;- similar to feedly with a support for filtering what you fetch from rss.    &lt;br /&gt;&lt;/p&gt;  &lt;h5&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#black_small_square-irc-channels"&gt;&lt;/a&gt;▪️ IRC Channels&lt;/h5&gt;  &lt;p&gt;  :small_orange_diamond:    &lt;a href="https://wiki.hackerspaces.org/IRC_Channel" rel="nofollow"&gt;      &lt;strong&gt;#hackerspaces&lt;/strong&gt;&lt;/a&gt;- hackerspace IRC channels.    &lt;br /&gt;&lt;/p&gt;  &lt;h5&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#black_small_square-security-2"&gt;&lt;/a&gt;▪️ Security&lt;/h5&gt;  &lt;p&gt;  :small_orange_diamond:    &lt;a href="https://thehackernews.com/" rel="nofollow"&gt;      &lt;strong&gt;The Hacker News&lt;/strong&gt;&lt;/a&gt;- leading news source dedicated to promoting awareness for security experts and hackers.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://latesthackingnews.com/" rel="nofollow"&gt;      &lt;strong&gt;Latest Hacking News&lt;/strong&gt;&lt;/a&gt;- provides the latest hacking news, exploits and vulnerabilities for ethical hackers.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://securitynewsletter.co/" rel="nofollow"&gt;      &lt;strong&gt;Security Newsletter&lt;/strong&gt;&lt;/a&gt;- security news as a weekly digest (email notifications).    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://security.googleblog.com/" rel="nofollow"&gt;      &lt;strong&gt;Google Online Security Blog&lt;/strong&gt;&lt;/a&gt;- the latest news and insights from Google on security and safety on the Internet.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://blog.qualys.com/" rel="nofollow"&gt;      &lt;strong&gt;Qualys Blog&lt;/strong&gt;&lt;/a&gt;- expert network security guidance and news.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://www.darkreading.com/" rel="nofollow"&gt;      &lt;strong&gt;DARKReading&lt;/strong&gt;&lt;/a&gt;- connecting the Information Security Community.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://www.darknet.org.uk/" rel="nofollow"&gt;      &lt;strong&gt;Darknet&lt;/strong&gt;&lt;/a&gt;- latest hacking tools, hacker news, cybersecurity best practices, ethical hacking &amp;amp; pen-testing.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://twitter.com/disclosedh1" rel="nofollow"&gt;      &lt;strong&gt;publiclyDisclosed&lt;/strong&gt;&lt;/a&gt;- public disclosure watcher who keeps you up to date about the recently disclosed bugs.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://www.reddit.com/r/hacking/" rel="nofollow"&gt;      &lt;strong&gt;Reddit - Hacking&lt;/strong&gt;&lt;/a&gt;- a subreddit dedicated to hacking and hackers.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://packetstormsecurity.com/" rel="nofollow"&gt;      &lt;strong&gt;Packet Storm&lt;/strong&gt;&lt;/a&gt;- information security services, news, files, tools, exploits, advisories and whitepapers.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://sekurak.pl/" rel="nofollow"&gt;      &lt;strong&gt;Sekurak&lt;/strong&gt;&lt;/a&gt;- about security, penetration tests, vulnerabilities and many others (PL/EN).    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://nfsec.pl/" rel="nofollow"&gt;      &lt;strong&gt;nf.sec&lt;/strong&gt;&lt;/a&gt;- basic aspects and mechanisms of Linux operating system security (PL).    &lt;br /&gt;&lt;/p&gt;  &lt;h5&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#black_small_square-otherall-in-one"&gt;&lt;/a&gt;▪️ Other/All-in-one&lt;/h5&gt;  &lt;p&gt;  :small_orange_diamond:    &lt;a href="https://changelog.com/" rel="nofollow"&gt;      &lt;strong&gt;Changelog&lt;/strong&gt;&lt;/a&gt;- is a community of hackers; news &amp;amp; podcasts for developers and hackers.    &lt;br /&gt;&lt;/p&gt;  &lt;h4&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#other-cheat-sheets-toc"&gt;&lt;/a&gt;Other Cheat Sheets      &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#anger-table-of-contents"&gt;      &lt;sup&gt;[TOC]&lt;/sup&gt;&lt;/a&gt;&lt;/h4&gt;  &lt;h6&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#build-your-own-dns-servers"&gt;&lt;/a&gt;Build your own DNS Servers&lt;/h6&gt;  &lt;p&gt;  :small_orange_diamond:    &lt;a href="https://calomel.org/unbound_dns.html" rel="nofollow"&gt;      &lt;strong&gt;Unbound DNS Tutorial&lt;/strong&gt;&lt;/a&gt;- a validating, recursive, and caching DNS server.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://www.ctrl.blog/entry/knot-dns-resolver-tutorial.html" rel="nofollow"&gt;      &lt;strong&gt;Knot Resolver on Fedora&lt;/strong&gt;&lt;/a&gt;- how to get faster and more secure DNS resolution with Knot Resolver on Fedora.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://www.aaflalo.me/2018/10/tutorial-setup-dns-over-https-server/" rel="nofollow"&gt;      &lt;strong&gt;DNS-over-HTTPS&lt;/strong&gt;&lt;/a&gt;- tutorial to setup your own DNS-over-HTTPS (DoH) server.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://hacks.mozilla.org/2018/05/a-cartoon-intro-to-dns-over-https/" rel="nofollow"&gt;      &lt;strong&gt;dns-over-https&lt;/strong&gt;&lt;/a&gt;- a cartoon intro to DNS over HTTPS.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://www.aaflalo.me/2019/03/dns-over-tls/" rel="nofollow"&gt;      &lt;strong&gt;DNS-over-TLS&lt;/strong&gt;&lt;/a&gt;- following to your DoH server, setup your DNS-over-TLS (DoT) server.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://zwischenzugs.com/2018/01/26/how-and-why-i-run-my-own-dns-servers/" rel="nofollow"&gt;      &lt;strong&gt;DNS Servers&lt;/strong&gt;&lt;/a&gt;- how (and why) i run my own DNS Servers.    &lt;br /&gt;&lt;/p&gt;  &lt;h6&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#build-your-own-certificate-authority"&gt;&lt;/a&gt;Build your own Certificate Authority&lt;/h6&gt;  &lt;p&gt;  :small_orange_diamond:    &lt;a href="https://jamielinux.com/docs/openssl-certificate-authority/" rel="nofollow"&gt;      &lt;strong&gt;OpenSSL Certificate Authority&lt;/strong&gt;&lt;/a&gt;- build your own certificate authority (CA) using the OpenSSL tools.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://github.com/smallstep/certificates"&gt;      &lt;strong&gt;step-ca Certificate Authority&lt;/strong&gt;&lt;/a&gt;- build your own certificate authority (CA) using open source step-ca.    &lt;br /&gt;&lt;/p&gt;  &lt;h6&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#build-your-own-systemvirtual-machine"&gt;&lt;/a&gt;Build your own System/Virtual Machine&lt;/h6&gt;  &lt;p&gt;  :small_orange_diamond:    &lt;a href="https://github.com/cfenollosa/os-tutorial"&gt;      &lt;strong&gt;os-tutorial&lt;/strong&gt;&lt;/a&gt;- how to create an OS from scratch.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://justinmeiners.github.io/lc3-vm/" rel="nofollow"&gt;      &lt;strong&gt;Write your Own Virtual Machine&lt;/strong&gt;&lt;/a&gt;- how to write your own virtual machine (VM).    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://github.com/cirosantilli/x86-bare-metal-examples"&gt;      &lt;strong&gt;x86 Bare Metal Examples&lt;/strong&gt;&lt;/a&gt;- dozens of minimal operating systems to learn x86 system programming.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://github.com/djhworld/simple-computer"&gt;      &lt;strong&gt;simple-computer&lt;/strong&gt;&lt;/a&gt;- the scott CPU from &amp;quot;But How Do It Know?&amp;quot; by J. Clark Scott.    &lt;br /&gt;  :small_orange_diamond:    &lt;a href="https://littleosbook.github.io/" rel="nofollow"&gt;      &lt;strong&gt;littleosbook&lt;/strong&gt;&lt;/a&gt;- the little book about OS development.    &lt;br /&gt;&lt;/p&gt;  &lt;h6&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#dns-servers-list-privacy"&gt;&lt;/a&gt;DNS Servers list (privacy)&lt;/h6&gt;  &lt;table&gt;    &lt;tr&gt;      &lt;th align="left"&gt;        &lt;strong&gt;IP&lt;/strong&gt;&lt;/th&gt;      &lt;th align="left"&gt;        &lt;strong&gt;URL&lt;/strong&gt;&lt;/th&gt;&lt;/tr&gt;    &lt;tr&gt;      &lt;td align="left"&gt;        &lt;strong&gt;          &lt;code&gt;84.200.69.80&lt;/code&gt;&lt;/strong&gt;&lt;/td&gt;      &lt;td align="left"&gt;        &lt;a href="https://dns.watch/" rel="nofollow"&gt;dns.watch&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;    &lt;tr&gt;      &lt;td align="left"&gt;        &lt;strong&gt;          &lt;code&gt;94.247.43.254&lt;/code&gt;&lt;/strong&gt;&lt;/td&gt;      &lt;td align="left"&gt;        &lt;a href="https://www.opennic.org/" rel="nofollow"&gt;opennic.org&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;    &lt;tr&gt;      &lt;td align="left"&gt;        &lt;strong&gt;          &lt;code&gt;64.6.64.6&lt;/code&gt;&lt;/strong&gt;&lt;/td&gt;      &lt;td align="left"&gt;        &lt;a href="https://www.verisign.com/en_US/security-services/public-dns/index.xhtml" rel="nofollow"&gt;verisign.com&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;    &lt;tr&gt;      &lt;td align="left"&gt;        &lt;strong&gt;          &lt;code&gt;89.233.43.71&lt;/code&gt;&lt;/strong&gt;&lt;/td&gt;      &lt;td align="left"&gt;        &lt;a href="https://blog.uncensoreddns.org/" rel="nofollow"&gt;censurfridns.dk&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;    &lt;tr&gt;      &lt;td align="left"&gt;        &lt;strong&gt;          &lt;code&gt;1.1.1.1&lt;/code&gt;&lt;/strong&gt;&lt;/td&gt;      &lt;td align="left"&gt;        &lt;a href="https://1.1.1.1/" rel="nofollow"&gt;cloudflare.com&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;    &lt;tr&gt;      &lt;td align="left"&gt;        &lt;strong&gt;          &lt;code&gt;94.130.110.185&lt;/code&gt;&lt;/strong&gt;&lt;/td&gt;      &lt;td align="left"&gt;        &lt;a href="https://dnsprivacy.at/" rel="nofollow"&gt;dnsprivacy.at&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;  &lt;h6&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#top-browser-extensions"&gt;&lt;/a&gt;TOP Browser extensions&lt;/h6&gt;  &lt;table&gt;    &lt;tr&gt;      &lt;th align="left"&gt;        &lt;strong&gt;Extension name&lt;/strong&gt;&lt;/th&gt;      &lt;th align="left"&gt;        &lt;strong&gt;Description&lt;/strong&gt;&lt;/th&gt;&lt;/tr&gt;    &lt;tr&gt;      &lt;td align="left"&gt;        &lt;strong&gt;          &lt;code&gt;IPvFoo&lt;/code&gt;&lt;/strong&gt;&lt;/td&gt;      &lt;td align="left"&gt;Display the server IP address and HTTPS information across all page elements.&lt;/td&gt;&lt;/tr&gt;    &lt;tr&gt;      &lt;td align="left"&gt;        &lt;strong&gt;          &lt;code&gt;FoxyProxy&lt;/code&gt;&lt;/strong&gt;&lt;/td&gt;      &lt;td align="left"&gt;Simplifies configuring browsers to access proxy-servers.&lt;/td&gt;&lt;/tr&gt;    &lt;tr&gt;      &lt;td align="left"&gt;        &lt;strong&gt;          &lt;code&gt;HTTPS Everywhere&lt;/code&gt;&lt;/strong&gt;&lt;/td&gt;      &lt;td align="left"&gt;Automatically use HTTPS security on many sites.&lt;/td&gt;&lt;/tr&gt;    &lt;tr&gt;      &lt;td align="left"&gt;        &lt;strong&gt;          &lt;code&gt;uMatrix&lt;/code&gt;&lt;/strong&gt;&lt;/td&gt;      &lt;td align="left"&gt;Point &amp;amp; click to forbid/allow any class of requests made by your browser.&lt;/td&gt;&lt;/tr&gt;    &lt;tr&gt;      &lt;td align="left"&gt;        &lt;strong&gt;          &lt;code&gt;uBlock Origin&lt;/code&gt;&lt;/strong&gt;&lt;/td&gt;      &lt;td align="left"&gt;An efficient blocker: easy on memory and CPU footprint.&lt;/td&gt;&lt;/tr&gt;    &lt;tr&gt;      &lt;td align="left"&gt;        &lt;strong&gt;          &lt;code&gt;Session Buddy&lt;/code&gt;&lt;/strong&gt;&lt;/td&gt;      &lt;td align="left"&gt;Manage browser tabs and bookmarks with ease.&lt;/td&gt;&lt;/tr&gt;    &lt;tr&gt;      &lt;td align="left"&gt;        &lt;strong&gt;          &lt;code&gt;SuperSorter&lt;/code&gt;&lt;/strong&gt;&lt;/td&gt;      &lt;td align="left"&gt;Sort bookmarks recursively, delete duplicates, merge folders, and more.&lt;/td&gt;&lt;/tr&gt;    &lt;tr&gt;      &lt;td align="left"&gt;        &lt;strong&gt;          &lt;code&gt;Clear Cache&lt;/code&gt;&lt;/strong&gt;&lt;/td&gt;      &lt;td align="left"&gt;Clear your cache and browsing data.&lt;/td&gt;&lt;/tr&gt;    &lt;tr&gt;      &lt;td align="left"&gt;        &lt;strong&gt;          &lt;code&gt;d3coder&lt;/code&gt;&lt;/strong&gt;&lt;/td&gt;      &lt;td align="left"&gt;Encoding/Decoding plugin for various types of encoding.&lt;/td&gt;&lt;/tr&gt;    &lt;tr&gt;      &lt;td align="left"&gt;        &lt;strong&gt;          &lt;code&gt;Web Developer&lt;/code&gt;&lt;/strong&gt;&lt;/td&gt;      &lt;td align="left"&gt;Adds a toolbar button with various web developer tools.&lt;/td&gt;&lt;/tr&gt;    &lt;tr&gt;      &lt;td align="left"&gt;        &lt;strong&gt;          &lt;code&gt;ThreatPinch Lookup&lt;/code&gt;&lt;/strong&gt;&lt;/td&gt;      &lt;td align="left"&gt;Add threat intelligence hover tool tips.&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;  &lt;h6&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#top-burp-extensions"&gt;&lt;/a&gt;TOP Burp extensions&lt;/h6&gt;  &lt;table&gt;    &lt;tr&gt;      &lt;th align="left"&gt;        &lt;strong&gt;Extension name&lt;/strong&gt;&lt;/th&gt;      &lt;th align="left"&gt;        &lt;strong&gt;Description&lt;/strong&gt;&lt;/th&gt;&lt;/tr&gt;    &lt;tr&gt;      &lt;td align="left"&gt;        &lt;strong&gt;          &lt;code&gt;Active Scan++&lt;/code&gt;&lt;/strong&gt;&lt;/td&gt;      &lt;td align="left"&gt;Extends Burp&amp;apos;s active and passive scanning capabilities.&lt;/td&gt;&lt;/tr&gt;    &lt;tr&gt;      &lt;td align="left"&gt;        &lt;strong&gt;          &lt;code&gt;Autorize&lt;/code&gt;&lt;/strong&gt;&lt;/td&gt;      &lt;td align="left"&gt;Automatically detects authorization enforcement.&lt;/td&gt;&lt;/tr&gt;    &lt;tr&gt;      &lt;td align="left"&gt;        &lt;strong&gt;          &lt;code&gt;AuthMatrix&lt;/code&gt;&lt;/strong&gt;&lt;/td&gt;      &lt;td align="left"&gt;A simple matrix grid to define the desired levels of access privilege.&lt;/td&gt;&lt;/tr&gt;    &lt;tr&gt;      &lt;td align="left"&gt;        &lt;strong&gt;          &lt;code&gt;Logger++&lt;/code&gt;&lt;/strong&gt;&lt;/td&gt;      &lt;td align="left"&gt;Logs requests and responses for all Burp tools in a sortable table.&lt;/td&gt;&lt;/tr&gt;    &lt;tr&gt;      &lt;td align="left"&gt;        &lt;strong&gt;          &lt;code&gt;Bypass WAF&lt;/code&gt;&lt;/strong&gt;&lt;/td&gt;      &lt;td align="left"&gt;Adds headers useful for bypassing some WAF devices.&lt;/td&gt;&lt;/tr&gt;    &lt;tr&gt;      &lt;td align="left"&gt;        &lt;strong&gt;          &lt;code&gt;JSON Beautifier&lt;/code&gt;&lt;/strong&gt;&lt;/td&gt;      &lt;td align="left"&gt;Beautifies JSON content in the HTTP message viewer.&lt;/td&gt;&lt;/tr&gt;    &lt;tr&gt;      &lt;td align="left"&gt;        &lt;strong&gt;          &lt;code&gt;JSON Web Tokens&lt;/code&gt;&lt;/strong&gt;&lt;/td&gt;      &lt;td align="left"&gt;Enables Burp to decode and manipulate JSON web tokens.&lt;/td&gt;&lt;/tr&gt;    &lt;tr&gt;      &lt;td align="left"&gt;        &lt;strong&gt;          &lt;code&gt;CSP Auditor&lt;/code&gt;&lt;/strong&gt;&lt;/td&gt;      &lt;td align="left"&gt;Displays CSP headers for responses, and passively reports CSP weaknesses.&lt;/td&gt;&lt;/tr&gt;    &lt;tr&gt;      &lt;td align="left"&gt;        &lt;strong&gt;          &lt;code&gt;CSP-Bypass&lt;/code&gt;&lt;/strong&gt;&lt;/td&gt;      &lt;td align="left"&gt;Passively scans for CSP headers that contain known bypasses.&lt;/td&gt;&lt;/tr&gt;    &lt;tr&gt;      &lt;td align="left"&gt;        &lt;strong&gt;          &lt;code&gt;Hackvertor&lt;/code&gt;&lt;/strong&gt;&lt;/td&gt;      &lt;td align="left"&gt;Converts data using a tag-based configuration to apply various encoding.&lt;/td&gt;&lt;/tr&gt;    &lt;tr&gt;      &lt;td align="left"&gt;        &lt;strong&gt;          &lt;code&gt;HTML5 Auditor&lt;/code&gt;&lt;/strong&gt;&lt;/td&gt;      &lt;td align="left"&gt;Scans for usage of risky HTML5 features.&lt;/td&gt;&lt;/tr&gt;    &lt;tr&gt;      &lt;td align="left"&gt;        &lt;strong&gt;          &lt;code&gt;Software Vulnerability Scanner&lt;/code&gt;&lt;/strong&gt;&lt;/td&gt;      &lt;td align="left"&gt;Vulnerability scanner based on vulners.com audit API.&lt;/td&gt;&lt;/tr&gt;    &lt;tr&gt;      &lt;td align="left"&gt;        &lt;strong&gt;          &lt;code&gt;Turbo Intruder&lt;/code&gt;&lt;/strong&gt;&lt;/td&gt;      &lt;td align="left"&gt;Is a powerful bruteforcing tool.&lt;/td&gt;&lt;/tr&gt;    &lt;tr&gt;      &lt;td align="left"&gt;        &lt;strong&gt;          &lt;code&gt;Upload Scanner&lt;/code&gt;&lt;/strong&gt;&lt;/td&gt;      &lt;td align="left"&gt;Upload a number of different file types, laced with different forms of payload.&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;  &lt;h6&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#hack-mozilla-firefox-address-bar"&gt;&lt;/a&gt;Hack Mozilla Firefox address bar&lt;/h6&gt;  &lt;p&gt;In Firefox&amp;apos;s address bar, you can limit results by typing special characters before or after your term:&lt;/p&gt;  &lt;ul&gt;    &lt;li&gt;      &lt;code&gt;^&lt;/code&gt;- for matches in your browsing history&lt;/li&gt;    &lt;li&gt;      &lt;code&gt;*&lt;/code&gt;- for matches in your bookmarks.&lt;/li&gt;    &lt;li&gt;      &lt;code&gt;%&lt;/code&gt;- for matches in your currently open tabs.&lt;/li&gt;    &lt;li&gt;      &lt;code&gt;#&lt;/code&gt;- for matches in page titles.&lt;/li&gt;    &lt;li&gt;      &lt;code&gt;@&lt;/code&gt;- for matches in web addresses.&lt;/li&gt;&lt;/ul&gt;  &lt;h6&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#chrome-hidden-commands"&gt;&lt;/a&gt;Chrome hidden commands&lt;/h6&gt;  &lt;ul&gt;    &lt;li&gt;      &lt;code&gt;chrome://chrome-urls&lt;/code&gt;- list of all commands&lt;/li&gt;    &lt;li&gt;      &lt;code&gt;chrome://flags&lt;/code&gt;- enable experiments and development features&lt;/li&gt;    &lt;li&gt;      &lt;code&gt;chrome://interstitials&lt;/code&gt;- errors and warnings&lt;/li&gt;    &lt;li&gt;      &lt;code&gt;chrome://net-internals&lt;/code&gt;- network internals (events, dns, cache)&lt;/li&gt;    &lt;li&gt;      &lt;code&gt;chrome://network-errors&lt;/code&gt;- network errors&lt;/li&gt;    &lt;li&gt;      &lt;code&gt;chrome://net-export&lt;/code&gt;- start logging future network activity to a file&lt;/li&gt;    &lt;li&gt;      &lt;code&gt;chrome://safe-browsing&lt;/code&gt;- safe browsing options&lt;/li&gt;    &lt;li&gt;      &lt;code&gt;chrome://user-actions&lt;/code&gt;- record all user actions&lt;/li&gt;    &lt;li&gt;      &lt;code&gt;chrome://restart&lt;/code&gt;- restart chrome&lt;/li&gt;    &lt;li&gt;      &lt;code&gt;chrome://dino&lt;/code&gt;- ERR_INTERNET_DISCONNECTED...&lt;/li&gt;    &lt;li&gt;      &lt;code&gt;cache:&amp;lt;website-address&amp;gt;&lt;/code&gt;- view the cached version of the web page&lt;/li&gt;&lt;/ul&gt;  &lt;h6&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#bypass-wafs-by-shortening-ip-address-by-0xinfection"&gt;&lt;/a&gt;Bypass WAFs by Shortening IP Address (by    &lt;a href="https://twitter.com/0xInfection" rel="nofollow"&gt;0xInfection&lt;/a&gt;)&lt;/h6&gt;  &lt;p&gt;IP addresses can be shortened by dropping the zeroes:&lt;/p&gt;  &lt;div&gt;    &lt;pre&gt;      &lt;code&gt;http://1.0.0.1 → http://1.1
http://127.0.0.1 → http://127.1
http://192.168.0.1 → http://192.168.1

http://0xC0A80001 or http://3232235521 → 192.168.0.1
http://192.168.257 → 192.168.1.1
http://192.168.516 → 192.168.2.4&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;  &lt;blockquote&gt;    &lt;p&gt;This bypasses WAF filters for SSRF, open-redirect, etc where any IP as input gets blacklisted.&lt;/p&gt;&lt;/blockquote&gt;  &lt;p&gt;For more information please see    &lt;a href="http://www.pc-help.org/obscure.htm" rel="nofollow"&gt;How to Obscure Any URL&lt;/a&gt;and    &lt;a href="https://stuff-things.net/2014/09/25/magic-ip-address-shortcuts/" rel="nofollow"&gt;Magic IP Address Shortcuts&lt;/a&gt;.&lt;/p&gt;  &lt;h6&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#hashing-encryption-and-encoding-by-michal-&amp;#353;pa&amp;#269;ek"&gt;&lt;/a&gt;Hashing, encryption and encoding (by    &lt;a href="https://twitter.com/spazef0rze" rel="nofollow"&gt;Michal Špaček&lt;/a&gt;)&lt;/h6&gt;  &lt;p&gt;    &lt;em&gt;Hashing&lt;/em&gt;&lt;/p&gt;  &lt;p&gt;plaintext ➡️ hash    &lt;br /&gt;hash ⛔ plaintext&lt;/p&gt;  &lt;p&gt;    &lt;em&gt;Symmetric encryption&lt;/em&gt;&lt;/p&gt;  &lt;p&gt;plaintext ➡️ 🔑 ➡️ ciphertext    &lt;br /&gt;plaintext ⬅️ 🔑 ⬅️ ciphertext    &lt;br /&gt;(:key: shared key)&lt;/p&gt;  &lt;p&gt;    &lt;em&gt;Asymmetric encryption&lt;/em&gt;&lt;/p&gt;  &lt;p&gt;plaintext ➡️ 🔑 ➡️ ciphertext    &lt;br /&gt;plaintext ⬅️ 〽️ ⬅️ ciphertext    &lt;br /&gt;(:key: public key, :part_alternation_mark: private key)    &lt;br /&gt;&lt;/p&gt;  &lt;p&gt;    &lt;em&gt;Encoding&lt;/em&gt;&lt;/p&gt;  &lt;p&gt;text ➡️ encoded    &lt;br /&gt;text ⬅️ encoded&lt;/p&gt;  &lt;h4&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#shell-one-liners-toc"&gt;&lt;/a&gt;Shell One-liners      &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#anger-table-of-contents"&gt;      &lt;sup&gt;[TOC]&lt;/sup&gt;&lt;/a&gt;&lt;/h4&gt;  &lt;h5&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#table-of-contents"&gt;&lt;/a&gt;Table of Contents&lt;/h5&gt;  &lt;ul&gt;    &lt;li&gt;      &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#tool-terminal"&gt;terminal&lt;/a&gt;&lt;/li&gt;    &lt;li&gt;      &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#tool-busybox"&gt;busybox&lt;/a&gt;&lt;/li&gt;    &lt;li&gt;      &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#tool-mount"&gt;mount&lt;/a&gt;&lt;/li&gt;    &lt;li&gt;      &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#tool-fuser"&gt;fuser&lt;/a&gt;&lt;/li&gt;    &lt;li&gt;      &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#tool-lsof"&gt;lsof&lt;/a&gt;&lt;/li&gt;    &lt;li&gt;      &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#tool-ps"&gt;ps&lt;/a&gt;&lt;/li&gt;    &lt;li&gt;      &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#tool-top"&gt;top&lt;/a&gt;&lt;/li&gt;    &lt;li&gt;      &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#tool-vmstat"&gt;vmstat&lt;/a&gt;&lt;/li&gt;    &lt;li&gt;      &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#tool-iostat"&gt;iostat&lt;/a&gt;&lt;/li&gt;    &lt;li&gt;      &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#tool-strace"&gt;strace&lt;/a&gt;&lt;/li&gt;    &lt;li&gt;      &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#tool-kill"&gt;kill&lt;/a&gt;&lt;/li&gt;    &lt;li&gt;      &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#tool-find"&gt;find&lt;/a&gt;&lt;/li&gt;    &lt;li&gt;      &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#tool-diff"&gt;diff&lt;/a&gt;&lt;/li&gt;    &lt;li&gt;      &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#tool-vimdiff"&gt;vimdiff&lt;/a&gt;&lt;/li&gt;    &lt;li&gt;      &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#tool-tail"&gt;tail&lt;/a&gt;&lt;/li&gt;    &lt;li&gt;      &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#tool-cpulimit"&gt;cpulimit&lt;/a&gt;&lt;/li&gt;    &lt;li&gt;      &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#tool-pwdx"&gt;pwdx&lt;/a&gt;&lt;/li&gt;    &lt;li&gt;      &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#tool-tr"&gt;tr&lt;/a&gt;&lt;/li&gt;    &lt;li&gt;      &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#tool-chmod"&gt;chmod&lt;/a&gt;&lt;/li&gt;    &lt;li&gt;      &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#tool-who"&gt;who&lt;/a&gt;&lt;/li&gt;    &lt;li&gt;      &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#tool-last"&gt;last&lt;/a&gt;&lt;/li&gt;    &lt;li&gt;      &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#tool-screen"&gt;screen&lt;/a&gt;&lt;/li&gt;    &lt;li&gt;      &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#tool-script"&gt;script&lt;/a&gt;&lt;/li&gt;    &lt;li&gt;      &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#tool-du"&gt;du&lt;/a&gt;&lt;/li&gt;    &lt;li&gt;      &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#tool-inotifywait"&gt;inotifywait&lt;/a&gt;&lt;/li&gt;    &lt;li&gt;      &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#tool-openssl"&gt;openssl&lt;/a&gt;&lt;/li&gt;    &lt;li&gt;      &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#tool-secure-delete"&gt;secure-delete&lt;/a&gt;&lt;/li&gt;    &lt;li&gt;      &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#tool-dd"&gt;dd&lt;/a&gt;&lt;/li&gt;    &lt;li&gt;      &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#tool-gpg"&gt;gpg&lt;/a&gt;&lt;/li&gt;    &lt;li&gt;      &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#tool-system-other"&gt;system-other&lt;/a&gt;&lt;/li&gt;    &lt;li&gt;      &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#tool-curl"&gt;curl&lt;/a&gt;&lt;/li&gt;    &lt;li&gt;      &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#tool-httpie"&gt;httpie&lt;/a&gt;&lt;/li&gt;    &lt;li&gt;      &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#tool-ssh"&gt;ssh&lt;/a&gt;&lt;/li&gt;    &lt;li&gt;      &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#tool-linux-dev"&gt;linux-dev&lt;/a&gt;&lt;/li&gt;    &lt;li&gt;      &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#tool-tcpdump"&gt;tcpdump&lt;/a&gt;&lt;/li&gt;    &lt;li&gt;      &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#tool-tcpick"&gt;tcpick&lt;/a&gt;&lt;/li&gt;    &lt;li&gt;      &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#tool-ngrep"&gt;ngrep&lt;/a&gt;&lt;/li&gt;    &lt;li&gt;      &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#tool-hping3"&gt;hping3&lt;/a&gt;&lt;/li&gt;    &lt;li&gt;      &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#tool-nmap"&gt;nmap&lt;/a&gt;&lt;/li&gt;    &lt;li&gt;      &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#tool-netcat"&gt;netcat&lt;/a&gt;&lt;/li&gt;    &lt;li&gt;      &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#tool-socat"&gt;socat&lt;/a&gt;&lt;/li&gt;    &lt;li&gt;      &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#tool-p0f"&gt;p0f&lt;/a&gt;&lt;/li&gt;    &lt;li&gt;      &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#tool-gnutls-cli"&gt;gnutls-cli&lt;/a&gt;&lt;/li&gt;    &lt;li&gt;      &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#tool-netstat"&gt;netstat&lt;/a&gt;&lt;/li&gt;    &lt;li&gt;      &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#tool-rsync"&gt;rsync&lt;/a&gt;&lt;/li&gt;    &lt;li&gt;      &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#tool-host"&gt;host&lt;/a&gt;&lt;/li&gt;    &lt;li&gt;      &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#tool-dig"&gt;dig&lt;/a&gt;&lt;/li&gt;    &lt;li&gt;      &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#tool-certbot"&gt;certbot&lt;/a&gt;&lt;/li&gt;    &lt;li&gt;      &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#tool-network-other"&gt;network-other&lt;/a&gt;&lt;/li&gt;    &lt;li&gt;      &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#tool-git"&gt;git&lt;/a&gt;&lt;/li&gt;    &lt;li&gt;      &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#tool-awk"&gt;awk&lt;/a&gt;&lt;/li&gt;    &lt;li&gt;      &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#tool-sed"&gt;sed&lt;/a&gt;&lt;/li&gt;    &lt;li&gt;      &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#tool-grep"&gt;grep&lt;/a&gt;&lt;/li&gt;    &lt;li&gt;      &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#tool-perl"&gt;perl&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;  &lt;h5&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#tool-terminal"&gt;&lt;/a&gt;Tool:    &lt;a href="https://en.wikipedia.org/wiki/Linux_console" rel="nofollow"&gt;terminal&lt;/a&gt;&lt;/h5&gt;  &lt;h6&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#reload-shell-without-exit"&gt;&lt;/a&gt;Reload shell without exit&lt;/h6&gt;  &lt;div&gt;    &lt;pre&gt;exec$SHELL-l&lt;/pre&gt;&lt;/div&gt;  &lt;h6&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#close-shell-keeping-all-subprocess-running"&gt;&lt;/a&gt;Close shell keeping all subprocess running&lt;/h6&gt;  &lt;div&gt;    &lt;pre&gt;disown-a&amp;amp;&amp;amp;exit&lt;/pre&gt;&lt;/div&gt;  &lt;h6&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#exit-without-saving-shell-history"&gt;&lt;/a&gt;Exit without saving shell history&lt;/h6&gt;  &lt;div&gt;    &lt;pre&gt;kill-9$$unsetHISTFILE&amp;amp;&amp;amp;exit&lt;/pre&gt;&lt;/div&gt;  &lt;h6&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#perform-a-branching-conditional"&gt;&lt;/a&gt;Perform a branching conditional&lt;/h6&gt;  &lt;div&gt;    &lt;pre&gt;true&amp;amp;&amp;amp;echosuccessfalse||echofailed&lt;/pre&gt;&lt;/div&gt;  &lt;h6&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#pipe-stdout-and-stderr-to-separate-commands"&gt;&lt;/a&gt;Pipe stdout and stderr to separate commands&lt;/h6&gt;  &lt;div&gt;    &lt;pre&gt;some_command&amp;gt;&amp;gt;(/bin/cmd_for_stdout)2&amp;gt;&amp;gt;(/bin/cmd_for_stderr)&lt;/pre&gt;&lt;/div&gt;  &lt;h6&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#redirect-stdout-and-stderr-each-to-separate-files-and-print-both-to-the-screen"&gt;&lt;/a&gt;Redirect stdout and stderr each to separate files and print both to the screen&lt;/h6&gt;  &lt;div&gt;    &lt;pre&gt;(some_command2&amp;gt;&amp;amp;11&amp;gt;&amp;amp;3|tee errorlog )3&amp;gt;&amp;amp;11&amp;gt;&amp;amp;2|tee stdoutlog&lt;/pre&gt;&lt;/div&gt;  &lt;h6&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#list-of-commands-you-use-most-often"&gt;&lt;/a&gt;List of commands you use most often&lt;/h6&gt;  &lt;div&gt;    &lt;pre&gt;history|\
awk&amp;apos;{CMD[$2]++;count++;}END { for (a in CMD)print CMD[a] &amp;quot; &amp;quot; CMD[a]/count*100 &amp;quot;% &amp;quot; a;}&amp;apos;|\
grep -v&amp;quot;./&amp;quot;|\
column -c3 -s&amp;quot;&amp;quot;-t|\
sort -nr|nl|head -n 20&lt;/pre&gt;&lt;/div&gt;  &lt;h6&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#sterilize-bash-history"&gt;&lt;/a&gt;Sterilize bash history&lt;/h6&gt;  &lt;div&gt;    &lt;pre&gt;functionsterile(){history|awk&amp;apos;$2 != &amp;quot;history&amp;quot; { $1=&amp;quot;&amp;quot;; print $0 }&amp;apos;|egrep -vi&amp;quot;\curl\b+.*(-E|--cert)\b+.*\b*|\curl\b+.*--pass\b+.*\b*|\curl\b+.*(-U|--proxy-user).*:.*\b*|\curl\b+.*(-u|--user).*:.*\b*.*(-H|--header).*(token|auth.*)\b+.*|\wget\b+.*--.*password\b+.*\b*|\http.?://.+:.+@.*\&amp;quot;&amp;gt;$HOME/histbuff;history-r$HOME/histbuff;}exportPROMPT_COMMAND=&amp;quot;sterile&amp;quot;&lt;/pre&gt;&lt;/div&gt;  &lt;blockquote&gt;    &lt;p&gt;Look also:      &lt;a href="https://github.com/lbonanomi/go/blob/master/revisionist.go"&gt;A naive utility to censor credentials in command history&lt;/a&gt;.&lt;/p&gt;&lt;/blockquote&gt;  &lt;h6&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#quickly-backup-a-file"&gt;&lt;/a&gt;Quickly backup a file&lt;/h6&gt;  &lt;div&gt;    &lt;pre&gt;cp filename{,.orig}&lt;/pre&gt;&lt;/div&gt;  &lt;h6&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#empty-a-file-truncate-to-0-size"&gt;&lt;/a&gt;Empty a file (truncate to 0 size)&lt;/h6&gt;  &lt;div&gt;    &lt;pre&gt;&amp;gt;filename&lt;/pre&gt;&lt;/div&gt;  &lt;h6&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#delete-all-files-in-a-folder-that-dont-match-a-certain-file-extension"&gt;&lt;/a&gt;Delete all files in a folder that don&amp;apos;t match a certain file extension&lt;/h6&gt;  &lt;div&gt;    &lt;pre&gt;rm!(*.foo|*.bar|*.baz)&lt;/pre&gt;&lt;/div&gt;  &lt;h6&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#pass-multi-line-string-to-a-file"&gt;&lt;/a&gt;Pass multi-line string to a file&lt;/h6&gt;  &lt;div&gt;    &lt;pre&gt;#cat  &amp;gt;filename ... - overwrite the file#cat &amp;gt;&amp;gt;filename ... - append to a filecat&amp;gt;filename&amp;lt;&amp;lt;__EOF__data data data__EOF__&lt;/pre&gt;&lt;/div&gt;  &lt;h6&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#edit-a-file-on-a-remote-host-using-vim"&gt;&lt;/a&gt;Edit a file on a remote host using vim&lt;/h6&gt;  &lt;div&gt;    &lt;pre&gt;vim scp://user@host//etc/fstab&lt;/pre&gt;&lt;/div&gt;  &lt;h6&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#create-a-directory-and-change-into-it-at-the-same-time"&gt;&lt;/a&gt;Create a directory and change into it at the same time&lt;/h6&gt;  &lt;div&gt;    &lt;pre&gt;mkd() { mkdir -p&amp;quot;$@&amp;quot;&amp;amp;&amp;amp;cd&amp;quot;$@&amp;quot;;}&lt;/pre&gt;&lt;/div&gt;  &lt;h6&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#convert-uppercase-files-to-lowercase-files"&gt;&lt;/a&gt;Convert uppercase files to lowercase files&lt;/h6&gt;  &lt;div&gt;    &lt;pre&gt;rename&amp;apos;y/A-Z/a-z/&amp;apos;*&lt;/pre&gt;&lt;/div&gt;  &lt;h6&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#print-a-row-of-characters-across-the-terminal"&gt;&lt;/a&gt;Print a row of characters across the terminal&lt;/h6&gt;  &lt;div&gt;    &lt;pre&gt;printf&amp;quot;%`tput cols`s&amp;quot;|tr&amp;apos;&amp;apos;&amp;apos;#&amp;apos;&lt;/pre&gt;&lt;/div&gt;  &lt;h6&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#show-shell-history-without-line-numbers"&gt;&lt;/a&gt;Show shell history without line numbers&lt;/h6&gt;  &lt;div&gt;    &lt;pre&gt;history|cut -c 8-fc-l -n 1|sed&amp;apos;s/^\s*//&amp;apos;&lt;/pre&gt;&lt;/div&gt;  &lt;h6&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#run-commands-after-exit-session"&gt;&lt;/a&gt;Run command(s) after exit session&lt;/h6&gt;  &lt;div&gt;    &lt;pre&gt;cat&amp;gt;/etc/profile&amp;lt;&amp;lt;__EOF___after_logout() {username=$(whoami)for _pid in$(ps afx|grep sshd|grep&amp;quot;$username&amp;quot;|awk&amp;apos;{print $1}&amp;apos;); dokill -9$_piddone}trap _after_logout EXIT__EOF__&lt;/pre&gt;&lt;/div&gt;  &lt;h6&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#generate-a-sequence-of-numbers"&gt;&lt;/a&gt;Generate a sequence of numbers&lt;/h6&gt;  &lt;div&gt;    &lt;pre&gt;for((i=1; i&amp;lt;=10; i+=2));doecho$i;done#alternative: seq 1 2 10for((i=5; i&amp;lt;=10;++i));doprintf&amp;apos;%02d\n&amp;apos;$i;done#alternative: seq -w 5 10foriin{1..10};doecho$i;done&lt;/pre&gt;&lt;/div&gt;  &lt;h6&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#simple-bash-filewatching"&gt;&lt;/a&gt;Simple Bash filewatching&lt;/h6&gt;  &lt;div&gt;    &lt;pre&gt;unsetMAIL;exportMAILCHECK=1;exportMAILPATH=&amp;apos;$FILE_TO_WATCH?$MESSAGE&amp;apos;&lt;/pre&gt;&lt;/div&gt;  &lt;hr&gt;&lt;/hr&gt;  &lt;h5&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#tool-busybox"&gt;&lt;/a&gt;Tool:    &lt;a href="https://www.busybox.net/" rel="nofollow"&gt;busybox&lt;/a&gt;&lt;/h5&gt;  &lt;h6&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#static-http-web-server"&gt;&lt;/a&gt;Static HTTP web server&lt;/h6&gt;  &lt;div&gt;    &lt;pre&gt;busybox httpd -p$PORT-h$HOME[-c httpd.conf]&lt;/pre&gt;&lt;/div&gt;  &lt;hr&gt;&lt;/hr&gt;  &lt;h5&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#tool-mount"&gt;&lt;/a&gt;Tool:    &lt;a href="https://en.wikipedia.org/wiki/Mount_(Unix)" rel="nofollow"&gt;mount&lt;/a&gt;&lt;/h5&gt;  &lt;h6&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#mount-a-temporary-ram-partition"&gt;&lt;/a&gt;Mount a temporary ram partition&lt;/h6&gt;  &lt;div&gt;    &lt;pre&gt;mount -t tmpfs tmpfs /mnt -o size=64M&lt;/pre&gt;&lt;/div&gt;  &lt;ul&gt;    &lt;li&gt;      &lt;code&gt;-t&lt;/code&gt;- filesystem type&lt;/li&gt;    &lt;li&gt;      &lt;code&gt;-o&lt;/code&gt;- mount options&lt;/li&gt;&lt;/ul&gt;  &lt;h6&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#remount-a-filesystem-as-readwrite"&gt;&lt;/a&gt;Remount a filesystem as read/write&lt;/h6&gt;  &lt;div&gt;    &lt;pre&gt;mount -o remount,rw /&lt;/pre&gt;&lt;/div&gt;  &lt;hr&gt;&lt;/hr&gt;  &lt;h5&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#tool-fuser"&gt;&lt;/a&gt;Tool:    &lt;a href="https://en.wikipedia.org/wiki/Fuser_(Unix)" rel="nofollow"&gt;fuser&lt;/a&gt;&lt;/h5&gt;  &lt;h6&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#show-which-processes-use-the-filesdirectories"&gt;&lt;/a&gt;Show which processes use the files/directories&lt;/h6&gt;  &lt;div&gt;    &lt;pre&gt;fuser /var/log/daemon.log
fuser -v /home/supervisor&lt;/pre&gt;&lt;/div&gt;  &lt;h6&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#kills-a-process-that-is-locking-a-file"&gt;&lt;/a&gt;Kills a process that is locking a file&lt;/h6&gt;  &lt;div&gt;    &lt;pre&gt;fuser -ki filename&lt;/pre&gt;&lt;/div&gt;  &lt;ul&gt;    &lt;li&gt;      &lt;code&gt;-i&lt;/code&gt;- interactive option&lt;/li&gt;&lt;/ul&gt;  &lt;h6&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#kills-a-process-that-is-locking-a-file-with-specific-signal"&gt;&lt;/a&gt;Kills a process that is locking a file with specific signal&lt;/h6&gt;  &lt;div&gt;    &lt;pre&gt;fuser -k -HUP filename&lt;/pre&gt;&lt;/div&gt;  &lt;ul&gt;    &lt;li&gt;      &lt;code&gt;--list-signals&lt;/code&gt;- list available signal names&lt;/li&gt;&lt;/ul&gt;  &lt;h6&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#show-what-pid-is-listening-on-specific-port"&gt;&lt;/a&gt;Show what PID is listening on specific port&lt;/h6&gt;  &lt;div&gt;    &lt;pre&gt;fuser -v 53/udp&lt;/pre&gt;&lt;/div&gt;  &lt;h6&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#show-all-processes-using-the-named-filesystems-or-block-device"&gt;&lt;/a&gt;Show all processes using the named filesystems or block device&lt;/h6&gt;  &lt;div&gt;    &lt;pre&gt;fuser -mv /var/www&lt;/pre&gt;&lt;/div&gt;  &lt;hr&gt;&lt;/hr&gt;  &lt;h5&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#tool-lsof"&gt;&lt;/a&gt;Tool:    &lt;a href="https://en.wikipedia.org/wiki/Lsof" rel="nofollow"&gt;lsof&lt;/a&gt;&lt;/h5&gt;  &lt;h6&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#show-process-that-use-internet-connection-at-the-moment"&gt;&lt;/a&gt;Show process that use internet connection at the moment&lt;/h6&gt;  &lt;div&gt;    &lt;pre&gt;lsof -P -i -n&lt;/pre&gt;&lt;/div&gt;  &lt;h6&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#show-process-that-use-specific-port-number"&gt;&lt;/a&gt;Show process that use specific port number&lt;/h6&gt;  &lt;div&gt;    &lt;pre&gt;lsof -i tcp:443&lt;/pre&gt;&lt;/div&gt;  &lt;h6&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#lists-all-listening-ports-together-with-the-pid-of-the-associated-process"&gt;&lt;/a&gt;Lists all listening ports together with the PID of the associated process&lt;/h6&gt;  &lt;div&gt;    &lt;pre&gt;lsof -Pan -i tcp -i udp&lt;/pre&gt;&lt;/div&gt;  &lt;h6&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#list-all-open-ports-and-their-owning-executables"&gt;&lt;/a&gt;List all open ports and their owning executables&lt;/h6&gt;  &lt;div&gt;    &lt;pre&gt;lsof -i -P|grep -i&amp;quot;listen&amp;quot;&lt;/pre&gt;&lt;/div&gt;  &lt;h6&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#show-all-open-ports"&gt;&lt;/a&gt;Show all open ports&lt;/h6&gt;  &lt;div&gt;    &lt;pre&gt;lsof -Pnl -i&lt;/pre&gt;&lt;/div&gt;  &lt;h6&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#show-open-ports-listen"&gt;&lt;/a&gt;Show open ports (LISTEN)&lt;/h6&gt;  &lt;div&gt;    &lt;pre&gt;lsof -Pni4|grep LISTEN|column -t&lt;/pre&gt;&lt;/div&gt;  &lt;h6&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#list-all-files-opened-by-a-particular-command"&gt;&lt;/a&gt;List all files opened by a particular command&lt;/h6&gt;  &lt;div&gt;    &lt;pre&gt;lsof -c&amp;quot;process&amp;quot;&lt;/pre&gt;&lt;/div&gt;  &lt;h6&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#view-user-activity-per-directory"&gt;&lt;/a&gt;View user activity per directory&lt;/h6&gt;  &lt;div&gt;    &lt;pre&gt;lsof -u username -a +D /etc&lt;/pre&gt;&lt;/div&gt;  &lt;h6&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#show-10-largest-open-files"&gt;&lt;/a&gt;Show 10 largest open files&lt;/h6&gt;  &lt;div&gt;    &lt;pre&gt;lsof /|\
awk&amp;apos;{ if($7 &amp;gt; 1048576) print $7/1048576 &amp;quot;MB&amp;quot; &amp;quot; &amp;quot; $9 &amp;quot; &amp;quot; $1 }&amp;apos;|\
sort -n -u|tail|column -t&lt;/pre&gt;&lt;/div&gt;  &lt;h6&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#show-current-working-directory-of-a-process"&gt;&lt;/a&gt;Show current working directory of a process&lt;/h6&gt;  &lt;div&gt;    &lt;pre&gt;lsof -p&amp;lt;PID&amp;gt;|grep cwd&lt;/pre&gt;&lt;/div&gt;  &lt;hr&gt;&lt;/hr&gt;  &lt;h5&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#tool-ps"&gt;&lt;/a&gt;Tool:    &lt;a href="https://en.wikipedia.org/wiki/Ps_(Unix)" rel="nofollow"&gt;ps&lt;/a&gt;&lt;/h5&gt;  &lt;h6&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#show-a-4-way-scrollable-process-tree-with-full-details"&gt;&lt;/a&gt;Show a 4-way scrollable process tree with full details&lt;/h6&gt;  &lt;div&gt;    &lt;pre&gt;ps awwfux|less -S&lt;/pre&gt;&lt;/div&gt;  &lt;h6&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#processes-per-user-counter"&gt;&lt;/a&gt;Processes per user counter&lt;/h6&gt;  &lt;div&gt;    &lt;pre&gt;ps hax -o user|sort|uniq -c|sort -r&lt;/pre&gt;&lt;/div&gt;  &lt;h6&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#show-all-processes-by-name-with-main-header"&gt;&lt;/a&gt;Show all processes by name with main header&lt;/h6&gt;  &lt;div&gt;    &lt;pre&gt;ps -lfC nginx&lt;/pre&gt;&lt;/div&gt;  &lt;hr&gt;&lt;/hr&gt;  &lt;h5&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#tool-find"&gt;&lt;/a&gt;Tool:    &lt;a href="https://en.wikipedia.org/wiki/Find_(Unix)" rel="nofollow"&gt;find&lt;/a&gt;&lt;/h5&gt;  &lt;h6&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#find-files-that-have-been-modified-on-your-system-in-the-past-60-minutes"&gt;&lt;/a&gt;Find files that have been modified on your system in the past 60 minutes&lt;/h6&gt;  &lt;div&gt;    &lt;pre&gt;find / -mmin 60 -type f&lt;/pre&gt;&lt;/div&gt;  &lt;h6&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#find-all-files-larger-than-20m"&gt;&lt;/a&gt;Find all files larger than 20M&lt;/h6&gt;  &lt;div&gt;    &lt;pre&gt;find / -type f -size +20M&lt;/pre&gt;&lt;/div&gt;  &lt;h6&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#find-duplicate-files-based-on-md5-hash"&gt;&lt;/a&gt;Find duplicate files (based on MD5 hash)&lt;/h6&gt;  &lt;div&gt;    &lt;pre&gt;find -type f -exec md5sum&amp;apos;{}&amp;apos;&amp;apos;;&amp;apos;|sort|uniq --all-repeated=separate -w 33&lt;/pre&gt;&lt;/div&gt;  &lt;h6&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#change-permission-only-for-files"&gt;&lt;/a&gt;Change permission only for files&lt;/h6&gt;  &lt;div&gt;    &lt;pre&gt;cd/var/www/site&amp;amp;&amp;amp;find.-type f -exec chmod 766 {}\;cd/var/www/site&amp;amp;&amp;amp;find.-type f -exec chmod 664 {} +&lt;/pre&gt;&lt;/div&gt;  &lt;h6&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#change-permission-only-for-directories"&gt;&lt;/a&gt;Change permission only for directories&lt;/h6&gt;  &lt;div&gt;    &lt;pre&gt;cd/var/www/site&amp;amp;&amp;amp;find.-type d -exec chmod g+x {}\;cd/var/www/site&amp;amp;&amp;amp;find.-type d -exec chmod g+rwx {} +&lt;/pre&gt;&lt;/div&gt;  &lt;h6&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#find-files-and-directories-for-specific-usergroup"&gt;&lt;/a&gt;Find files and directories for specific user/group&lt;/h6&gt;  &lt;div&gt;    &lt;pre&gt;#User:find.-user&amp;lt;username&amp;gt;-print
find /etc -type f -user&amp;lt;username&amp;gt;-name&amp;quot;*.conf&amp;quot;#Group:find /opt -group&amp;lt;group&amp;gt;find /etc -type f -group&amp;lt;group&amp;gt;-iname&amp;quot;*.conf&amp;quot;&lt;/pre&gt;&lt;/div&gt;  &lt;h6&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#find-files-and-directories-for-all-without-specific-usergroup"&gt;&lt;/a&gt;Find files and directories for all without specific user/group&lt;/h6&gt;  &lt;div&gt;    &lt;pre&gt;#User:find.\!-user&amp;lt;username&amp;gt;-print#Group:find.\!-group&amp;lt;group&amp;gt;&lt;/pre&gt;&lt;/div&gt;  &lt;h6&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#looking-for-filesdirectories-that-only-have-certain-permission"&gt;&lt;/a&gt;Looking for files/directories that only have certain permission&lt;/h6&gt;  &lt;div&gt;    &lt;pre&gt;#Userfind.-user&amp;lt;username&amp;gt;-perm -u+rw#-rw-r--r--find /home -user$(whoami)-perm 777#-rwxrwxrwx#Group:find /home -type d -group&amp;lt;group&amp;gt;-perm 755#-rwxr-xr-x&lt;/pre&gt;&lt;/div&gt;  &lt;h6&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#delete-older-files-than-60-days"&gt;&lt;/a&gt;Delete older files than 60 days&lt;/h6&gt;  &lt;div&gt;    &lt;pre&gt;find.-type f -mtime +60 -delete&lt;/pre&gt;&lt;/div&gt;  &lt;h6&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#recursively-remove-all-empty-sub-directories-from-a-directory"&gt;&lt;/a&gt;Recursively remove all empty sub-directories from a directory&lt;/h6&gt;  &lt;div&gt;    &lt;pre&gt;find.-depth  -type d  -empty -exec rmdir {}\;&lt;/pre&gt;&lt;/div&gt;  &lt;h6&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#how-to-find-all-hard-links-to-a-file"&gt;&lt;/a&gt;How to find all hard links to a file&lt;/h6&gt;  &lt;div&gt;    &lt;pre&gt;find&amp;lt;/path/to/dir&amp;gt;-xdev -samefile filename&lt;/pre&gt;&lt;/div&gt;  &lt;h6&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#recursively-find-the-latest-modified-files"&gt;&lt;/a&gt;Recursively find the latest modified files&lt;/h6&gt;  &lt;div&gt;    &lt;pre&gt;find.-type f -exec stat --format&amp;apos;%Y :%y %n&amp;apos;&amp;quot;{}&amp;quot;\;|sort -nr|cut -d: -f2-|head&lt;/pre&gt;&lt;/div&gt;  &lt;h6&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#recursively-findreplace-of-a-string-with-sed"&gt;&lt;/a&gt;Recursively find/replace of a string with sed&lt;/h6&gt;  &lt;div&gt;    &lt;pre&gt;find.-not -path&amp;apos;*/\.git*&amp;apos;-type f -print0|xargs -0 sed -i&amp;apos;s/foo/bar/g&amp;apos;&lt;/pre&gt;&lt;/div&gt;  &lt;h6&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#recursively-findreplace-of-a-string-in-directories-and-file-names"&gt;&lt;/a&gt;Recursively find/replace of a string in directories and file names&lt;/h6&gt;  &lt;div&gt;    &lt;pre&gt;find.-depth -name&amp;apos;*test*&amp;apos;-execdir bash -c&amp;apos;mv -v &amp;quot;$1&amp;quot; &amp;quot;${1//foo/bar}&amp;quot;&amp;apos;_ {}\;&lt;/pre&gt;&lt;/div&gt;  &lt;h6&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#recursively-find-suid-executables"&gt;&lt;/a&gt;Recursively find suid executables&lt;/h6&gt;  &lt;div&gt;    &lt;pre&gt;find /\(-perm -4000 -o -perm -2000\)-type f -exec ls -la {}\;&lt;/pre&gt;&lt;/div&gt;  &lt;hr&gt;&lt;/hr&gt;  &lt;h5&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#tool-top"&gt;&lt;/a&gt;Tool:    &lt;a href="https://en.wikipedia.org/wiki/Top_(software)" rel="nofollow"&gt;top&lt;/a&gt;&lt;/h5&gt;  &lt;h6&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#use-top-to-monitor-only-all-processes-with-the-specific-string"&gt;&lt;/a&gt;Use top to monitor only all processes with the specific string&lt;/h6&gt;  &lt;div&gt;    &lt;pre&gt;top -p$(pgrep -d ,&amp;lt;str&amp;gt;)&lt;/pre&gt;&lt;/div&gt;  &lt;ul&gt;    &lt;li&gt;      &lt;code&gt;&amp;lt;str&amp;gt;&lt;/code&gt;- process containing string (eg. nginx, worker)&lt;/li&gt;&lt;/ul&gt;  &lt;hr&gt;&lt;/hr&gt;  &lt;h5&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#tool-vmstat"&gt;&lt;/a&gt;Tool:    &lt;a href="https://en.wikipedia.org/wiki/Vmstat" rel="nofollow"&gt;vmstat&lt;/a&gt;&lt;/h5&gt;  &lt;h6&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#show-current-system-utilization-fields-in-kilobytes"&gt;&lt;/a&gt;Show current system utilization (fields in kilobytes)&lt;/h6&gt;  &lt;div&gt;    &lt;pre&gt;vmstat 2 20 -t -w&lt;/pre&gt;&lt;/div&gt;  &lt;ul&gt;    &lt;li&gt;      &lt;code&gt;2&lt;/code&gt;- number of times with a defined time interval (delay)&lt;/li&gt;    &lt;li&gt;      &lt;code&gt;20&lt;/code&gt;- each execution of the command (count)&lt;/li&gt;    &lt;li&gt;      &lt;code&gt;-t&lt;/code&gt;- show timestamp&lt;/li&gt;    &lt;li&gt;      &lt;code&gt;-w&lt;/code&gt;- wide output&lt;/li&gt;    &lt;li&gt;      &lt;code&gt;-S M&lt;/code&gt;- output of the fields in megabytes instead of kilobytes&lt;/li&gt;&lt;/ul&gt;  &lt;h6&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#show-current-system-utilization-will-get-refreshed-every-5-seconds"&gt;&lt;/a&gt;Show current system utilization will get refreshed every 5 seconds&lt;/h6&gt;  &lt;div&gt;    &lt;pre&gt;vmstat 5 -w&lt;/pre&gt;&lt;/div&gt;  &lt;h6&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#display-report-a-summary-of-disk-operations"&gt;&lt;/a&gt;Display report a summary of disk operations&lt;/h6&gt;  &lt;div&gt;    &lt;pre&gt;vmstat -D&lt;/pre&gt;&lt;/div&gt;  &lt;h6&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#display-report-of-event-counters-and-memory-stats"&gt;&lt;/a&gt;Display report of event counters and memory stats&lt;/h6&gt;  &lt;div&gt;    &lt;pre&gt;vmstat -s&lt;/pre&gt;&lt;/div&gt;  &lt;h6&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#display-report-about-kernel-objects-stored-in-slab-layer-cache"&gt;&lt;/a&gt;Display report about kernel objects stored in slab layer cache&lt;/h6&gt;  &lt;div&gt;    &lt;pre&gt;vmstat -m&lt;/pre&gt;&lt;/div&gt;  &lt;h5&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#tool-iostat"&gt;&lt;/a&gt;Tool:    &lt;a href="https://en.wikipedia.org/wiki/Iostat" rel="nofollow"&gt;iostat&lt;/a&gt;&lt;/h5&gt;  &lt;h6&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#show-information-about-the-cpu-usage-and-io-statistics-about-all-the-partitions"&gt;&lt;/a&gt;Show information about the CPU usage, and I/O statistics about all the partitions&lt;/h6&gt;  &lt;div&gt;    &lt;pre&gt;iostat 2 10 -t -m&lt;/pre&gt;&lt;/div&gt;  &lt;ul&gt;    &lt;li&gt;      &lt;code&gt;2&lt;/code&gt;- number of times with a defined time interval (delay)&lt;/li&gt;    &lt;li&gt;      &lt;code&gt;10&lt;/code&gt;- each execution of the command (count)&lt;/li&gt;    &lt;li&gt;      &lt;code&gt;-t&lt;/code&gt;- show timestamp&lt;/li&gt;    &lt;li&gt;      &lt;code&gt;-m&lt;/code&gt;- fields in megabytes (      &lt;code&gt;-k&lt;/code&gt;- in kilobytes, default)&lt;/li&gt;&lt;/ul&gt;  &lt;h6&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#show-information-only-about-the-cpu-utilization"&gt;&lt;/a&gt;Show information only about the CPU utilization&lt;/h6&gt;  &lt;div&gt;    &lt;pre&gt;iostat 2 10 -t -m -c&lt;/pre&gt;&lt;/div&gt;  &lt;h6&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#show-information-only-about-the-disk-utilization"&gt;&lt;/a&gt;Show information only about the disk utilization&lt;/h6&gt;  &lt;div&gt;    &lt;pre&gt;iostat 2 10 -t -m -d&lt;/pre&gt;&lt;/div&gt;  &lt;h6&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#show-information-only-about-the-lvm-utilization"&gt;&lt;/a&gt;Show information only about the LVM utilization&lt;/h6&gt;  &lt;div&gt;    &lt;pre&gt;iostat -N&lt;/pre&gt;&lt;/div&gt;  &lt;hr&gt;&lt;/hr&gt;  &lt;h5&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#tool-strace"&gt;&lt;/a&gt;Tool:    &lt;a href="https://en.wikipedia.org/wiki/Strace" rel="nofollow"&gt;strace&lt;/a&gt;&lt;/h5&gt;  &lt;h6&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#track-with-child-processes"&gt;&lt;/a&gt;Track with child processes&lt;/h6&gt;  &lt;div&gt;    &lt;pre&gt;#1)strace -f -p$(pidof glusterfsd)#2)strace -f$(pidof php-fpm|sed&amp;apos;s/\([0-9]*\)/\-p \1/g&amp;apos;)&lt;/pre&gt;&lt;/div&gt;  &lt;h6&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#track-process-with-30-seconds-limit"&gt;&lt;/a&gt;Track process with 30 seconds limit&lt;/h6&gt;  &lt;div&gt;    &lt;pre&gt;timeout 30 strace$(&amp;lt;/var/run/zabbix/zabbix_agentd.pid)&lt;/pre&gt;&lt;/div&gt;  &lt;h6&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#track-processes-and-redirect-output-to-a-file"&gt;&lt;/a&gt;Track processes and redirect output to a file&lt;/h6&gt;  &lt;div&gt;    &lt;pre&gt;ps auxw|grep&amp;apos;[a]pache&amp;apos;|awk&amp;apos;{print &amp;quot; -p &amp;quot; $2}&amp;apos;|\
xargs strace -o /tmp/strace-apache-proc.out&lt;/pre&gt;&lt;/div&gt;  &lt;h6&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#track-with-print-time-spent-in-each-syscall-and-limit-length-of-print-strings"&gt;&lt;/a&gt;Track with print time spent in each syscall and limit length of print strings&lt;/h6&gt;  &lt;div&gt;    &lt;pre&gt;ps auxw|grep&amp;apos;[i]init_policy&amp;apos;|awk&amp;apos;{print &amp;quot; -p &amp;quot; $2}&amp;apos;|\
xargs strace -f -e trace=network -T -s 10000&lt;/pre&gt;&lt;/div&gt;  &lt;h6&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#track-the-open-request-of-a-network-port"&gt;&lt;/a&gt;Track the open request of a network port&lt;/h6&gt;  &lt;div&gt;    &lt;pre&gt;strace -f -e trace=bind nc -l 80&lt;/pre&gt;&lt;/div&gt;  &lt;h6&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#track-the-open-request-of-a-network-port-show-tcpudp"&gt;&lt;/a&gt;Track the open request of a network port (show TCP/UDP)&lt;/h6&gt;  &lt;div&gt;    &lt;pre&gt;strace -f -e trace=network nc -lu 80&lt;/pre&gt;&lt;/div&gt;  &lt;hr&gt;&lt;/hr&gt;  &lt;h5&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#tool-kill"&gt;&lt;/a&gt;Tool:    &lt;a href="https://en.wikipedia.org/wiki/Kill_(command)" rel="nofollow"&gt;kill&lt;/a&gt;&lt;/h5&gt;  &lt;h6&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#kill-a-process-running-on-port"&gt;&lt;/a&gt;Kill a process running on port&lt;/h6&gt;  &lt;div&gt;    &lt;pre&gt;kill-9$(lsof -i :&amp;lt;port&amp;gt;|awk&amp;apos;{l=$2} END {print l}&amp;apos;)&lt;/pre&gt;&lt;/div&gt;  &lt;hr&gt;&lt;/hr&gt;  &lt;h5&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#tool-diff"&gt;&lt;/a&gt;Tool:    &lt;a href="https://en.wikipedia.org/wiki/Diff" rel="nofollow"&gt;diff&lt;/a&gt;&lt;/h5&gt;  &lt;h6&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#compare-two-directory-trees"&gt;&lt;/a&gt;Compare two directory trees&lt;/h6&gt;  &lt;div&gt;    &lt;pre&gt;diff&amp;lt;(cd directory1&amp;amp;&amp;amp;find|sort)&amp;lt;(cd directory2&amp;amp;&amp;amp;find|sort)&lt;/pre&gt;&lt;/div&gt;  &lt;h6&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#compare-output-of-two-commands"&gt;&lt;/a&gt;Compare output of two commands&lt;/h6&gt;  &lt;div&gt;    &lt;pre&gt;diff&amp;lt;(cat /etc/passwd)&amp;lt;(cut -f2 /etc/passwd)&lt;/pre&gt;&lt;/div&gt;  &lt;hr&gt;&lt;/hr&gt;  &lt;h5&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#tool-vimdiff"&gt;&lt;/a&gt;Tool:    &lt;a href="http://vimdoc.sourceforge.net/htmldoc/diff.html" rel="nofollow"&gt;vimdiff&lt;/a&gt;&lt;/h5&gt;  &lt;h6&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#highlight-the-exact-differences-based-on-characters-and-words"&gt;&lt;/a&gt;Highlight the exact differences, based on characters and words&lt;/h6&gt;  &lt;div&gt;    &lt;pre&gt;vimdiff file1 file2&lt;/pre&gt;&lt;/div&gt;  &lt;h6&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#compare-two-json-files"&gt;&lt;/a&gt;Compare two JSON files&lt;/h6&gt;  &lt;div&gt;    &lt;pre&gt;vimdiff&amp;lt;(jq -S.A.json)&amp;lt;(jq -S.B.json)&lt;/pre&gt;&lt;/div&gt;  &lt;h6&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#compare-hex-dump"&gt;&lt;/a&gt;Compare Hex dump&lt;/h6&gt;  &lt;div&gt;    &lt;pre&gt;d(){ vimdiff&amp;lt;(f$1)&amp;lt;(f$2);};f(){ hexdump -C$1|cut -d&amp;apos;&amp;apos;-f3-|tr -s&amp;apos;&amp;apos;;};d~/bin1~/bin2&lt;/pre&gt;&lt;/div&gt;  &lt;h6&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#diffchar"&gt;&lt;/a&gt;diffchar&lt;/h6&gt;  &lt;p&gt;Save    &lt;a href="https://raw.githubusercontent.com/vim-scripts/diffchar.vim/master/plugin/diffchar.vim" rel="nofollow"&gt;diffchar&lt;/a&gt;@    &lt;code&gt;~/.vim/plugins&lt;/code&gt;&lt;/p&gt;  &lt;p&gt;Click    &lt;code&gt;F7&lt;/code&gt;to switch between diff modes&lt;/p&gt;  &lt;p&gt;Usefull    &lt;code&gt;vimdiff&lt;/code&gt;commands:&lt;/p&gt;  &lt;ul&gt;    &lt;li&gt;      &lt;code&gt;qa&lt;/code&gt;to exit all windows&lt;/li&gt;    &lt;li&gt;      &lt;code&gt;:vertical resize 70&lt;/code&gt;to resize window&lt;/li&gt;    &lt;li&gt;set window width      &lt;code&gt;Ctrl+W [N columns]+(Shift+)&amp;lt;\&amp;gt;&lt;/code&gt;&lt;/li&gt;&lt;/ul&gt;  &lt;hr&gt;&lt;/hr&gt;  &lt;h5&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#tool-tail"&gt;&lt;/a&gt;Tool:    &lt;a href="https://en.wikipedia.org/wiki/Tail_(Unix)" rel="nofollow"&gt;tail&lt;/a&gt;&lt;/h5&gt;  &lt;h6&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#annotate-tail--f-with-timestamps"&gt;&lt;/a&gt;Annotate tail -f with timestamps&lt;/h6&gt;  &lt;div&gt;    &lt;pre&gt;tail -f file|whileread;doecho&amp;quot;$(date +%T.%N)$REPLY&amp;quot;;done&lt;/pre&gt;&lt;/div&gt;  &lt;h6&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#analyse-an-apache-access-log-for-the-most-common-ip-addresses"&gt;&lt;/a&gt;Analyse an Apache access log for the most common IP addresses&lt;/h6&gt;  &lt;div&gt;    &lt;pre&gt;tail -10000 access_log|awk&amp;apos;{print $1}&amp;apos;|sort|uniq -c|sort -n|tail&lt;/pre&gt;&lt;/div&gt;  &lt;h6&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#analyse-web-server-log-and-show-only-5xx-http-codes"&gt;&lt;/a&gt;Analyse web server log and show only 5xx http codes&lt;/h6&gt;  &lt;div&gt;    &lt;pre&gt;tail -n 100 -f /path/to/logfile|grep&amp;quot;HTTP/[1-2].[0-1]\&amp;quot;[5]&amp;quot;&lt;/pre&gt;&lt;/div&gt;  &lt;hr&gt;&lt;/hr&gt;  &lt;h5&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#tool-tar"&gt;&lt;/a&gt;Tool:    &lt;a href="https://en.wikipedia.org/wiki/Tar_(computing)" rel="nofollow"&gt;tar&lt;/a&gt;&lt;/h5&gt;  &lt;h6&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#system-backup-with-exclude-specific-directories"&gt;&lt;/a&gt;System backup with exclude specific directories&lt;/h6&gt;  &lt;div&gt;    &lt;pre&gt;cd/
tar -czvpf /mnt/system$(date +%d%m%Y%s).tgz --directory=/ \
--exclude=proc/*--exclude=sys/*--exclude=dev/*--exclude=mnt/*.&lt;/pre&gt;&lt;/div&gt;  &lt;h6&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#system-backup-with-exclude-specific-directories-pigz"&gt;&lt;/a&gt;System backup with exclude specific directories (pigz)&lt;/h6&gt;  &lt;div&gt;    &lt;pre&gt;cd/
tar cvpf /backup/snapshot-$(date +%d%m%Y%s).tgz --directory=/ \
--exclude=proc/*--exclude=sys/*--exclude=dev/*\
--exclude=mnt/*--exclude=tmp/*--use-compress-program=pigz.&lt;/pre&gt;&lt;/div&gt;  &lt;hr&gt;&lt;/hr&gt;  &lt;h5&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#tool-dump"&gt;&lt;/a&gt;Tool:    &lt;a href="https://en.wikipedia.org/wiki/Dump_(program)" rel="nofollow"&gt;dump&lt;/a&gt;&lt;/h5&gt;  &lt;h6&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#system-backup-to-file"&gt;&lt;/a&gt;System backup to file&lt;/h6&gt;  &lt;div&gt;    &lt;pre&gt;dump -y -u -f /backup/system$(date +%d%m%Y%s).lzo /&lt;/pre&gt;&lt;/div&gt;  &lt;h6&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#restore-system-from-lzo-file"&gt;&lt;/a&gt;Restore system from lzo file&lt;/h6&gt;  &lt;div&gt;    &lt;pre&gt;cd/
restore -rf /backup/system$(date +%d%m%Y%s).lzo&lt;/pre&gt;&lt;/div&gt;  &lt;hr&gt;&lt;/hr&gt;  &lt;h5&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#tool-cpulimit"&gt;&lt;/a&gt;Tool:    &lt;a href="http://cpulimit.sourceforge.net/" rel="nofollow"&gt;cpulimit&lt;/a&gt;&lt;/h5&gt;  &lt;h6&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#limit-the-cpu-usage-of-a-process"&gt;&lt;/a&gt;Limit the cpu usage of a process&lt;/h6&gt;  &lt;div&gt;    &lt;pre&gt;cpulimit -p pid -l 50&lt;/pre&gt;&lt;/div&gt;  &lt;hr&gt;&lt;/hr&gt;  &lt;h5&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#tool-pwdx"&gt;&lt;/a&gt;Tool:    &lt;a href="https://www.cyberciti.biz/faq/unix-linux-pwdx-command-examples-usage-syntax/" rel="nofollow"&gt;pwdx&lt;/a&gt;&lt;/h5&gt;  &lt;h6&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#show-current-working-directory-of-a-process-1"&gt;&lt;/a&gt;Show current working directory of a process&lt;/h6&gt;  &lt;div&gt;    &lt;pre&gt;pwdx&amp;lt;pid&amp;gt;&lt;/pre&gt;&lt;/div&gt;  &lt;hr&gt;&lt;/hr&gt;  &lt;h5&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#tool-taskset"&gt;&lt;/a&gt;Tool:    &lt;a href="https://www.cyberciti.biz/faq/taskset-cpu-affinity-command/" rel="nofollow"&gt;taskset&lt;/a&gt;&lt;/h5&gt;  &lt;h6&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#start-a-command-on-only-one-cpu-core"&gt;&lt;/a&gt;Start a command on only one CPU core&lt;/h6&gt;  &lt;div&gt;    &lt;pre&gt;taskset -c 0&amp;lt;command&amp;gt;&lt;/pre&gt;&lt;/div&gt;  &lt;hr&gt;&lt;/hr&gt;  &lt;h5&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#tool-tr"&gt;&lt;/a&gt;Tool:    &lt;a href="https://en.wikipedia.org/wiki/Tr_(Unix)" rel="nofollow"&gt;tr&lt;/a&gt;&lt;/h5&gt;  &lt;h6&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#show-directories-in-the-path-one-per-line"&gt;&lt;/a&gt;Show directories in the PATH, one per line&lt;/h6&gt;  &lt;div&gt;    &lt;pre&gt;tr:&amp;apos;\n&amp;apos;&amp;lt;&amp;lt;&amp;lt;$PATH&lt;/pre&gt;&lt;/div&gt;  &lt;hr&gt;&lt;/hr&gt;  &lt;h5&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#tool-chmod"&gt;&lt;/a&gt;Tool:    &lt;a href="https://en.wikipedia.org/wiki/Chmod" rel="nofollow"&gt;chmod&lt;/a&gt;&lt;/h5&gt;  &lt;h6&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#remove-executable-bit-from-all-files-in-the-current-directory"&gt;&lt;/a&gt;Remove executable bit from all files in the current directory&lt;/h6&gt;  &lt;div&gt;    &lt;pre&gt;chmod -R -x+X*&lt;/pre&gt;&lt;/div&gt;  &lt;h6&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#restore-permission-for-binchmod"&gt;&lt;/a&gt;Restore permission for /bin/chmod&lt;/h6&gt;  &lt;div&gt;    &lt;pre&gt;#1:cp /bin/ls chmod.01
cp /bin/chmod chmod.01
./chmod.01 700 file#2:/bin/busybox chmod 0700 /bin/chmod#3:setfacl --set u::rwx,g::---,o::--- /bin/chmod&lt;/pre&gt;&lt;/div&gt;  &lt;hr&gt;&lt;/hr&gt;  &lt;h5&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#tool-who"&gt;&lt;/a&gt;Tool:    &lt;a href="https://en.wikipedia.org/wiki/Who_(Unix)" rel="nofollow"&gt;who&lt;/a&gt;&lt;/h5&gt;  &lt;h6&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#find-last-reboot-time"&gt;&lt;/a&gt;Find last reboot time&lt;/h6&gt;  &lt;div&gt;    &lt;pre&gt;who -b&lt;/pre&gt;&lt;/div&gt;  &lt;h6&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#detect-a-user-sudo-sud-into-the-current-shell"&gt;&lt;/a&gt;Detect a user sudo-su&amp;apos;d into the current shell&lt;/h6&gt;  &lt;div&gt;    &lt;pre&gt;[[$(who -m|awk&amp;apos;{ print $1 }&amp;apos;)==$(whoami)]]||echo&amp;quot;You are su-ed to$(whoami)&amp;quot;&lt;/pre&gt;&lt;/div&gt;  &lt;hr&gt;&lt;/hr&gt;  &lt;h5&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#tool-last"&gt;&lt;/a&gt;Tool:    &lt;a href="https://www.howtoforge.com/linux-last-command/" rel="nofollow"&gt;last&lt;/a&gt;&lt;/h5&gt;  &lt;h6&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#was-the-last-reboot-a-panic"&gt;&lt;/a&gt;Was the last reboot a panic?&lt;/h6&gt;  &lt;div&gt;    &lt;pre&gt;(last -x -f$(ls -1t /var/log/wtmp*|head -2|tail -1);last -x -f /var/log/wtmp)|\
grep -A1 reboot|head -2|grep -q shutdown&amp;amp;&amp;amp;echo&amp;quot;Expected reboot&amp;quot;||echo&amp;quot;Panic reboot&amp;quot;&lt;/pre&gt;&lt;/div&gt;  &lt;hr&gt;&lt;/hr&gt;  &lt;h5&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#tool-screen"&gt;&lt;/a&gt;Tool:    &lt;a href="https://en.wikipedia.org/wiki/GNU_Screen" rel="nofollow"&gt;screen&lt;/a&gt;&lt;/h5&gt;  &lt;h6&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#start-screen-in-detached-mode"&gt;&lt;/a&gt;Start screen in detached mode&lt;/h6&gt;  &lt;div&gt;    &lt;pre&gt;screen -d -m&amp;lt;command&amp;gt;&lt;/pre&gt;&lt;/div&gt;  &lt;h6&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#attach-to-an-existing-screen-session"&gt;&lt;/a&gt;Attach to an existing screen session&lt;/h6&gt;  &lt;div&gt;    &lt;pre&gt;screen -r -d&amp;lt;pid&amp;gt;&lt;/pre&gt;&lt;/div&gt;  &lt;hr&gt;&lt;/hr&gt;  &lt;h5&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#tool-script"&gt;&lt;/a&gt;Tool:    &lt;a href="https://en.wikipedia.org/wiki/Script_(Unix)" rel="nofollow"&gt;script&lt;/a&gt;&lt;/h5&gt;  &lt;h6&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#record-and-replay-terminal-session"&gt;&lt;/a&gt;Record and replay terminal session&lt;/h6&gt;  &lt;div&gt;    &lt;pre&gt;### Record session#1)script -t2&amp;gt;~/session.time -a~/session.log#2)script --timing=session.time session.log### Replay sessionscriptreplay --timing=session.time session.log&lt;/pre&gt;&lt;/div&gt;  &lt;hr&gt;&lt;/hr&gt;  &lt;h5&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#tool-du"&gt;&lt;/a&gt;Tool:    &lt;a href="https://en.wikipedia.org/wiki/GNU_Screen" rel="nofollow"&gt;du&lt;/a&gt;&lt;/h5&gt;  &lt;h6&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#show-20-biggest-directories-with-k-m-g"&gt;&lt;/a&gt;Show 20 biggest directories with &amp;apos;K M G&amp;apos;&lt;/h6&gt;  &lt;div&gt;    &lt;pre&gt;du|\
sort -r -n|\
awk&amp;apos;{split(&amp;quot;K M G&amp;quot;,v); s=1; while($1&amp;gt;1024){$1/=1024; s++} print int($1)&amp;quot; &amp;quot;v[s]&amp;quot;\t&amp;quot;$2}&amp;apos;|\
head -n 20&lt;/pre&gt;&lt;/div&gt;  &lt;hr&gt;&lt;/hr&gt;  &lt;h5&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#tool-inotifywait"&gt;&lt;/a&gt;Tool:    &lt;a href="https://en.wikipedia.org/wiki/GNU_Screen" rel="nofollow"&gt;inotifywait&lt;/a&gt;&lt;/h5&gt;  &lt;h6&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#init-tool-everytime-a-file-in-a-directory-is-modified"&gt;&lt;/a&gt;Init tool everytime a file in a directory is modified&lt;/h6&gt;  &lt;div&gt;    &lt;pre&gt;whiletrue;doinotifywait -r -e MODIFY dir/&amp;amp;&amp;amp;ls dir/;done;&lt;/pre&gt;&lt;/div&gt;  &lt;hr&gt;&lt;/hr&gt;  &lt;h5&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#tool-openssl"&gt;&lt;/a&gt;Tool:    &lt;a href="https://www.openssl.org/" rel="nofollow"&gt;openssl&lt;/a&gt;&lt;/h5&gt;  &lt;h6&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#testing-connection-to-the-remote-host"&gt;&lt;/a&gt;Testing connection to the remote host&lt;/h6&gt;  &lt;div&gt;    &lt;pre&gt;echo|openssl s_client -connect google.com:443 -showcerts&lt;/pre&gt;&lt;/div&gt;  &lt;h6&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#testing-connection-to-the-remote-host-debug-mode"&gt;&lt;/a&gt;Testing connection to the remote host (debug mode)&lt;/h6&gt;  &lt;div&gt;    &lt;pre&gt;echo|openssl s_client -connect google.com:443 -showcerts -tlsextdebug -status&lt;/pre&gt;&lt;/div&gt;  &lt;h6&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#testing-connection-to-the-remote-host-with-sni-support"&gt;&lt;/a&gt;Testing connection to the remote host (with SNI support)&lt;/h6&gt;  &lt;div&gt;    &lt;pre&gt;echo|openssl s_client -showcerts -servername google.com -connect google.com:443&lt;/pre&gt;&lt;/div&gt;  &lt;h6&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#testing-connection-to-the-remote-host-with-specific-ssl-version"&gt;&lt;/a&gt;Testing connection to the remote host with specific ssl version&lt;/h6&gt;  &lt;div&gt;    &lt;pre&gt;openssl s_client -tls1_2 -connect google.com:443&lt;/pre&gt;&lt;/div&gt;  &lt;h6&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#testing-connection-to-the-remote-host-with-specific-ssl-cipher"&gt;&lt;/a&gt;Testing connection to the remote host with specific ssl cipher&lt;/h6&gt;  &lt;div&gt;    &lt;pre&gt;openssl s_client -cipher&amp;apos;AES128-SHA&amp;apos;-connect google.com:443&lt;/pre&gt;&lt;/div&gt;  &lt;h6&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#verify-0-rtt"&gt;&lt;/a&gt;Verify 0-RTT&lt;/h6&gt;  &lt;div&gt;    &lt;pre&gt;_host=&amp;quot;example.com&amp;quot;cat&amp;gt;req.in&amp;lt;&amp;lt;__EOF__HEAD / HTTP/1.1Host:$_hostConnection: close__EOF__openssl s_client -connect${_host}:443 -tls1_3 -sess_out session.pem -ign_eof&amp;lt;req.in
openssl s_client -connect${_host}:443 -tls1_3 -sess_in session.pem -early_data req.in&lt;/pre&gt;&lt;/div&gt;  &lt;h6&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#generate-private-key-without-passphrase"&gt;&lt;/a&gt;Generate private key without passphrase&lt;/h6&gt;  &lt;div&gt;    &lt;pre&gt;#_len: 2048, 4096( _fd=&amp;quot;private.key&amp;quot;;_len=&amp;quot;2048&amp;quot;;\
openssl genrsa -out${_fd}${_len})&lt;/pre&gt;&lt;/div&gt;  &lt;h6&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#generate-private-key-with-passphrase"&gt;&lt;/a&gt;Generate private key with passphrase&lt;/h6&gt;  &lt;div&gt;    &lt;pre&gt;#_ciph: aes128, aes256#_len: 2048, 4096( _ciph=&amp;quot;aes128&amp;quot;;_fd=&amp;quot;private.key&amp;quot;;_len=&amp;quot;2048&amp;quot;;\
openssl genrsa -${_ciph}-out${_fd}${_len})&lt;/pre&gt;&lt;/div&gt;  &lt;h6&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#remove-passphrase-from-private-key"&gt;&lt;/a&gt;Remove passphrase from private key&lt;/h6&gt;  &lt;div&gt;    &lt;pre&gt;( _fd=&amp;quot;private.key&amp;quot;;_fd_unp=&amp;quot;private_unp.key&amp;quot;;\
openssl rsa -in${_fd}-out${_fd_unp})&lt;/pre&gt;&lt;/div&gt;  &lt;h6&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#encrypt-existing-private-key-with-a-passphrase"&gt;&lt;/a&gt;Encrypt existing private key with a passphrase&lt;/h6&gt;  &lt;div&gt;    &lt;pre&gt;#_ciph: aes128, aes256( _ciph=&amp;quot;aes128&amp;quot;;_fd=&amp;quot;private.key&amp;quot;;_fd_pass=&amp;quot;private_pass.key&amp;quot;;\
openssl rsa -${_ciph}-in${_fd}-out${_fd_pass}&lt;/pre&gt;&lt;/div&gt;  &lt;h6&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#check-private-key"&gt;&lt;/a&gt;Check private key&lt;/h6&gt;  &lt;div&gt;    &lt;pre&gt;( _fd=&amp;quot;private.key&amp;quot;;\
openssl rsa -check -in${_fd})&lt;/pre&gt;&lt;/div&gt;  &lt;h6&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#get-public-key-from-private-key"&gt;&lt;/a&gt;Get public key from private key&lt;/h6&gt;  &lt;div&gt;    &lt;pre&gt;( _fd=&amp;quot;private.key&amp;quot;;_fd_pub=&amp;quot;public.key&amp;quot;;\
openssl rsa -pubout -in${_fd}-out${_fd_pub})&lt;/pre&gt;&lt;/div&gt;  &lt;h6&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#generate-private-key-and-csr"&gt;&lt;/a&gt;Generate private key and CSR&lt;/h6&gt;  &lt;div&gt;    &lt;pre&gt;( _fd=&amp;quot;private.key&amp;quot;;_fd_csr=&amp;quot;request.csr&amp;quot;;_len=&amp;quot;2048&amp;quot;;\
openssl req -out${_fd_csr}-new -newkey rsa:${_len}-nodes -keyout${_fd})&lt;/pre&gt;&lt;/div&gt;  &lt;h6&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#generate-csr"&gt;&lt;/a&gt;Generate CSR&lt;/h6&gt;  &lt;div&gt;    &lt;pre&gt;( _fd=&amp;quot;private.key&amp;quot;;_fd_csr=&amp;quot;request.csr&amp;quot;;\
openssl req -out${_fd_csr}-new -key${_fd})&lt;/pre&gt;&lt;/div&gt;  &lt;h6&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#generate-csr-metadata-from-existing-certificate"&gt;&lt;/a&gt;Generate CSR (metadata from existing certificate)&lt;/h6&gt;  &lt;blockquote&gt;    &lt;p&gt;Where      &lt;code&gt;private.key&lt;/code&gt;is the existing private key. As you can see you do not generate this CSR from your certificate (public key). Also you do not generate the &amp;quot;same&amp;quot; CSR, just a new one to request a new certificate.&lt;/p&gt;&lt;/blockquote&gt;  &lt;div&gt;    &lt;pre&gt;( _fd=&amp;quot;private.key&amp;quot;;_fd_csr=&amp;quot;request.csr&amp;quot;;_fd_crt=&amp;quot;cert.crt&amp;quot;;\
openssl x509 -x509toreq -in${_fd_crt}-out${_fd_csr}-signkey${_fd})&lt;/pre&gt;&lt;/div&gt;  &lt;h6&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#generate-csr-with--config-param"&gt;&lt;/a&gt;Generate CSR with -config param&lt;/h6&gt;  &lt;div&gt;    &lt;pre&gt;( _fd=&amp;quot;private.key&amp;quot;;_fd_csr=&amp;quot;request.csr&amp;quot;;\
openssl req -new -sha256 -key${_fd}-out${_fd_csr}\
-config&amp;lt;(cat&amp;lt;&amp;lt;__EOF__[req]default_bits        = 2048default_md          = sha256prompt              = nodistinguished_name  = dnreq_extensions      = req_ext[ dn ]C   = &amp;quot;&amp;lt;two-letter ISO abbreviation for your country&amp;gt;&amp;quot;ST  = &amp;quot;&amp;lt;state or province where your organisation is legally located&amp;gt;&amp;quot;L   = &amp;quot;&amp;lt;city where your organisation is legally located&amp;gt;&amp;quot;O   = &amp;quot;&amp;lt;legal name of your organisation&amp;gt;&amp;quot;OU  = &amp;quot;&amp;lt;section of the organisation&amp;gt;&amp;quot;CN  = &amp;quot;&amp;lt;fully qualified domain name&amp;gt;&amp;quot;[ req_ext ]subjectAltName = @alt_names[ alt_names ]DNS.1 = &amp;lt;fully qualified domain name&amp;gt;DNS.2 = &amp;lt;next domain&amp;gt;DNS.3 = &amp;lt;next domain&amp;gt;__EOF__))&lt;/pre&gt;&lt;/div&gt;  &lt;p&gt;Other values in    &lt;code&gt;[ dn ]&lt;/code&gt;:&lt;/p&gt;  &lt;div&gt;    &lt;pre&gt;      &lt;code&gt;countryName            = &amp;quot;DE&amp;quot;                     # C=
stateOrProvinceName    = &amp;quot;Hessen&amp;quot;                 # ST=
localityName           = &amp;quot;Keller&amp;quot;                 # L=
postalCode             = &amp;quot;424242&amp;quot;                 # L/postalcode=
postalAddress          = &amp;quot;Keller&amp;quot;                 # L/postaladdress=
streetAddress          = &amp;quot;Crater 1621&amp;quot;            # L/street=
organizationName       = &amp;quot;apfelboymschule&amp;quot;        # O=
organizationalUnitName = &amp;quot;IT Department&amp;quot;          # OU=
commonName             = &amp;quot;example.com&amp;quot;            # CN=
emailAddress           = &amp;quot;webmaster@example.com&amp;quot;  # CN/emailAddress=&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;  &lt;p&gt;Example of    &lt;code&gt;oids&lt;/code&gt;(you&amp;apos;ll probably also have to make OpenSSL know about the new fields required for EV by adding the following under    &lt;code&gt;[new_oids]&lt;/code&gt;):&lt;/p&gt;  &lt;div&gt;    &lt;pre&gt;      &lt;code&gt;[req]
...
oid_section         = new_oids

[ new_oids ]
postalCode = 2.5.4.17
streetAddress = 2.5.4.9&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;  &lt;p&gt;Full example:&lt;/p&gt;  &lt;div&gt;    &lt;pre&gt;( _fd=&amp;quot;private.key&amp;quot;;_fd_csr=&amp;quot;request.csr&amp;quot;;\
openssl req -new -sha256 -key${_fd}-out${_fd_csr}\
-config&amp;lt;(cat&amp;lt;&amp;lt;__EOF__[req]default_bits        = 2048default_md          = sha256prompt              = nodistinguished_name  = dnreq_extensions      = req_extoid_section         = new_oids[ new_oids ]serialNumber = 2.5.4.5streetAddress = 2.5.4.9postalCode = 2.5.4.17businessCategory = 2.5.4.15[ dn ]serialNumber=00001111businessCategory=Private OrganizationjurisdictionC=DEC=DEST=HessenL=KellerpostalCode=424242streetAddress=Crater 1621O=AV CompanyOU=ITCN=example.com[ req_ext ]subjectAltName = @alt_names[ alt_names ]DNS.1 = example.com__EOF__))&lt;/pre&gt;&lt;/div&gt;  &lt;p&gt;For more information please look at these great explanations:&lt;/p&gt;  &lt;ul&gt;    &lt;li&gt;      &lt;a href="https://tools.ietf.org/html/rfc5280" rel="nofollow"&gt;RFC 5280&lt;/a&gt;&lt;/li&gt;    &lt;li&gt;      &lt;a href="https://apfelboymchen.net/gnu/notes/openssl%20multidomain%20with%20config%20files.html" rel="nofollow"&gt;How to create multidomain certificates using config files&lt;/a&gt;&lt;/li&gt;    &lt;li&gt;      &lt;a href="https://gist.github.com/romainnorberg/464758a6620228b977212a3cf20c3e08"&gt;Generate a multi domains certificate using config files&lt;/a&gt;&lt;/li&gt;    &lt;li&gt;      &lt;a href="https://expeditedsecurity.com/blog/openssl-csr-command/" rel="nofollow"&gt;Your OpenSSL CSR command is out of date&lt;/a&gt;&lt;/li&gt;    &lt;li&gt;      &lt;a href="https://www.tbs-certificats.com/openssl-dem-server-cert.cnf" rel="nofollow"&gt;OpenSSL example configuration file&lt;/a&gt;&lt;/li&gt;    &lt;li&gt;      &lt;a href="https://www.alvestrand.no/objectid/" rel="nofollow"&gt;Object Identifiers (OIDs)&lt;/a&gt;&lt;/li&gt;    &lt;li&gt;      &lt;a href="https://github.com/openssl/openssl/blob/master/crypto/objects/objects.txt"&gt;openssl objects.txt&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;  &lt;h6&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#list-available-ec-curves"&gt;&lt;/a&gt;List available EC curves&lt;/h6&gt;  &lt;div&gt;    &lt;pre&gt;openssl ecparam -list_curves&lt;/pre&gt;&lt;/div&gt;  &lt;h6&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#print-ecdsa-private-and-public-keys"&gt;&lt;/a&gt;Print ECDSA private and public keys&lt;/h6&gt;  &lt;div&gt;    &lt;pre&gt;( _fd=&amp;quot;private.key&amp;quot;;\
openssl ec -in${_fd}-noout -text )#For x25519 only extracting public key( _fd=&amp;quot;private.key&amp;quot;;_fd_pub=&amp;quot;public.key&amp;quot;;\
openssl pkey -in${_fd}-pubout -out${_fd_pub})&lt;/pre&gt;&lt;/div&gt;  &lt;h6&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#generate-ecdsa-private-key"&gt;&lt;/a&gt;Generate ECDSA private key&lt;/h6&gt;  &lt;div&gt;    &lt;pre&gt;#_curve: prime256v1, secp521r1, secp384r1( _fd=&amp;quot;private.key&amp;quot;;_curve=&amp;quot;prime256v1&amp;quot;;\
openssl ecparam -out${_fd}-name${_curve}-genkey )#_curve: X25519( _fd=&amp;quot;private.key&amp;quot;;_curve=&amp;quot;x25519&amp;quot;;\
openssl genpkey -algorithm${_curve}-out${_fd})&lt;/pre&gt;&lt;/div&gt;  &lt;h6&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#generate-private-key-and-csr-ecc"&gt;&lt;/a&gt;Generate private key and CSR (ECC)&lt;/h6&gt;  &lt;div&gt;    &lt;pre&gt;#_curve: prime256v1, secp521r1, secp384r1( _fd=&amp;quot;domain.com.key&amp;quot;;_fd_csr=&amp;quot;domain.com.csr&amp;quot;;_curve=&amp;quot;prime256v1&amp;quot;;\
openssl ecparam -out${_fd}-name${_curve}-genkey;\
openssl req -new -key${_fd}-out${_fd_csr}-sha256 )&lt;/pre&gt;&lt;/div&gt;  &lt;h6&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#generate-self-signed-certificate"&gt;&lt;/a&gt;Generate self-signed certificate&lt;/h6&gt;  &lt;div&gt;    &lt;pre&gt;#_len: 2048, 4096( _fd=&amp;quot;domain.key&amp;quot;;_fd_out=&amp;quot;domain.crt&amp;quot;;_len=&amp;quot;2048&amp;quot;;_days=&amp;quot;365&amp;quot;;\
openssl req -newkey rsa:${_len}-nodes \
-keyout${_fd}-x509 -days${_days}-out${_fd_out})&lt;/pre&gt;&lt;/div&gt;  &lt;h6&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#generate-self-signed-certificate-from-existing-private-key"&gt;&lt;/a&gt;Generate self-signed certificate from existing private key&lt;/h6&gt;  &lt;div&gt;    &lt;pre&gt;#_len: 2048, 4096( _fd=&amp;quot;domain.key&amp;quot;;_fd_out=&amp;quot;domain.crt&amp;quot;;_days=&amp;quot;365&amp;quot;;\
openssl req -key${_fd}-nodes \
-x509 -days${_days}-out${_fd_out})&lt;/pre&gt;&lt;/div&gt;  &lt;h6&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#generate-self-signed-certificate-from-existing-private-key-and-csr"&gt;&lt;/a&gt;Generate self-signed certificate from existing private key and csr&lt;/h6&gt;  &lt;div&gt;    &lt;pre&gt;#_len: 2048, 4096( _fd=&amp;quot;domain.key&amp;quot;;_fd_csr=&amp;quot;domain.csr&amp;quot;;_fd_out=&amp;quot;domain.crt&amp;quot;;_days=&amp;quot;365&amp;quot;;\
openssl x509 -signkey${_fd}-nodes \
-in${_fd_csr}-req -days${_days}-out${_fd_out})&lt;/pre&gt;&lt;/div&gt;  &lt;h6&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#generate-dh-public-parameters"&gt;&lt;/a&gt;Generate DH public parameters&lt;/h6&gt;  &lt;div&gt;    &lt;pre&gt;( _dh_size=&amp;quot;2048&amp;quot;;\
openssl dhparam -out /etc/nginx/ssl/dhparam_${_dh_size}.pem&amp;quot;$_dh_size&amp;quot;)&lt;/pre&gt;&lt;/div&gt;  &lt;h6&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#display-dh-public-parameters"&gt;&lt;/a&gt;Display DH public parameters&lt;/h6&gt;  &lt;div&gt;    &lt;pre&gt;openssl pkeyparam -in dhparam.pem -text&lt;/pre&gt;&lt;/div&gt;  &lt;h6&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#extract-private-key-from-pfx"&gt;&lt;/a&gt;Extract private key from pfx&lt;/h6&gt;  &lt;div&gt;    &lt;pre&gt;( _fd_pfx=&amp;quot;cert.pfx&amp;quot;;_fd_key=&amp;quot;key.pem&amp;quot;;\
openssl pkcs12 -in${_fd_pfx}-nocerts -nodes -out${_fd_key})&lt;/pre&gt;&lt;/div&gt;  &lt;h6&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#extract-private-key-and-certs-from-pfx"&gt;&lt;/a&gt;Extract private key and certs from pfx&lt;/h6&gt;  &lt;div&gt;    &lt;pre&gt;( _fd_pfx=&amp;quot;cert.pfx&amp;quot;;_fd_pem=&amp;quot;key_certs.pem&amp;quot;;\
openssl pkcs12 -in${_fd_pfx}-nodes -out${_fd_pem})&lt;/pre&gt;&lt;/div&gt;  &lt;h6&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#extract-certs-from-p7b"&gt;&lt;/a&gt;Extract certs from p7b&lt;/h6&gt;  &lt;div&gt;    &lt;pre&gt;#PKCS#7 file doesn&amp;apos;t include private keys.( _fd_p7b=&amp;quot;cert.p7b&amp;quot;;_fd_pem=&amp;quot;cert.pem&amp;quot;;\
openssl pkcs7 -inform DER -outform PEM -in${_fd_p7b}-print_certs&amp;gt;${_fd_pem})#or:openssl pkcs7 -print_certs -in -in${_fd_p7b}-out${_fd_pem})&lt;/pre&gt;&lt;/div&gt;  &lt;h6&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#convert-der-to-pem"&gt;&lt;/a&gt;Convert DER to PEM&lt;/h6&gt;  &lt;div&gt;    &lt;pre&gt;( _fd_der=&amp;quot;cert.crt&amp;quot;;_fd_pem=&amp;quot;cert.pem&amp;quot;;\
openssl x509 -in${_fd_der}-inform der -outform pem -out${_fd_pem})&lt;/pre&gt;&lt;/div&gt;  &lt;h6&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#convert-pem-to-der"&gt;&lt;/a&gt;Convert PEM to DER&lt;/h6&gt;  &lt;div&gt;    &lt;pre&gt;( _fd_der=&amp;quot;cert.crt&amp;quot;;_fd_pem=&amp;quot;cert.pem&amp;quot;;\
openssl x509 -in${_fd_pem}-outform der -out${_fd_der})&lt;/pre&gt;&lt;/div&gt;  &lt;h6&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#verification-of-the-private-key"&gt;&lt;/a&gt;Verification of the private key&lt;/h6&gt;  &lt;div&gt;    &lt;pre&gt;( _fd=&amp;quot;private.key&amp;quot;;\
openssl rsa -noout -text -in${_fd})&lt;/pre&gt;&lt;/div&gt;  &lt;h6&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#verification-of-the-public-key"&gt;&lt;/a&gt;Verification of the public key&lt;/h6&gt;  &lt;div&gt;    &lt;pre&gt;#1)( _fd=&amp;quot;public.key&amp;quot;;\
openssl pkey -noout -text -pubin -in${_fd})#2)( _fd=&amp;quot;private.key&amp;quot;;\
openssl rsa -inform PEM -noout -in${_fd}&amp;amp;&amp;gt;/dev/null;\if[$?=0 ];thenecho-en&amp;quot;OK\n&amp;quot;;fi)&lt;/pre&gt;&lt;/div&gt;  &lt;h6&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#verification-of-the-certificate"&gt;&lt;/a&gt;Verification of the certificate&lt;/h6&gt;  &lt;div&gt;    &lt;pre&gt;( _fd=&amp;quot;certificate.crt&amp;quot;;#format: pem, cer, crt \openssl x509 -noout -text -in${_fd})&lt;/pre&gt;&lt;/div&gt;  &lt;h6&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#verification-of-the-csr"&gt;&lt;/a&gt;Verification of the CSR&lt;/h6&gt;  &lt;div&gt;    &lt;pre&gt;( _fd_csr=&amp;quot;request.csr&amp;quot;;\
openssl req -text -noout -in${_fd_csr})&lt;/pre&gt;&lt;/div&gt;  &lt;h6&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#check-the-private-key-and-the-certificate-are-match"&gt;&lt;/a&gt;Check the private key and the certificate are match&lt;/h6&gt;  &lt;div&gt;    &lt;pre&gt;(openssl rsa -noout -modulus -in private.key|openssl md5;\
openssl x509 -noout -modulus -in certificate.crt|openssl md5)|uniq&lt;/pre&gt;&lt;/div&gt;  &lt;h6&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#check-the-private-key-and-the-csr-are-match"&gt;&lt;/a&gt;Check the private key and the CSR are match&lt;/h6&gt;  &lt;div&gt;    &lt;pre&gt;(openssl rsa -noout -modulus -in private.key|openssl md5;\
openssl req -noout -modulus -in request.csr|openssl md5)|uniq&lt;/pre&gt;&lt;/div&gt;  &lt;hr&gt;&lt;/hr&gt;  &lt;h5&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#tool-secure-delete"&gt;&lt;/a&gt;Tool:    &lt;a href="https://wiki.archlinux.org/index.php/Securely_wipe_disk" rel="nofollow"&gt;secure-delete&lt;/a&gt;&lt;/h5&gt;  &lt;h6&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#secure-delete-with-shred"&gt;&lt;/a&gt;Secure delete with shred&lt;/h6&gt;  &lt;div&gt;    &lt;pre&gt;shred -vfuz -n 10 file
shred --verbose --random-source=/dev/urandom -n 1 /dev/sda&lt;/pre&gt;&lt;/div&gt;  &lt;h6&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#secure-delete-with-scrub"&gt;&lt;/a&gt;Secure delete with scrub&lt;/h6&gt;  &lt;div&gt;    &lt;pre&gt;scrub -p dod /dev/sda
scrub -p dod -r file&lt;/pre&gt;&lt;/div&gt;  &lt;h6&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#secure-delete-with-badblocks"&gt;&lt;/a&gt;Secure delete with badblocks&lt;/h6&gt;  &lt;div&gt;    &lt;pre&gt;badblocks -s -w -t random -v /dev/sda
badblocks -c 10240 -s -w -t random -v /dev/sda&lt;/pre&gt;&lt;/div&gt;  &lt;h6&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#secure-delete-with-secure-delete"&gt;&lt;/a&gt;Secure delete with secure-delete&lt;/h6&gt;  &lt;div&gt;    &lt;pre&gt;srm -vz /tmp/file
sfill -vz /local
sdmem -v
swapoff /dev/sda5&amp;amp;&amp;amp;sswap -vz /dev/sda5&lt;/pre&gt;&lt;/div&gt;  &lt;hr&gt;&lt;/hr&gt;  &lt;h5&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#tool-dd"&gt;&lt;/a&gt;Tool:    &lt;a href="https://en.wikipedia.org/wiki/Dd_(Unix)" rel="nofollow"&gt;dd&lt;/a&gt;&lt;/h5&gt;  &lt;h6&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#show-dd-status-every-so-often"&gt;&lt;/a&gt;Show dd status every so often&lt;/h6&gt;  &lt;div&gt;    &lt;pre&gt;dd&amp;lt;dd_params&amp;gt;status=progress
watch --interval 5 killall -USR1 dd&lt;/pre&gt;&lt;/div&gt;  &lt;h6&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#redirect-output-to-a-file-with-dd"&gt;&lt;/a&gt;Redirect output to a file with dd&lt;/h6&gt;  &lt;div&gt;    &lt;pre&gt;echo&amp;quot;string&amp;quot;|dd of=filename&lt;/pre&gt;&lt;/div&gt;  &lt;hr&gt;&lt;/hr&gt;  &lt;h5&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#tool-gpg"&gt;&lt;/a&gt;Tool:    &lt;a href="https://www.gnupg.org/" rel="nofollow"&gt;gpg&lt;/a&gt;&lt;/h5&gt;  &lt;h6&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#export-public-key"&gt;&lt;/a&gt;Export public key&lt;/h6&gt;  &lt;div&gt;    &lt;pre&gt;gpg --export --armor&amp;quot;&amp;lt;username&amp;gt;&amp;quot;&amp;gt;username.pkey&lt;/pre&gt;&lt;/div&gt;  &lt;ul&gt;    &lt;li&gt;      &lt;code&gt;--export&lt;/code&gt;- export all keys from all keyrings or specific key&lt;/li&gt;    &lt;li&gt;      &lt;code&gt;-a|--armor&lt;/code&gt;- create ASCII armored output&lt;/li&gt;&lt;/ul&gt;  &lt;h6&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#encrypt-file"&gt;&lt;/a&gt;Encrypt file&lt;/h6&gt;  &lt;div&gt;    &lt;pre&gt;gpg -e -r&amp;quot;&amp;lt;username&amp;gt;&amp;quot;dump.sql&lt;/pre&gt;&lt;/div&gt;  &lt;ul&gt;    &lt;li&gt;      &lt;code&gt;-e|--encrypt&lt;/code&gt;- encrypt data&lt;/li&gt;    &lt;li&gt;      &lt;code&gt;-r|--recipient&lt;/code&gt;- encrypt for specific&lt;/li&gt;&lt;/ul&gt;  &lt;h6&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#decrypt-file"&gt;&lt;/a&gt;Decrypt file&lt;/h6&gt;  &lt;div&gt;    &lt;pre&gt;gpg -o dump.sql -d dump.sql.gpg&lt;/pre&gt;&lt;/div&gt;  &lt;ul&gt;    &lt;li&gt;      &lt;code&gt;-o|--output&lt;/code&gt;- use as output file&lt;/li&gt;    &lt;li&gt;      &lt;code&gt;-d|--decrypt&lt;/code&gt;- decrypt data (default)&lt;/li&gt;&lt;/ul&gt;  &lt;h6&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#search-recipient"&gt;&lt;/a&gt;Search recipient&lt;/h6&gt;  &lt;div&gt;    &lt;pre&gt;gpg --keyserver hkp://keyserver.ubuntu.com --search-keys&amp;quot;&amp;lt;username&amp;gt;&amp;quot;&lt;/pre&gt;&lt;/div&gt;  &lt;ul&gt;    &lt;li&gt;      &lt;code&gt;--keyserver&lt;/code&gt;- set specific key server&lt;/li&gt;    &lt;li&gt;      &lt;code&gt;--search-keys&lt;/code&gt;- search for keys on a key server&lt;/li&gt;&lt;/ul&gt;  &lt;h6&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#list-all-of-the-packets-in-an-encrypted-file"&gt;&lt;/a&gt;List all of the packets in an encrypted file&lt;/h6&gt;  &lt;div&gt;    &lt;pre&gt;gpg --batch --list-packets archive.gpg
gpg2 --batch --list-packets archive.gpg&lt;/pre&gt;&lt;/div&gt;  &lt;hr&gt;&lt;/hr&gt;  &lt;h5&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#tool-system-other"&gt;&lt;/a&gt;Tool:    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#tool-system-other"&gt;system-other&lt;/a&gt;&lt;/h5&gt;  &lt;h6&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#reboot-system-from-init"&gt;&lt;/a&gt;Reboot system from init&lt;/h6&gt;  &lt;div&gt;    &lt;pre&gt;exec/sbin/init 6&lt;/pre&gt;&lt;/div&gt;  &lt;h6&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#init-system-from-single-user-mode"&gt;&lt;/a&gt;Init system from single user mode&lt;/h6&gt;  &lt;div&gt;    &lt;pre&gt;exec/sbin/init&lt;/pre&gt;&lt;/div&gt;  &lt;h6&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#show-current-working-directory-of-a-process-2"&gt;&lt;/a&gt;Show current working directory of a process&lt;/h6&gt;  &lt;div&gt;    &lt;pre&gt;readlink -f /proc/&amp;lt;PID&amp;gt;/cwd&lt;/pre&gt;&lt;/div&gt;  &lt;h6&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#show-actual-pathname-of-the-executed-command"&gt;&lt;/a&gt;Show actual pathname of the executed command&lt;/h6&gt;  &lt;div&gt;    &lt;pre&gt;readlink -f /proc/&amp;lt;PID&amp;gt;/exe&lt;/pre&gt;&lt;/div&gt;  &lt;h5&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#tool-curl"&gt;&lt;/a&gt;Tool:    &lt;a href="https://curl.haxx.se" rel="nofollow"&gt;curl&lt;/a&gt;&lt;/h5&gt;  &lt;div&gt;    &lt;pre&gt;curl -Iks https://www.google.com&lt;/pre&gt;&lt;/div&gt;  &lt;ul&gt;    &lt;li&gt;      &lt;code&gt;-I&lt;/code&gt;- show response headers only&lt;/li&gt;    &lt;li&gt;      &lt;code&gt;-k&lt;/code&gt;- insecure connection when using ssl&lt;/li&gt;    &lt;li&gt;      &lt;code&gt;-s&lt;/code&gt;- silent mode (not display body)&lt;/li&gt;&lt;/ul&gt;  &lt;div&gt;    &lt;pre&gt;curl -Iks --location -X GET -A&amp;quot;x-agent&amp;quot;https://www.google.com&lt;/pre&gt;&lt;/div&gt;  &lt;ul&gt;    &lt;li&gt;      &lt;code&gt;--location&lt;/code&gt;- follow redirects&lt;/li&gt;    &lt;li&gt;      &lt;code&gt;-X&lt;/code&gt;- set method&lt;/li&gt;    &lt;li&gt;      &lt;code&gt;-A&lt;/code&gt;- set user-agent&lt;/li&gt;&lt;/ul&gt;  &lt;div&gt;    &lt;pre&gt;curl -Iks --location -X GET -A&amp;quot;x-agent&amp;quot;--proxy http://127.0.0.1:16379 https://www.google.com&lt;/pre&gt;&lt;/div&gt;  &lt;ul&gt;    &lt;li&gt;      &lt;code&gt;--proxy [socks5://|http://]&lt;/code&gt;- set proxy server&lt;/li&gt;&lt;/ul&gt;  &lt;div&gt;    &lt;pre&gt;curl -o file.pdf -C - https://example.com/Aiju2goo0Ja2.pdf&lt;/pre&gt;&lt;/div&gt;  &lt;ul&gt;    &lt;li&gt;      &lt;code&gt;-o&lt;/code&gt;- write output to file&lt;/li&gt;    &lt;li&gt;      &lt;code&gt;-C&lt;/code&gt;- resume the transfer&lt;/li&gt;&lt;/ul&gt;  &lt;h6&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#find-your-external-ip-address-external-services"&gt;&lt;/a&gt;Find your external IP address (external services)&lt;/h6&gt;  &lt;div&gt;    &lt;pre&gt;curl ipinfo.io
curl ipinfo.io/ip
curl icanhazip.com
curl ifconfig.me/ip;echo&lt;/pre&gt;&lt;/div&gt;  &lt;h6&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#repeat-url-request"&gt;&lt;/a&gt;Repeat URL request&lt;/h6&gt;  &lt;div&gt;    &lt;pre&gt;#URL sequence substitution with a dummy query string:curl -ks https://example.com/?[1-20]#With shell &amp;apos;for&amp;apos; loop:foriin{1..20};docurl -ks https://example.com/;done&lt;/pre&gt;&lt;/div&gt;  &lt;h6&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#check-dns-and-http-trace-with-headers-for-specific-domains"&gt;&lt;/a&gt;Check DNS and HTTP trace with headers for specific domains&lt;/h6&gt;  &lt;div&gt;    &lt;pre&gt;### Set domains and external dns servers._domain_list=(google.com);_dns_list=(&amp;quot;8.8.8.8&amp;quot;&amp;quot;1.1.1.1&amp;quot;)for_domainin&amp;quot;${_domain_list[@]}&amp;quot;;doprintf&amp;apos;=%.0s&amp;apos;{1..48}echoprintf&amp;quot;[\\e[1;32m+\\e[m] resolve: %s\\n&amp;quot;&amp;quot;$_domain&amp;quot;for_dnsin&amp;quot;${_dns_list[@]}&amp;quot;;do#Resolve domain.host&amp;quot;${_domain}&amp;quot;&amp;quot;${_dns}&amp;quot;echodonefor_protoinhttp https;doprintf&amp;quot;[\\e[1;32m+\\e[m] trace + headers: %s://%s\\n&amp;quot;&amp;quot;$_proto&amp;quot;&amp;quot;$_domain&amp;quot;#Get trace and http headers.curl -Iks -A&amp;quot;x-agent&amp;quot;--location&amp;quot;${_proto}://${_domain}&amp;quot;echodonedoneunset_domain_list _dns_list&lt;/pre&gt;&lt;/div&gt;  &lt;hr&gt;&lt;/hr&gt;  &lt;h5&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#tool-httpie"&gt;&lt;/a&gt;Tool:    &lt;a href="https://httpie.org/" rel="nofollow"&gt;httpie&lt;/a&gt;&lt;/h5&gt;  &lt;div&gt;    &lt;pre&gt;http -p Hh https://www.google.com&lt;/pre&gt;&lt;/div&gt;  &lt;ul&gt;    &lt;li&gt;      &lt;code&gt;-p&lt;/code&gt;- print request and response headers      &lt;ul&gt;        &lt;li&gt;          &lt;code&gt;H&lt;/code&gt;- request headers&lt;/li&gt;        &lt;li&gt;          &lt;code&gt;B&lt;/code&gt;- request body&lt;/li&gt;        &lt;li&gt;          &lt;code&gt;h&lt;/code&gt;- response headers&lt;/li&gt;        &lt;li&gt;          &lt;code&gt;b&lt;/code&gt;- response body&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ul&gt;  &lt;div&gt;    &lt;pre&gt;http -p Hh https://www.google.com --follow --verify no&lt;/pre&gt;&lt;/div&gt;  &lt;ul&gt;    &lt;li&gt;      &lt;code&gt;-F, --follow&lt;/code&gt;- follow redirects&lt;/li&gt;    &lt;li&gt;      &lt;code&gt;--verify no&lt;/code&gt;- skip SSL verification&lt;/li&gt;&lt;/ul&gt;  &lt;div&gt;    &lt;pre&gt;http -p Hh https://www.google.com --follow --verify no \
--proxy http:http://127.0.0.1:16379&lt;/pre&gt;&lt;/div&gt;  &lt;ul&gt;    &lt;li&gt;      &lt;code&gt;--proxy [http:]&lt;/code&gt;- set proxy server&lt;/li&gt;&lt;/ul&gt;  &lt;h5&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#tool-ssh"&gt;&lt;/a&gt;Tool:    &lt;a href="https://www.openssh.com/" rel="nofollow"&gt;ssh&lt;/a&gt;&lt;/h5&gt;  &lt;h6&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#escape-sequence"&gt;&lt;/a&gt;Escape Sequence&lt;/h6&gt;  &lt;div&gt;    &lt;pre&gt;      &lt;code&gt;# Supported escape sequences:
~.  - terminate connection (and any multiplexed sessions)
~B  - send a BREAK to the remote system
~C  - open a command line
~R  - Request rekey (SSH protocol 2 only)
~^Z - suspend ssh
~#  - list forwarded connections
~&amp;amp;  - background ssh (when waiting for connections to terminate)
~?  - this message
~~  - send the escape character by typing it twice&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;  &lt;h6&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#compare-a-remote-file-with-a-local-file"&gt;&lt;/a&gt;Compare a remote file with a local file&lt;/h6&gt;  &lt;div&gt;    &lt;pre&gt;ssh user@host cat /path/to/remotefile|diff /path/to/localfile -&lt;/pre&gt;&lt;/div&gt;  &lt;h6&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#ssh-connection-through-host-in-the-middle"&gt;&lt;/a&gt;SSH connection through host in the middle&lt;/h6&gt;  &lt;div&gt;    &lt;pre&gt;ssh -t reachable_host ssh unreachable_host&lt;/pre&gt;&lt;/div&gt;  &lt;h6&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#run-command-over-ssh-on-remote-host"&gt;&lt;/a&gt;Run command over SSH on remote host&lt;/h6&gt;  &lt;div&gt;    &lt;pre&gt;cat&amp;gt;cmd.txt&amp;lt;&amp;lt;__EOF__cat /etc/hosts__EOF__ssh host -l user$(&amp;lt;cmd.txt)&lt;/pre&gt;&lt;/div&gt;  &lt;h6&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#get-public-key-from-private-key-1"&gt;&lt;/a&gt;Get public key from private key&lt;/h6&gt;  &lt;div&gt;    &lt;pre&gt;ssh-keygen -y -f~/.ssh/id_rsa&lt;/pre&gt;&lt;/div&gt;  &lt;h6&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#get-all-fingerprints"&gt;&lt;/a&gt;Get all fingerprints&lt;/h6&gt;  &lt;div&gt;    &lt;pre&gt;ssh-keygen -l -f .ssh/known_hosts&lt;/pre&gt;&lt;/div&gt;  &lt;h6&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#ssh-authentication-with-user-password"&gt;&lt;/a&gt;SSH authentication with user password&lt;/h6&gt;  &lt;div&gt;    &lt;pre&gt;ssh -o PreferredAuthentications=password -o PubkeyAuthentication=no user@remote_host&lt;/pre&gt;&lt;/div&gt;  &lt;h6&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#ssh-authentication-with-publickey"&gt;&lt;/a&gt;SSH authentication with publickey&lt;/h6&gt;  &lt;div&gt;    &lt;pre&gt;ssh -o PreferredAuthentications=publickey -o PubkeyAuthentication=yes -i id_rsa user@remote_host&lt;/pre&gt;&lt;/div&gt;  &lt;h6&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#simple-recording-ssh-session"&gt;&lt;/a&gt;Simple recording SSH session&lt;/h6&gt;  &lt;div&gt;    &lt;pre&gt;function_ssh_sesslog(){

  _sesdir=&amp;quot;&amp;lt;path/to/session/logs&amp;gt;&amp;quot;mkdir -p&amp;quot;${_sesdir}&amp;quot;&amp;amp;&amp;amp;\
  ssh$@2&amp;gt;&amp;amp;1|tee -a&amp;quot;${_sesdir}/$(date +%Y%m%d).log&amp;quot;}#Alias:aliasssh=&amp;apos;_ssh_sesslog&amp;apos;&lt;/pre&gt;&lt;/div&gt;  &lt;h6&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#using-keychain-for-ssh-logins"&gt;&lt;/a&gt;Using Keychain for SSH logins&lt;/h6&gt;  &lt;div&gt;    &lt;pre&gt;### Delete all of ssh-agent&amp;apos;s keys.function_scl(){

  /usr/bin/keychain --clear

}### Add key to keychain.function_scg(){

  /usr/bin/keychain /path/to/private-keysource&amp;quot;$HOME/.keychain/$HOSTNAME-sh&amp;quot;}&lt;/pre&gt;&lt;/div&gt;  &lt;h6&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#ssh-login-without-processing-any-login-scripts"&gt;&lt;/a&gt;SSH login without processing any login scripts&lt;/h6&gt;  &lt;div&gt;    &lt;pre&gt;ssh -tt user@host bash&lt;/pre&gt;&lt;/div&gt;  &lt;h6&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#ssh-local-port-forwarding"&gt;&lt;/a&gt;SSH local port forwarding&lt;/h6&gt;  &lt;p&gt;Example 1:&lt;/p&gt;  &lt;div&gt;    &lt;pre&gt;#Forwarding our local 2250 port to nmap.org:443 from localhost through localhosthost1&amp;gt;ssh -L 2250:nmap.org:443 localhost#Connect to the service:host1&amp;gt;curl -Iks --location -X GET https://localhost:2250&lt;/pre&gt;&lt;/div&gt;  &lt;p&gt;Example 2:&lt;/p&gt;  &lt;div&gt;    &lt;pre&gt;#Forwarding our local 9051 port to db.d.x:5432 from localhost through node.d.yhost1&amp;gt;ssh -nNT -L 9051:db.d.x:5432 node.d.y#Connect to the service:host1&amp;gt;psql -U db_user -d db_dev -p 9051 -h localhost&lt;/pre&gt;&lt;/div&gt;  &lt;ul&gt;    &lt;li&gt;      &lt;code&gt;-n&lt;/code&gt;- redirects stdin from      &lt;code&gt;/dev/null&lt;/code&gt;&lt;/li&gt;    &lt;li&gt;      &lt;code&gt;-N&lt;/code&gt;- do not execute a remote command&lt;/li&gt;    &lt;li&gt;      &lt;code&gt;-T&lt;/code&gt;- disable pseudo-terminal allocation&lt;/li&gt;&lt;/ul&gt;  &lt;h6&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#ssh-remote-port-forwarding"&gt;&lt;/a&gt;SSH remote port forwarding&lt;/h6&gt;  &lt;div&gt;    &lt;pre&gt;#Forwarding our local 9051 port to db.d.x:5432 from host2 through node.d.yhost1&amp;gt;ssh -nNT -R 9051:db.d.x:5432 node.d.y#Connect to the service:host2&amp;gt;psql -U postgres -d postgres -p 8000 -h localhost&lt;/pre&gt;&lt;/div&gt;  &lt;hr&gt;&lt;/hr&gt;  &lt;h5&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#tool-linux-dev"&gt;&lt;/a&gt;Tool:    &lt;a href="https://www.tldp.org/LDP/abs/html/devref1.html" rel="nofollow"&gt;linux-dev&lt;/a&gt;&lt;/h5&gt;  &lt;h6&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#testing-remote-connection-to-port"&gt;&lt;/a&gt;Testing remote connection to port&lt;/h6&gt;  &lt;div&gt;    &lt;pre&gt;timeout 1 bash -c&amp;quot;&amp;lt;/dev/&amp;lt;proto&amp;gt;/&amp;lt;host&amp;gt;/&amp;lt;port&amp;gt;&amp;quot;&amp;gt;/dev/null2&amp;gt;&amp;amp;1;echo$?&lt;/pre&gt;&lt;/div&gt;  &lt;ul&gt;    &lt;li&gt;      &lt;code&gt;&amp;lt;proto&lt;/code&gt;- set protocol (tcp/udp)&lt;/li&gt;    &lt;li&gt;      &lt;code&gt;&amp;lt;host&amp;gt;&lt;/code&gt;- set remote host&lt;/li&gt;    &lt;li&gt;      &lt;code&gt;&amp;lt;port&amp;gt;&lt;/code&gt;- set destination port&lt;/li&gt;&lt;/ul&gt;  &lt;h6&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#read-and-write-to-tcp-or-udp-sockets-with-common-bash-tools"&gt;&lt;/a&gt;Read and write to TCP or UDP sockets with common bash tools&lt;/h6&gt;  &lt;div&gt;    &lt;pre&gt;exec5&amp;lt;&amp;gt;/dev/tcp/&amp;lt;host&amp;gt;/&amp;lt;port&amp;gt;;cat&amp;lt;&amp;amp;5&amp;amp;cat&amp;gt;&amp;amp;5;exec5&amp;gt;&amp;amp;-&lt;/pre&gt;&lt;/div&gt;  &lt;hr&gt;&lt;/hr&gt;  &lt;h5&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#tool-tcpdump"&gt;&lt;/a&gt;Tool:    &lt;a href="http://www.tcpdump.org/" rel="nofollow"&gt;tcpdump&lt;/a&gt;&lt;/h5&gt;  &lt;h6&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#filter-incoming-on-interface-traffic-specific-ipport"&gt;&lt;/a&gt;Filter incoming (on interface) traffic (specific ip:port)&lt;/h6&gt;  &lt;div&gt;    &lt;pre&gt;tcpdump -ne -i eth0 -Qinhost 192.168.252.1 and port 443&lt;/pre&gt;&lt;/div&gt;  &lt;ul&gt;    &lt;li&gt;      &lt;code&gt;-n&lt;/code&gt;- don&amp;apos;t convert addresses (      &lt;code&gt;-nn&lt;/code&gt;will not resolve hostnames or ports)&lt;/li&gt;    &lt;li&gt;      &lt;code&gt;-e&lt;/code&gt;- print the link-level headers&lt;/li&gt;    &lt;li&gt;      &lt;code&gt;-i [iface|any]&lt;/code&gt;- set interface&lt;/li&gt;    &lt;li&gt;      &lt;code&gt;-Q|-D [in|out|inout]&lt;/code&gt;- choose send/receive direction (      &lt;code&gt;-D&lt;/code&gt;- for old tcpdump versions)&lt;/li&gt;    &lt;li&gt;      &lt;code&gt;host [ip|hostname]&lt;/code&gt;- set host, also      &lt;code&gt;[host not]&lt;/code&gt;&lt;/li&gt;    &lt;li&gt;      &lt;code&gt;[and|or]&lt;/code&gt;- set logic&lt;/li&gt;    &lt;li&gt;      &lt;code&gt;port [1-65535]&lt;/code&gt;- set port number, also      &lt;code&gt;[port not]&lt;/code&gt;&lt;/li&gt;&lt;/ul&gt;  &lt;h6&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#filter-incoming-on-interface-traffic-specific-ipport-and-write-to-a-file"&gt;&lt;/a&gt;Filter incoming (on interface) traffic (specific ip:port) and write to a file&lt;/h6&gt;  &lt;div&gt;    &lt;pre&gt;tcpdump -ne -i eth0 -Qinhost 192.168.252.1 and port 443 -c 5 -w tcpdump.pcap&lt;/pre&gt;&lt;/div&gt;  &lt;ul&gt;    &lt;li&gt;      &lt;code&gt;-c [num]&lt;/code&gt;- capture only num number of packets&lt;/li&gt;    &lt;li&gt;      &lt;code&gt;-w [filename]&lt;/code&gt;- write packets to file,      &lt;code&gt;-r [filename]&lt;/code&gt;- reading from file&lt;/li&gt;&lt;/ul&gt;  &lt;h6&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#capture-all-icmp-packets"&gt;&lt;/a&gt;Capture all ICMP packets&lt;/h6&gt;  &lt;div&gt;    &lt;pre&gt;tcpdump -nei eth0 icmp&lt;/pre&gt;&lt;/div&gt;  &lt;h6&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#check-protocol-used-tcp-or-udp-for-service"&gt;&lt;/a&gt;Check protocol used (TCP or UDP) for service&lt;/h6&gt;  &lt;div&gt;    &lt;pre&gt;tcpdump -nei eth0 tcp port 22 -vv -X|egrep&amp;quot;TCP|UDP&amp;quot;&lt;/pre&gt;&lt;/div&gt;  &lt;h6&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#display-ascii-text-to-parse-the-output-using-grep-or-other"&gt;&lt;/a&gt;Display ASCII text (to parse the output using grep or other)&lt;/h6&gt;  &lt;div&gt;    &lt;pre&gt;tcpdump -i eth0 -A -s0 port 443&lt;/pre&gt;&lt;/div&gt;  &lt;h6&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#grab-everything-between-two-keywords"&gt;&lt;/a&gt;Grab everything between two keywords&lt;/h6&gt;  &lt;div&gt;    &lt;pre&gt;tcpdump -i eth0 port 80 -X|sed -n -e&amp;apos;/username/,/=ldap/ p&amp;apos;&lt;/pre&gt;&lt;/div&gt;  &lt;h6&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#grab-user-and-pass-ever-plain-http"&gt;&lt;/a&gt;Grab user and pass ever plain http&lt;/h6&gt;  &lt;div&gt;    &lt;pre&gt;tcpdump -i eth0  port http -l -A|egrep -i \&amp;apos;pass=|pwd=|log=|login=|user=|username=|pw=|passw=|passwd=|password=|pass:|user:|username:|password:|login:|pass |user&amp;apos;\
--color=auto --line-buffered -B20&lt;/pre&gt;&lt;/div&gt;  &lt;h6&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#extract-http-user-agent-from-http-request-header"&gt;&lt;/a&gt;Extract HTTP User Agent from HTTP request header&lt;/h6&gt;  &lt;div&gt;    &lt;pre&gt;tcpdump -ei eth0 -nn -A -s1500 -l|grep&amp;quot;User-Agent:&amp;quot;&lt;/pre&gt;&lt;/div&gt;  &lt;h6&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#capture-only-http-get-and-post-packets"&gt;&lt;/a&gt;Capture only HTTP GET and POST packets&lt;/h6&gt;  &lt;div&gt;    &lt;pre&gt;tcpdump -ei eth0 -s 0 -A -vv \&amp;apos;tcp[((tcp[12:1] &amp;amp; 0xf0) &amp;gt;&amp;gt; 2):4] = 0x47455420&amp;apos;or&amp;apos;tcp[((tcp[12:1] &amp;amp; 0xf0) &amp;gt;&amp;gt; 2):4] = 0x504f5354&amp;apos;&lt;/pre&gt;&lt;/div&gt;  &lt;p&gt;or simply:&lt;/p&gt;  &lt;div&gt;    &lt;pre&gt;tcpdump -ei eth0 -s 0 -v -n -l|egrep -i&amp;quot;POST /|GET /|Host:&amp;quot;&lt;/pre&gt;&lt;/div&gt;  &lt;h6&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#rotate-capture-files"&gt;&lt;/a&gt;Rotate capture files&lt;/h6&gt;  &lt;div&gt;    &lt;pre&gt;tcpdump -ei eth0 -w /tmp/capture-%H.pcap -G 3600 -C 200&lt;/pre&gt;&lt;/div&gt;  &lt;ul&gt;    &lt;li&gt;      &lt;code&gt;-G &amp;lt;num&amp;gt;&lt;/code&gt;- pcap will be created every      &lt;code&gt;&amp;lt;num&amp;gt;&lt;/code&gt;seconds&lt;/li&gt;    &lt;li&gt;      &lt;code&gt;-C &amp;lt;size&amp;gt;&lt;/code&gt;- close the current pcap and open a new one if is larger than      &lt;code&gt;&amp;lt;size&amp;gt;&lt;/code&gt;&lt;/li&gt;&lt;/ul&gt;  &lt;h6&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#top-hosts-by-packets"&gt;&lt;/a&gt;Top hosts by packets&lt;/h6&gt;  &lt;div&gt;    &lt;pre&gt;tcpdump -ei enp0s25 -nnn -t -c 200|cut -f 1,2,3,4 -d&amp;apos;.&amp;apos;|sort|uniq -c|sort -nr|head -n 20&lt;/pre&gt;&lt;/div&gt;  &lt;h6&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#excludes-any-rfc-1918-private-address"&gt;&lt;/a&gt;Excludes any RFC 1918 private address&lt;/h6&gt;  &lt;div&gt;    &lt;pre&gt;tcpdump -nei eth0&amp;apos;not (src net (10 or 172.16/12 or 192.168/16) and dst net (10 or 172.16/12 or 192.168/16))&amp;apos;&lt;/pre&gt;&lt;/div&gt;  &lt;hr&gt;&lt;/hr&gt;  &lt;h5&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#tool-tcpick"&gt;&lt;/a&gt;Tool:    &lt;a href="http://tcpick.sourceforge.net/" rel="nofollow"&gt;tcpick&lt;/a&gt;&lt;/h5&gt;  &lt;h6&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#analyse-packets-in-real-time"&gt;&lt;/a&gt;Analyse packets in real-time&lt;/h6&gt;  &lt;div&gt;    &lt;pre&gt;whiletrue;dotcpick -a -C -r dump.pcap;sleep 2;clear;done&lt;/pre&gt;&lt;/div&gt;  &lt;hr&gt;&lt;/hr&gt;  &lt;h5&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#tool-ngrep"&gt;&lt;/a&gt;Tool:    &lt;a href="http://ngrep.sourceforge.net/usage.html" rel="nofollow"&gt;ngrep&lt;/a&gt;&lt;/h5&gt;  &lt;div&gt;    &lt;pre&gt;ngrep -d eth0&amp;quot;www.domain.com&amp;quot;port 443&lt;/pre&gt;&lt;/div&gt;  &lt;ul&gt;    &lt;li&gt;      &lt;code&gt;-d [iface|any]&lt;/code&gt;- set interface&lt;/li&gt;    &lt;li&gt;      &lt;code&gt;[domain]&lt;/code&gt;- set hostname&lt;/li&gt;    &lt;li&gt;      &lt;code&gt;port [1-65535]&lt;/code&gt;- set port number&lt;/li&gt;&lt;/ul&gt;  &lt;div&gt;    &lt;pre&gt;ngrep -d eth0&amp;quot;www.domain.com&amp;quot;src host 10.240.20.2 and port 443&lt;/pre&gt;&lt;/div&gt;  &lt;ul&gt;    &lt;li&gt;      &lt;code&gt;(host [ip|hostname])&lt;/code&gt;- filter by ip or hostname&lt;/li&gt;    &lt;li&gt;      &lt;code&gt;(port [1-65535])&lt;/code&gt;- filter by port number&lt;/li&gt;&lt;/ul&gt;  &lt;div&gt;    &lt;pre&gt;ngrep -d eth0 -qt -O ngrep.pcap&amp;quot;www.domain.com&amp;quot;port 443&lt;/pre&gt;&lt;/div&gt;  &lt;ul&gt;    &lt;li&gt;      &lt;code&gt;-q&lt;/code&gt;- quiet mode (only payloads)&lt;/li&gt;    &lt;li&gt;      &lt;code&gt;-t&lt;/code&gt;- added timestamps&lt;/li&gt;    &lt;li&gt;      &lt;code&gt;-O [filename]&lt;/code&gt;- save output to file,      &lt;code&gt;-I [filename]&lt;/code&gt;- reading from file&lt;/li&gt;&lt;/ul&gt;  &lt;div&gt;    &lt;pre&gt;ngrep -d eth0 -qt&amp;apos;HTTP&amp;apos;&amp;apos;tcp&amp;apos;&lt;/pre&gt;&lt;/div&gt;  &lt;ul&gt;    &lt;li&gt;      &lt;code&gt;HTTP&lt;/code&gt;- show http headers&lt;/li&gt;    &lt;li&gt;      &lt;code&gt;tcp|udp&lt;/code&gt;- set protocol&lt;/li&gt;    &lt;li&gt;      &lt;code&gt;[src|dst] host [ip|hostname]&lt;/code&gt;- set direction for specific node&lt;/li&gt;&lt;/ul&gt;  &lt;div&gt;    &lt;pre&gt;ngrep -l -q -d eth0 -i&amp;quot;User-Agent: curl*&amp;quot;&lt;/pre&gt;&lt;/div&gt;  &lt;ul&gt;    &lt;li&gt;      &lt;code&gt;-l&lt;/code&gt;- stdout line buffered&lt;/li&gt;    &lt;li&gt;      &lt;code&gt;-i&lt;/code&gt;- case-insensitive search&lt;/li&gt;&lt;/ul&gt;  &lt;hr&gt;&lt;/hr&gt;  &lt;h5&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#tool-hping3"&gt;&lt;/a&gt;Tool:    &lt;a href="http://www.hping.org/" rel="nofollow"&gt;hping3&lt;/a&gt;&lt;/h5&gt;  &lt;div&gt;    &lt;pre&gt;hping3 -V -p 80 -s 5050&amp;lt;scan_type&amp;gt;www.google.com&lt;/pre&gt;&lt;/div&gt;  &lt;ul&gt;    &lt;li&gt;      &lt;code&gt;-V|--verbose&lt;/code&gt;- verbose mode&lt;/li&gt;    &lt;li&gt;      &lt;code&gt;-p|--destport&lt;/code&gt;- set destination port&lt;/li&gt;    &lt;li&gt;      &lt;code&gt;-s|--baseport&lt;/code&gt;- set source port&lt;/li&gt;    &lt;li&gt;      &lt;code&gt;&amp;lt;scan_type&amp;gt;&lt;/code&gt;- set scan type      &lt;ul&gt;        &lt;li&gt;          &lt;code&gt;-F|--fin&lt;/code&gt;- set FIN flag, port open if no reply&lt;/li&gt;        &lt;li&gt;          &lt;code&gt;-S|--syn&lt;/code&gt;- set SYN flag&lt;/li&gt;        &lt;li&gt;          &lt;code&gt;-P|--push&lt;/code&gt;- set PUSH flag&lt;/li&gt;        &lt;li&gt;          &lt;code&gt;-A|--ack&lt;/code&gt;- set ACK flag (use when ping is blocked, RST response back if the port is open)&lt;/li&gt;        &lt;li&gt;          &lt;code&gt;-U|--urg&lt;/code&gt;- set URG flag&lt;/li&gt;        &lt;li&gt;          &lt;code&gt;-Y|--ymas&lt;/code&gt;- set Y unused flag (0x80 - nullscan), port open if no reply&lt;/li&gt;        &lt;li&gt;          &lt;code&gt;-M 0 -UPF&lt;/code&gt;- set TCP sequence number and scan type (URG+PUSH+FIN), port open if no reply&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ul&gt;  &lt;div&gt;    &lt;pre&gt;hping3 -V -c 1 -1 -C 8 www.google.com&lt;/pre&gt;&lt;/div&gt;  &lt;ul&gt;    &lt;li&gt;      &lt;code&gt;-c [num]&lt;/code&gt;- packet count&lt;/li&gt;    &lt;li&gt;      &lt;code&gt;-1&lt;/code&gt;- set ICMP mode&lt;/li&gt;    &lt;li&gt;      &lt;code&gt;-C|--icmptype [icmp-num]&lt;/code&gt;- set icmp type (default icmp-echo = 8)&lt;/li&gt;&lt;/ul&gt;  &lt;div&gt;    &lt;pre&gt;hping3 -V -c 1000000 -d 120 -S -w 64 -p 80 --flood --rand-source&amp;lt;remote_host&amp;gt;&lt;/pre&gt;&lt;/div&gt;  &lt;ul&gt;    &lt;li&gt;      &lt;code&gt;--flood&lt;/code&gt;- sent packets as fast as possible (don&amp;apos;t show replies)&lt;/li&gt;    &lt;li&gt;      &lt;code&gt;--rand-source&lt;/code&gt;- random source address mode&lt;/li&gt;    &lt;li&gt;      &lt;code&gt;-d --data&lt;/code&gt;- data size&lt;/li&gt;    &lt;li&gt;      &lt;code&gt;-w|--win&lt;/code&gt;- winsize (default 64)&lt;/li&gt;&lt;/ul&gt;  &lt;hr&gt;&lt;/hr&gt;  &lt;h5&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#tool-nmap"&gt;&lt;/a&gt;Tool:    &lt;a href="https://nmap.org/" rel="nofollow"&gt;nmap&lt;/a&gt;&lt;/h5&gt;  &lt;h6&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#ping-scans-the-network"&gt;&lt;/a&gt;Ping scans the network&lt;/h6&gt;  &lt;div&gt;    &lt;pre&gt;nmap -sP 192.168.0.0/24&lt;/pre&gt;&lt;/div&gt;  &lt;h6&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#show-only-open-ports"&gt;&lt;/a&gt;Show only open ports&lt;/h6&gt;  &lt;div&gt;    &lt;pre&gt;nmap -F --open 192.168.0.0/24&lt;/pre&gt;&lt;/div&gt;  &lt;h6&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#full-tcp-port-scan-using-with-service-version-detection"&gt;&lt;/a&gt;Full TCP port scan using with service version detection&lt;/h6&gt;  &lt;div&gt;    &lt;pre&gt;nmap -p 1-65535 -sV -sS -T4 192.168.0.0/24&lt;/pre&gt;&lt;/div&gt;  &lt;h6&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#nmap-scan-and-pass-output-to-nikto"&gt;&lt;/a&gt;Nmap scan and pass output to Nikto&lt;/h6&gt;  &lt;div&gt;    &lt;pre&gt;nmap -p80,443 192.168.0.0/24 -oG -|nikto.pl -h -&lt;/pre&gt;&lt;/div&gt;  &lt;h6&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#recon-specific-ipservice-with-nmap-nse-scripts-stack"&gt;&lt;/a&gt;Recon specific ip:service with Nmap NSE scripts stack&lt;/h6&gt;  &lt;div&gt;    &lt;pre&gt;#Set variables:_hosts=&amp;quot;192.168.250.10&amp;quot;_ports=&amp;quot;80,443&amp;quot;#Set Nmap NSE scripts stack:_nmap_nse_scripts=&amp;quot;+dns-brute,\+http-auth-finder,\+http-chrono,\+http-cookie-flags,\+http-cors,\+http-cross-domain-policy,\+http-csrf,\+http-dombased-xss,\+http-enum,\+http-errors,\+http-git,\+http-grep,\+http-internal-ip-disclosure,\+http-jsonp-detection,\+http-malware-host,\+http-methods,\+http-passwd,\+http-phpself-xss,\+http-php-version,\+http-robots.txt,\+http-sitemap-generator,\+http-shellshock,\+http-stored-xss,\+http-title,\+http-unsafe-output-escaping,\+http-useragent-tester,\+http-vhosts,\+http-waf-detect,\+http-waf-fingerprint,\+http-xssed,\+traceroute-geolocation.nse,\+ssl-enum-ciphers,\+whois-domain,\+whois-ip&amp;quot;#Set Nmap NSE script params:_nmap_nse_scripts_args=&amp;quot;dns-brute.domain=${_hosts},http-cross-domain-policy.domain-lookup=true,&amp;quot;_nmap_nse_scripts_args+=&amp;quot;http-waf-detect.aggro,http-waf-detect.detectBodyChanges,&amp;quot;_nmap_nse_scripts_args+=&amp;quot;http-waf-fingerprint.intensive=1&amp;quot;#Perform scan:nmap --script=&amp;quot;$_nmap_nse_scripts&amp;quot;--script-args=&amp;quot;$_nmap_nse_scripts_args&amp;quot;-p&amp;quot;$_ports&amp;quot;&amp;quot;$_hosts&amp;quot;&lt;/pre&gt;&lt;/div&gt;  &lt;hr&gt;&lt;/hr&gt;  &lt;h5&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#tool-netcat"&gt;&lt;/a&gt;Tool:    &lt;a href="http://netcat.sourceforge.net/" rel="nofollow"&gt;netcat&lt;/a&gt;&lt;/h5&gt;  &lt;div&gt;    &lt;pre&gt;nc -kl 5000&lt;/pre&gt;&lt;/div&gt;  &lt;ul&gt;    &lt;li&gt;      &lt;code&gt;-l&lt;/code&gt;- listen for an incoming connection&lt;/li&gt;    &lt;li&gt;      &lt;code&gt;-k&lt;/code&gt;- listening after client has disconnected&lt;/li&gt;    &lt;li&gt;      &lt;code&gt;&amp;gt;filename.out&lt;/code&gt;- save receive data to file (optional)&lt;/li&gt;&lt;/ul&gt;  &lt;div&gt;    &lt;pre&gt;nc 192.168.0.1 5051&amp;lt;filename.in&lt;/pre&gt;&lt;/div&gt;  &lt;ul&gt;    &lt;li&gt;      &lt;code&gt;&amp;lt; filename.in&lt;/code&gt;- send data to remote host&lt;/li&gt;&lt;/ul&gt;  &lt;div&gt;    &lt;pre&gt;nc -vz 10.240.30.3 5000&lt;/pre&gt;&lt;/div&gt;  &lt;ul&gt;    &lt;li&gt;      &lt;code&gt;-v&lt;/code&gt;- verbose output&lt;/li&gt;    &lt;li&gt;      &lt;code&gt;-z&lt;/code&gt;- scan for listening daemons&lt;/li&gt;&lt;/ul&gt;  &lt;div&gt;    &lt;pre&gt;nc -vzu 10.240.30.3 1-65535&lt;/pre&gt;&lt;/div&gt;  &lt;ul&gt;    &lt;li&gt;      &lt;code&gt;-u&lt;/code&gt;- scan only udp ports&lt;/li&gt;&lt;/ul&gt;  &lt;h6&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#transfer-data-file-archive"&gt;&lt;/a&gt;Transfer data file (archive)&lt;/h6&gt;  &lt;div&gt;    &lt;pre&gt;server&amp;gt;nc -l 5000|tar xzvfp -
client&amp;gt;tar czvfp - /path/to/dir|nc 10.240.30.3 5000&lt;/pre&gt;&lt;/div&gt;  &lt;h6&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#launch-remote-shell"&gt;&lt;/a&gt;Launch remote shell&lt;/h6&gt;  &lt;div&gt;    &lt;pre&gt;#1)server&amp;gt;nc -l 5000 -e /bin/bash
client&amp;gt;nc 10.240.30.3 5000#2)server&amp;gt;rm -f /tmp/f;mkfifo /tmp/f
server&amp;gt;cat /tmp/f|/bin/bash -i2&amp;gt;&amp;amp;1|nc -l 127.0.0.1 5000&amp;gt;/tmp/f
client&amp;gt;nc 10.240.30.3 5000&lt;/pre&gt;&lt;/div&gt;  &lt;h6&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#simple-file-server"&gt;&lt;/a&gt;Simple file server&lt;/h6&gt;  &lt;div&gt;    &lt;pre&gt;whiletrue;donc -l 5000|tar -xvf -;done&lt;/pre&gt;&lt;/div&gt;  &lt;h6&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#simple-minimal-http-server"&gt;&lt;/a&gt;Simple minimal HTTP Server&lt;/h6&gt;  &lt;div&gt;    &lt;pre&gt;whiletrue;donc -l -p 1500 -c&amp;apos;echo -e &amp;quot;HTTP/1.1 200 OK\n\n $(date)&amp;quot;&amp;apos;;done&lt;/pre&gt;&lt;/div&gt;  &lt;h6&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#simple-http-server"&gt;&lt;/a&gt;Simple HTTP Server&lt;/h6&gt;  &lt;blockquote&gt;    &lt;p&gt;Restarts web server after each request - remove      &lt;code&gt;while&lt;/code&gt;condition for only single connection.&lt;/p&gt;&lt;/blockquote&gt;  &lt;div&gt;    &lt;pre&gt;cat&amp;gt;index.html&amp;lt;&amp;lt;__EOF__&amp;lt;!doctype html&amp;gt;&amp;lt;head&amp;gt;&amp;lt;meta charset=&amp;quot;utf-8&amp;quot;&amp;gt;&amp;lt;meta http-equiv=&amp;quot;X-UA-Compatible&amp;quot; content=&amp;quot;IE=edge,chrome=1&amp;quot;&amp;gt;&amp;lt;title&amp;gt;&amp;lt;/title&amp;gt;&amp;lt;meta name=&amp;quot;description&amp;quot; content=&amp;quot;&amp;quot;&amp;gt;&amp;lt;meta name=&amp;quot;viewport&amp;quot; content=&amp;quot;width=device-width, initial-scale=1&amp;quot;&amp;gt;&amp;lt;/head&amp;gt;&amp;lt;body&amp;gt;&amp;lt;p&amp;gt;Hello! It&amp;apos;s a site.&amp;lt;/p&amp;gt;&amp;lt;/body&amp;gt;&amp;lt;/html&amp;gt;__EOF__&lt;/pre&gt;&lt;/div&gt;  &lt;div&gt;    &lt;pre&gt;server&amp;gt;while:;do\
(echo -ne&amp;quot;HTTP/1.1 200 OK\r\nContent-Length:$(wc -c&amp;lt;index.html)\r\n\r\n&amp;quot;;cat index.html;)|\
nc -l -p 5000 \;done&lt;/pre&gt;&lt;/div&gt;  &lt;ul&gt;    &lt;li&gt;      &lt;code&gt;-p&lt;/code&gt;- port number&lt;/li&gt;&lt;/ul&gt;  &lt;h6&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#simple-http-proxy-single-connection"&gt;&lt;/a&gt;Simple HTTP Proxy (single connection)&lt;/h6&gt;  &lt;div&gt;    &lt;pre&gt;#!/usr/bin/env bashif[[$#!=2 ]];thenprintf&amp;quot;%s\\n&amp;quot;\&amp;quot;usage: ./nc-proxy listen-port bk_host:bk_port&amp;quot;fi_listen_port=&amp;quot;$1&amp;quot;_bk_host=$(echo&amp;quot;$2&amp;quot;|cut -d&amp;quot;:&amp;quot;-f1)_bk_port=$(echo&amp;quot;$2&amp;quot;|cut -d&amp;quot;:&amp;quot;-f2)printf&amp;quot;lport: %s\\nbk_host: %s\\nbk_port: %s\\n\\n&amp;quot;\&amp;quot;$_listen_port&amp;quot;&amp;quot;$_bk_host&amp;quot;&amp;quot;$_bk_port&amp;quot;_tmp=$(mktemp -d)_back=&amp;quot;$_tmp/pipe.back&amp;quot;_sent=&amp;quot;$_tmp/pipe.sent&amp;quot;_recv=&amp;quot;$_tmp/pipe.recv&amp;quot;trap&amp;apos;rm -rf &amp;quot;$_tmp&amp;quot;&amp;apos;EXIT

mkfifo -m 0600&amp;quot;$_back&amp;quot;&amp;quot;$_sent&amp;quot;&amp;quot;$_recv&amp;quot;sed&amp;quot;s/^/=&amp;gt; /&amp;quot;&amp;lt;&amp;quot;$_sent&amp;quot;&amp;amp;sed&amp;quot;s/^/&amp;lt;=  /&amp;quot;&amp;lt;&amp;quot;$_recv&amp;quot;&amp;amp;nc -l -p&amp;quot;$_listen_port&amp;quot;&amp;lt;&amp;quot;$_back&amp;quot;|\
tee&amp;quot;$_sent&amp;quot;|\
nc&amp;quot;$_bk_host&amp;quot;&amp;quot;$_bk_port&amp;quot;|\
tee&amp;quot;$_recv&amp;quot;&amp;gt;&amp;quot;$_back&amp;quot;&lt;/pre&gt;&lt;/div&gt;  &lt;div&gt;    &lt;pre&gt;server&amp;gt;chmod +x nc-proxy&amp;amp;&amp;amp;./nc-proxy 8080 192.168.252.10:8000
  lport: 8080
bk_host: 192.168.252.10
bk_port: 8000

client&amp;gt;http -p h 10.240.30.3:8080
HTTP/1.1 200 OK
Accept-Ranges: bytes
Cache-Control: max-age=31536000
Content-Length: 2748
Content-Type: text/html;charset=utf-8
Date: Sun, 01 Jul 2018 20:12:08 GMT
Last-Modified: Sun, 01 Apr 2018 21:53:37 GMT&lt;/pre&gt;&lt;/div&gt;  &lt;h6&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#create-a-single-use-tcp-or-udp-proxy"&gt;&lt;/a&gt;Create a single-use TCP or UDP proxy&lt;/h6&gt;  &lt;div&gt;    &lt;pre&gt;### TCP -&amp;gt; TCPnc -l -p 2000 -c&amp;quot;nc [ip|hostname] 3000&amp;quot;### TCP -&amp;gt; UDPnc -l -p 2000 -c&amp;quot;nc -u [ip|hostname] 3000&amp;quot;### UDP -&amp;gt; UDPnc -l -u -p 2000 -c&amp;quot;nc -u [ip|hostname] 3000&amp;quot;### UDP -&amp;gt; TCPnc -l -u -p 2000 -c&amp;quot;nc [ip|hostname] 3000&amp;quot;&lt;/pre&gt;&lt;/div&gt;  &lt;hr&gt;&lt;/hr&gt;  &lt;h5&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#tool-gnutls-cli"&gt;&lt;/a&gt;Tool:    &lt;a href="https://gnutls.org/manual/html_node/gnutls_002dcli-Invocation.html" rel="nofollow"&gt;gnutls-cli&lt;/a&gt;&lt;/h5&gt;  &lt;h6&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#testing-connection-to-remote-host-with-sni-support"&gt;&lt;/a&gt;Testing connection to remote host (with SNI support)&lt;/h6&gt;  &lt;div&gt;    &lt;pre&gt;gnutls-cli -p 443 google.com&lt;/pre&gt;&lt;/div&gt;  &lt;h6&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#testing-connection-to-remote-host-without-sni-support"&gt;&lt;/a&gt;Testing connection to remote host (without SNI support)&lt;/h6&gt;  &lt;div&gt;    &lt;pre&gt;gnutls-cli --disable-sni -p 443 google.com&lt;/pre&gt;&lt;/div&gt;  &lt;hr&gt;&lt;/hr&gt;  &lt;h5&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#tool-socat"&gt;&lt;/a&gt;Tool:    &lt;a href="http://www.dest-unreach.org/socat/doc/socat.html" rel="nofollow"&gt;socat&lt;/a&gt;&lt;/h5&gt;  &lt;h6&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#testing-remote-connection-to-port-1"&gt;&lt;/a&gt;Testing remote connection to port&lt;/h6&gt;  &lt;div&gt;    &lt;pre&gt;socat - TCP4:10.240.30.3:22&lt;/pre&gt;&lt;/div&gt;  &lt;ul&gt;    &lt;li&gt;      &lt;code&gt;-&lt;/code&gt;- standard input (STDIO)&lt;/li&gt;    &lt;li&gt;      &lt;code&gt;TCP4:&amp;lt;params&amp;gt;&lt;/code&gt;- set tcp4 connection with specific params      &lt;ul&gt;        &lt;li&gt;          &lt;code&gt;[hostname|ip]&lt;/code&gt;- set hostname/ip&lt;/li&gt;        &lt;li&gt;          &lt;code&gt;[1-65535]&lt;/code&gt;- set port number&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ul&gt;  &lt;h6&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#redirecting-tcp-traffic-to-a-unix-domain-socket-under-linux"&gt;&lt;/a&gt;Redirecting TCP-traffic to a UNIX domain socket under Linux&lt;/h6&gt;  &lt;div&gt;    &lt;pre&gt;socat TCP-LISTEN:1234,bind=127.0.0.1,reuseaddr,fork,su=nobody,range=127.0.0.0/8 UNIX-CLIENT:/tmp/foo&lt;/pre&gt;&lt;/div&gt;  &lt;ul&gt;    &lt;li&gt;      &lt;code&gt;TCP-LISTEN:&amp;lt;params&amp;gt;&lt;/code&gt;- set tcp listen with specific params      &lt;ul&gt;        &lt;li&gt;          &lt;code&gt;[1-65535]&lt;/code&gt;- set port number&lt;/li&gt;        &lt;li&gt;          &lt;code&gt;bind=[hostname|ip]&lt;/code&gt;- set bind hostname/ip&lt;/li&gt;        &lt;li&gt;          &lt;code&gt;reuseaddr&lt;/code&gt;- allows other sockets to bind to an address&lt;/li&gt;        &lt;li&gt;          &lt;code&gt;fork&lt;/code&gt;- keeps the parent process attempting to produce more connections&lt;/li&gt;        &lt;li&gt;          &lt;code&gt;su=nobody&lt;/code&gt;- set user&lt;/li&gt;        &lt;li&gt;          &lt;code&gt;range=[ip-range]&lt;/code&gt;- ip range&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;    &lt;li&gt;      &lt;code&gt;UNIX-CLIENT:&amp;lt;params&amp;gt;&lt;/code&gt;- communicates with the specified peer socket      &lt;ul&gt;        &lt;li&gt;          &lt;code&gt;filename&lt;/code&gt;- define socket&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ul&gt;  &lt;hr&gt;&lt;/hr&gt;  &lt;h5&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#tool-p0f"&gt;&lt;/a&gt;Tool:    &lt;a href="http://lcamtuf.coredump.cx/p0f3/" rel="nofollow"&gt;p0f&lt;/a&gt;&lt;/h5&gt;  &lt;h6&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#set-iface-in-promiscuous-mode-and-dump-traffic-to-the-log-file"&gt;&lt;/a&gt;Set iface in promiscuous mode and dump traffic to the log file&lt;/h6&gt;  &lt;div&gt;    &lt;pre&gt;p0f -i enp0s25 -p -d -o /dump/enp0s25.log&lt;/pre&gt;&lt;/div&gt;  &lt;ul&gt;    &lt;li&gt;      &lt;code&gt;-i&lt;/code&gt;- listen on the specified interface&lt;/li&gt;    &lt;li&gt;      &lt;code&gt;-p&lt;/code&gt;- set interface in promiscuous mode&lt;/li&gt;    &lt;li&gt;      &lt;code&gt;-d&lt;/code&gt;- fork into background&lt;/li&gt;    &lt;li&gt;      &lt;code&gt;-o&lt;/code&gt;- output file&lt;/li&gt;&lt;/ul&gt;  &lt;hr&gt;&lt;/hr&gt;  &lt;h5&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#tool-netstat"&gt;&lt;/a&gt;Tool:    &lt;a href="https://en.wikipedia.org/wiki/Netstat" rel="nofollow"&gt;netstat&lt;/a&gt;&lt;/h5&gt;  &lt;h6&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#graph--of-connections-for-each-hosts"&gt;&lt;/a&gt;Graph # of connections for each hosts&lt;/h6&gt;  &lt;div&gt;    &lt;pre&gt;netstat -an|awk&amp;apos;/ESTABLISHED/ { split($5,ip,&amp;quot;:&amp;quot;); if (ip[1] !~ /^$/) print ip[1] }&amp;apos;|\
sort|uniq -c|awk&amp;apos;{ printf(&amp;quot;%s\t%s\t&amp;quot;,$2,$1) ; for (i = 0; i &amp;lt; $1; i++) {printf(&amp;quot;*&amp;quot;)}; print &amp;quot;&amp;quot; }&amp;apos;&lt;/pre&gt;&lt;/div&gt;  &lt;h6&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#monitor-open-connections-for-specific-port-including-listen-count-and-sort-it-per-ip"&gt;&lt;/a&gt;Monitor open connections for specific port including listen, count and sort it per IP&lt;/h6&gt;  &lt;div&gt;    &lt;pre&gt;watch&amp;quot;netstat -plan | grep :443 | awk {&amp;apos;print\$5&amp;apos;} | cut -d: -f 1 | sort | uniq -c | sort -nk 1&amp;quot;&lt;/pre&gt;&lt;/div&gt;  &lt;h6&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#grab-banners-from-local-ipv4-listening-ports"&gt;&lt;/a&gt;Grab banners from local IPv4 listening ports&lt;/h6&gt;  &lt;div&gt;    &lt;pre&gt;netstat -nlt|grep&amp;apos;tcp&amp;apos;|grep -Eo&amp;quot;[1-9][0-9]*&amp;quot;|xargs -I {} sh -c&amp;quot;echo&amp;quot;&amp;quot;| nc -v -n -w1 127.0.0.1 {}&amp;quot;&lt;/pre&gt;&lt;/div&gt;  &lt;hr&gt;&lt;/hr&gt;  &lt;h5&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#tool-rsync"&gt;&lt;/a&gt;Tool:    &lt;a href="https://en.wikipedia.org/wiki/Rsync" rel="nofollow"&gt;rsync&lt;/a&gt;&lt;/h5&gt;  &lt;h6&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#rsync-remote-data-as-root-using-sudo"&gt;&lt;/a&gt;Rsync remote data as root using sudo&lt;/h6&gt;  &lt;div&gt;    &lt;pre&gt;rsync --rsync-path&amp;apos;sudo rsync&amp;apos;username@hostname:/path/to/dir/ /local/&lt;/pre&gt;&lt;/div&gt;  &lt;hr&gt;&lt;/hr&gt;  &lt;h5&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#tool-host"&gt;&lt;/a&gt;Tool:    &lt;a href="https://en.wikipedia.org/wiki/Host_(Unix)" rel="nofollow"&gt;host&lt;/a&gt;&lt;/h5&gt;  &lt;h6&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#resolves-the-domain-name-using-external-dns-server"&gt;&lt;/a&gt;Resolves the domain name (using external dns server)&lt;/h6&gt;  &lt;div&gt;    &lt;pre&gt;host google.com 9.9.9.9&lt;/pre&gt;&lt;/div&gt;  &lt;h6&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#checks-the-domain-administrator-soa-record"&gt;&lt;/a&gt;Checks the domain administrator (SOA record)&lt;/h6&gt;  &lt;div&gt;    &lt;pre&gt;host -t soa google.com 9.9.9.9&lt;/pre&gt;&lt;/div&gt;  &lt;hr&gt;&lt;/hr&gt;  &lt;h5&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#tool-dig"&gt;&lt;/a&gt;Tool:    &lt;a href="https://en.wikipedia.org/wiki/Dig_(command)" rel="nofollow"&gt;dig&lt;/a&gt;&lt;/h5&gt;  &lt;h6&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#resolves-the-domain-name-short-output"&gt;&lt;/a&gt;Resolves the domain name (short output)&lt;/h6&gt;  &lt;div&gt;    &lt;pre&gt;dig google.com +short&lt;/pre&gt;&lt;/div&gt;  &lt;h6&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#lookup-ns-record-for-specific-domain"&gt;&lt;/a&gt;Lookup NS record for specific domain&lt;/h6&gt;  &lt;div&gt;    &lt;pre&gt;dig @9.9.9.9 google.com NS&lt;/pre&gt;&lt;/div&gt;  &lt;h6&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#query-only-answer-section"&gt;&lt;/a&gt;Query only answer section&lt;/h6&gt;  &lt;div&gt;    &lt;pre&gt;dig google.com +nocomments +noquestion +noauthority +noadditional +nostats&lt;/pre&gt;&lt;/div&gt;  &lt;h6&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#query-all-dns-records"&gt;&lt;/a&gt;Query ALL DNS Records&lt;/h6&gt;  &lt;div&gt;    &lt;pre&gt;dig google.com ANY +noall +answer&lt;/pre&gt;&lt;/div&gt;  &lt;h6&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#dns-reverse-look-up"&gt;&lt;/a&gt;DNS Reverse Look-up&lt;/h6&gt;  &lt;div&gt;    &lt;pre&gt;dig -x 172.217.16.14 +short&lt;/pre&gt;&lt;/div&gt;  &lt;hr&gt;&lt;/hr&gt;  &lt;h5&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#tool-certbot"&gt;&lt;/a&gt;Tool:    &lt;a href="https://certbot.eff.org/" rel="nofollow"&gt;certbot&lt;/a&gt;&lt;/h5&gt;  &lt;h6&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#generate-multidomain-certificate"&gt;&lt;/a&gt;Generate multidomain certificate&lt;/h6&gt;  &lt;div&gt;    &lt;pre&gt;certbot certonly -d example.com -d www.example.com&lt;/pre&gt;&lt;/div&gt;  &lt;h6&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#generate-wildcard-certificate"&gt;&lt;/a&gt;Generate wildcard certificate&lt;/h6&gt;  &lt;div&gt;    &lt;pre&gt;certbot certonly --manual --preferred-challenges=dns -d example.com -d*.example.com&lt;/pre&gt;&lt;/div&gt;  &lt;h6&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#generate-certificate-with-4096-bit-private-key"&gt;&lt;/a&gt;Generate certificate with 4096 bit private key&lt;/h6&gt;  &lt;div&gt;    &lt;pre&gt;certbot certonly -d example.com -d www.example.com --rsa-key-size 4096&lt;/pre&gt;&lt;/div&gt;  &lt;hr&gt;&lt;/hr&gt;  &lt;h5&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#tool-network-other"&gt;&lt;/a&gt;Tool:    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#tool-network-other"&gt;network-other&lt;/a&gt;&lt;/h5&gt;  &lt;h6&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#get-all-subnets-for-specific-as-autonomous-system"&gt;&lt;/a&gt;Get all subnets for specific AS (Autonomous system)&lt;/h6&gt;  &lt;div&gt;    &lt;pre&gt;AS=&amp;quot;AS32934&amp;quot;whois -h whois.radb.net --&amp;quot;-i origin${AS}&amp;quot;|\
grep&amp;quot;^route:&amp;quot;|\
cut -d&amp;quot;:&amp;quot;-f2|\
sed -e&amp;apos;s/^[ \t]//&amp;apos;|\
sort -n -t.-k 1,1 -k 2,2 -k 3,3 -k 4,4|\
cut -d&amp;quot;:&amp;quot;-f2|\
sed -e&amp;apos;s/^[ \t]/allow /&amp;apos;|\
sed&amp;apos;s/$/;/&amp;apos;|\
sed&amp;apos;s/allow  */subnet -&amp;gt; /g&amp;apos;&lt;/pre&gt;&lt;/div&gt;  &lt;h6&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#resolves-domain-name-from-dnsgooglecom-with-curl-and-jq"&gt;&lt;/a&gt;Resolves domain name from dns.google.com with curl and jq&lt;/h6&gt;  &lt;div&gt;    &lt;pre&gt;_dname=&amp;quot;google.com&amp;quot;;curl -s&amp;quot;https://dns.google.com/resolve?name=${_dname}&amp;amp;type=A&amp;quot;|jq.&lt;/pre&gt;&lt;/div&gt;  &lt;h5&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#tool-git"&gt;&lt;/a&gt;Tool:    &lt;a href="https://git-scm.com/" rel="nofollow"&gt;git&lt;/a&gt;&lt;/h5&gt;  &lt;h6&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#log-alias-for-a-decent-view-of-your-repo"&gt;&lt;/a&gt;Log alias for a decent view of your repo&lt;/h6&gt;  &lt;div&gt;    &lt;pre&gt;#1)git log --oneline --decorate --graph --all#2)git log --graph \
--pretty=format:&amp;apos;%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)&amp;lt;%an&amp;gt;%Creset&amp;apos;\
--abbrev-commit&lt;/pre&gt;&lt;/div&gt;  &lt;hr&gt;&lt;/hr&gt;  &lt;h5&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#tool-python"&gt;&lt;/a&gt;Tool:    &lt;a href="https://www.python.org/" rel="nofollow"&gt;python&lt;/a&gt;&lt;/h5&gt;  &lt;h6&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#static-http-web-server-1"&gt;&lt;/a&gt;Static HTTP web server&lt;/h6&gt;  &lt;div&gt;    &lt;pre&gt;#Python 3.xpython3 -m http.server 8000 --bind 127.0.0.1#Python 2.xpython -m SimpleHTTPServer 8000&lt;/pre&gt;&lt;/div&gt;  &lt;h6&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#static-http-web-server-with-ssl-support"&gt;&lt;/a&gt;Static HTTP web server with SSL support&lt;/h6&gt;  &lt;div&gt;    &lt;pre&gt;#Python 3.xfrom http.server import HTTPServer, BaseHTTPRequestHandler
import ssl

httpd = HTTPServer((&amp;apos;localhost&amp;apos;,4443),BaseHTTPRequestHandler)httpd.socket = ssl.wrap_socket (httpd.socket,keyfile=&amp;quot;path/to/key.pem&amp;quot;,certfile=&amp;apos;path/to/cert.pem&amp;apos;, server_side=True)httpd.serve_forever()# Python2.ximport BaseHTTPServer, SimpleHTTPServerimport sslhttpd = BaseHTTPServer.HTTPServer((&amp;apos;localhost&amp;apos;,4443),SimpleHTTPServer.SimpleHTTPRequestHandler)httpd.socket = ssl.wrap_socket (httpd.socket,keyfile=&amp;quot;path/tp/key.pem&amp;quot;,certfile=&amp;apos;path/to/cert.pem&amp;apos;, server_side=True)httpd.serve_forever()&lt;/pre&gt;&lt;/div&gt;  &lt;h6&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#encode-base64"&gt;&lt;/a&gt;Encode base64&lt;/h6&gt;  &lt;div&gt;    &lt;pre&gt;python -m base64 -e&amp;lt;&amp;lt;&amp;lt;&amp;quot;sample string&amp;quot;&lt;/pre&gt;&lt;/div&gt;  &lt;h6&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#decode-base64"&gt;&lt;/a&gt;Decode base64&lt;/h6&gt;  &lt;div&gt;    &lt;pre&gt;python -m base64 -d&amp;lt;&amp;lt;&amp;lt;&amp;quot;dGhpcyBpcyBlbmNvZGVkCg==&amp;quot;&lt;/pre&gt;&lt;/div&gt;  &lt;h5&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#tool-awk"&gt;&lt;/a&gt;Tool:    &lt;a href="http://www.grymoire.com/Unix/Awk.html" rel="nofollow"&gt;awk&lt;/a&gt;&lt;/h5&gt;  &lt;h6&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#search-for-matching-lines"&gt;&lt;/a&gt;Search for matching lines&lt;/h6&gt;  &lt;div&gt;    &lt;pre&gt;#egrep fooawk&amp;apos;/foo/&amp;apos;filename&lt;/pre&gt;&lt;/div&gt;  &lt;h6&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#search-non-matching-lines"&gt;&lt;/a&gt;Search non matching lines&lt;/h6&gt;  &lt;div&gt;    &lt;pre&gt;#egrep -v fooawk&amp;apos;!/foo/&amp;apos;filename&lt;/pre&gt;&lt;/div&gt;  &lt;h6&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#print-matching-lines-with-numbers"&gt;&lt;/a&gt;Print matching lines with numbers&lt;/h6&gt;  &lt;div&gt;    &lt;pre&gt;#egrep -n fooawk&amp;apos;/foo/{print FNR,$0}&amp;apos;filename&lt;/pre&gt;&lt;/div&gt;  &lt;h6&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#print-the-last-column"&gt;&lt;/a&gt;Print the last column&lt;/h6&gt;  &lt;div&gt;    &lt;pre&gt;awk&amp;apos;{print $NF}&amp;apos;filename&lt;/pre&gt;&lt;/div&gt;  &lt;h6&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#find-all-the-lines-longer-than-80-characters"&gt;&lt;/a&gt;Find all the lines longer than 80 characters&lt;/h6&gt;  &lt;div&gt;    &lt;pre&gt;awk&amp;apos;length($0)&amp;gt;80{print FNR,$0}&amp;apos;filename&lt;/pre&gt;&lt;/div&gt;  &lt;h6&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#print-only-lines-of-less-than-80-characters"&gt;&lt;/a&gt;Print only lines of less than 80 characters&lt;/h6&gt;  &lt;div&gt;    &lt;pre&gt;awk&amp;apos;length &amp;lt; 80&amp;apos;filename&lt;/pre&gt;&lt;/div&gt;  &lt;h6&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#print-double-new-lines-a-file"&gt;&lt;/a&gt;Print double new lines a file&lt;/h6&gt;  &lt;div&gt;    &lt;pre&gt;awk&amp;apos;1; { print &amp;quot;&amp;quot; }&amp;apos;filename&lt;/pre&gt;&lt;/div&gt;  &lt;h6&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#print-line-numbers"&gt;&lt;/a&gt;Print line numbers&lt;/h6&gt;  &lt;div&gt;    &lt;pre&gt;awk&amp;apos;{ print FNR &amp;quot;\t&amp;quot; $0 }&amp;apos;filename
awk&amp;apos;{ printf(&amp;quot;%5d : %s\n&amp;quot;, NR, $0) }&amp;apos;filename#in a fancy manner&lt;/pre&gt;&lt;/div&gt;  &lt;h6&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#print-line-numbers-for-only-non-blank-lines"&gt;&lt;/a&gt;Print line numbers for only non-blank lines&lt;/h6&gt;  &lt;div&gt;    &lt;pre&gt;awk&amp;apos;NF { $0=++a &amp;quot; :&amp;quot; $0 }; { print }&amp;apos;filename&lt;/pre&gt;&lt;/div&gt;  &lt;h6&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#print-the-line-and-the-next-two-i5-lines-after-the-line-matching-regexp"&gt;&lt;/a&gt;Print the line and the next two (i=5) lines after the line matching regexp&lt;/h6&gt;  &lt;div&gt;    &lt;pre&gt;awk&amp;apos;/foo/{i=5+1;}{if(i){i--; print;}}&amp;apos;filename&lt;/pre&gt;&lt;/div&gt;  &lt;h6&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#print-the-lines-starting-at-the-line-matching-server--until-the-line-matching-"&gt;&lt;/a&gt;Print the lines starting at the line matching &amp;apos;server {&amp;apos; until the line matching &amp;apos;}&amp;apos;&lt;/h6&gt;  &lt;div&gt;    &lt;pre&gt;awk&amp;apos;/server {/,/}/&amp;apos;filename&lt;/pre&gt;&lt;/div&gt;  &lt;h6&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#print-multiple-columns-with-separators"&gt;&lt;/a&gt;Print multiple columns with separators&lt;/h6&gt;  &lt;div&gt;    &lt;pre&gt;awk -F&amp;apos;&amp;apos;&amp;apos;{print &amp;quot;ip:\t&amp;quot; $2 &amp;quot;\n port:\t&amp;quot; $3&amp;apos;filename&lt;/pre&gt;&lt;/div&gt;  &lt;h6&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#remove-empty-lines"&gt;&lt;/a&gt;Remove empty lines&lt;/h6&gt;  &lt;div&gt;    &lt;pre&gt;awk&amp;apos;NF &amp;gt; 0&amp;apos;filename#alternative:awk NF filename&lt;/pre&gt;&lt;/div&gt;  &lt;h6&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#delete-trailing-white-space-spaces-tabs"&gt;&lt;/a&gt;Delete trailing white space (spaces, tabs)&lt;/h6&gt;  &lt;div&gt;    &lt;pre&gt;awk&amp;apos;{sub(/[ \t]*$/, &amp;quot;&amp;quot;);print}&amp;apos;filename&lt;/pre&gt;&lt;/div&gt;  &lt;h6&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#delete-leading-white-space"&gt;&lt;/a&gt;Delete leading white space&lt;/h6&gt;  &lt;div&gt;    &lt;pre&gt;awk&amp;apos;{sub(/^[ \t]+/, &amp;quot;&amp;quot;); print}&amp;apos;filename&lt;/pre&gt;&lt;/div&gt;  &lt;h6&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#remove-duplicate-consecutive-lines"&gt;&lt;/a&gt;Remove duplicate consecutive lines&lt;/h6&gt;  &lt;div&gt;    &lt;pre&gt;#uniqawk&amp;apos;a !~ $0{print}; {a=$0}&amp;apos;filename&lt;/pre&gt;&lt;/div&gt;  &lt;h6&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#remove-duplicate-entries-in-a-file-without-sorting"&gt;&lt;/a&gt;Remove duplicate entries in a file without sorting&lt;/h6&gt;  &lt;div&gt;    &lt;pre&gt;awk&amp;apos;!x[$0]++&amp;apos;filename&lt;/pre&gt;&lt;/div&gt;  &lt;h6&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#exclude-multiple-columns"&gt;&lt;/a&gt;Exclude multiple columns&lt;/h6&gt;  &lt;div&gt;    &lt;pre&gt;awk&amp;apos;{$1=$3=&amp;quot;&amp;quot;}1&amp;apos;filename&lt;/pre&gt;&lt;/div&gt;  &lt;h6&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#substitute-foo-for-bar-on-lines-matching-regexp"&gt;&lt;/a&gt;Substitute foo for bar on lines matching regexp&lt;/h6&gt;  &lt;div&gt;    &lt;pre&gt;awk&amp;apos;/regexp/{gsub(/foo/, &amp;quot;bar&amp;quot;)};{print}&amp;apos;filename&lt;/pre&gt;&lt;/div&gt;  &lt;h6&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#add-some-characters-at-the-beginning-of-matching-lines"&gt;&lt;/a&gt;Add some characters at the beginning of matching lines&lt;/h6&gt;  &lt;div&gt;    &lt;pre&gt;awk&amp;apos;/regexp/{sub(/^/, &amp;quot;++++&amp;quot;); print;next;}{print}&amp;apos;filename&lt;/pre&gt;&lt;/div&gt;  &lt;h6&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#get-the-last-hour-of-apache-logs"&gt;&lt;/a&gt;Get the last hour of Apache logs&lt;/h6&gt;  &lt;div&gt;    &lt;pre&gt;awk&amp;apos;/&amp;apos;$(date -d&amp;quot;1 hours ago&amp;quot;&amp;quot;+%d\\/%b\\/%Y:%H:%M&amp;quot;)&amp;apos;/,/&amp;apos;$(date&amp;quot;+%d\\/%b\\/%Y:%H:%M&amp;quot;)&amp;apos;/ { print $0 }&amp;apos;\
/var/log/httpd/access_log&lt;/pre&gt;&lt;/div&gt;  &lt;hr&gt;&lt;/hr&gt;  &lt;h5&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#tool-sed"&gt;&lt;/a&gt;Tool:    &lt;a href="http://www.grymoire.com/Unix/Sed.html" rel="nofollow"&gt;sed&lt;/a&gt;&lt;/h5&gt;  &lt;h6&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#print-a-specific-line-from-a-file"&gt;&lt;/a&gt;Print a specific line from a file&lt;/h6&gt;  &lt;div&gt;    &lt;pre&gt;sed -n 10p /path/to/file&lt;/pre&gt;&lt;/div&gt;  &lt;h6&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#remove-a-specific-line-from-a-file"&gt;&lt;/a&gt;Remove a specific line from a file&lt;/h6&gt;  &lt;div&gt;    &lt;pre&gt;sed -i 10d /path/to/file#alternative (BSD): sed -i&amp;apos;&amp;apos; 10d /path/to/file&lt;/pre&gt;&lt;/div&gt;  &lt;h6&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#remove-a-range-of-lines-from-a-file"&gt;&lt;/a&gt;Remove a range of lines from a file&lt;/h6&gt;  &lt;div&gt;    &lt;pre&gt;sed -i&amp;lt;file&amp;gt;-re&amp;apos;&amp;lt;start&amp;gt;,&amp;lt;end&amp;gt;d&amp;apos;&lt;/pre&gt;&lt;/div&gt;  &lt;h6&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#replace-newlines-with-a-space"&gt;&lt;/a&gt;Replace newline(s) with a space&lt;/h6&gt;  &lt;div&gt;    &lt;pre&gt;sed&amp;apos;:a;N;$!ba;s/\n/ /g&amp;apos;/path/to/file#cross-platform compatible syntax:sed -e&amp;apos;:a&amp;apos;-e&amp;apos;N&amp;apos;-e&amp;apos;$!ba&amp;apos;-e&amp;apos;s/\n/ /g&amp;apos;/path/to/file&lt;/pre&gt;&lt;/div&gt;  &lt;ul&gt;    &lt;li&gt;      &lt;code&gt;:a&lt;/code&gt;create a label      &lt;code&gt;a&lt;/code&gt;&lt;/li&gt;    &lt;li&gt;      &lt;code&gt;N&lt;/code&gt;append the next line to the pattern space&lt;/li&gt;    &lt;li&gt;      &lt;code&gt;$!&lt;/code&gt;if not the last line, ba branch (go to) label      &lt;code&gt;a&lt;/code&gt;&lt;/li&gt;    &lt;li&gt;      &lt;code&gt;s&lt;/code&gt;substitute,      &lt;code&gt;/\n/&lt;/code&gt;regex for new line,      &lt;code&gt;/ /&lt;/code&gt;by a space,      &lt;code&gt;/g&lt;/code&gt;global match (as many times as it can)&lt;/li&gt;&lt;/ul&gt;  &lt;p&gt;Alternatives:&lt;/p&gt;  &lt;div&gt;    &lt;pre&gt;#perl version (sed-like speed):perl -p -e&amp;apos;s/\n/ /&amp;apos;/path/to/file#bash version (slow):whilereadline;doprintf&amp;quot;%s&amp;quot;&amp;quot;$line&amp;quot;;done&amp;lt;file&lt;/pre&gt;&lt;/div&gt;  &lt;h6&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#delete-string-n-next-lines"&gt;&lt;/a&gt;Delete string +N next lines&lt;/h6&gt;  &lt;div&gt;    &lt;pre&gt;sed&amp;apos;/start/,+4d&amp;apos;/path/to/file&lt;/pre&gt;&lt;/div&gt;  &lt;hr&gt;&lt;/hr&gt;  &lt;h5&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#tool-grep"&gt;&lt;/a&gt;Tool:    &lt;a href="http://www.grymoire.com/Unix/Grep.html" rel="nofollow"&gt;grep&lt;/a&gt;&lt;/h5&gt;  &lt;h6&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#search-for-a-pattern-inside-all-files-in-the-current-directory"&gt;&lt;/a&gt;Search for a &amp;quot;pattern&amp;quot; inside all files in the current directory&lt;/h6&gt;  &lt;div&gt;    &lt;pre&gt;grep -rn&amp;quot;pattern&amp;quot;grep -RnisI&amp;quot;pattern&amp;quot;*fgrep&amp;quot;pattern&amp;quot;*-R&lt;/pre&gt;&lt;/div&gt;  &lt;h6&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#show-only-for-multiple-patterns"&gt;&lt;/a&gt;Show only for multiple patterns&lt;/h6&gt;  &lt;div&gt;    &lt;pre&gt;grep&amp;apos;INFO*&amp;apos;\&amp;apos;&amp;apos;WARN&amp;apos;filename
grep&amp;apos;INFO\|WARN&amp;apos;filename
grep -e INFO -e WARN filename
grep -E&amp;apos;(INFO|WARN)&amp;apos;filename
egrep&amp;quot;INFO|WARN&amp;quot;filename&lt;/pre&gt;&lt;/div&gt;  &lt;h6&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#except-multiple-patterns"&gt;&lt;/a&gt;Except multiple patterns&lt;/h6&gt;  &lt;div&gt;    &lt;pre&gt;grep -vE&amp;apos;(error|critical|warning)&amp;apos;filename&lt;/pre&gt;&lt;/div&gt;  &lt;h6&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#show-data-from-file-without-comments"&gt;&lt;/a&gt;Show data from file without comments&lt;/h6&gt;  &lt;div&gt;    &lt;pre&gt;grep -v ^[[:space:]]*#filename&lt;/pre&gt;&lt;/div&gt;  &lt;h6&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#show-data-from-file-without-comments-and-new-lines"&gt;&lt;/a&gt;Show data from file without comments and new lines&lt;/h6&gt;  &lt;div&gt;    &lt;pre&gt;egrep -v&amp;apos;#|^$&amp;apos;filename&lt;/pre&gt;&lt;/div&gt;  &lt;h6&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#show-strings-with-a-dashhyphen"&gt;&lt;/a&gt;Show strings with a dash/hyphen&lt;/h6&gt;  &lt;div&gt;    &lt;pre&gt;grep -e -- filename
grep -- -- filename
grep&amp;quot;\-\-&amp;quot;filename&lt;/pre&gt;&lt;/div&gt;  &lt;h6&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#remove-blank-lines-from-a-file-and-save-output-to-new-file"&gt;&lt;/a&gt;Remove blank lines from a file and save output to new file&lt;/h6&gt;  &lt;div&gt;    &lt;pre&gt;grep.filename&amp;gt;newfilename&lt;/pre&gt;&lt;/div&gt;  &lt;h5&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#tool-perl"&gt;&lt;/a&gt;Tool:    &lt;a href="https://www.perl.org/" rel="nofollow"&gt;perl&lt;/a&gt;&lt;/h5&gt;  &lt;h6&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#search-and-replace-in-place"&gt;&lt;/a&gt;Search and replace (in place)&lt;/h6&gt;  &lt;div&gt;    &lt;pre&gt;perl -i -pe&amp;apos;s/SEARCH/REPLACE/&amp;apos;filename&lt;/pre&gt;&lt;/div&gt;  &lt;h6&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#edit-of-conf-files-changing-all-foo-to-bar-and-backup-original"&gt;&lt;/a&gt;Edit of    &lt;code&gt;*.conf&lt;/code&gt;files changing all foo to bar (and backup original)&lt;/h6&gt;  &lt;div&gt;    &lt;pre&gt;perl -p -i.orig -e&amp;apos;s/\bfoo\b/bar/g&amp;apos;*.conf&lt;/pre&gt;&lt;/div&gt;  &lt;h6&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#prints-the-first-20-lines-from-conf-files"&gt;&lt;/a&gt;Prints the first 20 lines from    &lt;code&gt;*.conf&lt;/code&gt;files&lt;/h6&gt;  &lt;div&gt;    &lt;pre&gt;perl -pe&amp;apos;exit if $. &amp;gt; 20&amp;apos;*.conf&lt;/pre&gt;&lt;/div&gt;  &lt;h6&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#search-lines-10-to-20"&gt;&lt;/a&gt;Search lines 10 to 20&lt;/h6&gt;  &lt;div&gt;    &lt;pre&gt;perl -ne&amp;apos;print if 10 .. 20&amp;apos;filename&lt;/pre&gt;&lt;/div&gt;  &lt;h6&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#delete-first-10-lines-and-backup-original"&gt;&lt;/a&gt;Delete first 10 lines (and backup original)&lt;/h6&gt;  &lt;div&gt;    &lt;pre&gt;perl -i.orig -ne&amp;apos;print unless 1 .. 10&amp;apos;filename&lt;/pre&gt;&lt;/div&gt;  &lt;h6&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#delete-all-but-lines-between-foo-and-bar-and-backup-original"&gt;&lt;/a&gt;Delete all but lines between foo and bar (and backup original)&lt;/h6&gt;  &lt;div&gt;    &lt;pre&gt;perl -i.orig -ne&amp;apos;print unless /^foo$/ .. /^bar$/&amp;apos;filename&lt;/pre&gt;&lt;/div&gt;  &lt;h6&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#reduce-multiple-blank-lines-to-a-single-line"&gt;&lt;/a&gt;Reduce multiple blank lines to a single line&lt;/h6&gt;  &lt;div&gt;    &lt;pre&gt;perl -p -i -00pe0 filename&lt;/pre&gt;&lt;/div&gt;  &lt;h6&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#convert-tabs-to-spaces-1t--2sp"&gt;&lt;/a&gt;Convert tabs to spaces (1t = 2sp)&lt;/h6&gt;  &lt;div&gt;    &lt;pre&gt;perl -p -i -e&amp;apos;s/\t/  /g&amp;apos;filename&lt;/pre&gt;&lt;/div&gt;  &lt;h6&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#read-input-from-a-file-and-report-number-of-lines-and-characters"&gt;&lt;/a&gt;Read input from a file and report number of lines and characters&lt;/h6&gt;  &lt;div&gt;    &lt;pre&gt;perl -lne&amp;apos;$i++; $in += length($_); END { print &amp;quot;$i lines, $in characters&amp;quot;; }&amp;apos;filename&lt;/pre&gt;&lt;/div&gt;  &lt;h4&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#shell-tricks-toc"&gt;&lt;/a&gt;Shell Tricks      &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#anger-table-of-contents"&gt;      &lt;sup&gt;[TOC]&lt;/sup&gt;&lt;/a&gt;&lt;/h4&gt;  &lt;p&gt;When you get a shell, it is generally not very clean, but after following these steps, you will have a fairly clean and comfortable shell to work with.&lt;/p&gt;  &lt;ol&gt;    &lt;li&gt;      &lt;code&gt;script /dev/null -c bash&lt;/code&gt;&lt;/li&gt;    &lt;li&gt;Ctrl-Z (to send it to background)&lt;/li&gt;    &lt;li&gt;      &lt;code&gt;stty raw -echo; fg&lt;/code&gt;(returns the shell to foreground)&lt;/li&gt;    &lt;li&gt;      &lt;code&gt;reset&lt;/code&gt;(to reset terminal)&lt;/li&gt;    &lt;li&gt;      &lt;code&gt;xterm&lt;/code&gt;(when asked for terminal type)&lt;/li&gt;    &lt;li&gt;      &lt;code&gt;export TERM=xterm; export SHELL=bash&lt;/code&gt;&lt;/li&gt;&lt;/ol&gt;  &lt;h4&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#shell-functions-toc"&gt;&lt;/a&gt;Shell functions      &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#anger-table-of-contents"&gt;      &lt;sup&gt;[TOC]&lt;/sup&gt;&lt;/a&gt;&lt;/h4&gt;  &lt;h5&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#table-of-contents-1"&gt;&lt;/a&gt;Table of Contents&lt;/h5&gt;  &lt;ul&gt;    &lt;li&gt;      &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#domain-resolve"&gt;Domain resolve&lt;/a&gt;&lt;/li&gt;    &lt;li&gt;      &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#get-asn"&gt;Get ASN&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;  &lt;h6&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#domain-resolve"&gt;&lt;/a&gt;Domain resolve&lt;/h6&gt;  &lt;div&gt;    &lt;pre&gt;#Dependencies:#- curl#- jqfunctionDomainResolve(){local_host=&amp;quot;$1&amp;quot;local_curl_base=&amp;quot;curl --request GET&amp;quot;local_timeout=&amp;quot;15&amp;quot;_host_ip=$($_curl_base-ks -m&amp;quot;$_timeout&amp;quot;&amp;quot;https://dns.google.com/resolve?name=${_host}&amp;amp;type=A&amp;quot;|\jq&amp;apos;.Answer[0].data&amp;apos;|tr -d&amp;quot;\&amp;quot;&amp;quot;2&amp;gt;/dev/null)if[[-z&amp;quot;$_host_ip&amp;quot;]]||[[&amp;quot;$_host_ip&amp;quot;==&amp;quot;null&amp;quot;]];thenecho-en&amp;quot;Unsuccessful domain name resolution.\\n&amp;quot;elseecho-en&amp;quot;$_host&amp;gt;$_host_ip\\n&amp;quot;fi}&lt;/pre&gt;&lt;/div&gt;  &lt;p&gt;Example:&lt;/p&gt;  &lt;div&gt;    &lt;pre&gt;shell&amp;gt;DomainResolve nmap.org
nmap.org&amp;gt;45.33.49.119

shell&amp;gt;DomainResolve nmap.org
Unsuccessful domain name resolution.&lt;/pre&gt;&lt;/div&gt;  &lt;h6&gt;    &lt;a href="https://github.com/trimstray/the-book-of-secret-knowledge#get-asn"&gt;&lt;/a&gt;Get ASN&lt;/h6&gt;  &lt;div&gt;    &lt;pre&gt;#Dependencies:#- curlfunctionGetASN(){local_ip=&amp;quot;$1&amp;quot;local_curl_base=&amp;quot;curl --request GET&amp;quot;local_timeout=&amp;quot;15&amp;quot;_asn=$($_curl_base-ks -m&amp;quot;$_timeout&amp;quot;&amp;quot;http://ip-api.com/line/${_ip}?fields=as&amp;quot;)_state=$(echo$?)if[[-z&amp;quot;$_ip&amp;quot;]]||[[&amp;quot;$_ip&amp;quot;==&amp;quot;null&amp;quot;]]||[[&amp;quot;$_state&amp;quot;-ne0 ]];thenecho-en&amp;quot;Unsuccessful ASN gathering.\\n&amp;quot;elseecho-en&amp;quot;$_ip&amp;gt;$_asn\\n&amp;quot;fi}&lt;/pre&gt;&lt;/div&gt;  &lt;p&gt;Example:&lt;/p&gt;  &lt;div&gt;    &lt;pre&gt;shell&amp;gt;GetASN 1.1.1.1
1.1.1.1&amp;gt;AS13335 Cloudflare, Inc.

shell&amp;gt;GetASN 0.0.0.0
Unsuccessful ASN gathering.&lt;/pre&gt;&lt;/div&gt;
    &lt;div&gt; &lt;a href="https://itindex.net/"  title="IT 资讯"&gt;&lt;img src="https://itindex.net/images/iconWarning.gif" title="IT 资讯" border="0"/&gt; &lt;/a&gt;</description>
      <category />
      <guid isPermaLink="true">https://itindex.net/detail/62893-the-book-of</guid>
      <pubDate>Sun, 10 Dec 2023 17:01:16 CST</pubDate>
    </item>
    <item>
      <title>jsBridge 以及 Web 和 APP 交互通信方式</title>
      <link>https://itindex.net/detail/62859-jsbridge-web-app</link>
      <description>&lt;h1&gt;jsBridge 到底是什么？&lt;/h1&gt;
 &lt;p&gt;jsBridge 是一种技术，主要用于解决 Web 前端和原生应用间的通信问题。这一技术在混合开发（Hybrid App Development）和一些原生应用内嵌 H5 页面的场景中被广泛应用。通过 jsBridge，开发者可以直接在 JavaScript 中调用原生代码，如获取设备信息、调用系统功能等，极大的提高了开发效率。&lt;/p&gt;
 &lt;h1&gt;首先需要了解 WebView&lt;/h1&gt;
 &lt;p&gt;WebView 是一个浏览器控件或者组件，它能够帮助开发者将网页或者 HTML 内容嵌入到原生应用中。&lt;/p&gt;
 &lt;p&gt;WebView 控件除了能加载指定的 URL 外，还可以对 URL 请求、JavaScript 的对话框、加载进度、页面交互进行强大的处理，之后会提到拦截请求、执行 js 脚本都依赖于此。&lt;/p&gt;
 &lt;p&gt;Android 中的 WebView：&lt;/p&gt;
 &lt;p&gt;Android 中的 WebView 是一个继承自 View 的控件，它可以加载并显示网页，同时也提供了一些方法供你与 JavaScript 交互。你可以使用   &lt;code&gt;loadUrl(String url)&lt;/code&gt; 方法加载一个网页，使用   &lt;code&gt;evaluateJavascript(String script, ValueCallback&amp;lt;String&amp;gt; resultCallback)&lt;/code&gt; 方法执行 JavaScript 代码。你还可以通过   &lt;code&gt;addJavascriptInterface(Object object, String name)&lt;/code&gt; 方法向 JavaScript 环境中添加一个 Java 对象，使得 JavaScript 可以调用该对象的方法。&lt;/p&gt;
 &lt;p&gt;iOS 中的 WebView：&lt;/p&gt;
 &lt;p&gt;iOS 中提供了   &lt;code&gt;UIWebView&lt;/code&gt; 和   &lt;code&gt;WKWebView&lt;/code&gt; 两个用于展示网页的控件。  &lt;code&gt;UIWebView&lt;/code&gt; 在 iOS 2.0 就被引入，但自 iOS 8.0 起，Apple 推荐使用   &lt;code&gt;WKWebView&lt;/code&gt; 替代   &lt;code&gt;UIWebView&lt;/code&gt;。   &lt;code&gt;WKWebView&lt;/code&gt; 提供了   &lt;code&gt;load(URLRequest)&lt;/code&gt; 和   &lt;code&gt;loadHTMLString(String baseURL: URL?)&lt;/code&gt; 方法用于加载网页，通过   &lt;code&gt;evaluateJavaScript(String completionHandler: ((Any?, Error?) -&amp;gt; Void)?)&lt;/code&gt; 方法执行 JavaScript 代码。同时，iOS 中的   &lt;code&gt;WKWebView&lt;/code&gt; 通过   &lt;code&gt;WKScriptMessageHandler&lt;/code&gt; 协议和   &lt;code&gt;WKUserContentController&lt;/code&gt; 类来实现 Native 与 JavaScript 的交互。&lt;/p&gt;
 &lt;p&gt;  &lt;strong&gt;了解 WebView 很重要，它才是连接原生和 Web 的桥梁。因为 Web 前端大多对原生开发不了解，如果一开始就去了解所谓的 jsBridge，反而会迷惑。&lt;/strong&gt;&lt;/p&gt;
 &lt;h1&gt;Web 和 Native 的交互&lt;/h1&gt;
 &lt;p&gt;Web 和 Native 的交互分为 Native 调用 js 和 js 调用 Native。&lt;/p&gt;
 &lt;h2&gt;Native -&amp;gt; js&lt;/h2&gt;
 &lt;p&gt;原生调 js 的方式比较简单。JavaScript 作为解释性语言，最大的一个特性就是可以随时随地地通过解释器执行一段 js 代码，所以可以将拼接的 JavaScript 代码字符串，传入 js 解析器执行就可以，js 解析器在这里就是 WebView 组件。&lt;/p&gt;
 &lt;p&gt;所以 WebView 执行拼接的 JavaScript 字符串，从外部调用 JavaScript 方法，JavaScript 的方法必须在全局的 window 上。&lt;/p&gt;
 &lt;h3&gt;Android&lt;/h3&gt;
 &lt;p&gt;Android 4.4 之前只能用   &lt;code&gt;loadUrl&lt;/code&gt; 来实现，效率低，无法获得返回结果，且调用的时候会刷新 WebView：&lt;/p&gt;
 &lt;pre&gt;  &lt;code&gt;webView.loadUrl(&amp;quot;javascript:&amp;quot; + javaScriptString);
&lt;/code&gt;&lt;/pre&gt;
 &lt;p&gt;Android 4.4 之后提供了   &lt;code&gt;evaluateJavascript&lt;/code&gt; 来执行 js 代码，效率高，获取返回值方便，调用时候不刷新 WebView：&lt;/p&gt;
 &lt;pre&gt;  &lt;code&gt;webView.evaluateJavascript(javaScriptString, new ValueCallback&amp;lt;String&amp;gt;() {
    @Override
    public void onReceiveValue(String value){
        xxx
    }
});

&lt;/code&gt;&lt;/pre&gt;
 &lt;h3&gt;iOS&lt;/h3&gt;
 &lt;p&gt;UIWebView 使用   &lt;code&gt;stringByEvaluatingJavaScriptFromString&lt;/code&gt;：&lt;/p&gt;
 &lt;pre&gt;  &lt;code&gt;NSString *jsStr = @&amp;quot;执行的JS代码&amp;quot;;
[webView stringByEvaluatingJavaScriptFromString:jsStr];
&lt;/code&gt;&lt;/pre&gt;
 &lt;p&gt;WKWebView 使用   &lt;code&gt;evaluateJavaScript&lt;/code&gt;：&lt;/p&gt;
 &lt;pre&gt;  &lt;code&gt;[webView evaluateJavaScript:@&amp;quot;执行的JS代码&amp;quot; completionHandler:^(id _Nullable response, NSError * _Nullable error) {
  
}];

&lt;/code&gt;&lt;/pre&gt;
 &lt;pre&gt;  &lt;code&gt;func evaluateJavaScript(_ javaScriptString: String, completionHandler: ((Any?, Error?) -&amp;gt; Void)? = nil)
// javaScriptString 需要调用的 JS 代码
// completionHandler 执行后的回调
&lt;/code&gt;&lt;/pre&gt;
 &lt;h2&gt;js -&amp;gt; Native&lt;/h2&gt;
 &lt;p&gt;简单的说，主要是两类方法：拦截 URL，注入 API。&lt;/p&gt;
 &lt;h3&gt;拦截 URL Schema&lt;/h3&gt;
 &lt;p&gt;URL Schema 是类 URL 的一种请求格式，格式如下：&lt;/p&gt;
 &lt;p&gt;  &lt;code&gt;&amp;lt;protocol&amp;gt;://&amp;lt;host&amp;gt;/&amp;lt;path&amp;gt;?&amp;lt;qeury&amp;gt;#fragment&lt;/code&gt;&lt;/p&gt;
 &lt;p&gt;我们可以自定义 jsBridge 通信的 URL Schema，比如：  &lt;code&gt;jsbridge://showToast?text=hello&lt;/code&gt;&lt;/p&gt;
 &lt;p&gt;Native 加载 WebView 之后，Web 发送的所有请求都会经过 WebView 组件，所以 Native 可以重写 WebView里的方法，从来拦截 Web 发起的请求，我们对请求的格式进行判断：&lt;/p&gt;
 &lt;ul&gt;
  &lt;li&gt;如果符合我们自定义的 URL Schema，对 URL 进行解析，拿到相关操作，进而调用原生 Native 的方法&lt;/li&gt;
  &lt;li&gt;如果不符合我们自定义的 URL Schema，我们直接转发，请求真正的服务&lt;/li&gt;
&lt;/ul&gt;
 &lt;p&gt;  &lt;img alt="image.png" src="https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/639f351bc62747579dab373fdda373e1~tplv-k3u1fbpfcp-jj-mark:0:0:0:0:q75.image#?w=794&amp;h=312&amp;s=36225&amp;e=png&amp;a=1&amp;b=fbfbfb"&gt;&lt;/img&gt;&lt;/p&gt;
 &lt;p&gt;Web 发送 URL 请求的方法有这么几种：&lt;/p&gt;
 &lt;ol&gt;
  &lt;li&gt;   &lt;code&gt;a&lt;/code&gt; 标签&lt;/li&gt;
  &lt;li&gt;   &lt;code&gt;location.href&lt;/code&gt;&lt;/li&gt;
  &lt;li&gt;使用    &lt;code&gt;iframe.src&lt;/code&gt;&lt;/li&gt;
  &lt;li&gt;发送    &lt;code&gt;ajax&lt;/code&gt; 请求&lt;/li&gt;
&lt;/ol&gt;
 &lt;p&gt;这些方法，  &lt;code&gt;a&lt;/code&gt; 标签需要用户操作，  &lt;code&gt;location.href&lt;/code&gt; 可能会引起页面的跳转丢失调用，发送   &lt;code&gt;ajax&lt;/code&gt; 请求Android 没有相应的拦截方法，所以使用   &lt;code&gt;iframe.src&lt;/code&gt; 是经常会使用的方案：&lt;/p&gt;
 &lt;ul&gt;
  &lt;li&gt;安卓提供了    &lt;code&gt;shouldOverrideUrlLoading&lt;/code&gt; 方法拦截&lt;/li&gt;
  &lt;li&gt;UIWebView 使用    &lt;code&gt;shouldStartLoadWithRequest&lt;/code&gt;，WKWebView 则使用   &lt;code&gt;decidePolicyForNavigationAction&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
 &lt;p&gt;Android：&lt;/p&gt;
 &lt;pre&gt;  &lt;code&gt;public class CustomWebViewClient extends WebViewClient {
  @Override
  public boolean shouldOverrideUrlLoading(WebView view, String url) {
    ......
    // 场景一： 拦截请求、接收 scheme
    if (url.equals(&amp;quot;xxx&amp;quot;)) {

      // handle
      ...
      // callback
      view.loadUrl(&amp;quot;javascript:setAllContent(&amp;quot; + json + &amp;quot;);&amp;quot;)
      return true;
    }
    return super.shouldOverrideUrlLoading(url);
  }
}

&lt;/code&gt;&lt;/pre&gt;
 &lt;p&gt;iOS 的 WKWebview：&lt;/p&gt;
 &lt;pre&gt;  &lt;code&gt;- (void)webView:(WKWebView *)webView decidePolicyForNavigationAction:(WKNavigationAction *)navigationAction decisionHandler:(void (^)(WKNavigationActionPolicy))decisionHandler{
    if ([navigationAction.request.URL.absoluteString hasPrefix:@&amp;quot;xxx&amp;quot;]) {
        [[UIApplication sharedApplication] openURL:navigationAction.request.URL];
    }
    decisionHandler(WKNavigationActionPolicyAllow);
}
&lt;/code&gt;&lt;/pre&gt;
 &lt;p&gt;这种方式有一定的缺陷：&lt;/p&gt;
 &lt;ul&gt;
  &lt;li&gt;使用 iframe.src 发送 URL SCHEME 会有 URL 长度的隐患。&lt;/li&gt;
  &lt;li&gt;创建请求，需要一定的耗时，比注入 API 的方式调用同样的功能，耗时会较长。&lt;/li&gt;
&lt;/ul&gt;
 &lt;h3&gt;注入 API&lt;/h3&gt;
 &lt;p&gt;注入 API 方式的主要原理是，通过 WebView 提供的接口，向 JavaScript 的 Context（window）中注入对象或者方法，让 JavaScript 调用时，直接执行相应的 Native 代码逻辑，达到 JavaScript 调用 Native 的目的。&lt;/p&gt;
 &lt;p&gt;iOS 的 UIWebView 提供了   &lt;code&gt;JavaSciptCore&lt;/code&gt;：&lt;/p&gt;
 &lt;pre&gt;  &lt;code&gt;JSContext *context = [uiWebView valueForKeyPath:@&amp;quot;documentView.webView.mainFrame.javaScriptContext&amp;quot;];

context[@&amp;quot;postBridgeMessage&amp;quot;] = ^(NSArray&amp;lt;NSArray *&amp;gt; *calls) {
    // Native 逻辑
};

&lt;/code&gt;&lt;/pre&gt;
 &lt;p&gt;前端调用方式：&lt;/p&gt;
 &lt;pre&gt;  &lt;code&gt;window.postBridgeMessage(message);
&lt;/code&gt;&lt;/pre&gt;
 &lt;p&gt;iOS的 WKWebView 提供了   &lt;code&gt;WKScriptMessageHandler&lt;/code&gt;：&lt;/p&gt;
 &lt;pre&gt;  &lt;code&gt;@interface WKWebVIewVC ()&amp;lt;WKScriptMessageHandler&amp;gt;

@implementation WKWebVIewVC

- (void)viewDidLoad {
    [super viewDidLoad];

    WKWebViewConfiguration* configuration = [[WKWebViewConfiguration alloc] init];
    configuration.userContentController = [[WKUserContentController alloc] init];
    WKUserContentController *userCC = configuration.userContentController;
    // 注入对象，前端调用其方法时，Native 可以捕获到
    [userCC addScriptMessageHandler:self name:@&amp;quot;nativeBridge&amp;quot;];

    WKWebView wkWebView = [[WKWebView alloc] initWithFrame:self.view.frame configuration:configuration];

    // TODO 显示 WebView
}

- (void)userContentController:(WKUserContentController *)userContentController didReceiveScriptMessage:(WKScriptMessage *)message {
    if ([message.name isEqualToString:@&amp;quot;nativeBridge&amp;quot;]) {
        NSLog(@&amp;quot;前端传递的数据 %@: &amp;quot;,message.body);
        // Native 逻辑
    }
}

&lt;/code&gt;&lt;/pre&gt;
 &lt;p&gt;前端调用方式：&lt;/p&gt;
 &lt;pre&gt;  &lt;code&gt;window.webkit.messageHandlers.nativeBridge.postMessage(message);
&lt;/code&gt;&lt;/pre&gt;
 &lt;p&gt;Android 提供了   &lt;code&gt;addJavascriptInterface&lt;/code&gt;：&lt;/p&gt;
 &lt;pre&gt;  &lt;code&gt;public class JavaScriptInterface DemoActivity extends Activity {
private WebView Wv;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        Wv = (WebView)findViewById(R.id.webView);     
        final JavaScriptInterface myJavaScriptInterface = new JavaScriptInterface(this);     

        Wv.getSettings().setJavaScriptEnabled(true);
        Wv.addJavascriptInterface(myJavaScriptInterface, &amp;quot;nativeBridge&amp;quot;);

        // TODO 显示 WebView

    }

    public class JavaScriptInterface {
         Context mContext;

         JavaScriptInterface(Context c) {
             mContext = c;
         }

         public void postMessage(String webMessage){    
             // Native 逻辑
         }
     }
}

&lt;/code&gt;&lt;/pre&gt;
 &lt;p&gt;前端调用方式：&lt;/p&gt;
 &lt;pre&gt;  &lt;code&gt;window.nativeBridge.postMessage(message);
&lt;/code&gt;&lt;/pre&gt;
 &lt;p&gt;在 4.2 之前，Android 注入 JavaScript 对象的接口是   &lt;code&gt;addJavascriptInterface&lt;/code&gt;，但是这个接口有漏洞，可以被不法分子利用，危害用户的安全，因此在 4.2 中引入新的接口 @JavascriptInterface（上面代码中使用的）来替代这个接口，解决安全问题。所以 Android 注入对对象的方式是   &lt;strong&gt;有兼容性问题的&lt;/strong&gt;。（4.2 之前很多方案都采用拦截 prompt 的方式来实现，因为篇幅有限，这里就不展开了。）&lt;/p&gt;
 &lt;h1&gt;jsBridge 的实现（带回调的交互）&lt;/h1&gt;
 &lt;p&gt;Native、Web 间可以交互，但站在一端而言还是一个单向通信的过程，比如站在 Web 的角度：Web 调用 Native 的方法，Native 直接进行相关操作但无法将结果返回给 Web，但实际使用中会经常需要将操作的结果返回，也就是 js 回调。&lt;/p&gt;
 &lt;p&gt;jsBridge 的接口主要功能有两个：  &lt;strong&gt;调用 Native（给 Native 发消息）&lt;/strong&gt; 和   &lt;strong&gt;被 Native 调用（接收 Native 消息）&lt;/strong&gt; 。因此，jsBridge 可以设计如下：&lt;/p&gt;
 &lt;pre&gt;  &lt;code&gt;window.JSBridge = {
    // 调用 Native
    invoke: function(msg) {
        // 判断环境，获取不同的 nativeBridge
        nativeBridge.postMessage(msg);
    },
    receiveMessage: function(msg) {
        // 处理 msg
    }
};
&lt;/code&gt;&lt;/pre&gt;
 &lt;p&gt;那么有回调的交互如何实现呢？&lt;/p&gt;
 &lt;p&gt;其实基于之前的单向通信就可以实现，我们在一端调用的时候在参数中加一个   &lt;code&gt;callbackId&lt;/code&gt; 标记对应的回调，对端接收到调用请求后，进行实际操作，如果带有   &lt;code&gt;callbackId&lt;/code&gt;，对端再进行一次调用，将结果、  &lt;code&gt;callbackId&lt;/code&gt; 回传回来，这端根据   &lt;code&gt;callbackId&lt;/code&gt; 匹配相应的回调，将结果传入执行就可以了。&lt;/p&gt;
 &lt;p&gt;  &lt;img alt="" src="https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/621d60fb31b04294887ee1a541fbd8e0~tplv-k3u1fbpfcp-jj-mark:0:0:0:0:q75.image#?w=1512&amp;h=687&amp;s=16384&amp;e=webp&amp;b=ffffff"&gt;&lt;/img&gt;&lt;/p&gt;
 &lt;p&gt;可以看到实际上还是通过两次单项通信实现的。&lt;/p&gt;
 &lt;pre&gt;  &lt;code&gt;(function () {
    var id = 0,
        callbacks = {};

    window.JSBridge = {
        // 调用 Native
        invoke: function(bridgeName, callback, data) {
            // 判断环境，获取不同的 nativeBridge
            var thisId = id ++; // 获取唯一 id
            callbacks[thisId] = callback; // 存储 Callback
            window.nativeBridge.postMessage({
                bridgeName: bridgeName,
                data: data || {},
                callbackId: thisId // 传到 Native 端
            });
        },
        receiveMessage: function(msg) {
            var bridgeName = msg.bridgeName,
                data = msg.data || {},
                callbackId = msg.callbackId; // Native 将 callbackId 原封不动传回
            // 具体逻辑
            // bridgeName 和 callbackId 不会同时存在
            if (callbackId) {
                if (callbacks[callbackId]) { // 找到相应句柄
                    callbacks[callbackId](msg.data); // 执行调用
                }
            } elseif (bridgeName) {

            }
        }
    };
})();
&lt;/code&gt;&lt;/pre&gt;
 &lt;p&gt;最后用同样的方式加上 Native 调用的回调逻辑，同时对代码进行一些优化，就大概实现了一个功能比较完整的 jsBridge。其代码如下：&lt;/p&gt;
 &lt;pre&gt;  &lt;code&gt;(function () {
    var id = 0,
        callbacks = {},
        registerFuncs = {};

    window.JSBridge = {
        // 调用 Native
        invoke: function(bridgeName, callback, data) {
            // 判断环境，获取不同的 nativeBridge
            var thisId = id ++; // 获取唯一 id
            callbacks[thisId] = callback; // 存储 Callback
            nativeBridge.postMessage({
                bridgeName: bridgeName,
                data: data || {},
                callbackId: thisId // 传到 Native 端
            });
        },
        receiveMessage: function(msg) {
            var bridgeName = msg.bridgeName,
                data = msg.data || {},
                callbackId = msg.callbackId, // Native 将 callbackId 原封不动传回
                responstId = msg.responstId;
            // 具体逻辑
            // bridgeName 和 callbackId 不会同时存在
            if (callbackId) {
                if (callbacks[callbackId]) { // 找到相应句柄
                    callbacks[callbackId](msg.data); // 执行调用
                }
            } elseif (bridgeName) {
                if (registerFuncs[bridgeName]) { // 通过 bridgeName 找到句柄
                    var ret = {},
                        flag = false;
                    registerFuncs[bridgeName].forEach(function(callback) =&amp;gt; {
                        callback(data, function(r) {
                            flag = true;
                            ret = Object.assign(ret, r);
                        });
                    });
                    if (flag) {
                        nativeBridge.postMessage({ // 回调 Native
                            responstId: responstId,
                            ret: ret
                        });
                    }
                }
            }
        },
        register: function(bridgeName, callback) {
            if (!registerFuncs[bridgeName])  {
                registerFuncs[bridgeName] = [];
            }
            registerFuncs[bridgeName].push(callback); // 存储回调
        }
    };
})();
&lt;/code&gt;&lt;/pre&gt;
 &lt;h1&gt;参考&lt;/h1&gt;
 &lt;ul&gt;
  &lt;li&gt;https://juejin.cn/post/6936814903021797389&lt;/li&gt;
  &lt;li&gt;https://juejin.cn/post/6844903585268891662&lt;/li&gt;
  &lt;li&gt;https://juejin.cn/post/6844904070881214471&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt; &lt;a href="https://itindex.net/"  title="IT 资讯"&gt;&lt;img src="https://itindex.net/images/iconWarning.gif" title="IT 资讯" border="0"/&gt; &lt;/a&gt;</description>
      <category />
      <guid isPermaLink="true">https://itindex.net/detail/62859-jsbridge-web-app</guid>
      <pubDate>Mon, 09 Oct 2023 16:21:55 CST</pubDate>
    </item>
    <item>
      <title>欧盟开放 Web 搜索项目启动</title>
      <link>https://itindex.net/detail/62430-%E6%AC%A7%E7%9B%9F-%E5%BC%80%E6%94%BE-web</link>
      <description>搜索是数字经济的支柱，但它控制在少数巨头手中。为了实现信息的自由、不带偏见和透明的访问，欧盟 7 个国家 14 个研究和计算中心发起了 &lt;a href="https://openwebsearch.eu/" target="_blank"&gt;开放 Web 搜索项目&lt;/a&gt;，为欧盟的 Web 搜索构建开放的基础设施。未来三年，研究人员将开发核心的索引 Open Web Index (OWI)。索引将与搜索引擎分开，创建索引的昂贵过程可以在大型集群上完成，而搜索引擎则可以在本地执行。通过 Open-Web-Search Engine Hub，任何人都可以分享其搜索引擎规格和预计算定期更新的索引。最终目标是创造一个以人为中心无隐私问题的搜索。&lt;div&gt; &lt;a href="https://itindex.net/"  title="IT 资讯"&gt;&lt;img src="https://itindex.net/images/iconWarning.gif" title="IT 资讯" border="0"/&gt; &lt;/a&gt;</description>
      <category />
      <guid isPermaLink="true">https://itindex.net/detail/62430-%E6%AC%A7%E7%9B%9F-%E5%BC%80%E6%94%BE-web</guid>
      <pubDate>Wed, 21 Sep 2022 17:00:10 CST</pubDate>
    </item>
    <item>
      <title>微服务自动化测试的测试策略 - Web 3.0 Cloud-Streams 产品级敏捷</title>
      <link>https://itindex.net/detail/61934-%E5%BE%AE%E6%9C%8D%E5%8A%A1-%E8%87%AA%E5%8A%A8%E5%8C%96-%E6%B5%8B%E8%AF%95</link>
      <description>&lt;div&gt;    &lt;div&gt;   &lt;br /&gt;&lt;/div&gt;    &lt;h3&gt;前言:&lt;/h3&gt;    &lt;p&gt;微服务遵循著单一责任 (Single Responsibility) 的设计原则, 使得微服务较传统的单体 (Monolithic) 能更容易的独立发布、部署。另一方面, 微服务能拥有更大的空间去选择适合自身的编程语言、技术。最重要的一点是, 微服务的架构更容易的能做到 “水平扩展”。&lt;/p&gt;    &lt;p&gt;然而, 微服务也有它的技术挑战需要克服。&lt;/p&gt;    &lt;p&gt;如图一所示, 微服务的架构是分布式的, 在这样的分布式的架构下, 所谓的 “自动化测试” 将是微服务能否成功的一个首要且关键的要素。&lt;/p&gt;    &lt;p&gt;我们将以一系列的文章来探讨微服务自动化测试的策略、方法、工具。首先, 我们从微服务的测试策略谈起。&lt;/p&gt;    &lt;img alt="" height="1020" src="https://www.deva9.com/wp-content/uploads/2018/08/ms.png" width="1288"&gt;&lt;/img&gt;图一：微服务; 分布式的架构    &lt;h3&gt;本文:　&lt;/h3&gt;    &lt;p&gt;　在谈微服务的自动化测试策略前, 我们需先一起共同的来探讨: 微服务内的架构、微服务与微服务间的协作。然后, 我们就可以探讨微服务需要那些类型的自动化测试。&lt;/p&gt;    &lt;img alt="" height="650" src="https://www.deva9.com/wp-content/uploads/2018/08/servicesdetail.png" width="746"&gt;&lt;/img&gt;图二: 微服务内部的主要元素    &lt;p&gt;如图二所示, 微服务的内部主要是由以下的元素所组成：&lt;/p&gt;    &lt;ul&gt;      &lt;li&gt;        &lt;strong&gt;Resources&lt;/strong&gt;: 主要的责任是经由所选择的协议; 如: REST; 将微服务所提供的服务暴露给微服务的 Client。Resource 会完整性的校验由微服务的 Client所传过来的请求 (Request), 并且将微服务执行完某个服务后的结果, 按照由协议所界定的响应 (Response) 格式; 如: JSON; 提供给微服务的 Client。&lt;/li&gt;      &lt;li&gt;        &lt;strong&gt;Service layer:&lt;/strong&gt;主要的责任是派工给多个的 Domain, 以共同的完成微服务Client 的请求。Resource 完整的校验由微服务的 Client 所传过来的请求(Request) 后, 假如, 此请求会需要自身微服务内部或外部的微服务多个的Domain 才能完成时, Resource 便会将此请求, 交由 Service layer 来处理。Service layer 便会派工给多个的 Domain。当此请求需要调用到外部的微服务时, Service layer 便会藉由 Gateways去传递个请求 (Request) 到外部的微服务。&lt;/li&gt;      &lt;li&gt;        &lt;strong&gt;Domain&lt;/strong&gt;: 主要的责任是专注在微服务业务逻辑的处理。Domain 会将处理完业务逻辑后的结果, 传回给 Resources。&lt;/li&gt;      &lt;li&gt;        &lt;strong&gt;Gateways: &lt;/strong&gt;主要的责任是使有关连; 会发生调用; 的微服务可以连接起来。Gateways 引导著来自自身微服务的 Service layer 的请求 (Request), 到另一个或多个的外部的微服务, 并且将外部的微服务的响应 (Response) , 传回给自身微服务的 Domain。Gateways 则是藉由 HTTP client 处理微服务间的 HTTP 协议上的请求-响应 (Request-Response)。&lt;/li&gt;      &lt;li&gt;        &lt;strong&gt;Data mappers/ORM&lt;/strong&gt;: 主要的责任是将微服务内的对象持久化。&lt;/li&gt;&lt;/ul&gt;    &lt;p&gt;      &lt;strong&gt;微服务与微服务间的协作&lt;/strong&gt;&lt;/p&gt;    &lt;p&gt;微服务是能独立发布、独立部署的; 但, 绝不是 “孤立而行”。也就是说, 我们往往是需要多个的微服务来共同提供一具备商业价值的特性; 如图三所示。&lt;/p&gt;    &lt;img alt="" height="934" src="https://www.deva9.com/wp-content/uploads/2018/08/endtoend.png" width="1180"&gt;&lt;/img&gt;图三: 多个微服务共同提供一具备商业价值的特性    &lt;p&gt;对于由多个微服务共同提供一具备商业价值的特性的自动化测试, 我们需考量:&lt;/p&gt;    &lt;ul&gt;      &lt;li&gt;多个微服务是由一个以上的团队在负责开发时,如何确保某个团队开发的节奏、自动化的测试, 不会影响到其他团队的微服务的发布、布署? 我们将在 “能独立发布、独立部署微服务的团队阵型” 一文中再作探讨。&lt;/li&gt;&lt;/ul&gt;    &lt;p&gt;      &lt;strong&gt;微服务自动化测试的类型&lt;/strong&gt;&lt;/p&gt;    &lt;ul&gt;      &lt;li&gt;        &lt;strong&gt;单元测试(UNIT TESTING)&lt;/strong&gt;&lt;/li&gt;&lt;/ul&gt;    &lt;p&gt;微服务自动化测试中的单元测试, 也是以单个或多个相关的类 (Class) 为测试的单元。&lt;/p&gt;    &lt;p&gt;微服务自动化测试中的单元测试, 也是分成为两类:&lt;/p&gt;    &lt;ul&gt;      &lt;li&gt;        &lt;strong&gt;社交型的单元测试 (Sociable unit testing)&lt;/strong&gt;: 主要是专注测试模块接口的行为是否正确? 而将以类 (Class) 为单元的测试, 当成是黑盒。在微服务自动化测试中, Domain往往是采用社交型的单元测试。因为, 往往我们需要多个Domain 来完成某个微服务 Client 的请求。&lt;/li&gt;      &lt;li&gt;        &lt;strong&gt;单独型的单元测试 (Solitary unit testing)&lt;/strong&gt;: 主要是专注测试单个类/ 对象和它的依赖间的行为是否正确? 我们往往会将单个类/ 对象的依赖以 Mock 或Stub 的方式来替代。在微服务自动化测试中, 我们往往会将相对独立就能完成自身任务的 Resources, Service layer, Data mappers/ORM, Gateways, HTTP client 采用单独型的单元测试。&lt;/li&gt;&lt;/ul&gt;    &lt;p&gt;社交型的单元测试, 单独型的单元测试对于保障 “单一个” 微服务内部的质量, 扮演著重要且关键的角色。&lt;/p&gt;    &lt;p&gt;对于保障 “多个” 微服务间的所谓 “系统层级” 的行为正确, 我们将要藉助:&lt;/p&gt;    &lt;p&gt;集成测试 (Integration Testing), 组件测试 (Component Testing), 契约测试 (Contract Testing), 端到端测试 (End-To-End Testing)。&lt;/p&gt;    &lt;ul&gt;      &lt;li&gt;        &lt;strong&gt;集成测试 (Integration Testing)&lt;/strong&gt;&lt;/li&gt;&lt;/ul&gt;    &lt;p&gt;在微服务自动化测试中, 所谓的集成测试 (Integration Testing) 主要是测试微服务内的模块能否与外部的微服务或外部的数据库正常的 “通信” ? 而不是在测试外部的微服务或外部的数据库。&lt;/p&gt;    &lt;p&gt;所以, 在微服务自动化测试中的集成测试, 只需测试关键路径上成功/ 异常的场景即可。&lt;/p&gt;    &lt;p&gt;如图四所示, 在微服务内的 Gateways/ HTTP client, Data mappers/ORM 需执行微服务自动化测试中的集成测试。&lt;/p&gt;    &lt;ul&gt;      &lt;li&gt;        &lt;strong&gt;Gateways/ HTTP client &lt;/strong&gt;        &lt;strong&gt;的集成测试&lt;/strong&gt;: 主要是测试微服务内的模块能否与外部的微服务连接, 并且检测通信协议上的问题; 如: 丢失 HTTP 的表头, 不正确的 SSL 处理, request/response 不匹配。关键的一点是: 所有错误处理的场景一定要都能被覆盖测试到。在后面的文章中, 我们也将会探讨运用 Service virtualization 测试关于 timeout 或者外部微服务延迟响应等的场景。&lt;/li&gt;      &lt;li&gt;        &lt;strong&gt;Data mappers/ORM &lt;/strong&gt;        &lt;strong&gt;的集成测试&lt;/strong&gt;: 主要是测试微服务外部的数据库内的数据表结构是与微服务所期望的数据表结构是一致的。Data mappers/ORM 的集成测试, 对于 NoSQL 的数据库是相当重要、且必要的测试。&lt;/li&gt;&lt;/ul&gt;    &lt;img alt="" height="958" src="https://www.deva9.com/wp-content/uploads/2018/08/intergation_test.png" width="832"&gt;&lt;/img&gt;图四: 集成测试 (Integration Testing)    &lt;ul&gt;      &lt;li&gt;        &lt;strong&gt;组件测试 (Component Testing)&lt;/strong&gt;&lt;/li&gt;&lt;/ul&gt;    &lt;p&gt;微服务自动化测试中的组件测试 (Component Testing), 指的是: 微服务自身的测试; 以微服务作为测试的单元。&lt;/p&gt;    &lt;p&gt;在组件测试 (Component Testing) 中, 测试的粒度是微服务对外的API; 从微服务Client 的视角, 测试微服务对外的API 的行为是否符合预期?&lt;/p&gt;    &lt;p&gt;在组件测试 (Component Testing) 中, 将会以 test doubles (mock/ stub) 的方式, 隔离微服务对外的依赖。&lt;/p&gt;    &lt;ul&gt;      &lt;li&gt;如图五所示, 在组件测试 (Component Testing) 中, 为了隔离微服务对外的依赖, Gateways 被配置成去调用 HTTP Client Stub; HTTP Client Stub 将会取代外部的微服务, 而对请求 (Request) 做出响应 (Response)。&lt;/li&gt;      &lt;li&gt;如图五所示, 在组件测试 (Component Testing) 中, 我们会以 In-Memory 数据库; 如: H2; 取代外部数据库。这样的作法, 毫无疑问的, 将大幅的提升组件测试 (Component Testing) 执行的速度。&lt;/li&gt;&lt;/ul&gt;    &lt;p&gt;在后面的文章中, 我们将会探讨如何以 Arquillian 实现组件测试 (Component Testing) 。&lt;/p&gt;    &lt;img alt="" height="964" src="https://www.deva9.com/wp-content/uploads/2018/08/component-test.png" width="856"&gt;&lt;/img&gt;图五: 组件测试 (Component Testing)    &lt;ul&gt;      &lt;li&gt;        &lt;strong&gt;契约测试 (Contract Testing)&lt;/strong&gt;&lt;/li&gt;&lt;/ul&gt;    &lt;p&gt;微服务是能独立发布、独立部署的; 但, 绝不是 “孤立而行”。也就是说, 我们往往是需要多个的微服务来共同提供一具备商业价值的特性。&lt;/p&gt;    &lt;p&gt;当微服务是扮演提供服务的角色时, 我们便称此微服务是 “Producer”。&lt;/p&gt;    &lt;p&gt;当微服务是扮演使用服务的角色时, 我们便称此微服务是 “Consumer”。&lt;/p&gt;    &lt;p&gt;微服务自动化测试中的契约测试 (Contract Testing), 会在 Producer 微服务与Consumer 微服务之间, 定义一契约 (Contract)。&lt;/p&gt;    &lt;p&gt;契约测试 (Contract Testing) 便会根据 Producer 微服务与 Consumer 微服务之间的契约, 测试 Producer 微服务与 Consumer 微服务之间的交互行为是否正确?  Producer 微服务上代码的修改, 是否会影响到 Consumer 微服务, 而使 Consumer 微服务无法再运行?&lt;/p&gt;    &lt;p&gt;如图六所示:&lt;/p&gt;    &lt;ul&gt;      &lt;li&gt;Producer 微服务提供了 Resource: {id, name, age}。&lt;/li&gt;      &lt;li&gt;根据 Contract A, Consumer 微服务 A, 使用了 Producer 微服务, 取得了 Resource: {id, name}。&lt;/li&gt;      &lt;li&gt;根据 Contract B, Consumer 微服务 B, 使用了 Producer 微服务, 取得了 Resource: {id, age}。&lt;/li&gt;      &lt;li&gt;根据 Contract C, Consumer 微服务 C, 使用了 Producer 微服务, 取得了 Resource: {id, name, age}。&lt;/li&gt;&lt;/ul&gt;    &lt;p&gt;      &lt;strong&gt;在某一天,&lt;/strong&gt;      &lt;strong&gt;一个新的 Consumer &lt;/strong&gt;      &lt;strong&gt;微服务 Y,&lt;/strong&gt;      &lt;strong&gt;要求 Producer&lt;/strong&gt;      &lt;strong&gt;微服务提供: last name, first name&lt;/strong&gt;      &lt;strong&gt;。&lt;/strong&gt;&lt;/p&gt;    &lt;ul&gt;      &lt;li&gt;Producer 微服务的开发人员, 便将 Producer 微服务中的 name 栏位(属性) 改成 name 类(对象); 封装著 last name, first name。&lt;/li&gt;      &lt;li&gt;经由契约测试 (Contract Testing), Producer 微服务的开发人员将能立马的发现, 他(她) 在 Producer 微服务上的修改, 将会影响到 Consumer A 微服务与 Consumer C 微服务, 而使 Consumer A 微服务与 Consumer C 微服务无法再运行。&lt;/li&gt;&lt;/ul&gt;    &lt;p&gt;在后面的文章中, 我们将会探讨如何以 Pact 实现契约测试 (Contract Testing)。&lt;/p&gt;    &lt;img alt="" height="956" src="https://www.deva9.com/wp-content/uploads/2018/08/contracttest.png" width="926"&gt;&lt;/img&gt;契约测试 (Contract Testing)    &lt;ul&gt;      &lt;li&gt;        &lt;strong&gt;端到端测试 (End-To-End Testing)&lt;/strong&gt;&lt;/li&gt;&lt;/ul&gt;    &lt;p&gt;微服务自动化测试中的端到端测试 (End-To-End Testing), 主要是要覆盖产品中从前端 GUI 到微服务的测试。&lt;/p&gt;    &lt;p&gt;微服务自动化测试中的端到端测试 (End-To-End Testing) 开发与维护的成本是相当的高的。&lt;/p&gt;    &lt;p&gt;在后面的文章中, 我们将会探讨如何以 Arquillian 实现端到端测试 (End-To-End Testing)。&lt;/p&gt;    &lt;img alt="" height="934" src="https://www.deva9.com/wp-content/uploads/2018/08/endtoend-1.png" width="1180"&gt;&lt;/img&gt;图七: 端到端测试 (End-To-End Testing); 从前端 GUI 到微服务的测试    &lt;p&gt;      &lt;strong&gt;测试金字塔 (Test Pyramid)&lt;/strong&gt;&lt;/p&gt;    &lt;p&gt;在了解了各种类型的微服务自动化测试后, 我们就可以将各种类型的微服务自动化测试, 放入测试金字塔 (Test Pyramid) 中。&lt;/p&gt;    &lt;p&gt;如图八所示, 测试金字塔 (Test Pyramid) 可以帮助我们知道如何的去平衡 “测试成本” 与 “测试粗粒度”。&lt;/p&gt;    &lt;p&gt;在测试金字塔 (Test Pyramid)中, 越往上升, 所代表的是: 测试的粗粒度越大, 但测试的成本 (测试执行时间) 就越高 (越长)。&lt;/p&gt;    &lt;p&gt;　所以, 在      &lt;strong&gt;微服务自动化测试的测试策略&lt;/strong&gt;应该是:&lt;/p&gt;    &lt;ul&gt;      &lt;li&gt;在测试金字塔 (Test Pyramid) 中, 越往上升的测试类型, 其测试的粗粒度就越大, 而其测试的数量应递减。&lt;/li&gt;      &lt;li&gt;反之, 在测试金字塔 (Test Pyramid) 中, 越往下行的测试类型, 其测试的粗粒度就越小, 而其测试的数量应递增。&lt;/li&gt;      &lt;li&gt;        &lt;strong&gt;在微服务自动化测试中,&lt;/strong&gt;        &lt;strong&gt;测试数量最多的测试应该是:&lt;/strong&gt;        &lt;strong&gt;单元测试 (UNIT TESTING)&lt;/strong&gt;        &lt;strong&gt;。&lt;/strong&gt;&lt;/li&gt;      &lt;li&gt;        &lt;strong&gt;在微服务自动化测试中,&lt;/strong&gt;        &lt;strong&gt;测试数量最少的测试应该是:&lt;/strong&gt;        &lt;strong&gt;端到端测试 (End-To-End Testing)&lt;/strong&gt;        &lt;strong&gt;。&lt;/strong&gt;&lt;/li&gt;&lt;/ul&gt;    &lt;img alt="" height="556" src="https://www.deva9.com/wp-content/uploads/2018/08/pyramid.png" width="792"&gt;&lt;/img&gt;图八: 测试金字塔(Test Pyramid)    &lt;h3&gt;结论：&lt;/h3&gt;    &lt;p&gt;在分布式架构下的微服务, 要进行自动化测试是件相当复杂的工程。&lt;/p&gt;    &lt;p&gt;软件工程界的巨擘; Martin Fowler; 提供了微服务测试的指引。&lt;/p&gt;    &lt;p&gt;我们可­根据 Martin Fowler 所提供的微服务测试的指引, 制订我们微服务自动化测试的测试策略。我们后续的文章, 也将会根据 Martin Fowler 所提供的微服务测试的指引, 探讨如何运用相关的测试框架、工具, 以实现微服务自动化测试。&lt;/p&gt;    &lt;p&gt;      &lt;strong&gt;參考資料&lt;/strong&gt;&lt;/p&gt;    &lt;ul&gt;      &lt;li&gt;Testing Strategies in a Microservice Architecture; Martin Fowler&lt;/li&gt;      &lt;li&gt;Microservices Patterns; Chris Richardson&lt;/li&gt;      &lt;li&gt;Testing Java Microservices; Alex Soto Bueno, Andy Gumbrecht, Jason Porter&lt;/li&gt;&lt;/ul&gt;    &lt;div&gt;      &lt;div&gt;        &lt;a href="https://www.addtoany.com/add_to/wechat?linkurl=https%3A%2F%2Fwww.deva9.com%2Fcloud-streams%2F%25e5%25be%25ae%25e6%259c%258d%25e5%258a%25a1%25e8%2587%25aa%25e5%258a%25a8%25e5%258c%2596%25e6%25b5%258b%25e8%25af%2595%25e7%25b3%25bb%25e5%2588%2597-%25e4%25b8%2580-%25e5%25be%25ae%25e6%259c%258d%25e5%258a%25a1%25e8%2587%25aa%25e5%258a%25a8%25e5%258c%2596%25e6%25b5%258b%25e8%25af%2595%25e7%259a%2584%25e6%25b5%258b%2F&amp;linkname=%E5%BE%AE%E6%9C%8D%E5%8A%A1%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E7%9A%84%E6%B5%8B%E8%AF%95%E7%AD%96%E7%95%A5" rel="nofollow noopener" target="_blank" title=""&gt;&lt;/a&gt;        &lt;a href="https://www.addtoany.com/add_to/sina_weibo?linkurl=https%3A%2F%2Fwww.deva9.com%2Fcloud-streams%2F%25e5%25be%25ae%25e6%259c%258d%25e5%258a%25a1%25e8%2587%25aa%25e5%258a%25a8%25e5%258c%2596%25e6%25b5%258b%25e8%25af%2595%25e7%25b3%25bb%25e5%2588%2597-%25e4%25b8%2580-%25e5%25be%25ae%25e6%259c%258d%25e5%258a%25a1%25e8%2587%25aa%25e5%258a%25a8%25e5%258c%2596%25e6%25b5%258b%25e8%25af%2595%25e7%259a%2584%25e6%25b5%258b%2F&amp;linkname=%E5%BE%AE%E6%9C%8D%E5%8A%A1%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E7%9A%84%E6%B5%8B%E8%AF%95%E7%AD%96%E7%95%A5" rel="nofollow noopener" target="_blank" title=""&gt;&lt;/a&gt;        &lt;a href="https://www.addtoany.com/add_to/facebook?linkurl=https%3A%2F%2Fwww.deva9.com%2Fcloud-streams%2F%25e5%25be%25ae%25e6%259c%258d%25e5%258a%25a1%25e8%2587%25aa%25e5%258a%25a8%25e5%258c%2596%25e6%25b5%258b%25e8%25af%2595%25e7%25b3%25bb%25e5%2588%2597-%25e4%25b8%2580-%25e5%25be%25ae%25e6%259c%258d%25e5%258a%25a1%25e8%2587%25aa%25e5%258a%25a8%25e5%258c%2596%25e6%25b5%258b%25e8%25af%2595%25e7%259a%2584%25e6%25b5%258b%2F&amp;linkname=%E5%BE%AE%E6%9C%8D%E5%8A%A1%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E7%9A%84%E6%B5%8B%E8%AF%95%E7%AD%96%E7%95%A5" rel="nofollow noopener" target="_blank" title=""&gt;&lt;/a&gt;        &lt;a href="https://www.addtoany.com/add_to/facebook_messenger?linkurl=https%3A%2F%2Fwww.deva9.com%2Fcloud-streams%2F%25e5%25be%25ae%25e6%259c%258d%25e5%258a%25a1%25e8%2587%25aa%25e5%258a%25a8%25e5%258c%2596%25e6%25b5%258b%25e8%25af%2595%25e7%25b3%25bb%25e5%2588%2597-%25e4%25b8%2580-%25e5%25be%25ae%25e6%259c%258d%25e5%258a%25a1%25e8%2587%25aa%25e5%258a%25a8%25e5%258c%2596%25e6%25b5%258b%25e8%25af%2595%25e7%259a%2584%25e6%25b5%258b%2F&amp;linkname=%E5%BE%AE%E6%9C%8D%E5%8A%A1%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E7%9A%84%E6%B5%8B%E8%AF%95%E7%AD%96%E7%95%A5" rel="nofollow noopener" target="_blank" title=""&gt;&lt;/a&gt;        &lt;a href="https://www.addtoany.com/add_to/twitter?linkurl=https%3A%2F%2Fwww.deva9.com%2Fcloud-streams%2F%25e5%25be%25ae%25e6%259c%258d%25e5%258a%25a1%25e8%2587%25aa%25e5%258a%25a8%25e5%258c%2596%25e6%25b5%258b%25e8%25af%2595%25e7%25b3%25bb%25e5%2588%2597-%25e4%25b8%2580-%25e5%25be%25ae%25e6%259c%258d%25e5%258a%25a1%25e8%2587%25aa%25e5%258a%25a8%25e5%258c%2596%25e6%25b5%258b%25e8%25af%2595%25e7%259a%2584%25e6%25b5%258b%2F&amp;linkname=%E5%BE%AE%E6%9C%8D%E5%8A%A1%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E7%9A%84%E6%B5%8B%E8%AF%95%E7%AD%96%E7%95%A5" rel="nofollow noopener" target="_blank" title=""&gt;&lt;/a&gt;        &lt;a href="https://www.addtoany.com/add_to/whatsapp?linkurl=https%3A%2F%2Fwww.deva9.com%2Fcloud-streams%2F%25e5%25be%25ae%25e6%259c%258d%25e5%258a%25a1%25e8%2587%25aa%25e5%258a%25a8%25e5%258c%2596%25e6%25b5%258b%25e8%25af%2595%25e7%25b3%25bb%25e5%2588%2597-%25e4%25b8%2580-%25e5%25be%25ae%25e6%259c%258d%25e5%258a%25a1%25e8%2587%25aa%25e5%258a%25a8%25e5%258c%2596%25e6%25b5%258b%25e8%25af%2595%25e7%259a%2584%25e6%25b5%258b%2F&amp;linkname=%E5%BE%AE%E6%9C%8D%E5%8A%A1%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E7%9A%84%E6%B5%8B%E8%AF%95%E7%AD%96%E7%95%A5" rel="nofollow noopener" target="_blank" title=""&gt;&lt;/a&gt;        &lt;a href="https://www.addtoany.com/share"&gt;&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;
    &lt;div&gt; &lt;a href="https://itindex.net/"  title="IT 资讯"&gt;&lt;img src="https://itindex.net/images/iconWarning.gif" title="IT 资讯" border="0"/&gt; &lt;/a&gt;</description>
      <category />
      <guid isPermaLink="true">https://itindex.net/detail/61934-%E5%BE%AE%E6%9C%8D%E5%8A%A1-%E8%87%AA%E5%8A%A8%E5%8C%96-%E6%B5%8B%E8%AF%95</guid>
      <pubDate>Sun, 05 Dec 2021 21:19:35 CST</pubDate>
    </item>
    <item>
      <title>Flutter 2 来了：专为 Web、移动与台式机环境构建</title>
      <link>https://itindex.net/detail/61282-flutter-web-%E7%A7%BB%E5%8A%A8</link>
      <description>&lt;p&gt;&lt;/p&gt; &lt;blockquote&gt;下一代 Flutter 专为 Web、移动与台式机环境构建而成。&lt;/blockquote&gt; &lt;p&gt;&lt;/p&gt; &lt;p&gt;&lt;/p&gt; &lt;p&gt;今天，我们宣布 Flutter 2 正式亮相！作为 Flutter 的一次重大版本升级，Flutter 2 将帮助开发人员立足任意平台创建起美观、快速且能够轻松移植的应用程序。在 Flutter2 的支持下，您可以使用相同的代码库将原生应用程序发布至 iOS、Android、Windows、macOS 以及 Linux 五大系统阵营之上。此外，Flutter 2 还能够完美契合 Chrome、Firefox、Safari 以及 Edge 等网络浏览器，甚至可以被嵌入至汽车、电视与智能家居当中，借此带来最普遍、最具便携性的计算体验。&lt;/p&gt; &lt;p&gt;&lt;/p&gt; &lt;p&gt;我们的目标，是从根本上改变开发人员的应用程序构建思路。不同于以往对于特定平台的依赖，如今开发人员们可以将希望创造的体验本身作为出发点。Flutter 帮助您将品牌与设计诉求充分纳入应用体验当中。Flutter 的运行速度极快，能够将源代码编译为机器码；我们还支持有状态热重载，确保您在解释环境中获得良好生产力，并在应用程序运行时做出变更并立即查看结果。Flutter 是一套开放式核心框架，而且已经有成千上万贡献者通过软件包生态系统做出扩展贡献。&lt;/p&gt; &lt;p&gt;&lt;/p&gt; &lt;p&gt;  &lt;img src="https://static001.geekbang.org/wechat/images/44/4434f2061de46f19566c0f2d1d29fdf7.png"&gt;&lt;/img&gt;&lt;/p&gt; &lt;p&gt;&lt;/p&gt; &lt;p&gt;在今天发布的 Flutter 2 当中，我们将 Flutter 由移动框架扩展为一套可移植框架，努力确保您的应用程序能够在几乎无需任何调整的前提下轻松运行在不同平台之上。目前，单在 Play Store 软件商店中就存在超过 15 万个 Flutter 应用，且每款应用都可以获得 Flutter 2 提供的免费升级，由此在无需重写的情况下直接运行在目标台式机及 Web 环境当中。&lt;/p&gt; &lt;p&gt;&lt;/p&gt; &lt;p&gt;目前，世界各地的客户都在积极使用 Flutter，包括微信、Grab、Yandex Go、Nubank、Sonos、Fastic、Betterment 以及 realtor.com 等高人气应用。在谷歌，同样有 1000 多名工程师正在使用 Dart 与 Flutter 构建应用产品，其中的代表包括 Stadia、Google One 以及 Google Nest Hub。&lt;/p&gt; &lt;p&gt;&lt;/p&gt; &lt;p&gt;  &lt;img src="https://static001.geekbang.org/wechat/images/b6/b60369059e2f928c3522e0062328f61e.png"&gt;&lt;/img&gt;&lt;/p&gt; &lt;p&gt;&lt;/p&gt; &lt;p&gt;就在几个月前，Google Pay 刚刚转投 Flutter 的怀抱，借此在生产力与质量方面取得了重大进步。通过统一代码库，项目团队消除了不同平台之间的功能差异，并削减了超过 100 万行代码。Google Pay 还报告称，如今团队工程师们的效率大为提升、技术债务显著减少，发布流程也变得更为统一（例如 iOS 与 Android 上的安全审查与试验）。&lt;/p&gt; &lt;p&gt;&lt;/p&gt; &lt;h2&gt;Flutter 为 Web 应用添助力&lt;/h2&gt; &lt;p&gt;&lt;/p&gt; &lt;p&gt;&lt;/p&gt; &lt;p&gt;Flutter 2 当中最具份量的升级，当数对 Web 的生产质量支持能力。&lt;/p&gt; &lt;p&gt;&lt;/p&gt; &lt;p&gt;Web 在早期发展阶段主要以文档为中心。时至今日，Web 平台已经相当丰富并提供大量平台 API，可提供硬件加速下的 2D 与 3D 图形处理能力、灵活的布局与绘图 API，共同构建起高度复杂的应用程序。Flutter 的 Web 支持充分吸纳了上述创新优势，提供一套以应用程序为中心的框架体系，能够发挥现代 Web 提供的一切功能。&lt;/p&gt; &lt;p&gt;&lt;/p&gt; &lt;p&gt;新版本主要关注以下三大应用场景：&lt;/p&gt; &lt;p&gt;&lt;/p&gt; &lt;p&gt;渐进式 Web 应用（PWA），将 Web 的广泛覆盖范围与桌面应用程序的功能优势结合起来。单页应用程序（SPA），一次加载并与互联网服务之间持续传输数据。将现有 Flutter 移动应用引入 Web 环境，实现两种体验间的代码共享。&lt;/p&gt; &lt;p&gt;&lt;/p&gt; &lt;p&gt;过去几个月以来，我们一直努力实现稳定的 Web 支持能力，并在性能优化方面取得了大量进展。除了添加一套由 WebAssembly 构建的全新 CanvasKit 驱动型渲染引擎之外，我们还公布了 Flutter Plasma——由社区成员 FelixBlaschke 构建的演示方案，用以展示如何通过 Dart 与 Flutter 困难构建起复杂的 Web 图形体验。现在，这些体验已经能够在台式机与移动设备上原生运行。&lt;/p&gt; &lt;p&gt;&lt;/p&gt; &lt;p&gt;我们一直在扩展 Flutter 以构建起行业最佳的 Web 平台。最近几个月，我们引入了文本自动填充功能，对地址栏 URL 及路由的控制机制以及 PWA 清单功能。为了将台式机浏览器与手机浏览器统一起来，我们又添加了交互式滚动条与键盘快捷键、增加了台式机模式下的默认内容显示密度，同时增强了屏幕阅读器对于 Windows、MacOS 以及 Chrome OS 辅助功能的支持能力。&lt;/p&gt; &lt;p&gt;&lt;/p&gt; &lt;p&gt;我们已经发布 Flutter 构建的部分 Web 应用程序示例。在教育类用户中，iRobot 公司以其高人气 Root 教育机器人而闻名。Flutter 对于 Web 的生产级支持帮助 iRobot 将现有教育编程环境轻松迁移至 Web，相关功能也借此顺利登陆 Chromebook 及其他网络浏览器。关于相关进展以及选择 Flutter 的原因，请参阅 iRobot 发布的  &lt;a href="https://edu.irobot.com/the-latest/building-a-coding-experience-for-all"&gt; 说明博文&lt;/a&gt;&amp;quot;。&lt;/p&gt; &lt;p&gt;&lt;/p&gt; &lt;p&gt;  &lt;img src="https://static001.geekbang.org/wechat/images/d8/d8ff045772ed6781912ca67b17583a23.png"&gt;&lt;/img&gt;&lt;/p&gt; &lt;p&gt;&lt;/p&gt; &lt;p&gt;另以 Rive 为例，这是一款专门面向设计师群体的强大工具，能够在任意平台上创建出自定义动画。其更新 Web 应用程序现已提供 Beta 测试版，完全由 Flutter 构建而成，充分展示了 Flutter 新版本提供的全面服务。&lt;/p&gt; &lt;p&gt;&lt;/p&gt; &lt;p&gt;  &lt;img src="https://static001.geekbang.org/wechat/images/fe/fe340ed315173f6ecc97a58235126038.png"&gt;&lt;/img&gt;&lt;/p&gt; &lt;p&gt;&lt;/p&gt; &lt;h2&gt;Flutter 2 登陆台式机、折叠式设备与嵌入式设备&lt;/h2&gt; &lt;p&gt;&lt;/p&gt; &lt;p&gt;&lt;/p&gt; &lt;p&gt;除了传统移动设备与 Web 平台之外，Flutter 也开始为其他设备类型提供支持。在本文中，我们将以三位合作伙伴为例，聊聊 Flutter 的强大可移植性表现。&lt;/p&gt; &lt;p&gt;&lt;/p&gt; &lt;p&gt;首先是 Canonical，我们双方合作将 Flutter 引入桌面环境，借此 Canonical 工程师们贡献的代码支持 Flutter 在 Linux 上的开发与部署。Ubuntu 团队展示了由 Flutter 重写的全新安装程序的早期演示效果。对 Canonical 而言，最重要的就是如何在各类硬件配置之上提供稳定且令人愉悦的使用体验。展望未来，Flutter 将成为 Canonical 构建后续桌面与移动应用程序时的默认选项。&lt;/p&gt; &lt;p&gt;&lt;/p&gt; &lt;p&gt;  &lt;img src="https://static001.geekbang.org/wechat/images/e8/e8320077fb9697ac6741a41aa7f9ef88.png"&gt;&lt;/img&gt;&lt;/p&gt; &lt;p&gt;&lt;/p&gt; &lt;p&gt;接下来是微软，软件巨头同样在不断扩大对 Flutter 的支持。除了在 Flutter 当中建立更完善的 Windows 支持能力之外，微软此次同样宣布将对 Flutter 引擎提供全面支持，借此支持更多新型折叠式 Android 设备。这类设备将引入新的设计模式，相关应用能够扩展显示内容或利用双屏特性提供并行体验。结合 Surface 工程团队的博文，他们展示了自己的工作成果并邀请更多参与成员，希望借 Flutter 之力提升 Surface Duo 及其他同类设备的体验质量。&lt;/p&gt; &lt;p&gt;&lt;/p&gt; &lt;p&gt;  &lt;img src="https://static001.geekbang.org/wechat/images/24/244959871fd69a4e3d118da586e82cb8.png"&gt;&lt;/img&gt;&lt;/p&gt; &lt;p&gt;&lt;/p&gt; &lt;p&gt;最后，全球汽车巨头丰田公司也宣布了相关计划，着手构建由 Flutter 提供支持的车载信息娱乐系统，希望借此将最佳数字体验引入汽车产品。使用 Flutter 代表着车载软件的开发方式将出现重大变化。之所以选择 Flutter，是因为丰田看中了其出色的性能与一致性使用体验、快速迭代、易于掌握的人机工程学设计以及与智能手机相匹配的良好触控机制。通过使用 Flutter 的嵌入器 API，丰田得以针对车载系统的独特需求对 Flutter 做出量身定制。&lt;/p&gt; &lt;p&gt;&lt;/p&gt; &lt;p&gt;  &lt;img src="https://static001.geekbang.org/wechat/images/bd/bd275f281a9cbdad4c0fa9cb591ef682.png"&gt;&lt;/img&gt;&lt;/p&gt; &lt;p&gt;&lt;/p&gt; &lt;p&gt;我们很高兴能够与丰田及其他厂商积极合作，将 Flutter 应用于汽车、电视及其他嵌入式设备。未来几个月内，我们也将继续分享更多实际用例。&lt;/p&gt; &lt;p&gt;&lt;/p&gt; &lt;h2&gt;不断发展的 Flutter 生态系统&lt;/h2&gt; &lt;p&gt;&lt;/p&gt; &lt;p&gt;&lt;/p&gt; &lt;p&gt;目前，Flutter 与 Dart 已经拥有超过 15000 种软件包，分别来自 Amazon、微软、Adobe、阿里巴巴、eBay 以及 Square 等。除 Lottie、Sentry 以及 SVG 等关键软件包之外，sign_in_with_apple、google_fonts、geolocator 以及 sqflite 等 Flutter Favorite 首选软件包同样值得关注。&lt;/p&gt; &lt;p&gt;&lt;/p&gt; &lt;p&gt;现在，我们宣布正式推出 Google Mobile Ads for Flutter 的 Beta 版本。这是一种能够与 AdMob 与 AdManager 配合使用的全新 SDK，可提供包括横幅广告、插页广告、原生广告与奖励视频广告在内的多种广告格式。此前，我们一直在与多位主要客户共同试用此 SDK，例如南美洲最大的独立艺术家音乐平台 SuaMúsica 等。如今，我们决定开放 Google Mobile Ads for Flutter SDK 以供行业广泛使用。&lt;/p&gt; &lt;p&gt;&lt;/p&gt; &lt;p&gt;  &lt;img src="https://static001.geekbang.org/wechat/images/35/35c69096aa2129026d14fd50d4c5255d.png"&gt;&lt;/img&gt;&lt;/p&gt; &lt;p&gt;&lt;/p&gt; &lt;p&gt;我们还将对 Flutter 插件做出更新，包括多项核心 Firebase 服务：Authentication, CloudFirestore, Cloud Functions, Cloud Messaging, Cloud Storage 以及 Crashlytics，外加 sound null safety 支持以及对 Cloud Messaging 软件包的全面更新。&lt;/p&gt; &lt;p&gt;&lt;/p&gt; &lt;h2&gt;Dart: Flutter 背后的独门绝技&lt;/h2&gt; &lt;p&gt;&lt;/p&gt; &lt;p&gt;&lt;/p&gt; &lt;p&gt;如前文所述，Flutter 2 拥有灵活的多平台与多设备可移植能力。而这种轻松过渡至 Web、桌面与嵌入式设备的优势，在很大程度上要归功于 Dart——针对多平台开发并进行优化的谷歌编程语言。&lt;/p&gt; &lt;p&gt;&lt;/p&gt; &lt;p&gt;在构建应用方面，Dart 提供一套独特的功能组合：&lt;/p&gt; &lt;p&gt;&lt;/p&gt; &lt;p&gt;稳健的可移植表现，其编译器能够面向移动与台式机设备生成高性能的英特尔与 ARM 机器码，并为 Web 环境提供经过严格优化的 JavaScript 输出。所有目标皆可使用相同的 Flutter 框架源代码。支持有状态热重载的迭代开发，充分支持桌面与移动设备，同时提供现代 UI 编程中的异步、并发模式设计提供相应的语言构造。谷歌级性能水平，可跨越一切平台实现良好性能表现，提供 sound null safety 以保证运行时与开发过程中的 null 约束能力。&lt;/p&gt; &lt;p&gt;&lt;/p&gt; &lt;p&gt;从目前来看，还没有哪种语言能够像 Dart 这样将所有功能优势融合起来。也正因为如此，Dart 成为 GitHub 上发展速度最快的语言之一。&lt;/p&gt; &lt;p&gt;&lt;/p&gt; &lt;p&gt;Dart 2.12 现已正式发布，也是自 2.0 版本之后我们推出的最大规模发行版，可充分支持 sound null safety。Sound null safety 有望消除 null 引用引发的异常，为开发及运行时提供良好保障，允许开发人员明确指定哪些类型中可以包含 null 值。最重要的是，这项功能并非空降落地：您可以按自己熟悉的方式将其逐步添加至代码内，而后配合迁移工具实现 null 值保护。&lt;/p&gt; &lt;p&gt;&lt;/p&gt; &lt;p&gt;此次更新还包含 FFI 稳定实现，允许您编写出能够与基于 C 语言的 API 进行互操作的高性能代码；由 Flutter 编写的全新集成化开发者与分析器工具；外加众多性能与体量方面的改进，能够在无需重新编译的前提下进一步实现代码升级。关于更多详细信息，请参阅 Dart 2.12发布的  &lt;a href="https://medium.com/dartlang/announcing-dart-2-12-499a6e689c87"&gt;公告博文&lt;/a&gt;&amp;quot;：&lt;/p&gt; &lt;p&gt;&lt;/p&gt; &lt;h2&gt;Flutter 2：现已发布&lt;/h2&gt; &lt;p&gt;&lt;/p&gt; &lt;p&gt;&lt;/p&gt; &lt;p&gt;关于 Flutter 2 还有很多新鲜内容可讲，但受到本文篇幅所限，我们无法一一尽述。实际上，全部 pull 请求记录与说明构成的文档长达 200 页！感兴趣的朋友请访问 Flutter 2独立技术博客，在这里了解关于新功能与性能改进的  &lt;a href="https://medium.com/flutter/whats-new-in-flutter-2-0-fe8e95ecc65"&gt;更多信息&lt;/a&gt;&amp;quot;。&lt;/p&gt; &lt;p&gt;&lt;/p&gt; &lt;p&gt;  &lt;img src="https://static001.geekbang.org/wechat/images/33/33b88540a43315e9ba68639cda5e8039.png"&gt;&lt;/img&gt;&lt;/p&gt; &lt;p&gt;&lt;/p&gt; &lt;p&gt;我们还与加拿大屡获殊荣的设计团队 gskinner 合作开发出新的展示成果——Flutter Folio。Folio 是一款剪贴板应用程序，适用于一切设备平台。其小屏幕体验专为内容捕捉所设计；大屏幕支持允许您立足台式机与平板电脑以大家熟悉的方式完成编辑操作；Web 体验则专门针对共享操作开发而成。这一切量身定制体验都将共享同一套开源代码库，您可以随时查看并参与贡献。&lt;/p&gt; &lt;p&gt;&lt;/p&gt; &lt;p&gt;  &lt;img src="https://static001.geekbang.org/wechat/images/b3/b310fead41020ce8a612c7d9911b3622.png"&gt;&lt;/img&gt;&lt;/p&gt; &lt;p&gt;&lt;/p&gt; &lt;p&gt;如果您还没有体验过 Flutter，请千万不要错过它将给您应用程序开发体验带来的重大提升。在 Flutter 中，我们还提供一套开源工具包，可通过单一代码库构建起面向移动、桌面、Web 以及嵌入式设备的出色应用程序，将谷歌级别的质量水准引入您的实际需求场景当中。&lt;/p&gt; &lt;p&gt;&lt;/p&gt; &lt;p&gt;Flutter 为自由开源项目，我们期待有更多朋友使用 Flutter 2 构建起精美绝伦的开发成果！&lt;/p&gt; &lt;p&gt;&lt;/p&gt; &lt;p&gt;原文链接：&lt;/p&gt; &lt;p&gt;&lt;/p&gt; &lt;p&gt;  &lt;a href="https://developers.googleblog.com/2021/03/announcing-flutter-2.html"&gt;https://developers.googleblog.com/2021/03/announcing-flutter-2.html&lt;/a&gt;&amp;quot;&lt;/p&gt; &lt;p&gt;&lt;/p&gt;&lt;div&gt; &lt;a href="https://itindex.net/"  title="IT 资讯"&gt;&lt;img src="https://itindex.net/images/iconWarning.gif" title="IT 资讯" border="0"/&gt; &lt;/a&gt;</description>
      <category />
      <guid isPermaLink="true">https://itindex.net/detail/61282-flutter-web-%E7%A7%BB%E5%8A%A8</guid>
      <pubDate>Thu, 04 Mar 2021 17:25:15 CST</pubDate>
    </item>
    <item>
      <title>优化无止境，爱奇艺中后台 Web 应用性能优化实践</title>
      <link>https://itindex.net/detail/61163-%E4%BC%98%E5%8C%96-%E7%88%B1%E5%A5%87%E8%89%BA-%E5%90%8E%E5%8F%B0</link>
      <description>&lt;div&gt;  &lt;p&gt;爱奇艺视频生产智能云平台系统在今年进行了一次   &lt;strong&gt;重大升级&lt;/strong&gt;，前端团队也趁此机会将   &lt;strong&gt;底层技术架构&lt;/strong&gt;从三年前的 Arm.js（内部MVC框架）+ Java BFF + Velocity 模板完全切换到了 Vue.js + Node.js BFF 的技术栈。&lt;/p&gt;  &lt;p&gt;新的前端应是一个拥有超过   &lt;strong&gt;十个业务模块&lt;/strong&gt;的单页面应用，每个模块已经通过路由懒加载进行了拆分，同时公共的第三方依赖也拆分到了单独的 Vendor 文件。不过在上线试用初期，用户还是普遍反馈页面打开速度较老版本有比较明显的下降，存在几秒钟不等的白屏等待时间。&lt;/p&gt;  &lt;p&gt;为了提升用户体验和使用效率，团队内部对新版前端应用进行了多次优化，最终效果   &lt;strong&gt;提升非常显著&lt;/strong&gt;。本文的主要内容就是针对中后台 Web 应用性能的   &lt;strong&gt;分析思路&lt;/strong&gt;及   &lt;strong&gt;解决方案&lt;/strong&gt;的总结分享。&lt;/p&gt;  &lt;p&gt;问题梳理&lt;/p&gt;  &lt;p&gt;我们先通过提问题的方式，从   &lt;strong&gt;资源文件加载、页面渲染性能、接口响应速度&lt;/strong&gt;等三个方面分别列出了一些可能存在性能瓶颈的环节。&lt;/p&gt;  &lt;p&gt;资源加载问题   &lt;br /&gt;&lt;/p&gt;  &lt;div&gt;   &lt;p&gt;在一个复杂的 Web 应用中，通常会依赖很多 JS/CSS/Images 等资源文件。如何在最短时间内获取页面所需的最小资源，我们需要考虑以下几个问题：&lt;/p&gt;   &lt;ul&gt;    &lt;li&gt;     &lt;p&gt;源码中有无      &lt;strong&gt;冗余的模块&lt;/strong&gt;？是否进行了      &lt;strong&gt;压缩、合并&lt;/strong&gt;等操作？&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;   &lt;ul&gt;    &lt;li&gt;     &lt;p&gt;服务器响应及网络传输速度是否正常？有没有最大化利用浏览器的并发请求？&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;   &lt;ul&gt;    &lt;li&gt;     &lt;p&gt;资源文件的缓存策略是否合理？是否每次发布上线都需要重新请求所有文件？&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;   &lt;ul&gt;    &lt;li&gt;     &lt;p&gt;首次页面渲染是否下载了不必要的资源文件？每次渲染所需的资源文件能不能提前加载？&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;  &lt;p&gt;   &lt;strong&gt;页面渲染问题&lt;/strong&gt;&lt;/p&gt;  &lt;div&gt;   &lt;p&gt;由于 JS 是在单线程中执行，而 Vue.js 框架的大部分渲染任务都在浏览器端完成。为了解决白屏、卡顿等问题，我们需要考虑以下几个问题：&lt;/p&gt;   &lt;ul&gt;    &lt;li&gt;     &lt;p&gt;是否可以通过骨架屏等方式提前渲染核心布局？&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;   &lt;ul&gt;    &lt;li&gt;     &lt;p&gt;主线程是否存在非常耗时的长任务？是否可以进行任务分片、延迟渲染？&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;   &lt;ul&gt;    &lt;li&gt;     &lt;p&gt;是否存在时间复杂度过高的算法？是否存在大量重复计算？&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;   &lt;ul&gt;    &lt;li&gt;     &lt;p&gt;是否重复初始化相同的对象？是否存在内存泄露？&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;  &lt;p&gt;   &lt;strong&gt;接口速度问题&lt;/strong&gt;&lt;/p&gt;  &lt;div&gt;   &lt;p&gt;在列表查询等依赖后台数据展示的页面，接口的响应速度也至关重要。由于我们通过 Node.js 搭建的 BFF 来整合多个服务提供方的接口，因此可能存在以下几个问题：&lt;/p&gt;   &lt;ul&gt;    &lt;li&gt;     &lt;p&gt;后端服务提供的接口速度是否响应慢？网关、数据库、索引等服务是否正常？&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;   &lt;ul&gt;    &lt;li&gt;     &lt;p&gt;针对实时性要求较低的数据，是否可以利用缓存服务？&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;   &lt;ul&gt;    &lt;li&gt;     &lt;p&gt;同时调用多方接口时，是否最大化进行并发请求？非必要接口是否可以单独发起请求？&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;   &lt;ul&gt;    &lt;li&gt;     &lt;p&gt;与浏览器脚本一样，是否存在复杂算法、内存泄露等问题代码？&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;  &lt;p&gt;解决方案&lt;/p&gt;  &lt;p&gt;带着以上的这些问题，我们开始着手对现有的应用进行一次详细的检查，逐步定位影响性能的关键问题并一一进行解决。&lt;/p&gt;  &lt;p&gt;资源加载优化&lt;/p&gt;  &lt;p&gt;   &lt;img src="https://img0.tuicool.com/ry6nyq7.png!web"&gt;&lt;/img&gt;&lt;/p&gt;  &lt;p&gt;Webpack 构建问题分析&lt;/p&gt;  &lt;div&gt;   &lt;p&gt;由于我们的项目通过 Webpack 4.x 构建，因此为了分析资源文件的个数及大小，采用了 Webpack 插件webpack-bundle-analyzer对产出的静态资源文件进行了统计，如下图所示（截取了几个体积较大的文件）。&lt;/p&gt;   &lt;p&gt;    &lt;img src="https://img1.tuicool.com/f2IB7bE.png!web"&gt;&lt;/img&gt;&lt;/p&gt;   &lt;p&gt;根据统计我们发现了以下几个主要问题：&lt;/p&gt;   &lt;ul&gt;    &lt;li&gt;     &lt;p&gt;缓存问题。每次改动任意代码，所有生成的 JS/CSS 等文件的 Hash 值都发生了变化，这意味着每次发布上线，浏览器都需要重新请求全部资源。&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;   &lt;ul&gt;    &lt;li&gt;     &lt;p&gt;文件大小。通过 node_modules 生成的 chunk-vendor 原始大小超过 1.5 M。其中，体积最大的是 ElementUI，超过 650K，其次是 moment.js，体积超过 250K。剩余部分则由 Vue.js、Lodash 等基础类库组成。&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;   &lt;ul&gt;    &lt;li&gt;     &lt;p&gt;重复打包。部分业务模块对应的 chunk 文件原始大小在 500K 左右。其原因是使用到了 d3，echarts 等依赖的模块，直接将它们打包到了对应模块中。而这些第三方库，占整个文件大小的 70% 左右。&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;   &lt;ul&gt;    &lt;li&gt;     &lt;p&gt;资源个数。由 Webpack 自动生成了多个模块间的公共 chunk，大小在几 K 到一百多 K 不等。例如有三个模块 a，b，c，则自动生成的 chunk 包含多种不同的组合 a~b.js，a~c.js，a~b~c.js，请求 a 模块的时候也会同步加载这几个文件。随着模块数量增加，组合也更复杂，无形中也增加了请求的数量。&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;  &lt;p&gt;   &lt;img src="https://img0.tuicool.com/ry6nyq7.png!web"&gt;&lt;/img&gt;&lt;/p&gt;  &lt;p&gt;浏览器加载速度分析&lt;/p&gt;  &lt;div&gt;   &lt;p&gt;通过浏览器 Network 工具，我们发现服务器缓存、网络传输等对加载速度影响很小，导致慢的几个主要问题如下：&lt;/p&gt;   &lt;ul&gt;    &lt;li&gt;     &lt;p&gt;并发数量。通过构建得到的静态资源文件都部署到一个静态域名下面，导致需要排队下载文件。&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;   &lt;ul&gt;    &lt;li&gt;     &lt;p&gt;顺序问题。一些非首次渲染所需要的 JS 文件（如播放器 SDK 、流程图 SDK 等）在页面打开的时候就进行了阻塞加载。&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;  &lt;p&gt;   &lt;img src="https://img0.tuicool.com/ry6nyq7.png!web"&gt;&lt;/img&gt;&lt;/p&gt;  &lt;p&gt;资源构建及部署优化方案&lt;/p&gt;  &lt;div&gt;   &lt;p&gt;针对以上问题，我们对 Webpack 配置方式做了以下几点改进。&lt;/p&gt;   &lt;ul&gt;    &lt;li&gt;     &lt;p&gt;单独部署基础库至 CDN。生产环境将 Vue.js + VueRouter + Vuex + VueCompositionAPI + ElementUI + Lodash 等基础类库通过 webpack.DllPlugin 提前构建为 library.dll.js 并单独部署，同时整个站点中通过 prefetch 提前加载。&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;   &lt;ul&gt;    &lt;li&gt;     &lt;p&gt;单独部署样式主题至 CDN。项目中用到的 ElementUI 组件样式及团队内部开发的 MaterialTheme 主题样式放弃从 NPM 引入 Sass 源码。而是提前构建好 9 种不同颜色的主题，提前部署至 CDN，并通过 prefetch 提前加载。项目中的自定义样式则通过 Sass Mixin 生成不同主题的规则。&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;   &lt;pre&gt;&amp;lt;link    &lt;br /&gt;href=&amp;quot;//static.iqiyi.com/lego/theme/element-ui/1.0.0/css/cyan.css&amp;quot;    &lt;br /&gt;rel=&amp;quot;prefetch&amp;quot;    &lt;br /&gt;/&amp;gt;    &lt;br /&gt;&amp;lt;link    &lt;br /&gt;href=&amp;quot;//static.iqiyi.com/lego/theme/element-material/2.0.0/css/cyan.css&amp;quot;    &lt;br /&gt;rel=&amp;quot;prefetch&amp;quot;    &lt;br /&gt;/&amp;gt;    &lt;br /&gt;&lt;/pre&gt;   &lt;ul&gt;    &lt;li&gt;     &lt;p&gt;将业务代码部署至与基础库不同的域名。提升浏览器并发请求的数量。&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;   &lt;ul&gt;    &lt;li&gt;     &lt;p&gt;将播放器 SDK、流程图 SDK 等非首次渲染必须的 JS 文件通过 defer 等方式进行异步加载，或改为组件初始化时动态请求。&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;   &lt;ul&gt;    &lt;li&gt;     &lt;p&gt;删除 moment.js 等非必须的第三方类库。通过查看项目源码，发现仅几个地方用到了 moment.js 的格式化功能，因此我们选择通过自己实现一个仅几十行的工具函数来替换。此外根据项目实际情况，也可以考虑在项目中引入体积更小的类库，例如 Day.js 等。&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;   &lt;ul&gt;    &lt;li&gt;     &lt;p&gt;优化 Webpack 的 splitChunks 策略。将 d3，echarts 等依赖抽取为单独的 chunk。此外，考虑到不同模块之间自动生成的公共 chunk（类似 a~b~c.js）文件不大，反而增加了请求数量，因此禁用了该项配置。同时，显示地将各模块间公共的部分（项目中统一放在 src/common 目录下）打包至 chunk-common 文件中。&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;   &lt;pre&gt;// webpack config    &lt;br /&gt;{    &lt;br /&gt;optimization: {    &lt;br /&gt;splitChunks: {    &lt;br /&gt;cacheGroups: {    &lt;br /&gt;// 禁用默认拆分的 chunk    &lt;br /&gt;default: false,    &lt;br /&gt;// 显示抽取项目公共 chunk    &lt;br /&gt;common: {    &lt;br /&gt;name:&amp;apos;chunk-common&amp;apos;,    &lt;br /&gt;test: /src[\\/]common/,    &lt;br /&gt;chunks:&amp;apos;all&amp;apos;    &lt;br /&gt;},    &lt;br /&gt;// 抽取 d3/echarts 等第三方类库    &lt;br /&gt;d3: {    &lt;br /&gt;name:&amp;apos;chunk-d3&amp;apos;,    &lt;br /&gt;test: /[\\/]node_modules[\\/](d3|dagre|graphlib)/,    &lt;br /&gt;priority:100,    &lt;br /&gt;chunks:&amp;apos;all&amp;apos;    &lt;br /&gt;},    &lt;br /&gt;echarts: {    &lt;br /&gt;name:&amp;apos;chunk-echarts&amp;apos;,    &lt;br /&gt;test: /[\\/]node_modules[\\/](echarts|zrender)/,    &lt;br /&gt;priority:110,    &lt;br /&gt;chunks:&amp;apos;all&amp;apos;    &lt;br /&gt;}    &lt;br /&gt;}    &lt;br /&gt;}    &lt;br /&gt;},    &lt;br /&gt;}&lt;/pre&gt;   &lt;ul&gt;    &lt;li&gt;     &lt;p&gt;优化构建后文件名中的Hash。在生产环境改用 contenthash 来命名文件，仅当包含的文件内容发生改变时才会重新生成新的文件名，最大化利用缓存。&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;   &lt;div&gt;    &lt;pre&gt;// webpack config&lt;/pre&gt;    &lt;pre&gt;{&lt;/pre&gt;    &lt;pre&gt;output: {&lt;/pre&gt;    &lt;pre&gt;filename: &amp;apos;js/[name].[contenthash].js&amp;apos;,&lt;/pre&gt;    &lt;pre&gt;chunkFilename: &amp;apos;js/[name].[contenthash].js&amp;apos;&lt;/pre&gt;    &lt;pre&gt;}&lt;/pre&gt;    &lt;pre&gt;}&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;  &lt;p&gt;经过以上优化，最终构建的 chunk-vendor 大小在 500K 左右，体积大约减小 2/3；新抽取的项目公共文件 chunk-common 大小 300K 左右；各个模块打包的文件大小则在 200K 左右， 体积大约减小 3/5。同时，结合 CDN 部署基础类库，prefetch 预加载及 contenthash 缓存控制等，资源加载的速度大幅度提升。&lt;/p&gt;  &lt;p&gt;页面渲染优化&lt;/p&gt;  &lt;p&gt;考虑到业务场景及开发成本，新版本的前端应用并没有实现服务器端渲染，存在着较长的白屏时间。而老版本则通过 Java + Velocity 在服务器端完成渲染，两相对比，用户体验相差甚多。&lt;/p&gt;  &lt;p&gt;   &lt;img src="https://img0.tuicool.com/ry6nyq7.png!web"&gt;&lt;/img&gt;&lt;/p&gt;  &lt;p&gt;浏览器渲染性能分析&lt;/p&gt;  &lt;p&gt;为了解决这个问题，我们通过 Chrome Performance 对页面的渲染性能进行了完整的分析。&lt;/p&gt;  &lt;p&gt;由于生产环境代码已经压缩，这里建议在开发环境录制 Profile，可以直接定位到相关源码。录制后的时间线展示参见下面截图。&lt;/p&gt;  &lt;p&gt;   &lt;img src="https://img1.tuicool.com/EbQf6zN.png!web"&gt;&lt;/img&gt;&lt;/p&gt;  &lt;div&gt;   &lt;p&gt;其中我们需要重点关注的几个维度如下：&lt;/p&gt;   &lt;ul&gt;    &lt;li&gt;     &lt;p&gt;Frames：渲染的 FPS 以及不同时间点的渲染结果。&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;   &lt;ul&gt;    &lt;li&gt;     &lt;p&gt;Main：渲染主线程，包括 HTML 解析，JavaScript 执行等任务。&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;   &lt;ul&gt;    &lt;li&gt;     &lt;p&gt;Timings：包括 FP、DCL、FCP、LCP 等指标，以及通过 Performance API 记录的运行时间。Vue.js 2.x 中可以通过 Vue.config.performance = true; 开启组件性能记录。下图的截图展示了 Vue.js 组件的渲染耗时情况。&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;   &lt;p&gt;    &lt;img src="https://img1.tuicool.com/jEBJNzj.png!web"&gt;&lt;/img&gt;&lt;/p&gt;&lt;/div&gt;  &lt;div&gt;   &lt;p&gt;经过分析，我们发现以下几个主要问题：&lt;/p&gt;   &lt;ul&gt;    &lt;li&gt;     &lt;p&gt;路由激活后的首次渲染任务耗时特别长，已经超过了 2 秒。其中，站点导航、侧边栏等就占用了一半以上的时间。&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;   &lt;ul&gt;    &lt;li&gt;     &lt;p&gt;导航组件中，用于判断链接权限的 AuthService.hasURIAuth 方法占用了 80% 的时间。&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;   &lt;ul&gt;    &lt;li&gt;     &lt;p&gt;在通过配置渲染的动态表单页中，核心组件 FormBuilder 渲染时间也在 2 秒左右。&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;  &lt;p&gt;   &lt;img src="https://img0.tuicool.com/ry6nyq7.png!web"&gt;&lt;/img&gt;&lt;/p&gt;  &lt;p&gt;页面渲染整体优化方案&lt;/p&gt;  &lt;div&gt;   &lt;p&gt;针对以上问题，我们进行了以下几点改进：&lt;/p&gt;   &lt;ul&gt;    &lt;li&gt;     &lt;p&gt;通过服务器端渲染骨架屏，包括导航等页面基础布局。从视觉效果上减少用户的心理等待。&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;   &lt;ul&gt;    &lt;li&gt;     &lt;p&gt;减少首屏渲染的组件数量。将初始为隐藏状态的导航二级菜单、站点侧边栏、列表高级搜索弹窗等组件通过 webpack 提取至异步 chunk 中，在用户交互时再异步渲染。&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;   &lt;pre&gt;// AppLayout.vue    &lt;br /&gt;{    &lt;br /&gt;components: {    &lt;br /&gt;AppDrawer:()=&amp;gt;    &lt;br /&gt;import(    &lt;br /&gt;/* webpackChunkName: &amp;apos;chunk-async-common&amp;apos; */    &lt;br /&gt;&amp;apos;./AppDrawer&amp;apos;    &lt;br /&gt;),    &lt;br /&gt;AppHeader    &lt;br /&gt;},    &lt;br /&gt;}&lt;/pre&gt;&lt;/div&gt;  &lt;ul&gt;   &lt;li&gt;    &lt;p&gt;优化耗时的 JavaScript 函数。这一步需要结合实际代码实现进行优化，以上面提到的权限判断方法 AuthService.hasURIAuth 为例，其中最突出的问题就是循环内函数重复执行以及正则表达式重复创建。我们通过 Memoization 的方式为耗时函数添加记忆化功能，当参数相同时直接返回记忆值；通过 Cache 将正则表达式实例缓存起来以便重复使用。     &lt;br /&gt;&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;  &lt;div&gt;   &lt;ul&gt;    &lt;li&gt;     &lt;p&gt;将根据配置进行渲染的动态表单 FormBuilder 手动拆分为多个渲染任务。由于业务场景的复杂性，通常一个表单拥有 80 余个字段。而在 Vue.js 里面，一次数据变化触发的渲染任务是无法直接拆分的。这里我们采取了另一种方式，将表单配置拆分为多段，首次渲染时仅传递第一段配置，然后在后续的渲染周期依次将配置拼接上去。&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;   &lt;pre&gt;&amp;lt;template&amp;gt;    &lt;br /&gt;&amp;lt;form-builder:config=&amp;quot;formConfig&amp;quot;&amp;gt;&amp;lt;/form-builder&amp;gt;    &lt;br /&gt;&amp;lt;/template&amp;gt;&lt;/pre&gt;   &lt;pre&gt;{    &lt;br /&gt;created() {    &lt;br /&gt;this.getFormConfig().then(()=&amp;gt;{    &lt;br /&gt;this.startWork();    &lt;br /&gt;});    &lt;br /&gt;},    &lt;br /&gt;methods: {    &lt;br /&gt;startWork() {    &lt;br /&gt;constwork =()=&amp;gt;{    &lt;br /&gt;// 任务调度器    &lt;br /&gt;returnscheduler.next(()=&amp;gt;{    &lt;br /&gt;// 逐步拼接表单配置    &lt;br /&gt;this.formConfig =this.concatNextFormConfig();    &lt;br /&gt;    &lt;br /&gt;if(!scheduler.done()) {    &lt;br /&gt;// 循环执行任务    &lt;br /&gt;work();    &lt;br /&gt;}    &lt;br /&gt;});    &lt;br /&gt;};    &lt;br /&gt;    &lt;br /&gt;// 启动首次任务    &lt;br /&gt;work();    &lt;br /&gt;}    &lt;br /&gt;}    &lt;br /&gt;}&lt;/pre&gt;&lt;/div&gt;  &lt;p&gt;接口速度优化&lt;/p&gt;  &lt;p&gt;   &lt;img src="https://img0.tuicool.com/ry6nyq7.png!web"&gt;&lt;/img&gt;&lt;/p&gt;  &lt;p&gt;BFF 性能分析&lt;/p&gt;  &lt;div&gt;   &lt;p&gt;由于业务流程复杂，前端会调用多个服务接口，并对数据进行二次处理，因此一直由前端来负责Java Web层(BFF)的开发。本次升级为了开发更简便，引入了基于TypeScript的NestJS框架替换原来Spring MVC，由NestJS封装面向前端的接口给 VueJS应用。为了定位其中潜在的性能问题，我们做了一些通用的扩展：&lt;/p&gt;   &lt;ul&gt;    &lt;li&gt;     &lt;p&gt;为所有封装的接口添加自定义中间件 TimeMiddleware，用于统计接口的整体响应速度。&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;   &lt;ul&gt;    &lt;li&gt;     &lt;p&gt;为 axios 统一添加 interceptor，用于统计 BFF 调用第三方接口的响应速度。&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;   &lt;p&gt;最后，通过日志、Apache JMeter 等工具对核心接口进行分析，我们主要发现以下几个问题：&lt;/p&gt;   &lt;ul&gt;    &lt;li&gt;     &lt;p&gt;在对千万量级的索引数据进行分页查询的接口 A 中，当前 ES 的查询速度不理想，平均耗时在 2.6 秒左右。      &lt;br /&gt;&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;   &lt;ul&gt;    &lt;li&gt;     &lt;p&gt;在同时调用多方服务的接口 B 中，存在不必要的串行。此外，其中一个标签查询服务平均耗时在 700ms 左右，成为影响速度的关键因素。&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;   &lt;ul&gt;    &lt;li&gt;     &lt;p&gt;在获取用户信息的接口 C 中，有 20% 左右的请求耗时在 600ms 左右，而其他的请求仅耗时 50ms。经过定位发现是服务集群中某台服务器跨地区导致。&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;   &lt;ul&gt;    &lt;li&gt;     &lt;p&gt;大部分接口都依赖了一个获取频道列表的基础服务，实时性要求很低，然而每次都是通过接口实时获取，耗时大约 50 ms。&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;   &lt;ul&gt;    &lt;li&gt;     &lt;p&gt;整个应用的日志服务继承了 NestJS 的 logger.service ，它默认是通过 process.stdout 同步输出的。因此日志内容较多时在部分机器上开销也很大，平均耗时 100ms 左右。&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;  &lt;p&gt;   &lt;img src="https://img0.tuicool.com/ry6nyq7.png!web"&gt;&lt;/img&gt;&lt;/p&gt;  &lt;p&gt;BFF 整体优化方案&lt;/p&gt;  &lt;div&gt;   &lt;p&gt;针对以上问题，我们进行了以下几点改进：&lt;/p&gt;   &lt;ul&gt;    &lt;li&gt;     &lt;p&gt;后端同学优化 ES 查询服务，新增多台物理机进行扩容。优化后平均耗时小于 1 秒，速度提升超过 60%。&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;   &lt;ul&gt;    &lt;li&gt;     &lt;p&gt;后端同学为标签查询服务添加缓存机制，优化后平均耗时 200ms 左右，整体提升超过 70%。&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;   &lt;ul&gt;    &lt;li&gt;     &lt;p&gt;移除集群中的跨地区服务器，保证各服务之间尽量在同一个地区、机房。&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;   &lt;ul&gt;    &lt;li&gt;     &lt;p&gt;大化地并行请求，减少请求耗时的关键路径。以其中一个接口为例，优化前平均耗时 1.3 秒，优化后平均耗时仅 700ms，提升 45% 左右。&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;   &lt;ul&gt;    &lt;li&gt;     &lt;p&gt;实时性要求较低的服务通过 Redis 缓存查询结果，例如频道查询服务，平均耗时从 50ms 减少至 15ms，提升 70% 左右。&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;   &lt;ul&gt;    &lt;li&gt;     &lt;p&gt;生产环境的日志取消输出到 process.stdout，通过 winston 等日志框架将其异步写入至指定文件中。      &lt;br /&gt;&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;  &lt;p&gt;   &lt;strong&gt;优化后整体效果展示&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;   &lt;img src="https://img0.tuicool.com/ry6nyq7.png!web"&gt;&lt;/img&gt;&lt;/p&gt;  &lt;p&gt;资源加载速度展示&lt;/p&gt;  &lt;p&gt;通过减少文件大小及个数、缓存、并发、预加载、懒加载等各种优化，获取核心资源整体耗时控制在 200ms 左右。&lt;/p&gt;  &lt;p&gt;   &lt;img src="https://img1.tuicool.com/fUFVjar.png!web"&gt;&lt;/img&gt;&lt;/p&gt;  &lt;p&gt;首次加载主题样式与切换主题示例（Prefetch）&lt;/p&gt;  &lt;p&gt;   &lt;img src="https://img0.tuicool.com/jMZ7NbV.png!web"&gt;&lt;/img&gt;&lt;/p&gt;  &lt;p&gt;异步加载路由及组件示例（Prefetch）   &lt;br /&gt;&lt;/p&gt;  &lt;p&gt;   &lt;img src="https://img0.tuicool.com/ry6nyq7.png!web"&gt;&lt;/img&gt;&lt;/p&gt;  &lt;p&gt;页面渲染速度展示&lt;/p&gt;  &lt;p&gt;通过异步渲染隐藏组件、优化耗时函数、任务分片、骨架屏等方式，让用户尽早看到内容的同时，将首次路由渲染的时间控制在 1 秒以内，结合浏览器自身的优化，在电脑网速及性能正常的情况下，已经感知不到白屏的存在。&lt;/p&gt;  &lt;p&gt;   &lt;img src="https://img1.tuicool.com/EnAZbqM.png!web"&gt;&lt;/img&gt;&lt;/p&gt;  &lt;p&gt;   &lt;img src="https://img0.tuicool.com/ry6nyq7.png!web"&gt;&lt;/img&gt;&lt;/p&gt;  &lt;p&gt;接口相应速度展示&lt;/p&gt;  &lt;p&gt;通过扩容、缓存、并发、优化耗时函数等方式，我们将核心的几个查询接口的速度也控制在了 1 秒左右。&lt;/p&gt;  &lt;p&gt;   &lt;img src="https://img1.tuicool.com/UvUj6zV.png!web"&gt;&lt;/img&gt;&lt;/p&gt;  &lt;p&gt;   &lt;img src="https://img0.tuicool.com/ry6nyq7.png!web"&gt;&lt;/img&gt;&lt;/p&gt;  &lt;p&gt;优化前后核心数据对比&lt;/p&gt;  &lt;table&gt;   &lt;tr&gt;    &lt;td height="22" width="36%"&gt;     &lt;p&gt;优化环节&lt;/p&gt;&lt;/td&gt;    &lt;td height="22" width="33%"&gt;     &lt;p&gt;优化前&lt;/p&gt;&lt;/td&gt;    &lt;td height="22" width="31%"&gt;     &lt;p&gt;优化后&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;   &lt;tr&gt;    &lt;td height="44" width="36%"&gt;     &lt;p&gt;首次下载脚本资源&lt;/p&gt;&lt;/td&gt;    &lt;td height="44" width="33%"&gt;     &lt;p&gt;实际下载 JS 文件 7 个，整体大小 3.5M&lt;/p&gt;&lt;/td&gt;    &lt;td height="44" width="31%"&gt;     &lt;p&gt;实际下载 JS 文件 4 个，整体大小 1.8M&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;   &lt;tr&gt;    &lt;td height="22" width="36%"&gt;     &lt;p&gt;路由首次渲染时间&lt;/p&gt;&lt;/td&gt;    &lt;td height="22" width="33%"&gt;     &lt;p&gt;平均 2.66 秒&lt;/p&gt;&lt;/td&gt;    &lt;td height="22" width="31%"&gt;     &lt;p&gt;平均 790ms&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;   &lt;tr&gt;    &lt;td height="31" width="36%"&gt;     &lt;p&gt;索引分页查询响应时间&lt;/p&gt;&lt;/td&gt;    &lt;td height="31" width="33%"&gt;     &lt;p&gt;平均 2.60 秒&lt;/p&gt;&lt;/td&gt;    &lt;td height="31" width="31%"&gt;     &lt;p&gt;平均 1.03 秒&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;  &lt;p&gt;后记&lt;/p&gt;  &lt;p&gt;前端的性能优化涉及到方方面面，每一个环节其实都有优化的空间。这次实践，我们针对项目的实际场景，主要从资源加载、渲染性能和接口速度三个方面来分析并解决问题，一步一步提升页面的打开速度，也为用户带来了更好的使用体验。当然，优化无止境，希望本文能起到抛砖引玉的作用，感兴趣的同学可以留言讨论。&lt;/p&gt;&lt;/div&gt;&lt;div&gt; &lt;a href="https://itindex.net/"  title="IT 资讯"&gt;&lt;img src="https://itindex.net/images/iconWarning.gif" title="IT 资讯" border="0"/&gt; &lt;/a&gt;</description>
      <category>tuicool</category>
      <guid isPermaLink="true">https://itindex.net/detail/61163-%E4%BC%98%E5%8C%96-%E7%88%B1%E5%A5%87%E8%89%BA-%E5%90%8E%E5%8F%B0</guid>
      <pubDate>Mon, 11 Jan 2021 00:00:00 CST</pubDate>
    </item>
    <item>
      <title>基于Kong和Kubernetes的Web API多版本解决方案</title>
      <link>https://itindex.net/detail/60489-kong-kubernetes-web</link>
      <description>&lt;br /&gt;今天分享一个我们正在使用的一个基于Kubernetes以及Kong网关的Web API多版本管理的解决方案，这种方案已经在我们的生产环境运行了将近两年，也迭代了很多个版本，我们觉得这个方案非常的适合用在微服务当中。 &lt;br /&gt;
 &lt;h3&gt;什么是Web API多版本&lt;/h3&gt;版本的概念大家应该都知道，那么什么是Web API的版本呢？ &lt;br /&gt;
 &lt;br /&gt;开发App后端的兄弟应该都非常清楚了，在给App提供Web API接口的时候，由于安装在用户手机上的App存在多个客户端版本的问题，这些版本大部分时候需要进行共存，由于现在Android和iOS基本上都不允许App内置升级功能，当然有些时候是用户不愿意或者拒绝升级，很多时候业务需求在不停的变化，就避免不了对接口进行调整和增加新功能，所以我们需要保证后端接口的向前兼容性，那些没有升级的客户端App仍然要让它们能够正常工作，这就需要使用到多个不同版本的API接口来进行控制，很多时候我们是保留旧接口，增加新接口，为了区分不同的客户端，然后给接口进行版本编号，这就是Web API的多版本控制管理。 &lt;br /&gt;
 &lt;h4&gt;应用场景&lt;/h4&gt;了解了Web API多版本的概念之后，应用场景就自然也就明白了。 &lt;br /&gt;
 &lt;br /&gt;除了App的服务端会用到之后，同样也适用于那些客户端非浏览器的项目的服务端，例如给一些桌面程序提供接口等等。 &lt;br /&gt;
 &lt;br /&gt;有些时候针对一些特性的App客户端提供不同的功能也是其应用场景之一。 &lt;br /&gt;
 &lt;h3&gt;解决方案&lt;/h3&gt;解决方案就是App在请求的时候携带一个版本信息到服务端，然后服务端就能够提供不同的功能了。 &lt;br /&gt;
 &lt;br /&gt;API请求服务端携带版本信息可以通过两种方式： &lt;br /&gt;
 &lt;ol&gt;  &lt;li&gt;通过在URL中追加版本号或作为查询字符串参数。&lt;/li&gt;  &lt;li&gt;通过Http自定义标头。&lt;/li&gt;&lt;/ol&gt; &lt;br /&gt;
 &lt;br /&gt; &lt;h4&gt;ASP.NET Core中解决方案&lt;/h4&gt;在ASP.NET Core中的方案，我不打算进行详细介绍了，感兴趣的可以看下下面这个大兄弟的这篇文章： &lt;br /&gt;
 &lt;br /&gt;菠萝吹雪-Code： &lt;a href="https://www.cnblogs.com/runningsmallguo/p/7484954.html"&gt;ASP.Net Core Web API几种版本控制&lt;/a&gt; &lt;br /&gt;
 &lt;h4&gt;基于Kubernetes和Kong的解决方案&lt;/h4&gt;由于我们使用的是基于Kubernetes的多版本解决方案，所以此处就详细说明一下。 &lt;br /&gt;
 &lt;br /&gt;我们采用的是在URL中追加版本号来实现的版本控制，这样做有两个好处： &lt;br /&gt;
 &lt;ol&gt;  &lt;li&gt;方便Kong进行路由解析，可以直接通过配置方式实现，如果通过header来路由的话，需要自己进行扩展才行。&lt;/li&gt;  &lt;li&gt;从日志记录的时候可以很直观到看到当前的API版本，在发生问题时候可以快速定位的具体版本的服务。&lt;/li&gt;&lt;/ol&gt; &lt;br /&gt;
 &lt;br /&gt;下面是我画的一个我们的基于Kubernetes的大致的架构图，像CDN这些我就给省掉了。 &lt;br /&gt;
 &lt;div&gt;
  &lt;a href="http://dockone.io/uploads/article/20200408/b3ab9922df37b4a3d4afd2b9633d10f1.png" rel="lightbox" target="_blank"&gt;   &lt;img alt="1.png" src="http://dockone.io/uploads/article/20200408/b3ab9922df37b4a3d4afd2b9633d10f1.png" title="1.png"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;
 &lt;br /&gt;
主要流程分为以下几个步骤： &lt;br /&gt;
 &lt;ol&gt;  &lt;li&gt;App端不同的版本会请求不同的API接口，这些API接口以版本区分，不同的版本可以提供不同的结果。&lt;/li&gt;  &lt;li&gt;Kong网关针对URL中携带的版本号信息进行路由转发，在配置路由转发的时候需要把携带路径参数开启，例如/api/v1/ordering/list这个请求地址，我们可以新建一个路由，然后配置/api/v1/ordering这个前缀的URL转发的到ordering这个服务，同时把路径带过去，假如说我们ordering微服务的地址为/api/ordering，那么就可以配置服务的路径为/api/ordering，由于路由配置了携带路径，所以此时我们的微服务接收到的请求地址就变成了/api/ordering/list。&lt;/li&gt;  &lt;li&gt;Kong网关以NodePort方式部署到Kubernetes集群中，路由服务指向Kubernetes内部服务的DNS集群地址。Kong的多个实例他们之间共享配置信息，可以把配置存储到PostgreSQL或者Cassandra中。&lt;/li&gt;  &lt;li&gt;后端微服务集群内部提供集群地址配置到Kong的Service中。&lt;/li&gt;&lt;/ol&gt; &lt;br /&gt;
 &lt;br /&gt; &lt;h4&gt;业务需求的配合&lt;/h4&gt;这整个方案中有一个重要的点就是开发人员和产品或者业务人员的一个配合问题，也就是整个开发进度的规划需要符合敏捷开发的流程，这样不会导致每个小版本都会有变化非常大的接口这种需求的出现，可以做到平滑升级。 &lt;br /&gt;
 &lt;br /&gt;以我司来举例，当有对接口进行大改的需求时，我们会将其规划到大的迭代主版本中，这样在大版本发布的时候，会新起一套大版本的服务集群环境来进行支撑，此时老的版本仍然不会删除，这样就会新旧版本同时共存，当新的版本再迭代几个小版本时候大部分用户其实已经自动升上来了，这个时候就可以把旧的大版本进行强制升级提示了，这样终端App用户就会全部升级到新的版本上了，从而把影响降低到最小。 &lt;br /&gt;
 &lt;br /&gt;所以，此处遵循一个原则：小版本做兼容升级，大版本做重大特性的提供以及Break Changes和代码重构等工作。 &lt;br /&gt;
 &lt;h4&gt;DevOps 的配合&lt;/h4&gt;在进行大版本升级的时候，微服务的DevOps基础设施就显得非常重要了，此时我们需要动态的创建路由到Kong，这就需要利用DevOps的配合，你可以将创建调用Kong提供的rest接口来创建路由，也许一开始会花费比较多的时间，但是从长远来看的话还是非常重要的，可以节约后续的很多时间。 &lt;br /&gt;
 &lt;br /&gt;以我司来举例，当进行大版本升级时，DevOps 脚本中会检测到版本号为大版本，此时就会运行创建新环境的脚本，这个脚本负责初始化新的 大版本的Kubernetes集群环境以及Kong的服务和路由配置，然后自动发布新版本的各个服务，最终会提供出来一个新的服务地址出来，类似/api/v2/xxxx。 &lt;br /&gt;
 &lt;h4&gt;数据中间件服务的配合&lt;/h4&gt;在进行新的大版本开发和迭代的过程中，还会涉及到一些关于新版本数据和旧版本不兼容的情况，比如Redis的缓存数据结构变化，消息队列的数据结构的变化，以及Elasticsearch等索引数据结构的变化。 &lt;br /&gt;
 &lt;br /&gt;那么如何处理以上数据服务的版本兼容问题呢？ 最简单的方案是起一套新的环境，新版本完全使用一套新的中间件服务环境来进行运行，但是这样有一个缺点就是会使用更多的服务器资源，照成服务器资源浪费的情况，当然如果是土豪公司可以无视了。 &lt;br /&gt;
 &lt;br /&gt;那如果想不同的版本使用相同的数据中间件服务怎么办呢？ 其实办法也是有的，大部分数据中间件都是支持版本划分的，比如Elasticsearch，CAP等都支持使用版本来区分数据，对于不支持的可以在程序中进行控制了，比如像Redis这种就可以使用不同的逻辑DB来区分。 &lt;br /&gt;
 &lt;h3&gt;总结&lt;/h3&gt;本篇文章主要讲述了如何利用Kong网关和Kubernetes服务来处理Web API多版本的问题。 &lt;br /&gt;
 &lt;br /&gt;同时还讲述了在开发的过程中一些不同版本的数据应该如何处理以及需求的规划等，希望以上的东西能够帮助到有需要的人。 &lt;br /&gt;
 &lt;br /&gt;原文链接： &lt;a href="https://www.cnblogs.com/savorboard/p/webapi-versions.html" rel="nofollow" target="_blank"&gt;https://www.cnblogs.com/savorb ... .html&lt;/a&gt;
                                                                 &lt;div&gt;
                                                                                                                                &lt;/div&gt;
                                
                                                                 &lt;ul&gt;
                                                                                                                                            &lt;/ul&gt;
                                                            &lt;div&gt; &lt;a href="https://itindex.net/"  title="IT 资讯"&gt;&lt;img src="https://itindex.net/images/iconWarning.gif" title="IT 资讯" border="0"/&gt; &lt;/a&gt;</description>
      <category />
      <guid isPermaLink="true">https://itindex.net/detail/60489-kong-kubernetes-web</guid>
      <pubDate>Thu, 09 Apr 2020 07:25:34 CST</pubDate>
    </item>
    <item>
      <title>如何处理 Web 图片优化？</title>
      <link>https://itindex.net/detail/60235-web-%E5%9B%BE%E7%89%87-%E4%BC%98%E5%8C%96</link>
      <description>&lt;p&gt;未优化的图片是影响网站性能的主要因素之一，尤其会影响初次加载。取决于图像的分辨率和画质，图片可能占据整个网站流量的 70%.&lt;/p&gt;
 &lt;p&gt;生产环境出现未优化的图片并显著影响初次加载速度的现象还是挺常见的。缺乏经验的开发者通常没有意识到这一潜在问题，也不了解各种优化图片的工具和方法。&lt;/p&gt;
 &lt;p&gt;本文的目标是介绍优化 web 图片的主要工具和方法。&lt;/p&gt;
 &lt;h2&gt;计算 JPG 文件尺寸&lt;/h2&gt;
 &lt;p&gt;未压缩图片的尺寸很容易计算，只需将图片的长宽相乘（px 值），再乘以 3 字节（因为 RGB 色彩系统使用 24 个位元）。所得结果除以 1,048,576（1024 * 1024）即得到兆字节。&lt;/p&gt;
 &lt;pre&gt;  &lt;code&gt;image_size = (image_width * image_height * 3) / 1048576&lt;/code&gt;&lt;/pre&gt;
 &lt;p&gt;比如，计算分辨率为 1366px x 768px 的未压缩图片的大小：&lt;/p&gt;
 &lt;pre&gt;  &lt;code&gt;1366 * 768 * 3 / 1048576 = 3Mb&lt;/code&gt;&lt;/pre&gt;
 &lt;p&gt;现在网站的尺寸平均在 2Mb 和 3Mb 之间，想象一下，一张未压缩的图片就占掉了 80% 的流量。在网速较慢的移动网络上，3Mb 大小的图片要花很久才能加载完毕。如果等待网站加载的用户大部分时间花在等待单张图片加载，那网站会损失不少流量。想想就可怕，是吗？&lt;/p&gt;
 &lt;p&gt;所以，在保证图片分辨率和画质可接受的前提下，我们可以做什么来优化下图片呢？&lt;/p&gt;
 &lt;p&gt;  &lt;strong&gt;在线图片优化&lt;/strong&gt;&lt;/p&gt;
 &lt;p&gt;如果你的项目是一个简单的静态网站，只有少量不经常变动（甚至从来不会变动）的图片，那么你可以直接使用在线工具。这些工具使用各种算法压缩图像，效果很不错，对简单项目而言完全够用。&lt;/p&gt;
 &lt;p&gt;  &lt;img alt="" src="https://segmentfault.com/img/remote/1460000021339246" title=""&gt;&lt;/img&gt;&lt;/p&gt;
 &lt;p&gt;就我个人所知，比较著名的在线工具有：&lt;/p&gt;
 &lt;ul&gt;
  &lt;li&gt;
   &lt;a href="https://compressor.io/" rel="nofollow noreferrer"&gt;Compressor.io&lt;/a&gt;，支持 JPG、PNG、SVG、GIF，每次上传 1 个文件&lt;/li&gt;
  &lt;li&gt;
   &lt;a href="https://squoosh.app/" rel="nofollow noreferrer"&gt;Squoosh&lt;/a&gt;，支持 JPG、PNG、SVG、GIF，每次上传 1 个文件&lt;/li&gt;
  &lt;li&gt;
   &lt;a href="https://imagecompressor.com/" rel="nofollow noreferrer"&gt;Optimizilla&lt;/a&gt;，支持 JPG、PNG，最多每次上传 20 个文件&lt;/li&gt;
  &lt;li&gt;
   &lt;a href="https://tinypng.com/" rel="nofollow noreferrer"&gt;TinyPNG&lt;/a&gt;，支持 JPG、PNG，最多每次上传 20 个文件&lt;/li&gt;
  &lt;li&gt;
   &lt;a href="https://www.svgminify.com/" rel="nofollow noreferrer"&gt;SVGMinify&lt;/a&gt;，支持 SVG，每次上传 1 个文件&lt;/li&gt;
  &lt;li&gt;
   &lt;a href="https://jakearchibald.github.io/svgomg/" rel="nofollow noreferrer"&gt;svgomg&lt;/a&gt;，支持 SVG，每次上传 1 个文件&lt;/li&gt;
&lt;/ul&gt;
 &lt;h2&gt;自动化解决方案&lt;/h2&gt;
 &lt;p&gt;然而，如果你做的是多人协作的复杂项目，使用大量图片，在加入每张图片时都手动操作一下很乏味。同时，还存在由于人为错误或其他因素导致一些图片没有优化的风险。&lt;/p&gt;
 &lt;p&gt;复杂项目常常使用同样复杂的构建系统，比如   &lt;strong&gt;Gulp&lt;/strong&gt;、  &lt;strong&gt;Webpack&lt;/strong&gt;、  &lt;strong&gt;Parcel&lt;/strong&gt;。配置一下这类构建系统，加入图片优化插件很方便。这样就可以完全自动化图片优化过程，在项目中加入图片后就可以优化它们。&lt;/p&gt;
 &lt;p&gt;就我所知，最有名的插件是   &lt;a href="https://www.npmjs.com/package/imagemin" rel="nofollow noreferrer"&gt;imagemin&lt;/a&gt;，可以作为命令行工具使用，也可以作为构建工具的插件使用：&lt;/p&gt;
 &lt;ul&gt;
  &lt;li&gt;   &lt;a href="https://github.com/imagemin/imagemin-cli" rel="nofollow noreferrer"&gt;imagemin-cli&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;   &lt;a href="https://github.com/sindresorhus/gulp-imagemin" rel="nofollow noreferrer"&gt;gulp-imagemin&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;   &lt;a href="https://github.com/itgalaxy/imagemin-webpack" rel="nofollow noreferrer"&gt;imagemin-webpack&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;   &lt;a href="https://github.com/DeMoorJasper/parcel-plugin-imagemin" rel="nofollow noreferrer"&gt;parcel-plugin-imagemin&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
 &lt;h2&gt;图片加载优化&lt;/h2&gt;
 &lt;p&gt;我们前面介绍了如何通过压缩图片降低文件尺寸，但不过多改变图片分辨率和影响画质。尽管优化图片后文件尺寸能降低不少，但一次性加载大量优化过的图片（比如电商网站的商品列表页面）还是会影响性能。&lt;/p&gt;
 &lt;p&gt;  &lt;strong&gt;懒加载&lt;/strong&gt;&lt;/p&gt;
 &lt;p&gt;懒加载也叫按需加载，意思是仅加载当前视图（用户屏幕显示范围）内的图片，不加载其他图片（直到它们出现在当前视图内时才加载）。&lt;/p&gt;
 &lt;p&gt;只有较新版本的浏览器才支持原生的懒加载特性，不过有许多基于 JavaScript 的方案。&lt;/p&gt;
 &lt;p&gt;  &lt;img alt="" src="https://segmentfault.com/img/remote/1460000021339245" title=""&gt;&lt;/img&gt;&lt;/p&gt;
 &lt;ul&gt;  &lt;li&gt;原生懒加载&lt;/li&gt;&lt;/ul&gt;
 &lt;pre&gt;  &lt;code&gt;&amp;lt;img src=&amp;quot;image.jpg&amp;quot; loading=&amp;quot;lazy&amp;quot; alt=&amp;quot;Sample image&amp;quot; /&amp;gt;&lt;/code&gt;&lt;/pre&gt;
 &lt;ul&gt;  &lt;li&gt;基于 JavaScript 的方案&lt;/li&gt;&lt;/ul&gt;
 &lt;p&gt;就我所知，最知名的方案有：&lt;/p&gt;
 &lt;p&gt;  &lt;a href="https://github.com/verlok/lazyload" rel="nofollow noreferrer"&gt;verlok/lazyload&lt;/a&gt;    &lt;br /&gt;  &lt;a href="https://github.com/malchata/yall.js/" rel="nofollow noreferrer"&gt;yall.js&lt;/a&gt;    &lt;br /&gt;  &lt;a href="https://github.com/dinbror/blazy" rel="nofollow noreferrer"&gt;Blazy&lt;/a&gt; （现在没有维护）&lt;/p&gt;
 &lt;p&gt;  &lt;strong&gt;渐进式图片&lt;/strong&gt;&lt;/p&gt;
 &lt;p&gt;尽管懒加载在性能方面表现出色，但是用户滚动屏幕后需要盯着空白区域等待图片加载，这样的用户体验不太好。网速慢的情况下，下载图片会非常慢。所以我们还需要渐进式图片。&lt;/p&gt;
 &lt;p&gt;渐进式图片的意思是在高画质图像加载完之前会先显示低画质版本。低画质版本由于画质低、压缩率高，尺寸很小，加载很快。在两者之间我们也可以根据需要显示不同画质的版本。&lt;/p&gt;
 &lt;p&gt;  &lt;img alt="" src="https://segmentfault.com/img/remote/1460000021339247" title=""&gt;&lt;/img&gt;&lt;/p&gt;
 &lt;p&gt;类似于先加载页面的骨架，渐进式图片这一技术让用户产生图片加载变快的印象。用户不再盯着一片空白区域等待事情发生，而能看到图像变得越来越清晰。    &lt;br /&gt;渐进式图片有基于 JavaScript 实现的方案：    &lt;br /&gt;  &lt;a href="https://url.leanapp.cn/CaxSpZe" rel="nofollow noreferrer"&gt;progressive-image&lt;/a&gt;。&lt;/p&gt;
 &lt;p&gt;  &lt;strong&gt;响应式图片&lt;/strong&gt;&lt;/p&gt;
 &lt;p&gt;我们还需要留意使用尺寸合适的图片。&lt;/p&gt;
 &lt;p&gt;例如，假设图片在桌面浏览器上显示的最大宽度为 1920px，平板上的最大宽度为 1024px，手机上的最大宽度为 568px，那么最简单的方案是使用 1920px 的图片，这样可以满足所有场景。不过，这种情况下，网速慢、网络不稳定的智能手机用户需要等很久图片才能加载完毕，这就又碰到了我们文章开头提到的问题。&lt;/p&gt;
 &lt;p&gt;好在我们可以通过 picture 元素告诉浏览器基于媒体查询下载相应的图片。尽管现在 93% 的用户使用的浏览器都支持这一特性，但是这个元素内部还是包含了一个 img 元素，以兼容不支持这一特性的浏览器。&lt;/p&gt;
 &lt;pre&gt;  &lt;code&gt;&amp;lt;picture&amp;gt;  &amp;lt;source media=&amp;quot;(min-width: 1025px)&amp;quot; srcset=&amp;quot;image_desktop.jpg&amp;quot;&amp;gt;  &amp;lt;source media=&amp;quot;(min-width: 769px)&amp;quot; srcset=&amp;quot;image_tablet.jpg&amp;quot;&amp;gt;  &amp;lt;img src=&amp;quot;image_mobile.jpg&amp;quot; alt=&amp;quot;Sample image&amp;quot;&amp;gt;&amp;lt;/picture&amp;gt;&lt;/code&gt;&lt;/pre&gt;
 &lt;h2&gt;使用 CDN&lt;/h2&gt;
 &lt;p&gt;Cloudinary、Cloudflare 之类的 CDN 服务可以在服务器上优化图片，将优化后的图片传送给用户。如果你的站点使用 CDN，可以看下静态资源优化选项。这样我们就不用操心图片优化，由 CDN 在服务端完成优化。我们只需要操心懒加载、渐进式图片等前端的加载方案。&lt;/p&gt;
 &lt;h2&gt;WebP 图像格式&lt;/h2&gt;
 &lt;p&gt;WebP 是由 Google 开发的专为 web 优化的图像格式。根据   &lt;a href="https://caniuse.com/#feat=webp" rel="nofollow noreferrer"&gt;canIUse 的数据&lt;/a&gt;，大部分用户使用的浏览器支持 WebP 格式。另外使用 picture 元素也可以很方便地兼容不支持 WebP 的浏览器。&lt;/p&gt;
 &lt;pre&gt;  &lt;code&gt;&amp;lt;picture&amp;gt;  &amp;lt;source type=&amp;quot;image/webp&amp;quot; srcset=&amp;quot;image.webp&amp;quot; /&amp;gt;  &amp;lt;source srcset=&amp;quot;image.jpg&amp;quot; /&amp;gt;  &amp;lt;img src=&amp;quot;image.jpg&amp;quot; alt=&amp;quot;Sample image&amp;quot; /&amp;gt;&amp;lt;/picture&amp;gt;&lt;/code&gt;&lt;/pre&gt;
 &lt;p&gt;有很多在线文件格式转换工具可以把图片转为 WebP 格式，不过 CDN 服务可以在服务端完成这一格式转化。&lt;/p&gt;
 &lt;h2&gt;为高分屏优化&lt;/h2&gt;
 &lt;p&gt;考虑高分屏很有必要，不过这个更多的是用户体验优化。&lt;/p&gt;
 &lt;p&gt;例如，假定我们在 768px 的屏幕上显示一张 768px x 320px 的图片。但是屏幕有 2x 的密度，也就是说屏幕宽度实际是 2 x 768 = 1536 px。这就意味着我们将 768 px 的图片拉升到 1536 px，这就导致高分屏上的图片看起来很模糊。&lt;/p&gt;
 &lt;p&gt;为了解决这一问题，我们需要提供为高分屏优化的图片。我们需要单独创建相当于普通屏幕 2 倍或 3 倍分辨率的图片，然后在 srcset 属性上使用 2x 标签表明这是为高分屏准备的图片。&lt;/p&gt;
 &lt;pre&gt;  &lt;code&gt;&amp;lt;img src=&amp;quot;image-1x.jpg&amp;quot; srcset=&amp;quot;image-2x.jpg 2x&amp;quot; alt=&amp;quot;Sample image&amp;quot; /&amp;gt;&lt;/code&gt;&lt;/pre&gt;
 &lt;p&gt;  &lt;strong&gt;例子&lt;/strong&gt;&lt;/p&gt;
 &lt;p&gt;支持高分屏的响应式 WebP/PNG 图片：&lt;/p&gt;
 &lt;pre&gt;  &lt;code&gt;&amp;lt;picture&amp;gt;    &amp;lt;source srcset=&amp;quot;./images/webp/hero-image-420-min.webp 1x, ./images/webp/hero-image-760-min.webp 2x&amp;quot; type=&amp;quot;image/webp&amp;quot; media=&amp;quot;(max-width: 440px)&amp;quot;&amp;gt;    &amp;lt;source srcset=&amp;quot;./images/minified/hero-image-420-min.png 1x, ./images/minified/hero-image-760-min.png 2x&amp;quot; media=&amp;quot;(max-width: 440px)&amp;quot;&amp;gt;    &amp;lt;source srcset=&amp;quot;./images/webp/hero-image-550-min.webp 1x, ./images/webp/hero-image-960-min.webp 2x&amp;quot; type=&amp;quot;image/webp&amp;quot; media=&amp;quot;(max-width: 767px)&amp;quot;&amp;gt;    &amp;lt;source srcset=&amp;quot;./images/minified/hero-image-550-min.png 1x, ./images/minified/hero-image-960-min.png 2x&amp;quot; media=&amp;quot;(max-width: 767px)&amp;quot;&amp;gt;    &amp;lt;source srcset=&amp;quot;./images/webp/hero-image-420-min.webp 1x, ./images/webp/hero-image-760-min.webp 2x&amp;quot; type=&amp;quot;image/webp&amp;quot; media=&amp;quot;(max-width: 1023px)&amp;quot;&amp;gt;    &amp;lt;source srcset=&amp;quot;./images/minified/hero-image-420-min.png 1x, ./images/minified/hero-image-760-min.png 2x&amp;quot; media=&amp;quot;(max-width: 1023px)&amp;quot;&amp;gt;    &amp;lt;source srcset=&amp;quot;./images/webp/hero-image-760-min.webp 1x, ./images/webp/hero-image-960-min.webp 2x&amp;quot; type=&amp;quot;image/webp&amp;quot; media=&amp;quot;(max-width: 1919px)&amp;quot;&amp;gt;    &amp;lt;source srcset=&amp;quot;./images/minified/hero-image-760-min.png 1x, ./images/minified/hero-image-960-min.png 2x&amp;quot; media=&amp;quot;(max-width: 1919px)&amp;quot;&amp;gt;    &amp;lt;source srcset=&amp;quot;./images/webp/hero-image-960-min.webp&amp;quot; type=&amp;quot;image/webp&amp;quot;&amp;gt;    &amp;lt;source srcset=&amp;quot;./images/minified/hero-image-960-min.png&amp;quot;&amp;gt;    &amp;lt;img  src=&amp;quot;./images/minified/hero-image-960-min.png&amp;quot; alt=&amp;quot;Example&amp;quot;&amp;gt;&amp;lt;/picture&amp;gt;&lt;/code&gt;&lt;/pre&gt;
 &lt;h2&gt;结语 —— 优化优先级&lt;/h2&gt;
 &lt;ol&gt;
  &lt;li&gt;使用优化后的图片（使用自动构建工具、在线服务、CDN 优化）&lt;/li&gt;
  &lt;li&gt;使用懒加载（在浏览器有更好的原生支持前考虑使用 JS 方案）&lt;/li&gt;
  &lt;li&gt;为高分屏优化图片&lt;/li&gt;
  &lt;li&gt;使用 WebP 格式&lt;/li&gt;
  &lt;li&gt;使用渐进式图片&lt;/li&gt;
&lt;/ol&gt;
 &lt;p&gt;  &lt;strong&gt;可选&lt;/strong&gt;： 如果条件允许，记得使用 CDN 加速图片（和其他静态资源）。&lt;/p&gt;
 &lt;p&gt;  &lt;img alt="" src="https://segmentfault.com/img/remote/1460000021339248" title=""&gt;&lt;/img&gt;&lt;/p&gt;
 &lt;p&gt;内容经授权转载自   &lt;a href="https://nextfe.com/optimize-image/" rel="nofollow noreferrer"&gt;New Frontend&lt;/a&gt; 网站。&lt;/p&gt;
&lt;div&gt; &lt;a href="https://itindex.net/"  title="IT 资讯"&gt;&lt;img src="https://itindex.net/images/iconWarning.gif" title="IT 资讯" border="0"/&gt; &lt;/a&gt;</description>
      <category>性能优化 前端 懒加载 cdn 高分屏</category>
      <guid isPermaLink="true">https://itindex.net/detail/60235-web-%E5%9B%BE%E7%89%87-%E4%BC%98%E5%8C%96</guid>
      <pubDate>Thu, 19 Dec 2019 16:04:20 CST</pubDate>
    </item>
    <item>
      <title>ASP.NET Core Web API 最佳实践指南 - hippieZhou - 博客园</title>
      <link>https://itindex.net/detail/60232-asp-net-core</link>
      <description>&lt;div&gt;    &lt;p&gt;      &lt;img src="https://img2018.cnblogs.com/blog/749711/201912/749711-20191202210059663-465533847.png"&gt;&lt;/img&gt;&lt;/p&gt;    &lt;blockquote&gt;      &lt;p&gt;原文地址：        &lt;a href="https://code-maze.us12.list-manage.com/track/click?u=9bb15645129501e5249a9a8e1&amp;id=986d07e1f0&amp;e=1184a539da"&gt;ASP.NET-Core-Web-API-Best-Practices-Guide&lt;/a&gt;&lt;/p&gt;&lt;/blockquote&gt;    &lt;h2&gt;介绍&lt;/h2&gt;    &lt;p&gt;当我们编写一个项目的时候，我们的主要目标是使它能如期运行，并尽可能地满足所有用户需求。&lt;/p&gt;    &lt;p&gt;但是，你难道不认为创建一个能正常工作的项目还不够吗？同时这个项目不应该也是可维护和可读的吗？&lt;/p&gt;    &lt;p&gt;事实证明，我们需要把更多的关注点放到我们项目的可读性和可维护性上。这背后的主要原因是我们或许不是这个项目的唯一编写者。一旦我们完成后，其他人也极有可能会加入到这里面来。&lt;/p&gt;    &lt;p&gt;因此，我们应该把关注点放到哪里呢？&lt;/p&gt;    &lt;p&gt;在这一份指南中，关于开发 .NET Core Web API 项目，我们将叙述一些我们认为会是最佳实践的方式。进而让我们的项目变得更好和更加具有可维护性。&lt;/p&gt;    &lt;p&gt;现在，让我们开始想一些可以应用到 ASP.NET Web API 项目中的一些最佳实践。&lt;/p&gt;    &lt;h2&gt;Startup 类 和 服务配置&lt;/h2&gt;    &lt;blockquote&gt;      &lt;p&gt;STARTUP CLASS AND THE SERVICE CONFIGURATION&lt;/p&gt;&lt;/blockquote&gt;    &lt;p&gt;在      &lt;code&gt;Startup&lt;/code&gt;类中，有两个方法：      &lt;code&gt;ConfigureServices&lt;/code&gt;是用于服务注册，      &lt;code&gt;Configure&lt;/code&gt;方法是向应用程序的请求管道中添加中间件。&lt;/p&gt;    &lt;p&gt;因此，最好的方式是保持      &lt;code&gt;ConfigureServices&lt;/code&gt;方法简洁，并且尽可能地具有可读性。当然，我们需要在该方法内部编写代码来注册服务，但是我们可以通过使用      &lt;code&gt;扩展方法&lt;/code&gt;来让我们的代码更加地可读和可维护。&lt;/p&gt;    &lt;p&gt;例如，让我们看一个注册 CORS 服务的不好方式：&lt;/p&gt;    &lt;pre&gt;      &lt;code&gt;public void ConfigureServices(IServiceCollection services)
{
    services.AddCors(options =&amp;gt; 
    {
        options.AddPolicy(&amp;quot;CorsPolicy&amp;quot;, builder =&amp;gt; builder.AllowAnyOrigin()
            .AllowAnyMethod()
            .AllowAnyHeader()
            .AllowCredentials());
    });
}&lt;/code&gt;&lt;/pre&gt;    &lt;p&gt;尽管这种方式看起来挺好，也能正常地将 CORS 服务注册成功。但是想象一下，在注册了十几个服务之后这个方法体的长度。&lt;/p&gt;    &lt;p&gt;这样一点也不具有可读性。&lt;/p&gt;    &lt;p&gt;一种好的方式是通过在扩展类中创建静态方法：&lt;/p&gt;    &lt;pre&gt;      &lt;code&gt;public static class ServiceExtensions
{
    public static void ConfigureCors(this IServiceCollection services)
    {
        services.AddCors(options =&amp;gt;
        {
            options.AddPolicy(&amp;quot;CorsPolicy&amp;quot;, builder =&amp;gt; builder.AllowAnyOrigin()
                .AllowAnyMethod()
                .AllowAnyHeader()
                .AllowCredentials());
        });
    }
}&lt;/code&gt;&lt;/pre&gt;    &lt;p&gt;然后，只需要调用这个扩展方法即可：&lt;/p&gt;    &lt;pre&gt;      &lt;code&gt;public void ConfigureServices(IServiceCollection services)
{
    services.ConfigureCors();
}&lt;/code&gt;&lt;/pre&gt;    &lt;p&gt;了解更多关于 .NET Core 的项目配置，请查看：      &lt;a href="https://code-maze.com/net-core-web-development-part2/"&gt;.NET Core Project Configuration&lt;/a&gt;&lt;/p&gt;    &lt;h2&gt;项目组织&lt;/h2&gt;    &lt;blockquote&gt;      &lt;p&gt;PROJECT ORGANIZATION&lt;/p&gt;&lt;/blockquote&gt;    &lt;p&gt;我们应该尝试将我们的应用程序拆分为多个小项目。通过这种方式，我们可以获得最佳的项目组织方式，并能将关注点分离（SoC）。我们的实体、契约、访问数据库操作、记录信息或者发送邮件的业务逻辑应该始终放在单独的 .NET Core 类库项目中。&lt;/p&gt;    &lt;p&gt;应用程序中的每个小项目都应该包含多个文件夹用来组织业务逻辑。&lt;/p&gt;    &lt;p&gt;这里有个简单的示例用来展示一个复杂的项目应该如何组织：&lt;/p&gt;    &lt;p&gt;      &lt;img src="https://img2018.cnblogs.com/blog/749711/201912/749711-20191202210211630-1582297257.png"&gt;&lt;/img&gt;&lt;/p&gt;    &lt;h2&gt;基于环境的设置&lt;/h2&gt;    &lt;blockquote&gt;      &lt;p&gt;ENVIRONMENT BASED SETTINGS&lt;/p&gt;&lt;/blockquote&gt;    &lt;p&gt;当我们开发应用程序时，它处于开发环境。但是一旦我们发布之后，它将处于生产环境。因此，将每个环境进行隔离配置往往是一种好的实践方式。&lt;/p&gt;    &lt;p&gt;在 .NET Core 中，这一点很容易实现。&lt;/p&gt;    &lt;p&gt;一旦我们创建好了项目，就已经有一个      &lt;code&gt;appsettings.json&lt;/code&gt;文件，当我们展开它时会看到      &lt;code&gt;appsettings.Development.json&lt;/code&gt;文件：&lt;/p&gt;    &lt;p&gt;      &lt;img src="https://img2018.cnblogs.com/blog/749711/201912/749711-20191202210228362-471063224.png"&gt;&lt;/img&gt;&lt;/p&gt;    &lt;p&gt;此文件中的所有设置将用于开发环境。&lt;/p&gt;    &lt;p&gt;我们应该添加另一个文件      &lt;code&gt;appsettings.Production.json&lt;/code&gt;，将其用于生产环境：&lt;/p&gt;    &lt;p&gt;      &lt;img src="https://img2018.cnblogs.com/blog/749711/201912/749711-20191202210241965-1672669642.png"&gt;&lt;/img&gt;&lt;/p&gt;    &lt;p&gt;生产文件将位于开发文件下面。&lt;/p&gt;    &lt;p&gt;设置修改后，我们就可以通过不同的 appsettings 文件来加载不同的配置，取决于我们应用程序当前所处环境，.NET Core 将会给我们提供正确的设置。更多关于这一主题，请查阅：      &lt;a href="https://docs.microsoft.com/en-us/aspnet/core/fundamentals/environments?view=aspnetcore-3.0"&gt;Multiple Environments in ASP.NET Core.&lt;/a&gt;&lt;/p&gt;    &lt;h2&gt;数据访问层&lt;/h2&gt;    &lt;blockquote&gt;      &lt;p&gt;DATA ACCESS LAYER&lt;/p&gt;&lt;/blockquote&gt;    &lt;p&gt;在一些不同的示例教程中，我们可能看到 DAL 的实现在主项目中，并且每个控制器中都有实例。我们不建议这么做。&lt;/p&gt;    &lt;p&gt;当我们编写 DAL 时，我们应该将其作为一个独立的服务来创建。在 .NET Core 项目中，这一点很重要，因为当我们将 DAL 作为一个独立的服务时，我们就可以将其直接注入到 IOC（控制反转）容器中。IOC 是 .NET Core 内置功能。通过这种方式，我们可以在任何控制器中通过构造函数注入的方式来使用。&lt;/p&gt;    &lt;pre&gt;      &lt;code&gt;public class OwnerController: Controller
{
    private readonly IRepository _repository;
    public OwnerController(IRepository repository)
    {
        _repository = repository;
    }
}&lt;/code&gt;&lt;/pre&gt;    &lt;h2&gt;控制器&lt;/h2&gt;    &lt;blockquote&gt;      &lt;p&gt;CONTROLLERS&lt;/p&gt;&lt;/blockquote&gt;    &lt;p&gt;控制器应该始终尽量保持整洁。我们不应该将任何业务逻辑放置于内。&lt;/p&gt;    &lt;p&gt;因此，我们的控制器应该通过构造函数注入的方式接收服务实例，并组织 HTTP 的操作方法（GET，POST，PUT，DELETE，PATCH...）:&lt;/p&gt;    &lt;pre&gt;      &lt;code&gt;public class OwnerController : Controller
{
    private readonly ILoggerManager _logger;
    private readonly IRepository _repository;
    public OwnerController(ILoggerManager logger, IRepository repository)
    {
        _logger = logger;
        _repository = repository;
    }

    [HttpGet]
    public IActionResult GetAllOwners()
    {
    }
    [HttpGet(&amp;quot;{id}&amp;quot;, Name = &amp;quot;OwnerById&amp;quot;)]
    public IActionResult GetOwnerById(Guid id)
    {
    }
    [HttpGet(&amp;quot;{id}/account&amp;quot;)]
    public IActionResult GetOwnerWithDetails(Guid id)
    {
    }
    [HttpPost]
    public IActionResult CreateOwner([FromBody]Owner owner)
    {
    }
    [HttpPut(&amp;quot;{id}&amp;quot;)]
    public IActionResult UpdateOwner(Guid id, [FromBody]Owner owner)
    {
    }
    [HttpDelete(&amp;quot;{id}&amp;quot;)]
    public IActionResult DeleteOwner(Guid id)
    {
    }
}&lt;/code&gt;&lt;/pre&gt;    &lt;p&gt;我们的 Action 应该尽量保持简洁，它们的职责应该包括处理 HTTP 请求，验证模型，捕捉异常和返回响应。&lt;/p&gt;    &lt;pre&gt;      &lt;code&gt;[HttpPost]
public IActionResult CreateOwner([FromBody]Owner owner)
{
    try
    {
        if (owner.IsObjectNull())
        {
            return BadRequest(&amp;quot;Owner object is null&amp;quot;);
        }
        if (!ModelState.IsValid)
        {
            return BadRequest(&amp;quot;Invalid model object&amp;quot;);
        }
        _repository.Owner.CreateOwner(owner);
        return CreatedAtRoute(&amp;quot;OwnerById&amp;quot;, new { id = owner.Id }, owner);
    }
    catch (Exception ex)
    {
        _logger.LogError($&amp;quot;Something went wrong inside the CreateOwner action: { ex} &amp;quot;);
        return StatusCode(500, &amp;quot;Internal server error&amp;quot;);
    }
}&lt;/code&gt;&lt;/pre&gt;    &lt;p&gt;在大多数情况下，我们的 action 应该将      &lt;code&gt;IActonResult&lt;/code&gt;作为返回类型（有时我们希望返回一个特定类型或者是      &lt;code&gt;JsonResult&lt;/code&gt;...）。通过使用这种方式，我们可以很好地使用 .NET Core 中内置方法的返回值和状态码。&lt;/p&gt;    &lt;p&gt;使用最多的方法是：&lt;/p&gt;    &lt;ul&gt;      &lt;li&gt;OK =&amp;gt; returns the 200 status code&lt;/li&gt;      &lt;li&gt;NotFound =&amp;gt; returns the 404 status code&lt;/li&gt;      &lt;li&gt;BadRequest =&amp;gt; returns the 400 status code&lt;/li&gt;      &lt;li&gt;NoContent =&amp;gt; returns the 204 status code&lt;/li&gt;      &lt;li&gt;Created, CreatedAtRoute, CreatedAtAction =&amp;gt; returns the 201 status code&lt;/li&gt;      &lt;li&gt;Unauthorized =&amp;gt; returns the 401 status code&lt;/li&gt;      &lt;li&gt;Forbid =&amp;gt; returns the 403 status code&lt;/li&gt;      &lt;li&gt;StatusCode =&amp;gt; returns the status code we provide as input&lt;/li&gt;&lt;/ul&gt;    &lt;h2&gt;处理全局异常&lt;/h2&gt;    &lt;blockquote&gt;      &lt;p&gt;HANDLING ERRORS GLOBALLY&lt;/p&gt;&lt;/blockquote&gt;    &lt;p&gt;在上面的示例中，我们的 action 内部有一个      &lt;code&gt;try-catch&lt;/code&gt;代码块。这一点很重要，我们需要在我们的 action 方法体中处理所有的异常（包括未处理的）。一些开发者在 action 中使用      &lt;code&gt;try-catch&lt;/code&gt;代码块，这种方式明显没有任何问题。但我们希望 action 尽量保持简洁。因此，从我们的 action 中删除      &lt;code&gt;try-catch&lt;/code&gt;,并将其放在一个集中的地方会是一种更好的方式。.NET Core 给我们提供了一种处理全局异常的方式，只需要稍加修改，就可以使用内置且完善的的中间件。我们需要做的修改就是在      &lt;code&gt;Startup&lt;/code&gt;类中修改      &lt;code&gt;Configure&lt;/code&gt;方法：&lt;/p&gt;    &lt;pre&gt;      &lt;code&gt;public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
    app.UseExceptionHandler(config =&amp;gt; 
    {
        config.Run(async context =&amp;gt; 
        {
            context.Response.StatusCode = 500;
            context.Response.ContentType = &amp;quot;application/json&amp;quot;;

            var error = context.Features.Get&amp;lt;IExceptionHandlerFeature&amp;gt;();
            if (error != null)
            {
                var ex = error.Error;
                await context.Response.WriteAsync(new ErrorModel
                {
                    StatusCode = 500,
                    ErrorMessage = ex.Message
                }.ToString());
            }
        });
    });

    app.UseRouting();

    app.UseEndpoints(endpoints =&amp;gt;
    {
        endpoints.MapControllers();
    });
}&lt;/code&gt;&lt;/pre&gt;    &lt;p&gt;我们也可以通过创建自定义的中间件来实现我们的自定义异常处理：&lt;/p&gt;    &lt;pre&gt;      &lt;code&gt;// You may need to install the Microsoft.AspNetCore.Http.Abstractions package into your project
public class CustomExceptionMiddleware
{
    private readonly RequestDelegate _next;
    private readonly ILogger&amp;lt;CustomExceptionMiddleware&amp;gt; _logger;
    public CustomExceptionMiddleware(RequestDelegate next, ILogger&amp;lt;CustomExceptionMiddleware&amp;gt; logger)
    {
        _next = next;
        _logger = logger;
    }

    public async Task Invoke(HttpContext httpContext)
    {
        try
        {
            await _next(httpContext);
        }
        catch (Exception ex)
        {
            _logger.LogError(&amp;quot;Unhandled exception....&amp;quot;, ex);
            await HandleExceptionAsync(httpContext, ex);
        }
    }

    private Task HandleExceptionAsync(HttpContext httpContext, Exception ex)
    {
        //todo
        return Task.CompletedTask;
    }
}

// Extension method used to add the middleware to the HTTP request pipeline.
public static class CustomExceptionMiddlewareExtensions
{
    public static IApplicationBuilder UseCustomExceptionMiddleware(this IApplicationBuilder builder)
    {
        return builder.UseMiddleware&amp;lt;CustomExceptionMiddleware&amp;gt;();
    }
}&lt;/code&gt;&lt;/pre&gt;    &lt;p&gt;之后，我们只需要将其注入到应用程序的请求管道中即可：&lt;/p&gt;    &lt;pre&gt;      &lt;code&gt;public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
    app.UseCustomExceptionMiddleware();
}&lt;/code&gt;&lt;/pre&gt;    &lt;h2&gt;使用过滤器移除重复代码&lt;/h2&gt;    &lt;blockquote&gt;      &lt;p&gt;USING ACTIONFILTERS TO REMOVE DUPLICATED CODE&lt;/p&gt;&lt;/blockquote&gt;    &lt;p&gt;ASP.NET Core 的过滤器可以让我们在请求管道的特定状态之前或之后运行一些代码。因此如果我们的 action 中有重复验证的话，可以使用它来简化验证操作。&lt;/p&gt;    &lt;p&gt;当我们在 action 方法中处理 PUT 或者 POST 请求时，我们需要验证我们的模型对象是否符合我们的预期。作为结果，这将导致我们的验证代码重复，我们希望避免出现这种情况，（基本上，我们应该尽我们所能避免出现任何代码重复。）我们可以在代码中通过使用 ActionFilter 来代替我们的验证代码：&lt;/p&gt;    &lt;pre&gt;      &lt;code&gt;if (!ModelState.IsValid)
{
    //bad request and logging logic
}&lt;/code&gt;&lt;/pre&gt;    &lt;p&gt;我们可以创建一个过滤器：&lt;/p&gt;    &lt;pre&gt;      &lt;code&gt;public class ModelValidationAttribute : ActionFilterAttribute
{
    public override void OnActionExecuting(ActionExecutingContext context)
    {
        if (!context.ModelState.IsValid)
        {
            context.Result = new BadRequestObjectResult(context.ModelState);
        }
    }
}&lt;/code&gt;&lt;/pre&gt;    &lt;p&gt;然后在      &lt;code&gt;Startup&lt;/code&gt;类的      &lt;code&gt;ConfigureServices&lt;/code&gt;函数中将其注入：&lt;/p&gt;    &lt;pre&gt;      &lt;code&gt;services.AddScoped&amp;lt;ModelValidationAttribute&amp;gt;();&lt;/code&gt;&lt;/pre&gt;    &lt;p&gt;现在，我们可以将上述注入的过滤器应用到我们的 action 中。&lt;/p&gt;    &lt;h2&gt;Microsoft.AspNetCore.All 元包&lt;/h2&gt;    &lt;blockquote&gt;      &lt;p&gt;MICROSOFT.ASPNETCORE.ALL META-PACKAGE&lt;/p&gt;&lt;/blockquote&gt;    &lt;p&gt;注：如果你使用的是 2.1 和更高版本的 ASP.NET Core。建议使用 Microsoft.AspNetCore.App 包，而不是 Microsoft.AspNetCore.All。这一切都是出于安全原因。此外，如果使用 2.1 版本创建新的 WebAPI 项目，我们将自动获取 AspNetCore.App 包，而不是 AspNetCore.All。&lt;/p&gt;    &lt;p&gt;这个元包包含了所有 AspNetCore 的相关包，EntityFrameworkCore 包，SignalR 包（version 2.1） 和依赖框架运行的支持包。采用这种方式创建一个新项目很方便，因为我们不需要手动安装一些我们可能使用到的包。&lt;/p&gt;    &lt;p&gt;当然，为了能使用 Microsoft.AspNetCore.all 元包，需要确保你的机器安装了 .NET Core Runtime。&lt;/p&gt;    &lt;h2&gt;路由&lt;/h2&gt;    &lt;blockquote&gt;      &lt;p&gt;ROUTING&lt;/p&gt;&lt;/blockquote&gt;    &lt;p&gt;在 .NET Core Web API 项目中，我们应该使用属性路由代替传统路由，这是因为属性路由可以帮助我们匹配路由参数名称与 Action 内的实际参数方法。另一个原因是路由参数的描述，对我们而言，一个名为 &amp;quot;ownerId&amp;quot; 的参数要比 &amp;quot;id&amp;quot; 更加具有可读性。&lt;/p&gt;    &lt;p&gt;我们可以使用      &lt;strong&gt;[Route]&lt;/strong&gt;属性来在控制器的顶部进行标注：&lt;/p&gt;    &lt;pre&gt;      &lt;code&gt;[Route(&amp;quot;api/[controller]&amp;quot;)]
public class OwnerController : Controller
{
    [Route(&amp;quot;{id}&amp;quot;)]
    [HttpGet]
    public IActionResult GetOwnerById(Guid id)
    {
    }
}&lt;/code&gt;&lt;/pre&gt;    &lt;p&gt;还有另一种方式为控制器和操作创建路由规则：&lt;/p&gt;    &lt;pre&gt;      &lt;code&gt;[Route(&amp;quot;api/owner&amp;quot;)]
public class OwnerController : Controller
{
    [Route(&amp;quot;{id}&amp;quot;)]
    [HttpGet]
    public IActionResult GetOwnerById(Guid id)
    {
    }
}&lt;/code&gt;&lt;/pre&gt;    &lt;p&gt;对于这两种方式哪种会好一些存在分歧，但是我们经常建议采用第二种方式。这是我们一直在项目中采用的方式。&lt;/p&gt;    &lt;p&gt;当我们谈论路由时，我们需要提到路由的命名规则。我们可以为我们的操作使用描述性名称，但对于 路由/节点，我们应该使用 NOUNS 而不是 VERBS。&lt;/p&gt;    &lt;p&gt;一个较差的示例：&lt;/p&gt;    &lt;pre&gt;      &lt;code&gt;[Route(&amp;quot;api/owner&amp;quot;)]
public class OwnerController : Controller
{
    [HttpGet(&amp;quot;getAllOwners&amp;quot;)]
    public IActionResult GetAllOwners()
    {
    }
    [HttpGet(&amp;quot;getOwnerById/{id}&amp;quot;]
    public IActionResult GetOwnerById(Guid id)
    {
    }
}&lt;/code&gt;&lt;/pre&gt;    &lt;p&gt;一个较好的示例：&lt;/p&gt;    &lt;pre&gt;      &lt;code&gt;[Route(&amp;quot;api/owner&amp;quot;)]
public class OwnerController : Controller
{
    [HttpGet]
    public IActionResult GetAllOwners()
    {
    }
    [HttpGet(&amp;quot;{id}&amp;quot;]
    public IActionResult GetOwnerById(Guid id)
    {
    }
}&lt;/code&gt;&lt;/pre&gt;    &lt;p&gt;更多关于 Restful 实践的细节解释，请查阅：      &lt;a href="https://code-maze.com/top-rest-api-best-practices/"&gt;Top REST API Best Practices&lt;/a&gt;&lt;/p&gt;    &lt;h2&gt;日志&lt;/h2&gt;    &lt;blockquote&gt;      &lt;p&gt;LOGGING&lt;/p&gt;&lt;/blockquote&gt;    &lt;p&gt;如果我们打算将我们的应用程序发布到生产环境，我们应该在合适的位置添加一个日志记录机制。在生产环境中记录日志对于我们梳理应用程序的运行很有帮助。&lt;/p&gt;    &lt;p&gt;.NET Core 通过继承      &lt;code&gt;ILogger&lt;/code&gt;接口实现了它自己的日志记录。通过借助依赖注入机制，它可以很容易地使用。&lt;/p&gt;    &lt;pre&gt;      &lt;code&gt;public class TestController: Controller
{
    private readonly ILogger _logger;
    public TestController(ILogger&amp;lt;TestController&amp;gt; logger)
    {
        _logger = logger;
    }
}&lt;/code&gt;&lt;/pre&gt;    &lt;p&gt;然后，在我们的 action 中，我们可以通过使用 _logger 对象借助不同的日志级别来记录日志。&lt;/p&gt;    &lt;p&gt;.NET Core 支持使用于各种日志记录的 Provider。因此，我们可能会在项目中使用不同的 Provider 来实现我们的日志逻辑。&lt;/p&gt;    &lt;p&gt;NLog 是一个很不错的可以用于我们自定义的日志逻辑类库，它极具扩展性。支持结构化日志，且易于配置。我们可以将信息记录到控制台，文件甚至是数据库中。&lt;/p&gt;    &lt;p&gt;想了解更多关于该类库在 .NET Core 中的应用，请查阅：      &lt;a href="https://code-maze.com/net-core-web-development-part3/"&gt;.NET Core series – Logging With NLog.&lt;/a&gt;&lt;/p&gt;    &lt;p&gt;Serilog 也是一个很不错的类库，它适用于 .NET Core 内置的日志系统。&lt;/p&gt;    &lt;h2&gt;加密&lt;/h2&gt;    &lt;blockquote&gt;      &lt;p&gt;CRYPTOHELPER&lt;/p&gt;&lt;/blockquote&gt;    &lt;p&gt;我们不会建议将密码以明文形式存储到数据库中。处于安全原因，我们需要对其进行哈希处理。这超出了本指南的内容范围。互联网上有大量哈希算法，其中不乏一些不错的方法来将密码进行哈希处理。&lt;/p&gt;    &lt;p&gt;但是如果需要为 .NET Core 的应用程序提供易于使用的加密类库，CryptoHelper 是一个不错的选择。&lt;/p&gt;    &lt;p&gt;CryptoHelper 是适用于 .NET Core 的独立密码哈希库，它是基于 PBKDF2 来实现的。通过创建      &lt;code&gt;Data Protection&lt;/code&gt;栈来将密码进行哈希化。这个类库在 NuGet 上是可用的，并且使用也很简单：&lt;/p&gt;    &lt;pre&gt;      &lt;code&gt;using CryptoHelper;

// Hash a password
public string HashPassword(string password)
{
    return Crypto.HashPassword(password);
}

// Verify the password hash against the given password
public bool VerifyPassword(string hash, string password)
{
    return Crypto.VerifyHashedPassword(hash, password);
}&lt;/code&gt;&lt;/pre&gt;    &lt;h2&gt;内容协商&lt;/h2&gt;    &lt;blockquote&gt;      &lt;p&gt;CONTENT NEGOTIATION&lt;/p&gt;&lt;/blockquote&gt;    &lt;p&gt;默认情况下，.NET Core Web API 会返回 JSON 格式的结果。大多数情况下，这是我们所希望的。&lt;/p&gt;    &lt;p&gt;但是如果客户希望我们的 Web API 返回其它的响应格式，例如 XML 格式呢？&lt;/p&gt;    &lt;p&gt;为了解决这个问题，我们需要进行服务端配置，用于按需格式化我们的响应结果：&lt;/p&gt;    &lt;pre&gt;      &lt;code&gt;public void ConfigureServices(IServiceCollection services)
{
    services.AddControllers().AddXmlSerializerFormatters();
}&lt;/code&gt;&lt;/pre&gt;    &lt;p&gt;但有时客户端会请求一个我们 Web API 不支持的格式，因此最好的实践方式是对于未经处理的请求格式统一返回 406 状态码。这种方式也同样能在 ConfigureServices 方法中进行简单配置：&lt;/p&gt;    &lt;pre&gt;      &lt;code&gt;public void ConfigureServices(IServiceCollection services)
{
    services.AddControllers(options =&amp;gt; options.ReturnHttpNotAcceptable = true).AddXmlSerializerFormatters();
}&lt;/code&gt;&lt;/pre&gt;    &lt;p&gt;我们也可以创建我们自己的格式化规则。&lt;/p&gt;    &lt;p&gt;这一部分内容是一个很大的主题，如果你希望了解更多，请查阅：      &lt;a href="https://code-maze.com/content-negotiation-dotnet-core/"&gt;Content Negotiation in .NET Core&lt;/a&gt;&lt;/p&gt;    &lt;h2&gt;使用 JWT&lt;/h2&gt;    &lt;blockquote&gt;      &lt;p&gt;USING JWT&lt;/p&gt;&lt;/blockquote&gt;    &lt;p&gt;现如今的 Web 开发中，JSON Web Tokens (JWT) 变得越来越流行。得益于 .NET Core 内置了对 JWT 的支持，因此实现起来非常容易。JWT 是一个开发标准，它允许我们以 JSON 格式在服务端和客户端进行安全的数据传输。&lt;/p&gt;    &lt;p&gt;我们可以在 ConfigureServices 中配置 JWT 认证：&lt;/p&gt;    &lt;pre&gt;      &lt;code&gt;public void ConfigureServices(IServiceCollection services)
{
    services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
        .AddJwtBearer(options =&amp;gt; 
        {
            options.TokenValidationParameters = new TokenValidationParameters
            {
                ValidateIssuer = true,
                ValidIssuer = _authToken.Issuer,

                ValidateAudience = true,
                ValidAudience = _authToken.Audience,

                ValidateIssuerSigningKey = true,
                IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(_authToken.Key)),

                RequireExpirationTime = true,
                ValidateLifetime = true,

                //others
            };
        });
}&lt;/code&gt;&lt;/pre&gt;    &lt;p&gt;为了能在应用程序中使用它，我们还需要在 Configure 中调用下面一段代码：&lt;/p&gt;    &lt;pre&gt;      &lt;code&gt;public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
    app.UseAuthentication();
}&lt;/code&gt;&lt;/pre&gt;    &lt;p&gt;此外，创建 Token 可以使用如下方式：&lt;/p&gt;    &lt;pre&gt;      &lt;code&gt;var securityToken = new JwtSecurityToken(
                claims: new Claim[]
                {
                    new Claim(ClaimTypes.NameIdentifier,user.Id),
                    new Claim(ClaimTypes.Email,user.Email)
                },
                issuer: _authToken.Issuer,
                audience: _authToken.Audience,
                notBefore: DateTime.Now,
                expires: DateTime.Now.AddDays(_authToken.Expires),
                signingCredentials: new SigningCredentials(
                    new SymmetricSecurityKey(Encoding.UTF8.GetBytes(_authToken.Key)),
                    SecurityAlgorithms.HmacSha256Signature));

Token = new JwtSecurityTokenHandler().WriteToken(securityToken)&lt;/code&gt;&lt;/pre&gt;    &lt;p&gt;基于 Token 的用户验证可以在控制器中使用如下方式：&lt;/p&gt;    &lt;pre&gt;      &lt;code&gt;var auth = await HttpContext.AuthenticateAsync();
var id = auth.Principal.Claims.FirstOrDefault(x =&amp;gt; x.Type.Equals(ClaimTypes.NameIdentifier))?.Value;&lt;/code&gt;&lt;/pre&gt;    &lt;p&gt;我们也可以将 JWT 用于授权部分，只需添加角色声明到 JWT 配置中即可。&lt;/p&gt;    &lt;p&gt;更多关于 .NET Core 中 JWT 认证和授权部分，请查阅：      &lt;a href="https://code-maze.com/authentication-aspnetcore-jwt-1/"&gt;authentication-aspnetcore-jwt-1&lt;/a&gt;和      &lt;a href="https://code-maze.com/authentication-aspnetcore-jwt-2/"&gt;authentication-aspnetcore-jwt-2&lt;/a&gt;&lt;/p&gt;    &lt;h2&gt;总结&lt;/h2&gt;    &lt;blockquote&gt;      &lt;p&gt;读到这里，可能会有朋友对上述一些最佳实践不是很认同，因为全篇都没有谈及更切合项目的实践指南，比如        &lt;strong&gt;TDD&lt;/strong&gt;、        &lt;strong&gt;DDD&lt;/strong&gt;等。但我个人认为上述所有的最佳实践是基础，只有把这些基础掌握了，才能更好地理解一些更高层次的实践指南。万丈高楼平地起，所以你可以把这看作是一篇面向新手的最佳实践指南。&lt;/p&gt;&lt;/blockquote&gt;    &lt;p&gt;在这份指南中，我们的主要目的是让你熟悉关于使用 .NET Core 开发 web API 项目时的一些最佳实践。这里面的部分内容在其它框架中也同样适用。因此，熟练掌握它们很有用。&lt;/p&gt;    &lt;p&gt;非常感谢你能阅读这份指南，希望它能对你有所帮助。&lt;/p&gt;&lt;/div&gt;
    &lt;div&gt; &lt;a href="https://itindex.net/"  title="IT 资讯"&gt;&lt;img src="https://itindex.net/images/iconWarning.gif" title="IT 资讯" border="0"/&gt; &lt;/a&gt;</description>
      <category />
      <guid isPermaLink="true">https://itindex.net/detail/60232-asp-net-core</guid>
      <pubDate>Thu, 19 Dec 2019 21:38:18 CST</pubDate>
    </item>
    <item>
      <title>花椒 web 端实时互动流媒体播放器</title>
      <link>https://itindex.net/detail/60214-%E8%8A%B1%E6%A4%92-web-%E5%AE%9E%E6%97%B6</link>
      <description>&lt;div&gt;  &lt;h2&gt;项目背景&lt;/h2&gt;  &lt;p&gt;春天的时候花椒做了一个创新项目， 这是一个直播综艺节目的项目，前端的工作主要是做出一个PC主站点，在这个站点中的首页需要一个播放器，    &lt;br /&gt;既能播放FLV直播视频流，还要在用户点击视频回顾按钮的时候， 弹出窗口播放HLS视频流；我们开始开发这个播放器的时候也没有多想， 直接使用了大家都能想到的   &lt;br /&gt;最简单的套路，flv.js和hls.js一起用！在播放视频时，调用中间件video.js来输出的Player来实现播放，这个Player根据视频地址的结尾字符来初始化播放器：new HLS 或者 flvjs.createPlayer，   &lt;br /&gt;对外提供一致的接口，对HLS.js和FLV.js创建的播放器进行调用。完美的实现了产品的需求，不过写代码的时候总感觉有点蠢，HLS.js（208KB）和FLV.js（169KB）体积加起来有点太让人热泪盈眶了。   &lt;br /&gt;这时我们就有了一个想法，这两能不能合起来成为一个lib，既能播放flv视频，又能播放hls视频。理想很丰满，现实很骨感，这2个lib虽然都是JavaScript写的，但是它们的范畴都是视频类，以前只是调用，   &lt;br /&gt;完全没有深入了解过，不过我们还是在领导的大(wei)力(bi)支(li)持(you)下，开始了尝试。&lt;/p&gt;  &lt;h2&gt;FLV.JS分析&lt;/h2&gt;  &lt;p&gt;FLV.js的工作原理是下载flv文件转码成IOS BMFF（MP4碎片）片段， 然后通过   &lt;code&gt;Media Source Extensions&lt;/code&gt;将MP4片段传输给HTML5的Video标签进行播放;   &lt;br /&gt;它的结构如下图所示:&lt;/p&gt;  &lt;p&gt;   &lt;img&gt;&lt;/img&gt;&lt;/p&gt;  &lt;p&gt;src/flv.js 是对外输出FLV.js的一些组件, 事件和错误, 方便用户根据抛出的事件进行各种操作和获取相应的播放信息; 最主要是flv.js下返回的2个player:    &lt;code&gt;NativePlayer&lt;/code&gt; 和    &lt;code&gt;FLVPlayer&lt;/code&gt;;   &lt;br /&gt;   &lt;code&gt;NativePlayer&lt;/code&gt; 是对浏览器本身播放器的一个再包装, 使之能和   &lt;code&gt;FLVPlayer&lt;/code&gt;一样, 相应共同的事件和操作; 大家最主要使用的还是   &lt;code&gt;FLVPlayer&lt;/code&gt;这个播放器;   &lt;br /&gt;而    &lt;code&gt;FLVPlayer&lt;/code&gt;中最重要东西可分为两块: 1. MSEController; 2. Transmuxer; &lt;/p&gt;  &lt;h3&gt;MSEController&lt;/h3&gt;  &lt;p&gt;这个MSEController负责给HTML Video Element 和 SourceBuffer之间建立连接, 接受 InitSegment(ISO BMFF 片段中的 FTYP + MOOV)和 MediaSegment (ISO BMFF 片段中的 MOOF + MDATA); 将这2个片段按照顺序添加到SourceBuffer中, 和对SouceBuffer的一些控制和状态反馈;&lt;/p&gt;  &lt;h3&gt;Transmuxer&lt;/h3&gt;  &lt;p&gt;Transmuxer 主要负责的就是下载, 解码, 转码, 发送Segment的工作; 它的下面主要包含了 2个模块,    &lt;code&gt;TransmuxingWorker&lt;/code&gt; 和    &lt;code&gt;TransmuxingController&lt;/code&gt;;    &lt;br /&gt;   &lt;code&gt;TransmuxingWorker&lt;/code&gt;是启用多线程执行    &lt;code&gt;TransmuxingController&lt;/code&gt;, 并对    &lt;code&gt;TransmuxingController&lt;/code&gt;抛出的事件就行转发;   &lt;br /&gt;   &lt;code&gt;TransmuxingController&lt;/code&gt; 才是真正执行 下载, 解码, 转码, 发送Segment的苦力部门, 苦活累活都是这个部门干的,    &lt;code&gt;Transmuxer&lt;/code&gt;(真上级) 和    &lt;code&gt;TransmuxingController&lt;/code&gt;(伪上级)都是在调用它的功能和传递它的输出;&lt;/p&gt;  &lt;p&gt;下面有请这个劳苦功高的部门登场&lt;/p&gt;  &lt;h4&gt;TransmuxingController&lt;/h4&gt;  &lt;p&gt;   &lt;code&gt;TransmuxingController&lt;/code&gt;也是一个大部门, 他的手下有三个小组:    &lt;code&gt;IOController&lt;/code&gt;,    &lt;code&gt;demuxer&lt;/code&gt;和    &lt;code&gt;remuxer&lt;/code&gt;;&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;    &lt;p&gt;IOController &lt;/p&gt;&lt;/li&gt;&lt;/ol&gt;  &lt;p&gt;IOController主要有三个功能, 一是负责遴选他手下的小小弟(loaders), 选出最适合当前浏览器环境的loader, 去从服务器搬运媒体流; 二是存储小小弟(loader)发上来的数据; 三是把数据发送给demuxer(解码)并存储demuxer未处理完的数据; &lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;    &lt;p&gt;demuxer &lt;/p&gt;&lt;/li&gt;&lt;/ol&gt;  &lt;p&gt;demuxer 是负责解码工作的员工, 他需要把IOController发送过来的FLV data, 解析整理成 videoTrack 和 audioTrack; 并把解析后的数据发送给    &lt;code&gt;remuxer&lt;/code&gt; 转码器; 解码完成后, 他会把已经处理的数据的长度返回给 IOController, IOController会把未处理的数据(总数据 - 已经处理的数据)存储, 等待下次发送数据的时候发从头部追加未处理的数据, 一起发送给 demuxer.&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;    &lt;p&gt;remuxer&lt;/p&gt;&lt;/li&gt;&lt;/ol&gt;  &lt;p&gt;remuxer 是负责将 videoTrack 和 audioTrack 转成 InitSegment 和 MediaSegment并向上发送, 并在转化的过程中进行音视频同步的操作. &lt;/p&gt;  &lt;p&gt;总的流程就是 FLVPlayer喊了一声启动之后, loader 加载数据 =&amp;gt; IOController 存储和转发数据 =&amp;gt; demuxer 解码数据 =&amp;gt; remuxer 转码数据 =&amp;gt; TransmuxingWorker 和 Transmuxer 转发数据 =&amp;gt;&lt;/p&gt;  &lt;p&gt;MSEController 接受数据 =&amp;gt; SourceBuffer; 一系列操作之后视频就可以播放了;&lt;/p&gt;  &lt;h2&gt;HLS.JS分析&lt;/h2&gt;  &lt;p&gt;HLS.js的工作原理是先下载index.m3u8文件, 然后解析该文档, 取出Level, 再根据Levels中的片段(Fragments)信息去下载相应的TS文件, 转码成IOS BMFF（MP4碎片）片段， 然后通过   &lt;code&gt;Media Source Extensions&lt;/code&gt;将MP4片段传输给HTML5的Video标签进行播放;&lt;/p&gt;  &lt;p&gt;   &lt;code&gt;HLS.js&lt;/code&gt;的结构如下&lt;/p&gt;  &lt;p&gt;   &lt;img&gt;&lt;/img&gt;&lt;/p&gt;  &lt;p&gt;相对于 flv.js的多层分级, hls.js到是有一点扁平化的味道, hls这个公司老总在继承 Observer 的trigger功能之后, 深入各个部门(即各种controller和loader)发号施令(进行   &lt;code&gt;hls.trigger(HlsEvents.xxx, data)&lt;/code&gt;的操作); 而各个部门继承EventHandler之后, 实例化时就分配好自己所负责的工作; 以    &lt;code&gt;buffer-controller.js&lt;/code&gt; 为例:&lt;/p&gt;  &lt;pre&gt;   &lt;code&gt;    &lt;br /&gt;constructor (hls: any) {    &lt;br /&gt;super(hls,    &lt;br /&gt;Events.MEDIA_ATTACHING,    &lt;br /&gt;Events.MEDIA_DETACHING,    &lt;br /&gt;Events.MANIFEST_PARSED,    &lt;br /&gt;Events.BUFFER_RESET,    &lt;br /&gt;Events.BUFFER_APPENDING,    &lt;br /&gt;Events.BUFFER_CODECS,    &lt;br /&gt;Events.BUFFER_EOS,    &lt;br /&gt;Events.BUFFER_FLUSHING,    &lt;br /&gt;Events.LEVEL_PTS_UPDATED,    &lt;br /&gt;Events.LEVEL_UPDATED);    &lt;br /&gt;this.config = hls.config;    &lt;br /&gt;}    &lt;br /&gt;    &lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;  &lt;p&gt;   &lt;code&gt;buffer-controller.js&lt;/code&gt; 这个部门主要负责以下功能: &lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;    &lt;p&gt;响应BUFFER_RESET事件, 重置媒体缓冲区&lt;/p&gt;&lt;/li&gt;   &lt;li&gt;    &lt;p&gt;响应BUFFER_CODECS事件, 接收时使用适当的编解码器信息初始化SourceBuffer&lt;/p&gt;&lt;/li&gt;   &lt;li&gt;    &lt;p&gt;响应BUFFER_APPENDING事件, 给SourceBuffer中添加MP4 片段&lt;/p&gt;&lt;/li&gt;   &lt;li&gt;    &lt;p&gt;成功添加缓冲区后触发BUFFER_APPENDED事件&lt;/p&gt;&lt;/li&gt;   &lt;li&gt;    &lt;p&gt;响应BUFFER_FLUSHING事件, 刷新指定的缓冲区范围&lt;/p&gt;&lt;/li&gt;   &lt;li&gt;    &lt;p&gt;成功刷新缓冲区后触发BUFFER_FLUSHED事件&lt;/p&gt;&lt;/li&gt;&lt;/ol&gt;  &lt;p&gt;   &lt;code&gt;buffer-controller.js&lt;/code&gt; 初始化时就定义了自己只响应    &lt;code&gt;Events.MEDIA_ATTACHING&lt;/code&gt;,    &lt;code&gt;Events.MEDIA_DETACHING&lt;/code&gt; 等等这些工作, 它会自己实现    &lt;code&gt;onMediaAttaching&lt;/code&gt;,     &lt;code&gt;onMediaDetaching&lt;/code&gt;等方法来响应和完成这些工作, 其他的一概不管, 它完成自己的任务后会通过hls向其他部门告知已经完成了自己的工作, 并将工作结果移交给其他部门, 例如    &lt;code&gt;buffer-controller.js&lt;/code&gt; 中的 581行    &lt;code&gt;this.hls.trigger(Events.BUFFER_FLUSHED)&lt;/code&gt;, 这行代码就是向其他部门(其他controllers)告知已经完成   &lt;code&gt;BUFFER_FLUSHED&lt;/code&gt;的工作;&lt;/p&gt;  &lt;pre&gt;   &lt;code&gt;注: 大家在读取hls.js的源码的时候, 看到 `this.hls.trigger(Events.xxxx)`时, 查找下一步骤时, 只要在全部代码中搜索onXXX(去掉事件中的下划线)方法即可找到下一步操作    &lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;  &lt;p&gt;明白了HLS.JS代码的读取套路之后我们可以更清晰的了解hls.js实现播放HLS流的大致过程了; &lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;    &lt;p&gt;hls.js只播放HLS流, 没有NativePlayer, 所以顶级src/hls.js 对应着 flv.js中的      &lt;code&gt;FLVPlayer&lt;/code&gt;, 直接提供API, 响应外界的各种操作和发送信息; 在开始准备播放的时候它会发令     &lt;code&gt;HlsEvents.MANIFEST_LOADING&lt;/code&gt;, &lt;/p&gt;&lt;/li&gt;   &lt;li&gt;    &lt;p&gt;playlist-loader 收到 HlsEvents.MANIFEST_LOADING 后, 它会使用XHRLoader去加载 M3U8文档, 文档经过解析之后会得到该文档含有的level(对于直播行业来说一般就是一个level, level[0] 就是我们想要的数据); playlist-loader 会发出      &lt;code&gt;LEVEL_LOADED&lt;/code&gt; 的事件并携带level信息;&lt;/p&gt;&lt;/li&gt;   &lt;li&gt;    &lt;p&gt;level-controller会记录level信息, 并计算更新m3u8的时间间隔, 不断加载m3u8文件更新level; 而 stream-controller 则会经过一系列的操作之后去加载 fragment(即m3u8文档中的ts文件); 发出      &lt;code&gt;FRAG_LOADING&lt;/code&gt;事件, 并初始化 解码器和转码器 (Demuxer对象, Remuxer会在Demuxer实例化中初始化)&lt;/p&gt;&lt;/li&gt;   &lt;li&gt;    &lt;p&gt;FragmentLoader 收到       &lt;code&gt;FRAG_LOADING&lt;/code&gt; 之后会去加载相应的TS文件, 并在加载TS文件完毕之后发出      &lt;code&gt;FRAG_LOADED&lt;/code&gt; 事件, 并把TS的Uint8数据和fragment的其他信息一并发送出;&lt;/p&gt;&lt;/li&gt;   &lt;li&gt;    &lt;p&gt;在      &lt;code&gt;stream-controller&lt;/code&gt; 接收      &lt;code&gt;FRAG_LOADED&lt;/code&gt;事件后, 他会调用它的      &lt;code&gt;onFragLoaded&lt;/code&gt; 方法, 在这个方法中 demuxer 会解析 TS 的文件, 经过demuxer和remuxer的通力协作, 生成InitSegment(FRAGPARSINGINITSEGMENT事件 所携带的数据) 和 MediaSegment(FRAGPARSING_DATA事件 所携带的数据), 经由 steam-controller 传输给 buffer-controller, 最后添加进SourceBuffer;&lt;/p&gt;&lt;/li&gt;&lt;/ol&gt;  &lt;h2&gt;怎么结合&lt;/h2&gt;  &lt;p&gt;通过对FLV.js和HLS.js 进行分析, 它们共同的流程都是 下载, 解码, 转码, 传输给SourceBuffer; 一样的loader(FragmentLoader和FetchStreamLoader), 一样的解码和转码(demuxer和remuxer), 一样的 SourceBuffer Controller (MSEController 和 Buffer-controller ); 不同的就是他们的控制流程不一样, 还有hls流多了一步解析文档的步骤; &lt;/p&gt;  &lt;p&gt;下面我们就思考怎么去结合两个lib:&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;    &lt;p&gt;根据项目目的: 项目是一个主直播, 次点播的站点; FLV直播功能是最重要的功能, HLS流的回放只在用户点击视频回顾和查看过去节目视频才会使用;&lt;/p&gt;&lt;/li&gt;   &lt;li&gt;    &lt;p&gt;根据其他项目的需求: 花椒PC端主站（https://www.huajiao.com/）现在也是HTTP-FLV的形式去进行直播展示, 而HLS流计划用于播放主播小视频(点播);&lt;/p&gt;&lt;/li&gt;   &lt;li&gt;    &lt;p&gt;根据业界情况: 现在业界直播基本还是用的HTTP-FLV这种形式(基础设施成熟, 技术简单, 延迟小), 而HLS流一般还是用在移动端直播; &lt;/p&gt;&lt;/li&gt;&lt;/ol&gt;  &lt;p&gt;所以我们决定采用在 FLV.js 的基础上, 加上HLS.js中的 loader, demuxer 和 remuxer 这三部分去组成一个新的播放器library, 既能播放FLV视频, 也能播放HLS流(根据项目的需要只包含单码率流的直播和点播, 不包含多码率流, 自动切换码率, 解密等功能);&lt;/p&gt;  &lt;h2&gt;具体实施过程&lt;/h2&gt;  &lt;p&gt;首先我们先规划了一下内嵌的功能怎么接入:&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;    &lt;p&gt;Loader的接入&lt;/p&gt;&lt;/li&gt;&lt;/ol&gt;  &lt;p&gt;HLS.js中加载HLS流需要 FragmentLoader, XHRLoader, M3U8Parser, LevelController, StreamController 这些, 其中 FragmentLoader 是控制XHR加载TS文件和反馈Fragment加载状态的组件,    &lt;br /&gt;XHRLoader是执行加载 TS 文件和 playlist 文件 的组件, LevelController 是 选择符合当前码率的level 和 playlist加载间隔的, streamController是负责判断加载当前Level中哪个TS文件的组件;   &lt;br /&gt;在接入FLV.js时, 需要 FragmentLoader 自己去承担 LevelController 和 StreamController 中相应的工作, 当 IOController 调用 startLoad 方法时, 它自己要去获取并解析playlist, 存储 Level的详细信息, 选择Level, 通过判断 Fragment 的 sequenceNum 来获取下一个TS文件地址, 让XHRLoader 去加载; (FragmentLoader 这娃来到了新公司, 身上担子变重了).&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;    &lt;p&gt;demuxer和remuxer的接入, &lt;/p&gt;&lt;/li&gt;&lt;/ol&gt;  &lt;p&gt;因为FLV和TS文件的解析方式不同, 但是在TransmuxingController中, 两个都要接入IOController这个统一数据源, 所以把FLV的解码和转码放入到一个FLVCodec的对象中对外输出功能, TS的解码和转码则集中放入TSCodec中对外输出功能; 根据传进来媒体类型实例化解码器和转码器.&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;    &lt;p&gt;IOController和 _mediaCodec 的接入&lt;/p&gt;&lt;/li&gt;&lt;/ol&gt;  &lt;p&gt;在 TransmuxingController 中则用 一个 _mediaCodec 对象来管理FLVCodec和TSCodec, 接入数据源IOController时调用两者都拥有的bindDataSource方法; 这里有一点需要注意的是   &lt;br /&gt;FLVCodec功能会返回一个 number 类型 consumed; 此参数表示FLVCodec功能已解码和转码的输出长度, 需要返回给 IOController, 让 IOController 刨除已解码的数据, 存储未解码的数据, 等下次一起再传给 FLVCodec 功能, 而TSCodec因为TS的文件结构特点(每个TS包都是188字节的整数倍), 所以每次都是全部处理, 只需要返回 consumed = 0 即可;&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;    &lt;p&gt;hls流的点播seek功能的接入&lt;/p&gt;&lt;/li&gt;&lt;/ol&gt;  &lt;p&gt;在FLV.js中, 每当SEEK操作时都会MediaInfo中的KeyFrame信息, 去查找相应的Range点, 然后从Range点去加载; 对于hls点播流, 需要对FragmentLoader中的Level信息进行查询, 对每个Fragment进行循环判断 seek的时间点是否处于当前 Fragment 的播放时间, 如果是, 就立即加载即可; &lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;    &lt;p&gt;对各种意外情况的处理&lt;/p&gt;&lt;/li&gt;&lt;/ol&gt;  &lt;p&gt;在嵌入的组件中加入logger打印日志, 并将错误返回接入到FLV.JS框架中, 使之能返回响应的错误信息和日志信息;&lt;/p&gt;  &lt;p&gt;具体结构如下图: &lt;/p&gt;  &lt;p&gt;   &lt;img&gt;&lt;/img&gt;&lt;/p&gt;  &lt;p&gt;除此之外, 我们还做了以下几点:&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;    &lt;p&gt;我们在进行改造的时候还接入了Typescript , 实现对功能参数的类型检查; &lt;/p&gt;&lt;/li&gt;   &lt;li&gt;    &lt;p&gt;在FLV-MP4Remuxer中集成了 jamken (感谢❤ jamken)&lt;/p&gt;    &lt;p&gt;（https://github.com/jamken）&lt;/p&gt;    &lt;p&gt;对 FLV.js 推送的 354PR&lt;/p&gt;    &lt;p&gt;（https://github.com/bilibili/flv.js/pull/354）, 修正FLV.JS中音视频不同步的问题;&lt;/p&gt;&lt;/li&gt;   &lt;li&gt;    &lt;p&gt;还加入了视频补充增强信息(Supplemental Enhancement Information)的解析, 通过监听     &lt;code&gt;HJPlayer.Events.GET_SEI_INFO&lt;/code&gt;事件可以得到自定义SEI信息, 格式为Uint8Array; &lt;/p&gt;&lt;/li&gt;&lt;/ol&gt;  &lt;h2&gt;对视频直播实时互动的尝试&lt;/h2&gt;  &lt;p&gt;在项目中, 主持人会在节目播放过程中提供事件发展方向的选项, 然后前端会弹出面板, 让用户选择方向, 节目根据答案的方向进行直播表演; 按照以往的方案, 一般这种情况都是选择由 Socket 服务器下发消息, 前端接到消息后展示选项, 然后用户选择, 点击提交答案这么一个流程; 去年阿里云推出了一项新颖的直播答题解决方案;    &lt;br /&gt;选项不再由Socket服务器下发, 而是由视频云服务器随视频下发; 播放SDK解析视频中的视频补充增强信息, 展示选项; 我们对此方案进行了实践, 大概流程如下:&lt;/p&gt;  &lt;p&gt;   &lt;img&gt;&lt;/img&gt;&lt;/p&gt;  &lt;p&gt;当主持人提出问题后, 后台人员会在后台填写问题, 经视频云SDK传输给360视频云, 视频云对视频进行处理, 加入视频补充增强信息, 当播放SDK收到带有SEI信息的视频后, 经过解码去重, 将其中包含的信息传递给综艺直播间的互动组件, 互动组件展示, 用户点击选择答案后提交给后台进行汇总, 节目根据汇总后的答案进行节目内容的变更;&lt;/p&gt;  &lt;p&gt;与传统方案相比, 采用视频SEI信息传递互动的方案有以下几项优点:&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;    &lt;p&gt;可以实现与主持人的音视频同步出现, 避免因服务器群发消息不及时导致主持人已经宣布开始, 但是面板迟迟不出现的问题.&lt;/p&gt;&lt;/li&gt;   &lt;li&gt;    &lt;p&gt;成本低, 问题是由视频下发而不是由服务器下发, 但延迟会高一点(可提前在视频中插入, 主持人后提出问题, 减少延迟);&lt;/p&gt;&lt;/li&gt;&lt;/ol&gt;  &lt;p&gt;视频补充增强信息的内容一般由云服务器来指定内容, 除前16位UUID之外, 内容不尽相同, 所以本播放器直接将SEI信息(Uint8Array格式数据)经   &lt;code&gt;GET_SEI_INFO&lt;/code&gt;事件抛出, 用户需自行按照己方视频云给定的格式去解析信息; 另外注意SEI信息是一段时间内重复发送的, 所以用户需要自行去重.&lt;/p&gt;  &lt;h2&gt;最后&lt;/h2&gt;  &lt;p&gt;我们完成了此项目后, 将它应用到花椒PC端主站（https://www.huajiao.com/）播放FLV直播, 除此之外我们还将项目开源HJPlayer（https://github.com/huajiaofrontend/HJPlayer）, 希望能帮助那些碰见同样项目需求的程序员; 如果使用中有问题, 可以在ISSUES中提出, 让我们共同讨论解决. &lt;/p&gt;  &lt;h2&gt;题外&lt;/h2&gt;  &lt;ol&gt;   &lt;li&gt;    &lt;p&gt;有人可能会问 为什么你们的视频回顾不采用FLV文件, 这样就只使用FLV.JS不就可以播放了吗?&lt;/p&gt;&lt;/li&gt;&lt;/ol&gt;  &lt;p&gt;答: 点击视频回顾的时候, 需要播放过去5分钟播过的内容, 如果采用 FLV 文件的话, 那么每次就要从存储的视频中截取一段视频生成 FLV 文件, 然后前端拉取文件播放, 这样会增加一大堆的视频碎片文件, 随之会带来一系列的存储问题; 如果采用HLS流的话, 可以根据前端传回的时间戳, 在存储的HLS回顾文件中查找相应的TS文件, 并生成一份m3u8文档就可以了; &lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;    &lt;p&gt;视频补充增强信息(Supplemental Enhancement Information) 是什么?&lt;/p&gt;&lt;/li&gt;&lt;/ol&gt;  &lt;p&gt;视频补充增强信息是H.264视频压缩标准的特性之一, 提供了向视频码流中加入信息的办法; 它并不是解码过程中的必须存在的, 有可能对解码有帮助, 但是没有也没有关系;    &lt;br /&gt;在视频内容的生成端、传输过程中，都可以插入SEI 信息。插入的信息，和其他视频内容一起经过网络传输到播放SDK;    &lt;br /&gt;在H264/AVC编码格式中NAL uint 中的头部, 有type字段指明 NAL uint的类型, 当 type = 6 时 该NAL uint 携带的信息即为 补充增强信息（SEI）;&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;    &lt;p&gt;关于 SEI信息的解析:     &lt;br /&gt;&lt;/p&gt;&lt;/li&gt;&lt;/ol&gt;  &lt;p&gt;NAL uint type 后下一位即为 SEI 的type, 一般自定义的SEI信息的type 为 5, 即 userdataunregistered; SEI type 的下一位直到0xFF为止即为所携带的数据的长度, 然后就是16位的UUID,   &lt;br /&gt;在16位的UUID之后一直到0x00的结束符之间, 即为自定义信息内容, 所以信息内容长度 = SEI信息所携带的数据的长度 - 16位UUID; 自定义信息内容的解析方式就要根据己方视频云给定的数据格式定义了;&lt;/p&gt;  &lt;p&gt;   &lt;br /&gt;&lt;/p&gt;  &lt;p&gt;   &lt;img&gt;&lt;/img&gt;&lt;/p&gt;&lt;/div&gt;&lt;div&gt; &lt;a href="https://itindex.net/"  title="IT 资讯"&gt;&lt;img src="https://itindex.net/images/iconWarning.gif" title="IT 资讯" border="0"/&gt; &lt;/a&gt;</description>
      <category>dev</category>
      <guid isPermaLink="true">https://itindex.net/detail/60214-%E8%8A%B1%E6%A4%92-web-%E5%AE%9E%E6%97%B6</guid>
      <pubDate>Thu, 12 Dec 2019 00:00:00 CST</pubDate>
    </item>
    <item>
      <title>GitHub - cnlh/nps: 一款轻量级、功能强大的内网穿透代理服务器。支持tcp、udp流量转发，支持内网http代理、内网socks5代理，同时支持snappy压缩、站点保护、加密传输、多路复用、header修改等。支持web图形化管理，集成多用户模式。</title>
      <link>https://itindex.net/detail/59950-github-cnlh-nps</link>
      <description>&lt;h1&gt;    &lt;a href="https://github.com/cnlh/nps#nps"&gt;&lt;/a&gt;nps&lt;/h1&gt;  &lt;p&gt;    &lt;a href="https://camo.githubusercontent.com/493ef1d2ffb5e476f78a4ecd9509a69f25d560fa/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f73746172732f636e6c682f6e70732e737667" rel="noopener noreferrer" target="_blank"&gt;      &lt;img alt="" src="https://camo.githubusercontent.com/493ef1d2ffb5e476f78a4ecd9509a69f25d560fa/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f73746172732f636e6c682f6e70732e737667"&gt;&lt;/img&gt;&lt;/a&gt;    &lt;a href="https://camo.githubusercontent.com/fc252107a3a77f7ae0f2b0aad97974a82c105482/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f666f726b732f636e6c682f6e70732e737667" rel="noopener noreferrer" target="_blank"&gt;      &lt;img alt="" src="https://camo.githubusercontent.com/fc252107a3a77f7ae0f2b0aad97974a82c105482/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f666f726b732f636e6c682f6e70732e737667"&gt;&lt;/img&gt;&lt;/a&gt;    &lt;a href="https://gitter.im/cnlh-nps/community?utm_source=badge&amp;utm_medium=badge&amp;utm_campaign=pr-badge" rel="nofollow"&gt;      &lt;img alt="Gitter" src="https://camo.githubusercontent.com/73f94cc306a9065da926ed35a059f0a11b5ad870/68747470733a2f2f6261646765732e6769747465722e696d2f636e6c682d6e70732f636f6d6d756e6974792e737667"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;nps是一款轻量级、高性能、功能强大的    &lt;strong&gt;内网穿透&lt;/strong&gt;代理服务器。目前支持    &lt;strong&gt;tcp、udp流量转发&lt;/strong&gt;，可支持任何    &lt;strong&gt;tcp、udp&lt;/strong&gt;上层协议（访问内网网站、本地支付接口调试、ssh访问、远程桌面，内网dns解析等等……），此外还    &lt;strong&gt;支持内网http代理、内网socks5代理&lt;/strong&gt;、    &lt;strong&gt;p2p等&lt;/strong&gt;，并带有功能强大的web管理端。&lt;/p&gt;  &lt;h2&gt;    &lt;a href="https://github.com/cnlh/nps#&amp;#32972;&amp;#26223;"&gt;&lt;/a&gt;背景&lt;/h2&gt;  &lt;p&gt;    &lt;a href="https://github.com/cnlh/nps/blob/master/image/web.png?raw=true" rel="noopener noreferrer" target="_blank"&gt;      &lt;img alt="image" src="https://github.com/cnlh/nps/raw/master/image/web.png?raw=true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;  &lt;ol&gt;    &lt;li&gt;      &lt;p&gt;做微信公众号开发、小程序开发等----&amp;gt; 域名代理模式&lt;/p&gt;&lt;/li&gt;    &lt;li&gt;      &lt;p&gt;想在外网通过ssh连接内网的机器，做云服务器到内网服务器端口的映射，----&amp;gt; tcp代理模式&lt;/p&gt;&lt;/li&gt;    &lt;li&gt;      &lt;p&gt;在非内网环境下使用内网dns，或者需要通过udp访问内网机器等----&amp;gt; udp代理模式&lt;/p&gt;&lt;/li&gt;    &lt;li&gt;      &lt;p&gt;在外网使用HTTP代理访问内网站点----&amp;gt; http代理模式&lt;/p&gt;&lt;/li&gt;    &lt;li&gt;      &lt;p&gt;搭建一个内网穿透ss，在外网如同使用内网vpn一样访问内网资源或者设备----&amp;gt; socks5代理模式&lt;/p&gt;&lt;/li&gt;&lt;/ol&gt;  &lt;h2&gt;    &lt;a href="https://github.com/cnlh/nps#&amp;#30446;&amp;#24405;"&gt;&lt;/a&gt;目录&lt;/h2&gt;  &lt;ul&gt;    &lt;li&gt;      &lt;p&gt;        &lt;a href="https://github.com/cnlh/nps#%E5%AE%89%E8%A3%85"&gt;安装&lt;/a&gt;&lt;/p&gt;      &lt;ul&gt;        &lt;li&gt;          &lt;a href="https://github.com/cnlh/nps#%E6%BA%90%E7%A0%81%E5%AE%89%E8%A3%85"&gt;编译安装&lt;/a&gt;&lt;/li&gt;        &lt;li&gt;          &lt;a href="https://github.com/cnlh/nps#release%E5%AE%89%E8%A3%85"&gt;release安装&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;    &lt;li&gt;      &lt;p&gt;        &lt;a href="https://github.com/cnlh/nps#%E4%BD%BF%E7%94%A8%E7%A4%BA%E4%BE%8B"&gt;使用示例（以web主控模式为主）&lt;/a&gt;&lt;/p&gt;      &lt;ul&gt;        &lt;li&gt;          &lt;a href="https://github.com/cnlh/nps#%E7%BB%9F%E4%B8%80%E5%87%86%E5%A4%87%E5%B7%A5%E4%BD%9C(%E5%BF%85%E5%81%9A)"&gt;统一准备工作&lt;/a&gt;&lt;/li&gt;        &lt;li&gt;          &lt;a href="https://github.com/cnlh/nps#%E5%9F%9F%E5%90%8D%E8%A7%A3%E6%9E%90"&gt;http|https域名解析&lt;/a&gt;&lt;/li&gt;        &lt;li&gt;          &lt;a href="https://github.com/cnlh/nps#tcp%E9%9A%A7%E9%81%93"&gt;内网ssh连接即tcp隧道&lt;/a&gt;&lt;/li&gt;        &lt;li&gt;          &lt;a href="https://github.com/cnlh/nps#udp%E9%9A%A7%E9%81%93"&gt;内网dns解析即udp隧道&lt;/a&gt;&lt;/li&gt;        &lt;li&gt;          &lt;a href="https://github.com/cnlh/nps#socks5%E4%BB%A3%E7%90%86"&gt;内网socks5代理&lt;/a&gt;&lt;/li&gt;        &lt;li&gt;          &lt;a href="https://github.com/cnlh/nps#http%E6%AD%A3%E5%90%91%E4%BB%A3%E7%90%86"&gt;内网http正向代理&lt;/a&gt;&lt;/li&gt;        &lt;li&gt;          &lt;a href="https://github.com/cnlh/nps#%E7%A7%81%E5%AF%86%E4%BB%A3%E7%90%86"&gt;内网安全私密代理&lt;/a&gt;&lt;/li&gt;        &lt;li&gt;          &lt;a href="https://github.com/cnlh/nps#p2p%E6%9C%8D%E5%8A%A1"&gt;p2p穿透&lt;/a&gt;&lt;/li&gt;        &lt;li&gt;          &lt;a href="https://github.com/cnlh/nps#%E6%96%87%E4%BB%B6%E8%AE%BF%E9%97%AE%E6%A8%A1%E5%BC%8F"&gt;简单的内网文件访问服务&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;    &lt;li&gt;      &lt;p&gt;        &lt;a href="https://github.com/cnlh/nps#web%E7%AE%A1%E7%90%86"&gt;服务端&lt;/a&gt;&lt;/p&gt;      &lt;ul&gt;        &lt;li&gt;          &lt;a href="https://github.com/cnlh/nps#%E6%9C%8D%E5%8A%A1%E7%AB%AF%E5%90%AF%E5%8A%A8"&gt;服务端启动&lt;/a&gt;          &lt;ul&gt;            &lt;li&gt;              &lt;a href="https://github.com/cnlh/nps#%E6%9C%8D%E5%8A%A1%E7%AB%AF%E6%B5%8B%E8%AF%95"&gt;服务端测试&lt;/a&gt;&lt;/li&gt;            &lt;li&gt;              &lt;a href="https://github.com/cnlh/nps#%E6%9C%8D%E5%8A%A1%E7%AB%AF%E5%90%AF%E5%8A%A8"&gt;服务端启动&lt;/a&gt;&lt;/li&gt;            &lt;li&gt;              &lt;a href="https://github.com/cnlh/nps#web%E7%AE%A1%E7%90%86"&gt;web管理&lt;/a&gt;&lt;/li&gt;            &lt;li&gt;              &lt;a href="https://github.com/cnlh/nps#%E6%9C%8D%E5%8A%A1%E7%AB%AF%E9%85%8D%E7%BD%AE%E6%96%87%E4%BB%B6%E9%87%8D%E8%BD%BD"&gt;服务端配置文件重载&lt;/a&gt;&lt;/li&gt;            &lt;li&gt;              &lt;a href="https://github.com/cnlh/nps#%E6%9C%8D%E5%8A%A1%E7%AB%AF%E5%81%9C%E6%AD%A2%E6%88%96%E9%87%8D%E5%90%AF"&gt;服务端停止或重启&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;        &lt;li&gt;          &lt;a href="https://github.com/cnlh/nps#%E6%9C%8D%E5%8A%A1%E7%AB%AF%E9%85%8D%E7%BD%AE%E6%96%87%E4%BB%B6"&gt;配置文件说明&lt;/a&gt;&lt;/li&gt;        &lt;li&gt;          &lt;a href="https://github.com/cnlh/nps#%E4%BD%BF%E7%94%A8https"&gt;使用https&lt;/a&gt;&lt;/li&gt;        &lt;li&gt;          &lt;a href="https://github.com/cnlh/nps#%E4%B8%8Enginx%E9%85%8D%E5%90%88"&gt;与nginx配合&lt;/a&gt;&lt;/li&gt;        &lt;li&gt;          &lt;a href="https://github.com/cnlh/nps#%E5%85%B3%E9%97%AD%E4%BB%A3%E7%90%86"&gt;关闭http|https代理&lt;/a&gt;&lt;/li&gt;        &lt;li&gt;          &lt;a href="https://github.com/cnlh/nps#%E5%B0%86nps%E5%AE%89%E8%A3%85%E5%88%B0%E7%B3%BB%E7%BB%9F"&gt;将nps安装到系统&lt;/a&gt;&lt;/li&gt;        &lt;li&gt;          &lt;a href="https://github.com/cnlh/nps#%E6%B5%81%E9%87%8F%E6%95%B0%E6%8D%AE%E6%8C%81%E4%B9%85%E5%8C%96"&gt;流量数据持久化&lt;/a&gt;&lt;/li&gt;        &lt;li&gt;          &lt;a href="https://github.com/cnlh/nps#%E7%B3%BB%E7%BB%9F%E4%BF%A1%E6%81%AF%E6%98%BE%E7%A4%BA"&gt;系统信息显示&lt;/a&gt;&lt;/li&gt;        &lt;li&gt;          &lt;a href="https://github.com/cnlh/nps#%E8%87%AA%E5%AE%9A%E4%B9%89%E5%AE%A2%E6%88%B7%E7%AB%AF%E8%BF%9E%E6%8E%A5%E5%AF%86%E9%92%A5"&gt;自定义客户端连接密钥&lt;/a&gt;&lt;/li&gt;        &lt;li&gt;          &lt;a href="https://github.com/cnlh/nps#%E5%85%B3%E9%97%AD%E5%85%AC%E9%92%A5%E8%AE%BF%E9%97%AE"&gt;关闭公钥访问&lt;/a&gt;&lt;/li&gt;        &lt;li&gt;          &lt;a href="https://github.com/cnlh/nps#%E5%85%B3%E9%97%ADweb%E7%AE%A1%E7%90%86"&gt;关闭web管理&lt;/a&gt;&lt;/li&gt;        &lt;li&gt;          &lt;a href="https://github.com/cnlh/nps#%E6%9C%8D%E5%8A%A1%E7%AB%AF%E5%A4%9A%E7%94%A8%E6%88%B7%E7%99%BB%E9%99%86"&gt;服务端多用户登陆&lt;/a&gt;&lt;/li&gt;        &lt;li&gt;          &lt;a href="https://github.com/cnlh/nps#%E7%94%A8%E6%88%B7%E6%B3%A8%E5%86%8C%E5%8A%9F%E8%83%BD"&gt;用户注册功能&lt;/a&gt;&lt;/li&gt;        &lt;li&gt;          &lt;a href="https://github.com/cnlh/nps#%E7%9B%91%E5%90%AC%E6%8C%87%E5%AE%9Aip"&gt;监听指定ip&lt;/a&gt;&lt;/li&gt;        &lt;li&gt;          &lt;a href="https://github.com/cnlh/nps#%E4%BB%A3%E7%90%86%E5%88%B0%E6%9C%8D%E5%8A%A1%E7%AB%AF%E6%9C%AC%E5%9C%B0"&gt;代理到服务端本地&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;    &lt;li&gt;      &lt;p&gt;        &lt;a href="https://github.com/cnlh/nps#%E5%AE%A2%E6%88%B7%E7%AB%AF"&gt;客户端&lt;/a&gt;&lt;/p&gt;      &lt;ul&gt;        &lt;li&gt;          &lt;a href="https://github.com/cnlh/nps#%E5%AE%A2%E6%88%B7%E7%AB%AF%E5%90%AF%E5%8A%A8"&gt;客户端启动&lt;/a&gt;          &lt;ul&gt;            &lt;li&gt;              &lt;a href="https://github.com/cnlh/nps#%E6%97%A0%E9%85%8D%E7%BD%AE%E6%96%87%E4%BB%B6%E6%A8%A1%E5%BC%8F"&gt;无配置文件模式&lt;/a&gt;&lt;/li&gt;            &lt;li&gt;              &lt;a href="https://github.com/cnlh/nps#%E9%85%8D%E7%BD%AE%E6%96%87%E4%BB%B6%E6%A8%A1%E5%BC%8F"&gt;配置文件模式&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;        &lt;li&gt;          &lt;a href="https://github.com/cnlh/nps#%E9%85%8D%E7%BD%AE%E6%96%87%E4%BB%B6%E8%AF%B4%E6%98%8E"&gt;配置文件说明&lt;/a&gt;          &lt;ul&gt;            &lt;li&gt;              &lt;a href="https://github.com/cnlh/nps#%E5%85%A8%E5%B1%80%E9%85%8D%E7%BD%AE"&gt;全局配置&lt;/a&gt;&lt;/li&gt;            &lt;li&gt;              &lt;a href="https://github.com/cnlh/nps#%E5%9F%9F%E5%90%8D%E4%BB%A3%E7%90%86"&gt;域名代理&lt;/a&gt;&lt;/li&gt;            &lt;li&gt;              &lt;a href="https://github.com/cnlh/nps#tcp%E9%9A%A7%E9%81%93%E6%A8%A1%E5%BC%8F"&gt;tcp隧道&lt;/a&gt;&lt;/li&gt;            &lt;li&gt;              &lt;a href="https://github.com/cnlh/nps#udp%E9%9A%A7%E9%81%93%E6%A8%A1%E5%BC%8F"&gt;udp隧道&lt;/a&gt;&lt;/li&gt;            &lt;li&gt;              &lt;a href="https://github.com/cnlh/nps#http%E4%BB%A3%E7%90%86%E6%A8%A1%E5%BC%8F"&gt;http正向代理&lt;/a&gt;&lt;/li&gt;            &lt;li&gt;              &lt;a href="https://github.com/cnlh/nps#socks5%E4%BB%A3%E7%90%86%E6%A8%A1%E5%BC%8F"&gt;socks5代理&lt;/a&gt;&lt;/li&gt;            &lt;li&gt;              &lt;a href="https://github.com/cnlh/nps#%E7%A7%81%E5%AF%86%E4%BB%A3%E7%90%86%E6%A8%A1%E5%BC%8F"&gt;私密代理&lt;/a&gt;&lt;/li&gt;            &lt;li&gt;              &lt;a href="https://github.com/cnlh/nps#p2p%E4%BB%A3%E7%90%86"&gt;p2p服务&lt;/a&gt;&lt;/li&gt;            &lt;li&gt;              &lt;a href="https://github.com/cnlh/nps#%E6%96%87%E4%BB%B6%E8%AE%BF%E9%97%AE%E6%A8%A1%E5%BC%8F"&gt;文件访问代理&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;        &lt;li&gt;          &lt;a href="https://github.com/cnlh/nps#%E6%96%AD%E7%BA%BF%E9%87%8D%E8%BF%9E"&gt;断线重连&lt;/a&gt;&lt;/li&gt;        &lt;li&gt;          &lt;a href="https://github.com/cnlh/nps#nat%E7%B1%BB%E5%9E%8B%E6%A3%80%E6%B5%8B"&gt;nat类型检测&lt;/a&gt;&lt;/li&gt;        &lt;li&gt;          &lt;a href="https://github.com/cnlh/nps#%E7%8A%B6%E6%80%81%E6%A3%80%E6%9F%A5"&gt;状态检查&lt;/a&gt;&lt;/li&gt;        &lt;li&gt;          &lt;a href="https://github.com/cnlh/nps#%E9%87%8D%E8%BD%BD%E9%85%8D%E7%BD%AE%E6%96%87%E4%BB%B6"&gt;重载配置文件&lt;/a&gt;&lt;/li&gt;        &lt;li&gt;          &lt;a href="https://github.com/cnlh/nps#%E9%80%9A%E8%BF%87%E4%BB%A3%E7%90%86%E8%BF%9E%E6%8E%A5nps"&gt;通过代理连接nps&lt;/a&gt;&lt;/li&gt;        &lt;li&gt;          &lt;a href="https://github.com/cnlh/nps#%E7%BE%A4%E6%99%96%E6%94%AF%E6%8C%81"&gt;群晖支持&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;    &lt;li&gt;      &lt;p&gt;        &lt;a href="https://github.com/cnlh/nps#%E7%9B%B8%E5%85%B3%E5%8A%9F%E8%83%BD"&gt;相关功能&lt;/a&gt;&lt;/p&gt;      &lt;ul&gt;        &lt;li&gt;          &lt;a href="https://github.com/cnlh/nps#%E7%BC%93%E5%AD%98%E6%94%AF%E6%8C%81"&gt;缓存支持&lt;/a&gt;&lt;/li&gt;        &lt;li&gt;          &lt;a href="https://github.com/cnlh/nps#%E6%95%B0%E6%8D%AE%E5%8E%8B%E7%BC%A9%E6%94%AF%E6%8C%81"&gt;数据压缩支持&lt;/a&gt;&lt;/li&gt;        &lt;li&gt;          &lt;a href="https://github.com/cnlh/nps#%E7%AB%99%E7%82%B9%E4%BF%9D%E6%8A%A4"&gt;站点密码保护&lt;/a&gt;&lt;/li&gt;        &lt;li&gt;          &lt;a href="https://github.com/cnlh/nps#%E5%8A%A0%E5%AF%86%E4%BC%A0%E8%BE%93"&gt;加密传输&lt;/a&gt;&lt;/li&gt;        &lt;li&gt;          &lt;a href="https://github.com/cnlh/nps#host%E4%BF%AE%E6%94%B9"&gt;host修改&lt;/a&gt;&lt;/li&gt;        &lt;li&gt;          &lt;a href="https://github.com/cnlh/nps#%E8%87%AA%E5%AE%9A%E4%B9%89header"&gt;自定义header&lt;/a&gt;&lt;/li&gt;        &lt;li&gt;          &lt;a href="https://github.com/cnlh/nps#404%E9%A1%B5%E9%9D%A2%E9%85%8D%E7%BD%AE"&gt;自定义404页面&lt;/a&gt;&lt;/li&gt;        &lt;li&gt;          &lt;a href="https://github.com/cnlh/nps#%E6%B5%81%E9%87%8F%E9%99%90%E5%88%B6"&gt;流量限制&lt;/a&gt;&lt;/li&gt;        &lt;li&gt;          &lt;a href="https://github.com/cnlh/nps#%E5%B8%A6%E5%AE%BD%E9%99%90%E5%88%B6"&gt;带宽限制&lt;/a&gt;&lt;/li&gt;        &lt;li&gt;          &lt;a href="https://github.com/cnlh/nps#%E8%B4%9F%E8%BD%BD%E5%9D%87%E8%A1%A1"&gt;负载均衡&lt;/a&gt;&lt;/li&gt;        &lt;li&gt;          &lt;a href="https://github.com/cnlh/nps#%E7%AB%AF%E5%8F%A3%E7%99%BD%E5%90%8D%E5%8D%95"&gt;端口白名单&lt;/a&gt;&lt;/li&gt;        &lt;li&gt;          &lt;a href="https://github.com/cnlh/nps#%E7%AB%AF%E5%8F%A3%E8%8C%83%E5%9B%B4%E6%98%A0%E5%B0%84"&gt;端口范围映射&lt;/a&gt;&lt;/li&gt;        &lt;li&gt;          &lt;a href="https://github.com/cnlh/nps#%E7%AB%AF%E5%8F%A3%E8%8C%83%E5%9B%B4%E6%98%A0%E5%B0%84%E5%88%B0%E5%85%B6%E4%BB%96%E6%9C%BA%E5%99%A8"&gt;端口范围映射到其他机器&lt;/a&gt;&lt;/li&gt;        &lt;li&gt;          &lt;a href="https://github.com/cnlh/nps#%E5%AE%88%E6%8A%A4%E8%BF%9B%E7%A8%8B"&gt;守护进程&lt;/a&gt;&lt;/li&gt;        &lt;li&gt;          &lt;a href="https://github.com/cnlh/nps#KCP%E5%8D%8F%E8%AE%AE%E6%94%AF%E6%8C%81"&gt;KCP协议支持&lt;/a&gt;&lt;/li&gt;        &lt;li&gt;          &lt;a href="https://github.com/cnlh/nps#%E5%9F%9F%E5%90%8D%E6%B3%9B%E8%A7%A3%E6%9E%90"&gt;域名泛解析&lt;/a&gt;&lt;/li&gt;        &lt;li&gt;          &lt;a href="https://github.com/cnlh/nps#URL%E8%B7%AF%E7%94%B1"&gt;URL路由&lt;/a&gt;&lt;/li&gt;        &lt;li&gt;          &lt;a href="https://github.com/cnlh/nps#%E9%99%90%E5%88%B6ip%E8%AE%BF%E9%97%AE"&gt;限制ip访问&lt;/a&gt;&lt;/li&gt;        &lt;li&gt;          &lt;a href="https://github.com/cnlh/nps#%E5%AE%A2%E6%88%B7%E7%AB%AF%E6%9C%80%E5%A4%A7%E8%BF%9E%E6%8E%A5%E6%95%B0"&gt;客户端最大连接数限制&lt;/a&gt;&lt;/li&gt;        &lt;li&gt;          &lt;a href="https://github.com/cnlh/nps#%E5%AE%A2%E6%88%B7%E7%AB%AF%E6%9C%80%E5%A4%A7%E9%9A%A7%E9%81%93%E6%95%B0%E9%99%90%E5%88%B6"&gt;客户端最大隧道数限制&lt;/a&gt;&lt;/li&gt;        &lt;li&gt;          &lt;a href="https://github.com/cnlh/nps#%E7%AB%AF%E5%8F%A3%E5%A4%8D%E7%94%A8"&gt;端口复用&lt;/a&gt;&lt;/li&gt;        &lt;li&gt;          &lt;a href="https://github.com/cnlh/nps#%E5%A4%9A%E8%B7%AF%E5%A4%8D%E7%94%A8"&gt;多路复用&lt;/a&gt;&lt;/li&gt;        &lt;li&gt;          &lt;a href="https://github.com/cnlh/nps#%E7%8E%AF%E5%A2%83%E5%8F%98%E9%87%8F%E6%B8%B2%E6%9F%93"&gt;环境变量渲染&lt;/a&gt;&lt;/li&gt;        &lt;li&gt;          &lt;a href="https://github.com/cnlh/nps#%E5%81%A5%E5%BA%B7%E6%A3%80%E6%9F%A5"&gt;健康检查&lt;/a&gt;&lt;/li&gt;        &lt;li&gt;          &lt;a href="https://github.com/cnlh/nps#%E6%97%A5%E5%BF%97%E8%BE%93%E5%87%BA"&gt;日志输出&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;    &lt;li&gt;      &lt;p&gt;        &lt;a href="https://github.com/cnlh/nps#%E7%9B%B8%E5%85%B3%E8%AF%B4%E6%98%8E"&gt;相关说明&lt;/a&gt;&lt;/p&gt;      &lt;ul&gt;        &lt;li&gt;          &lt;a href="https://github.com/cnlh/nps#%E6%B5%81%E9%87%8F%E7%BB%9F%E8%AE%A1"&gt;流量统计&lt;/a&gt;&lt;/li&gt;        &lt;li&gt;          &lt;a href="https://github.com/cnlh/nps#%E5%BD%93%E5%89%8D%E5%AE%A2%E6%88%B7%E7%AB%AF%E5%B8%A6%E5%AE%BD"&gt;当前客户端带宽&lt;/a&gt;&lt;/li&gt;        &lt;li&gt;          &lt;a href="https://github.com/cnlh/nps#%E7%83%AD%E6%9B%B4%E6%96%B0%E6%94%AF%E6%8C%81"&gt;热更新支持&lt;/a&gt;&lt;/li&gt;        &lt;li&gt;          &lt;a href="https://github.com/cnlh/nps#%E8%8E%B7%E5%8F%96%E7%94%A8%E6%88%B7%E7%9C%9F%E5%AE%9Eip"&gt;获取用户真实ip&lt;/a&gt;&lt;/li&gt;        &lt;li&gt;          &lt;a href="https://github.com/cnlh/nps#%E5%AE%A2%E6%88%B7%E7%AB%AF%E5%9C%B0%E5%9D%80%E6%98%BE%E7%A4%BA"&gt;客户端地址显示&lt;/a&gt;&lt;/li&gt;        &lt;li&gt;          &lt;a href="https://github.com/cnlh/nps#%E5%AE%A2%E6%88%B7%E7%AB%AF%E4%B8%8E%E6%9C%8D%E5%8A%A1%E7%AB%AF%E7%89%88%E6%9C%AC%E5%AF%B9%E6%AF%94"&gt;客户端与服务端版本对比&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;    &lt;li&gt;      &lt;p&gt;        &lt;a href="https://github.com/cnlh/nps#webAPI"&gt;webAPI&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;    &lt;li&gt;      &lt;p&gt;        &lt;a href="https://github.com/cnlh/nps#%E8%B4%A1%E7%8C%AE"&gt;贡献&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;    &lt;li&gt;      &lt;p&gt;        &lt;a href="https://github.com/cnlh/nps#%E6%8D%90%E8%B5%A0"&gt;支持nps发展&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;    &lt;li&gt;      &lt;p&gt;        &lt;a href="https://github.com/cnlh/nps#%E4%BA%A4%E6%B5%81%E7%BE%A4"&gt;交流群&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;  &lt;h2&gt;    &lt;a href="https://github.com/cnlh/nps#&amp;#23433;&amp;#35013;"&gt;&lt;/a&gt;安装&lt;/h2&gt;  &lt;h3&gt;    &lt;a href="https://github.com/cnlh/nps#releases&amp;#23433;&amp;#35013;"&gt;&lt;/a&gt;releases安装&lt;/h3&gt;  &lt;blockquote&gt;    &lt;p&gt;      &lt;a href="https://github.com/cnlh/nps/releases"&gt;releases&lt;/a&gt;&lt;/p&gt;&lt;/blockquote&gt;  &lt;p&gt;下载对应的系统版本即可，服务端和客户端是单独的&lt;/p&gt;  &lt;h3&gt;    &lt;a href="https://github.com/cnlh/nps#&amp;#28304;&amp;#30721;&amp;#23433;&amp;#35013;"&gt;&lt;/a&gt;源码安装&lt;/h3&gt;  &lt;ul&gt;    &lt;li&gt;安装源码&lt;/li&gt;&lt;/ul&gt;  &lt;blockquote&gt;    &lt;p&gt;go get -u github.com/cnlh/nps...&lt;/p&gt;&lt;/blockquote&gt;  &lt;ul&gt;    &lt;li&gt;编译&lt;/li&gt;&lt;/ul&gt;  &lt;blockquote&gt;    &lt;p&gt;go build cmd/nps/nps.go&lt;/p&gt;&lt;/blockquote&gt;  &lt;blockquote&gt;    &lt;p&gt;go build cmd/npc/npc.go&lt;/p&gt;&lt;/blockquote&gt;  &lt;h2&gt;    &lt;a href="https://github.com/cnlh/nps#&amp;#20351;&amp;#29992;&amp;#31034;&amp;#20363;"&gt;&lt;/a&gt;使用示例&lt;/h2&gt;  &lt;h3&gt;    &lt;a href="https://github.com/cnlh/nps#&amp;#32479;&amp;#19968;&amp;#20934;&amp;#22791;&amp;#24037;&amp;#20316;&amp;#24517;&amp;#20570;"&gt;&lt;/a&gt;统一准备工作（必做）&lt;/h3&gt;  &lt;ul&gt;    &lt;li&gt;开启服务端，假设公网服务器ip为1.1.1.1，配置文件中      &lt;code&gt;bridge_port&lt;/code&gt;为8284，配置文件中      &lt;code&gt;web_port&lt;/code&gt;为8080&lt;/li&gt;    &lt;li&gt;访问1.1.1.1:8080&lt;/li&gt;    &lt;li&gt;在客户端管理中创建一个客户端，记录下验证密钥&lt;/li&gt;    &lt;li&gt;内网客户端运行（windows使用cmd运行加.exe）&lt;/li&gt;&lt;/ul&gt;  &lt;div&gt;    &lt;pre&gt;./npc -server=1.1.1.1:8284 -vkey=客户端的密钥&lt;/pre&gt;&lt;/div&gt;  &lt;h3&gt;    &lt;a href="https://github.com/cnlh/nps#&amp;#22495;&amp;#21517;&amp;#35299;&amp;#26512;"&gt;&lt;/a&gt;域名解析&lt;/h3&gt;  &lt;p&gt;    &lt;strong&gt;适用范围：&lt;/strong&gt;小程序开发、微信公众号开发、产品演示&lt;/p&gt;  &lt;p&gt;    &lt;strong&gt;假设场景：&lt;/strong&gt;&lt;/p&gt;  &lt;ul&gt;    &lt;li&gt;有一个域名proxy.com，有一台公网机器ip为1.1.1.1&lt;/li&gt;    &lt;li&gt;两个内网开发站点127.0.0.1:81，127.0.0.1:82&lt;/li&gt;    &lt;li&gt;想通过（http|https://）a.proxy.com访问127.0.0.1:81，通过（http|https://）b.proxy.com访问127.0.0.1:82&lt;/li&gt;&lt;/ul&gt;  &lt;p&gt;    &lt;strong&gt;使用步骤&lt;/strong&gt;&lt;/p&gt;  &lt;ul&gt;    &lt;li&gt;将*.proxy.com解析到公网服务器1.1.1.1&lt;/li&gt;    &lt;li&gt;点击刚才创建的客户端的域名管理，添加两条规则规则：1、域名：      &lt;code&gt;a.proxy.com&lt;/code&gt;，内网目标：      &lt;code&gt;127.0.0.1:81&lt;/code&gt;，2、域名：      &lt;code&gt;b.proxy.com&lt;/code&gt;，内网目标：      &lt;code&gt;127.0.0.1:82&lt;/code&gt;&lt;/li&gt;&lt;/ul&gt;  &lt;p&gt;现在访问（http|https://）    &lt;code&gt;a.proxy.com&lt;/code&gt;，    &lt;code&gt;b.proxy.com&lt;/code&gt;即可成功&lt;/p&gt;  &lt;p&gt;    &lt;strong&gt;https:&lt;/strong&gt;如需使用https请进行相关配置，详见    &lt;a href="https://github.com/cnlh/nps#%E4%BD%BF%E7%94%A8https"&gt;使用https&lt;/a&gt;&lt;/p&gt;  &lt;h3&gt;    &lt;a href="https://github.com/cnlh/nps#tcp&amp;#38567;&amp;#36947;"&gt;&lt;/a&gt;tcp隧道&lt;/h3&gt;  &lt;p&gt;    &lt;strong&gt;适用范围：&lt;/strong&gt;ssh、远程桌面等tcp连接场景&lt;/p&gt;  &lt;p&gt;    &lt;strong&gt;假设场景：&lt;/strong&gt;想通过访问公网服务器1.1.1.1的8001端口，连接内网机器10.1.50.101的22端口，实现ssh连接&lt;/p&gt;  &lt;p&gt;    &lt;strong&gt;使用步骤&lt;/strong&gt;&lt;/p&gt;  &lt;ul&gt;    &lt;li&gt;在刚才创建的客户端隧道管理中添加一条tcp隧道，填写监听的端口（8001）、内网目标ip和目标端口（10.1.50.101:22），保存。&lt;/li&gt;    &lt;li&gt;访问公网服务器ip（1.1.1.1）,填写的监听端口(8001)，相当于访问内网ip(10.1.50.101):目标端口(22)，例如：      &lt;code&gt;ssh -p 8001 root@1.1.1.1&lt;/code&gt;&lt;/li&gt;&lt;/ul&gt;  &lt;h3&gt;    &lt;a href="https://github.com/cnlh/nps#udp&amp;#38567;&amp;#36947;"&gt;&lt;/a&gt;udp隧道&lt;/h3&gt;  &lt;p&gt;    &lt;strong&gt;适用范围：&lt;/strong&gt;内网dns解析等udp连接场景&lt;/p&gt;  &lt;p&gt;    &lt;strong&gt;假设场景：&lt;/strong&gt;内网有一台dns（10.1.50.102:53），在非内网环境下想使用该dns，公网服务器为1.1.1.1&lt;/p&gt;  &lt;p&gt;    &lt;strong&gt;使用步骤&lt;/strong&gt;&lt;/p&gt;  &lt;ul&gt;    &lt;li&gt;在刚才创建的客户端的隧道管理中添加一条udp隧道，填写监听的端口（53）、内网目标ip和目标端口（10.1.50.102:53），保存。&lt;/li&gt;    &lt;li&gt;修改需要使用的内网dns为127.0.0.1，则相当于使用10.1.50.202作为dns服务器&lt;/li&gt;&lt;/ul&gt;  &lt;h3&gt;    &lt;a href="https://github.com/cnlh/nps#socks5&amp;#20195;&amp;#29702;"&gt;&lt;/a&gt;socks5代理&lt;/h3&gt;  &lt;p&gt;    &lt;strong&gt;适用范围：&lt;/strong&gt;在外网环境下如同使用vpn一样访问内网设备或者资源&lt;/p&gt;  &lt;p&gt;    &lt;strong&gt;假设场景：&lt;/strong&gt;想将公网服务器1.1.1.1的8003端口作为socks5代理，达到访问内网任意设备或者资源的效果&lt;/p&gt;  &lt;p&gt;    &lt;strong&gt;使用步骤&lt;/strong&gt;&lt;/p&gt;  &lt;ul&gt;    &lt;li&gt;在刚才创建的客户端隧道管理中添加一条socks5代理，填写监听的端口（8003），保存。&lt;/li&gt;    &lt;li&gt;在外网环境的本机配置socks5代理(例如使用proxifier进行全局代理)，ip为公网服务器ip（1.1.1.1），端口为填写的监听端口(8003)，即可畅享内网了&lt;/li&gt;&lt;/ul&gt;  &lt;h3&gt;    &lt;a href="https://github.com/cnlh/nps#http&amp;#27491;&amp;#21521;&amp;#20195;&amp;#29702;"&gt;&lt;/a&gt;http正向代理&lt;/h3&gt;  &lt;p&gt;    &lt;strong&gt;适用范围：&lt;/strong&gt;在外网环境下使用http正向代理访问内网站点&lt;/p&gt;  &lt;p&gt;    &lt;strong&gt;假设场景：&lt;/strong&gt;想将公网服务器1.1.1.1的8004端口作为http代理，访问内网网站&lt;/p&gt;  &lt;p&gt;    &lt;strong&gt;使用步骤&lt;/strong&gt;&lt;/p&gt;  &lt;ul&gt;    &lt;li&gt;在刚才创建的客户端隧道管理中添加一条http代理，填写监听的端口（8004），保存。&lt;/li&gt;    &lt;li&gt;在外网环境的本机配置http代理，ip为公网服务器ip（1.1.1.1），端口为填写的监听端口(8004)，即可访问了&lt;/li&gt;&lt;/ul&gt;  &lt;h3&gt;    &lt;a href="https://github.com/cnlh/nps#&amp;#31169;&amp;#23494;&amp;#20195;&amp;#29702;"&gt;&lt;/a&gt;私密代理&lt;/h3&gt;  &lt;p&gt;    &lt;strong&gt;适用范围：&lt;/strong&gt;无需占用多余的端口、安全性要求较高可以防止其他人连接的tcp服务，例如ssh。&lt;/p&gt;  &lt;p&gt;    &lt;strong&gt;假设场景：&lt;/strong&gt;无需新增多的端口实现访问内网服务器10.1.50.2的22端口&lt;/p&gt;  &lt;p&gt;    &lt;strong&gt;使用步骤&lt;/strong&gt;&lt;/p&gt;  &lt;ul&gt;    &lt;li&gt;在刚才创建的客户端中添加一条私密代理，并设置唯一密钥secrettest和内网目标10.1.50.2:22&lt;/li&gt;    &lt;li&gt;在需要连接ssh的机器上以执行命令&lt;/li&gt;&lt;/ul&gt;  &lt;pre&gt;    &lt;code&gt;./npc -server=1.1.1.1:8284 -vkey=vkey -type=tcp -password=secrettest -local_type=secret&lt;/code&gt;&lt;/pre&gt;  &lt;p&gt;如需指定本地端口可加参数    &lt;code&gt;-local_port=xx&lt;/code&gt;，默认为2000&lt;/p&gt;  &lt;p&gt;    &lt;strong&gt;注意：&lt;/strong&gt;password为web管理上添加的唯一密钥，具体命令可查看web管理上的命令提示&lt;/p&gt;  &lt;p&gt;假设10.1.50.2用户名为root，现在执行    &lt;code&gt;ssh -p 2000 root@1.1.1.1&lt;/code&gt;即可访问ssh&lt;/p&gt;  &lt;h3&gt;    &lt;a href="https://github.com/cnlh/nps#p2p&amp;#26381;&amp;#21153;"&gt;&lt;/a&gt;p2p服务&lt;/h3&gt;  &lt;p&gt;    &lt;strong&gt;适用范围：&lt;/strong&gt;大流量传输场景，流量不经过公网服务器，但是由于p2p穿透和nat类型关系较大，不保证100%成功，支持大部分nat类型。    &lt;a href="https://github.com/cnlh/nps#nat%E7%B1%BB%E5%9E%8B%E6%A3%80%E6%B5%8B"&gt;nat类型检测&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;    &lt;strong&gt;假设场景：&lt;/strong&gt;内网1机器ip为10.1.50.2    内网2机器2 ip为10.2.50.2&lt;/p&gt;  &lt;p&gt;想通过访问内网1机器1的2000端口----&amp;gt;访问到内网2机器3 10.2.50.3的22端口&lt;/p&gt;  &lt;p&gt;    &lt;strong&gt;使用步骤&lt;/strong&gt;&lt;/p&gt;  &lt;ul&gt;    &lt;li&gt;在      &lt;code&gt;nps.conf&lt;/code&gt;中设置      &lt;code&gt;p2p_ip&lt;/code&gt;（nps服务器ip）和      &lt;code&gt;p2p_port&lt;/code&gt;（nps服务器udp端口）&lt;/li&gt;    &lt;li&gt;在刚才刚才创建的客户端中添加一条p2p代理，并设置唯一密钥p2pssh&lt;/li&gt;    &lt;li&gt;在机器1执行命令&lt;/li&gt;&lt;/ul&gt;  &lt;pre&gt;    &lt;code&gt;./npc -server=1.1.1.1:8284 -vkey=123 -password=p2pssh -target=10.2.50.3:22&lt;/code&gt;&lt;/pre&gt;  &lt;p&gt;如需指定本地端口可加参数    &lt;code&gt;-local_port=xx&lt;/code&gt;，默认为2000&lt;/p&gt;  &lt;p&gt;    &lt;strong&gt;注意：&lt;/strong&gt;password为web管理上添加的唯一密钥，具体命令可查看web管理上的命令提示&lt;/p&gt;  &lt;p&gt;假设机器3用户名为root，现在在机器1上执行    &lt;code&gt;ssh -p 2000 root@127.0.0.1&lt;/code&gt;即可访问机器2的ssh&lt;/p&gt;  &lt;h2&gt;    &lt;a href="https://github.com/cnlh/nps#web&amp;#31649;&amp;#29702;"&gt;&lt;/a&gt;web管理&lt;/h2&gt;  &lt;p&gt;    &lt;a href="https://github.com/cnlh/nps/blob/master/image/web2.png?raw=true" rel="noopener noreferrer" target="_blank"&gt;      &lt;img alt="image" src="https://github.com/cnlh/nps/raw/master/image/web2.png?raw=true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;  &lt;h3&gt;    &lt;a href="https://github.com/cnlh/nps#&amp;#20171;&amp;#32461;"&gt;&lt;/a&gt;介绍&lt;/h3&gt;  &lt;p&gt;可在网页上配置和管理各个tcp、udp隧道、内网站点代理，http、https解析等，功能强大，操作方便。&lt;/p&gt;  &lt;p&gt;    &lt;strong&gt;提示：使用web模式时，服务端执行文件必须在项目根目录，否则无法正确加载配置文件&lt;/strong&gt;&lt;/p&gt;  &lt;h3&gt;    &lt;a href="https://github.com/cnlh/nps#&amp;#21551;&amp;#21160;"&gt;&lt;/a&gt;启动&lt;/h3&gt;  &lt;h4&gt;    &lt;a href="https://github.com/cnlh/nps#&amp;#26381;&amp;#21153;&amp;#31471;&amp;#27979;&amp;#35797;"&gt;&lt;/a&gt;服务端测试&lt;/h4&gt;  &lt;div&gt;    &lt;pre&gt;./npstest&lt;/pre&gt;&lt;/div&gt;  &lt;p&gt;如有错误请及时修改配置文件，无错误可继续进行下去&lt;/p&gt;  &lt;h4&gt;    &lt;a href="https://github.com/cnlh/nps#&amp;#26381;&amp;#21153;&amp;#31471;&amp;#21551;&amp;#21160;"&gt;&lt;/a&gt;服务端启动&lt;/h4&gt;  &lt;div&gt;    &lt;pre&gt;./nps start&lt;/pre&gt;&lt;/div&gt;  &lt;p&gt;    &lt;strong&gt;如果无需daemon运行或者打开后无法正常访问web管理，去掉start查看日志运行即可&lt;/strong&gt;&lt;/p&gt;  &lt;h4&gt;    &lt;a href="https://github.com/cnlh/nps#web&amp;#31649;&amp;#29702;-1"&gt;&lt;/a&gt;web管理&lt;/h4&gt;  &lt;p&gt;进入web界面，公网ip:web界面端口（默认8080），密码默认为123&lt;/p&gt;  &lt;p&gt;进入web管理界面，有详细的说明&lt;/p&gt;  &lt;h4&gt;    &lt;a href="https://github.com/cnlh/nps#&amp;#26381;&amp;#21153;&amp;#31471;&amp;#37197;&amp;#32622;&amp;#25991;&amp;#20214;&amp;#37325;&amp;#36733;"&gt;&lt;/a&gt;服务端配置文件重载&lt;/h4&gt;  &lt;p&gt;如果是daemon启动&lt;/p&gt;  &lt;div&gt;    &lt;pre&gt;./nps reload&lt;/pre&gt;&lt;/div&gt;  &lt;p&gt;    &lt;strong&gt;说明：&lt;/strong&gt;仅支持部分配置重载，例如    &lt;code&gt;allow_user_login&lt;/code&gt;    &lt;code&gt;auth_crypt_key&lt;/code&gt;    &lt;code&gt;auth_key&lt;/code&gt;    &lt;code&gt;web_username&lt;/code&gt;    &lt;code&gt;web_password&lt;/code&gt;等，未来将支持更多&lt;/p&gt;  &lt;h4&gt;    &lt;a href="https://github.com/cnlh/nps#&amp;#26381;&amp;#21153;&amp;#31471;&amp;#20572;&amp;#27490;&amp;#25110;&amp;#37325;&amp;#21551;"&gt;&lt;/a&gt;服务端停止或重启&lt;/h4&gt;  &lt;p&gt;如果是daemon启动&lt;/p&gt;  &lt;div&gt;    &lt;pre&gt;./nps stop|restart&lt;/pre&gt;&lt;/div&gt;  &lt;h3&gt;    &lt;a href="https://github.com/cnlh/nps#&amp;#26381;&amp;#21153;&amp;#31471;&amp;#37197;&amp;#32622;&amp;#25991;&amp;#20214;"&gt;&lt;/a&gt;服务端配置文件&lt;/h3&gt;  &lt;ul&gt;    &lt;li&gt;/conf/nps.conf&lt;/li&gt;&lt;/ul&gt;  &lt;table&gt;    &lt;tr&gt;      &lt;th&gt;名称&lt;/th&gt;      &lt;th&gt;含义&lt;/th&gt;&lt;/tr&gt;    &lt;tr&gt;      &lt;td&gt;web_port&lt;/td&gt;      &lt;td&gt;web管理端口&lt;/td&gt;&lt;/tr&gt;    &lt;tr&gt;      &lt;td&gt;web_password&lt;/td&gt;      &lt;td&gt;web界面管理密码&lt;/td&gt;&lt;/tr&gt;    &lt;tr&gt;      &lt;td&gt;web_username&lt;/td&gt;      &lt;td&gt;web界面管理账号&lt;/td&gt;&lt;/tr&gt;    &lt;tr&gt;      &lt;td&gt;bridge_port&lt;/td&gt;      &lt;td&gt;服务端客户端通信端口&lt;/td&gt;&lt;/tr&gt;    &lt;tr&gt;      &lt;td&gt;https_proxy_port&lt;/td&gt;      &lt;td&gt;域名代理https代理监听端口&lt;/td&gt;&lt;/tr&gt;    &lt;tr&gt;      &lt;td&gt;http_proxy_port&lt;/td&gt;      &lt;td&gt;域名代理http代理监听端口&lt;/td&gt;&lt;/tr&gt;    &lt;tr&gt;      &lt;td&gt;auth_key&lt;/td&gt;      &lt;td&gt;web api密钥&lt;/td&gt;&lt;/tr&gt;    &lt;tr&gt;      &lt;td&gt;bridge_type&lt;/td&gt;      &lt;td&gt;客户端与服务端连接方式kcp或tcp&lt;/td&gt;&lt;/tr&gt;    &lt;tr&gt;      &lt;td&gt;public_vkey&lt;/td&gt;      &lt;td&gt;客户端以配置文件模式启动时的密钥，设置为空表示关闭客户端配置文件连接模式&lt;/td&gt;&lt;/tr&gt;    &lt;tr&gt;      &lt;td&gt;ip_limit&lt;/td&gt;      &lt;td&gt;是否限制ip访问，true或false或忽略&lt;/td&gt;&lt;/tr&gt;    &lt;tr&gt;      &lt;td&gt;flow_store_interval&lt;/td&gt;      &lt;td&gt;服务端流量数据持久化间隔，单位分钟，忽略表示不持久化&lt;/td&gt;&lt;/tr&gt;    &lt;tr&gt;      &lt;td&gt;log_level&lt;/td&gt;      &lt;td&gt;日志输出级别&lt;/td&gt;&lt;/tr&gt;    &lt;tr&gt;      &lt;td&gt;auth_crypt_key&lt;/td&gt;      &lt;td&gt;获取服务端authKey时的aes加密密钥，16位&lt;/td&gt;&lt;/tr&gt;    &lt;tr&gt;      &lt;td&gt;p2p_ip&lt;/td&gt;      &lt;td&gt;服务端Ip，使用p2p模式必填&lt;/td&gt;&lt;/tr&gt;    &lt;tr&gt;      &lt;td&gt;p2p_port&lt;/td&gt;      &lt;td&gt;p2p模式开启的udp端口&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;  &lt;h3&gt;    &lt;a href="https://github.com/cnlh/nps#&amp;#20351;&amp;#29992;https"&gt;&lt;/a&gt;使用https&lt;/h3&gt;  &lt;p&gt;    &lt;strong&gt;方式一：&lt;/strong&gt;类似于nginx实现https的处理&lt;/p&gt;  &lt;p&gt;在配置文件中将https_proxy_port设置为443或者其他你想配置的端口，和在web中对应域名编辑中设置对应的证书路径，将    &lt;code&gt;https_just_proxy&lt;/code&gt;设置为false，然后就和http代理一样了&lt;/p&gt;  &lt;p&gt;    &lt;strong&gt;此外：&lt;/strong&gt;可以在    &lt;code&gt;nps.conf&lt;/code&gt;中设置一个默认的https配置，当遇到未在web中设置https证书的域名解析时，将自动使用默认证书，另还有一种情况就是对于某些请求的clienthello不携带sni扩展信息，nps也将自动使用默认证书&lt;/p&gt;  &lt;p&gt;    &lt;strong&gt;方式二：&lt;/strong&gt;在内网对应服务器上设置https&lt;/p&gt;  &lt;p&gt;在    &lt;code&gt;nps.conf&lt;/code&gt;中将    &lt;code&gt;https_just_proxy&lt;/code&gt;设置为true，并且打开    &lt;code&gt;https_proxy_port&lt;/code&gt;端口，然后nps将直接转发https请求到内网服务器上，由内网服务器进行https处理&lt;/p&gt;  &lt;h3&gt;    &lt;a href="https://github.com/cnlh/nps#&amp;#19982;nginx&amp;#37197;&amp;#21512;"&gt;&lt;/a&gt;与nginx配合&lt;/h3&gt;  &lt;p&gt;有时候我们还需要在云服务器上运行nginx来保证静态文件缓存等，本代理可和nginx配合使用，在配置文件中将httpProxyPort设置为非80端口，并在nginx中配置代理，例如httpProxyPort为8024时&lt;/p&gt;  &lt;pre&gt;    &lt;code&gt;server {
    listen 80;
    server_name *.proxy.com;
    location / {
        proxy_set_header Host  $http_host;
        proxy_pass http://127.0.0.1:8024;
    }
}&lt;/code&gt;&lt;/pre&gt;  &lt;p&gt;如需使用https也可在nginx监听443端口并配置ssl，并将本代理的httpsProxyPort设置为空关闭https即可，例如httpProxyPort为8024时&lt;/p&gt;  &lt;pre&gt;    &lt;code&gt;server {
    listen 443;
    server_name *.proxy.com;
    ssl on;
    ssl_certificate  certificate.crt;
    ssl_certificate_key private.key;
    ssl_session_timeout 5m;
    ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
    ssl_prefer_server_ciphers on;
    location / {
        proxy_set_header Host  $http_host;
        proxy_pass http://127.0.0.1:8024;
    }
}&lt;/code&gt;&lt;/pre&gt;  &lt;h3&gt;    &lt;a href="https://github.com/cnlh/nps#&amp;#20851;&amp;#38381;&amp;#20195;&amp;#29702;"&gt;&lt;/a&gt;关闭代理&lt;/h3&gt;  &lt;p&gt;如需关闭http代理可在配置文件中将http_proxy_port设置为空，如需关闭https代理可在配置文件中将https_proxy_port设置为空。&lt;/p&gt;  &lt;h3&gt;    &lt;a href="https://github.com/cnlh/nps#&amp;#23558;nps&amp;#23433;&amp;#35013;&amp;#21040;&amp;#31995;&amp;#32479;"&gt;&lt;/a&gt;将nps安装到系统&lt;/h3&gt;  &lt;p&gt;如果需要长期并且方便的运行nps服务端，可将nps安装到操作系统中，可执行命令&lt;/p&gt;  &lt;pre&gt;    &lt;code&gt;(./nps|nps.exe) install&lt;/code&gt;&lt;/pre&gt;  &lt;p&gt;安装成功后，对于linux，darwin，将会把配置文件和静态文件放置于/etc/nps/，并将可执行文件nps复制到/usr/bin/nps或者/usr/local/bin/nps，安装成功后可在任何位置执行&lt;/p&gt;  &lt;pre&gt;    &lt;code&gt;nps test|start|stop|restart|status&lt;/code&gt;&lt;/pre&gt;  &lt;p&gt;对于windows系统，将会把配置文件和静态文件放置于C:\Program Files\nps，安装成功后可将可执行文件nps.exe复制到任何位置执行&lt;/p&gt;  &lt;pre&gt;    &lt;code&gt;nps.exe test|start|stop|restart|status&lt;/code&gt;&lt;/pre&gt;  &lt;h3&gt;    &lt;a href="https://github.com/cnlh/nps#&amp;#27969;&amp;#37327;&amp;#25968;&amp;#25454;&amp;#25345;&amp;#20037;&amp;#21270;"&gt;&lt;/a&gt;流量数据持久化&lt;/h3&gt;  &lt;p&gt;服务端支持将流量数据持久化，默认情况下是关闭的，如果有需求可以设置    &lt;code&gt;nps.conf&lt;/code&gt;中的    &lt;code&gt;flow_store_interval&lt;/code&gt;参数，单位为分钟&lt;/p&gt;  &lt;p&gt;    &lt;strong&gt;注意：&lt;/strong&gt;nps不会持久化通过公钥连接的客户端&lt;/p&gt;  &lt;h3&gt;    &lt;a href="https://github.com/cnlh/nps#&amp;#31995;&amp;#32479;&amp;#20449;&amp;#24687;&amp;#26174;&amp;#31034;"&gt;&lt;/a&gt;系统信息显示&lt;/h3&gt;  &lt;p&gt;nps服务端支持在web上显示和统计服务器的相关信息，但默认一些统计图表是关闭的，如需开启请在    &lt;code&gt;nps.conf&lt;/code&gt;中设置    &lt;code&gt;system_info_display=true&lt;/code&gt;&lt;/p&gt;  &lt;h3&gt;    &lt;a href="https://github.com/cnlh/nps#&amp;#33258;&amp;#23450;&amp;#20041;&amp;#23458;&amp;#25143;&amp;#31471;&amp;#36830;&amp;#25509;&amp;#23494;&amp;#38053;"&gt;&lt;/a&gt;自定义客户端连接密钥&lt;/h3&gt;  &lt;p&gt;web上可以自定义客户端连接的密钥，但是必须具有唯一性&lt;/p&gt;  &lt;h3&gt;    &lt;a href="https://github.com/cnlh/nps#&amp;#20851;&amp;#38381;&amp;#20844;&amp;#38053;&amp;#35775;&amp;#38382;"&gt;&lt;/a&gt;关闭公钥访问&lt;/h3&gt;  &lt;p&gt;可以将    &lt;code&gt;nps.conf&lt;/code&gt;中的    &lt;code&gt;public_vkey&lt;/code&gt;设置为空或者删除&lt;/p&gt;  &lt;h3&gt;    &lt;a href="https://github.com/cnlh/nps#&amp;#20851;&amp;#38381;web&amp;#31649;&amp;#29702;"&gt;&lt;/a&gt;关闭web管理&lt;/h3&gt;  &lt;p&gt;可以将    &lt;code&gt;nps.conf&lt;/code&gt;中的    &lt;code&gt;web_port&lt;/code&gt;设置为空或者删除&lt;/p&gt;  &lt;h3&gt;    &lt;a href="https://github.com/cnlh/nps#&amp;#26381;&amp;#21153;&amp;#31471;&amp;#22810;&amp;#29992;&amp;#25143;&amp;#30331;&amp;#38470;"&gt;&lt;/a&gt;服务端多用户登陆&lt;/h3&gt;  &lt;p&gt;如果将    &lt;code&gt;nps.conf&lt;/code&gt;中的    &lt;code&gt;allow_user_login&lt;/code&gt;设置为true,服务端web将支持多用户登陆，登陆用户名为user，默认密码为每个客户端的验证密钥，登陆后可以进入客户端编辑修改web登陆的用户名和密码，默认该功能是关闭的。&lt;/p&gt;  &lt;h3&gt;    &lt;a href="https://github.com/cnlh/nps#&amp;#29992;&amp;#25143;&amp;#27880;&amp;#20876;&amp;#21151;&amp;#33021;"&gt;&lt;/a&gt;用户注册功能&lt;/h3&gt;  &lt;p&gt;nps服务端支持用户注册功能，可将    &lt;code&gt;nps.conf&lt;/code&gt;中的    &lt;code&gt;allow_user_register&lt;/code&gt;设置为true，开启后登陆页将会有有注册功能，&lt;/p&gt;  &lt;h3&gt;    &lt;a href="https://github.com/cnlh/nps#&amp;#30417;&amp;#21548;&amp;#25351;&amp;#23450;ip"&gt;&lt;/a&gt;监听指定ip&lt;/h3&gt;  &lt;p&gt;nps支持每个隧道监听不同的服务端端口,在    &lt;code&gt;nps.conf&lt;/code&gt;中设置    &lt;code&gt;allow_multi_ip=true&lt;/code&gt;后，可在web中控制，或者npc配置文件中(可忽略，默认为0.0.0.0)&lt;/p&gt;  &lt;div&gt;    &lt;pre&gt;server_ip=xxx&lt;/pre&gt;&lt;/div&gt;  &lt;h3&gt;    &lt;a href="https://github.com/cnlh/nps#&amp;#20195;&amp;#29702;&amp;#21040;&amp;#26381;&amp;#21153;&amp;#31471;&amp;#26412;&amp;#22320;"&gt;&lt;/a&gt;代理到服务端本地&lt;/h3&gt;  &lt;p&gt;在使用nps监听80或者443端口时，默认是将所有的请求都会转发到内网上，但有时候我们的nps服务器的上一些服务也需要使用这两个端口，nps提供类似于    &lt;code&gt;nginx&lt;/code&gt;    &lt;code&gt;proxy_pass&lt;/code&gt;的功能，支持将代理到服务器本地，该功能支持域名解析，tcp、udp隧道，默认关闭。&lt;/p&gt;  &lt;p&gt;    &lt;strong&gt;即：&lt;/strong&gt;假设在nps的vps服务器上有一个服务使用5000端口，这时候nps占用了80端口和443，我们想能使用一个域名通过http(s)访问到5000的服务。&lt;/p&gt;  &lt;p&gt;    &lt;strong&gt;使用方式：&lt;/strong&gt;在    &lt;code&gt;nps.conf&lt;/code&gt;中设置    &lt;code&gt;allow_local_proxy=true&lt;/code&gt;，然后在web上设置想转发的隧道或者域名然后选择转发到本地选项即可成功。&lt;/p&gt;  &lt;h2&gt;    &lt;a href="https://github.com/cnlh/nps#&amp;#23458;&amp;#25143;&amp;#31471;"&gt;&lt;/a&gt;客户端&lt;/h2&gt;  &lt;h3&gt;    &lt;a href="https://github.com/cnlh/nps#&amp;#23458;&amp;#25143;&amp;#31471;&amp;#21551;&amp;#21160;"&gt;&lt;/a&gt;客户端启动&lt;/h3&gt;  &lt;h4&gt;    &lt;a href="https://github.com/cnlh/nps#&amp;#26080;&amp;#37197;&amp;#32622;&amp;#25991;&amp;#20214;&amp;#27169;&amp;#24335;"&gt;&lt;/a&gt;无配置文件模式&lt;/h4&gt;  &lt;p&gt;此模式的各种配置在服务端web管理中完成,客户端除运行一条命令外无需任何其他设置&lt;/p&gt;  &lt;pre&gt;    &lt;code&gt;./npc -server=ip:port -vkey=web界面中显示的密钥&lt;/code&gt;&lt;/pre&gt;  &lt;h4&gt;    &lt;a href="https://github.com/cnlh/nps#&amp;#37197;&amp;#32622;&amp;#25991;&amp;#20214;&amp;#27169;&amp;#24335;"&gt;&lt;/a&gt;配置文件模式&lt;/h4&gt;  &lt;p&gt;此模式使用nps的公钥或者客户端私钥验证，各种配置在客户端完成，同时服务端web也可以进行管理&lt;/p&gt;  &lt;pre&gt;    &lt;code&gt;./npc -config=npc配置文件路径&lt;/code&gt;&lt;/pre&gt;  &lt;h4&gt;    &lt;a href="https://github.com/cnlh/nps#&amp;#37197;&amp;#32622;&amp;#25991;&amp;#20214;&amp;#35828;&amp;#26126;"&gt;&lt;/a&gt;配置文件说明&lt;/h4&gt;  &lt;p&gt;    &lt;a href="https://github.com/cnlh/nps/tree/master/conf/npc.conf"&gt;示例配置文件&lt;/a&gt;&lt;/p&gt;  &lt;h5&gt;    &lt;a href="https://github.com/cnlh/nps#&amp;#20840;&amp;#23616;&amp;#37197;&amp;#32622;"&gt;&lt;/a&gt;全局配置&lt;/h5&gt;  &lt;div&gt;    &lt;pre&gt;[common]server_addr=1.1.1.1:8284conn_type=tcpvkey=123username=111password=222compress=truecrypt=truerate_limit=10000flow_limit=100remark=testmax_conn=10&lt;/pre&gt;&lt;/div&gt;  &lt;table&gt;    &lt;tr&gt;      &lt;th&gt;项&lt;/th&gt;      &lt;th&gt;含义&lt;/th&gt;&lt;/tr&gt;    &lt;tr&gt;      &lt;td&gt;server_addr&lt;/td&gt;      &lt;td&gt;服务端ip:port&lt;/td&gt;&lt;/tr&gt;    &lt;tr&gt;      &lt;td&gt;conn_type&lt;/td&gt;      &lt;td&gt;与服务端通信模式(tcp或kcp)&lt;/td&gt;&lt;/tr&gt;    &lt;tr&gt;      &lt;td&gt;vkey&lt;/td&gt;      &lt;td&gt;服务端配置文件中的密钥(非web)&lt;/td&gt;&lt;/tr&gt;    &lt;tr&gt;      &lt;td&gt;username&lt;/td&gt;      &lt;td&gt;socks5或http(s)密码保护用户名(可忽略)&lt;/td&gt;&lt;/tr&gt;    &lt;tr&gt;      &lt;td&gt;password&lt;/td&gt;      &lt;td&gt;socks5或http(s)密码保护密码(可忽略)&lt;/td&gt;&lt;/tr&gt;    &lt;tr&gt;      &lt;td&gt;compress&lt;/td&gt;      &lt;td&gt;是否压缩传输(true或false或忽略)&lt;/td&gt;&lt;/tr&gt;    &lt;tr&gt;      &lt;td&gt;crypt&lt;/td&gt;      &lt;td&gt;是否加密传输(true或false或忽略)&lt;/td&gt;&lt;/tr&gt;    &lt;tr&gt;      &lt;td&gt;rate_limit&lt;/td&gt;      &lt;td&gt;速度限制，可忽略&lt;/td&gt;&lt;/tr&gt;    &lt;tr&gt;      &lt;td&gt;flow_limit&lt;/td&gt;      &lt;td&gt;流量限制，可忽略&lt;/td&gt;&lt;/tr&gt;    &lt;tr&gt;      &lt;td&gt;remark&lt;/td&gt;      &lt;td&gt;客户端备注，可忽略&lt;/td&gt;&lt;/tr&gt;    &lt;tr&gt;      &lt;td&gt;max_conn&lt;/td&gt;      &lt;td&gt;最大连接数，可忽略&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;  &lt;h5&gt;    &lt;a href="https://github.com/cnlh/nps#&amp;#22495;&amp;#21517;&amp;#20195;&amp;#29702;"&gt;&lt;/a&gt;域名代理&lt;/h5&gt;  &lt;div&gt;    &lt;pre&gt;[common]server_addr=1.1.1.1:8284vkey=123[web1]host=a.proxy.comtarget_addr=127.0.0.1:8080,127.0.0.1:8082host_change=www.proxy.comheader_set_proxy=nps&lt;/pre&gt;&lt;/div&gt;  &lt;table&gt;    &lt;tr&gt;      &lt;th&gt;项&lt;/th&gt;      &lt;th&gt;含义&lt;/th&gt;&lt;/tr&gt;    &lt;tr&gt;      &lt;td&gt;web1&lt;/td&gt;      &lt;td&gt;备注&lt;/td&gt;&lt;/tr&gt;    &lt;tr&gt;      &lt;td&gt;host&lt;/td&gt;      &lt;td&gt;域名(http&lt;/td&gt;&lt;/tr&gt;    &lt;tr&gt;      &lt;td&gt;target_addr&lt;/td&gt;      &lt;td&gt;内网目标，负载均衡时多个目标，逗号隔开&lt;/td&gt;&lt;/tr&gt;    &lt;tr&gt;      &lt;td&gt;host_change&lt;/td&gt;      &lt;td&gt;请求host修改&lt;/td&gt;&lt;/tr&gt;    &lt;tr&gt;      &lt;td&gt;header_xxx&lt;/td&gt;      &lt;td&gt;请求header修改或添加，header_proxy表示添加header proxy:nps&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;  &lt;h5&gt;    &lt;a href="https://github.com/cnlh/nps#tcp&amp;#38567;&amp;#36947;&amp;#27169;&amp;#24335;"&gt;&lt;/a&gt;tcp隧道模式&lt;/h5&gt;  &lt;div&gt;    &lt;pre&gt;[common]server_addr=1.1.1.1:8284vkey=123[tcp]mode=tcptarget_addr=127.0.0.1:8080server_port=9001&lt;/pre&gt;&lt;/div&gt;  &lt;table&gt;    &lt;tr&gt;      &lt;th&gt;项&lt;/th&gt;      &lt;th&gt;含义&lt;/th&gt;&lt;/tr&gt;    &lt;tr&gt;      &lt;td&gt;mode&lt;/td&gt;      &lt;td&gt;tcp&lt;/td&gt;&lt;/tr&gt;    &lt;tr&gt;      &lt;td&gt;server_port&lt;/td&gt;      &lt;td&gt;在服务端的代理端口&lt;/td&gt;&lt;/tr&gt;    &lt;tr&gt;      &lt;td&gt;tartget_addr&lt;/td&gt;      &lt;td&gt;内网目标&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;  &lt;h5&gt;    &lt;a href="https://github.com/cnlh/nps#udp&amp;#38567;&amp;#36947;&amp;#27169;&amp;#24335;"&gt;&lt;/a&gt;udp隧道模式&lt;/h5&gt;  &lt;div&gt;    &lt;pre&gt;[common]server_addr=1.1.1.1:8284vkey=123[udp]mode=udptarget_addr=127.0.0.1:8080server_port=9002&lt;/pre&gt;&lt;/div&gt;  &lt;table&gt;    &lt;tr&gt;      &lt;th&gt;项&lt;/th&gt;      &lt;th&gt;含义&lt;/th&gt;&lt;/tr&gt;    &lt;tr&gt;      &lt;td&gt;mode&lt;/td&gt;      &lt;td&gt;udp&lt;/td&gt;&lt;/tr&gt;    &lt;tr&gt;      &lt;td&gt;server_port&lt;/td&gt;      &lt;td&gt;在服务端的代理端口&lt;/td&gt;&lt;/tr&gt;    &lt;tr&gt;      &lt;td&gt;target_addr&lt;/td&gt;      &lt;td&gt;内网目标&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;  &lt;h5&gt;    &lt;a href="https://github.com/cnlh/nps#http&amp;#20195;&amp;#29702;&amp;#27169;&amp;#24335;"&gt;&lt;/a&gt;http代理模式&lt;/h5&gt;  &lt;div&gt;    &lt;pre&gt;[common]server_addr=1.1.1.1:8284vkey=123[http]mode=httpProxyserver_port=9003&lt;/pre&gt;&lt;/div&gt;  &lt;table&gt;    &lt;tr&gt;      &lt;th&gt;项&lt;/th&gt;      &lt;th&gt;含义&lt;/th&gt;&lt;/tr&gt;    &lt;tr&gt;      &lt;td&gt;mode&lt;/td&gt;      &lt;td&gt;httpProxy&lt;/td&gt;&lt;/tr&gt;    &lt;tr&gt;      &lt;td&gt;server_port&lt;/td&gt;      &lt;td&gt;在服务端的代理端口&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;  &lt;h5&gt;    &lt;a href="https://github.com/cnlh/nps#socks5&amp;#20195;&amp;#29702;&amp;#27169;&amp;#24335;"&gt;&lt;/a&gt;socks5代理模式&lt;/h5&gt;  &lt;div&gt;    &lt;pre&gt;[common]server_addr=1.1.1.1:8284vkey=123[socks5]mode=socks5server_port=9004&lt;/pre&gt;&lt;/div&gt;  &lt;table&gt;    &lt;tr&gt;      &lt;th&gt;项&lt;/th&gt;      &lt;th&gt;含义&lt;/th&gt;&lt;/tr&gt;    &lt;tr&gt;      &lt;td&gt;mode&lt;/td&gt;      &lt;td&gt;socks5&lt;/td&gt;&lt;/tr&gt;    &lt;tr&gt;      &lt;td&gt;server_port&lt;/td&gt;      &lt;td&gt;在服务端的代理端口&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;  &lt;h5&gt;    &lt;a href="https://github.com/cnlh/nps#&amp;#31169;&amp;#23494;&amp;#20195;&amp;#29702;&amp;#27169;&amp;#24335;"&gt;&lt;/a&gt;私密代理模式&lt;/h5&gt;  &lt;div&gt;    &lt;pre&gt;[common]server_addr=1.1.1.1:8284vkey=123[secret_ssh]mode=secretpassword=ssh2target_addr=10.1.50.2:22&lt;/pre&gt;&lt;/div&gt;  &lt;table&gt;    &lt;tr&gt;      &lt;th&gt;项&lt;/th&gt;      &lt;th&gt;含义&lt;/th&gt;&lt;/tr&gt;    &lt;tr&gt;      &lt;td&gt;mode&lt;/td&gt;      &lt;td&gt;secret&lt;/td&gt;&lt;/tr&gt;    &lt;tr&gt;      &lt;td&gt;password&lt;/td&gt;      &lt;td&gt;唯一密钥&lt;/td&gt;&lt;/tr&gt;    &lt;tr&gt;      &lt;td&gt;target_addr&lt;/td&gt;      &lt;td&gt;内网目标&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;  &lt;h5&gt;    &lt;a href="https://github.com/cnlh/nps#p2p&amp;#20195;&amp;#29702;&amp;#27169;&amp;#24335;"&gt;&lt;/a&gt;p2p代理模式&lt;/h5&gt;  &lt;div&gt;    &lt;pre&gt;[common]server_addr=1.1.1.1:8284vkey=123[p2p_ssh]mode=p2ppassword=ssh2target_addr=10.1.50.2:22&lt;/pre&gt;&lt;/div&gt;  &lt;table&gt;    &lt;tr&gt;      &lt;th&gt;项&lt;/th&gt;      &lt;th&gt;含义&lt;/th&gt;&lt;/tr&gt;    &lt;tr&gt;      &lt;td&gt;mode&lt;/td&gt;      &lt;td&gt;p2p&lt;/td&gt;&lt;/tr&gt;    &lt;tr&gt;      &lt;td&gt;password&lt;/td&gt;      &lt;td&gt;唯一密钥&lt;/td&gt;&lt;/tr&gt;    &lt;tr&gt;      &lt;td&gt;target_addr&lt;/td&gt;      &lt;td&gt;内网目标&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;  &lt;h5&gt;    &lt;a href="https://github.com/cnlh/nps#&amp;#25991;&amp;#20214;&amp;#35775;&amp;#38382;&amp;#27169;&amp;#24335;"&gt;&lt;/a&gt;文件访问模式&lt;/h5&gt;  &lt;p&gt;利用nps提供一个公网可访问的本地文件服务，此模式仅客户端使用配置文件模式方可启动&lt;/p&gt;  &lt;div&gt;    &lt;pre&gt;[common]server_addr=1.1.1.1:8284vkey=123[file]mode=fileserver_port=9100local_path=/tmp/strip_pre=/web/&lt;/pre&gt;&lt;/div&gt;  &lt;table&gt;    &lt;tr&gt;      &lt;th&gt;项&lt;/th&gt;      &lt;th&gt;含义&lt;/th&gt;&lt;/tr&gt;    &lt;tr&gt;      &lt;td&gt;mode&lt;/td&gt;      &lt;td&gt;file&lt;/td&gt;&lt;/tr&gt;    &lt;tr&gt;      &lt;td&gt;server_port&lt;/td&gt;      &lt;td&gt;服务端开启的端口&lt;/td&gt;&lt;/tr&gt;    &lt;tr&gt;      &lt;td&gt;local_path&lt;/td&gt;      &lt;td&gt;本地文件目录&lt;/td&gt;&lt;/tr&gt;    &lt;tr&gt;      &lt;td&gt;strip_pre&lt;/td&gt;      &lt;td&gt;前缀&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;  &lt;p&gt;对于    &lt;code&gt;strip_pre&lt;/code&gt;，访问公网    &lt;code&gt;ip:9100/web/&lt;/code&gt;相当于访问    &lt;code&gt;/tmp/&lt;/code&gt;目录&lt;/p&gt;  &lt;h4&gt;    &lt;a href="https://github.com/cnlh/nps#&amp;#26029;&amp;#32447;&amp;#37325;&amp;#36830;"&gt;&lt;/a&gt;断线重连&lt;/h4&gt;  &lt;div&gt;    &lt;pre&gt;[common]auto_reconnection=true&lt;/pre&gt;&lt;/div&gt;  &lt;h4&gt;    &lt;a href="https://github.com/cnlh/nps#nat&amp;#31867;&amp;#22411;&amp;#26816;&amp;#27979;"&gt;&lt;/a&gt;nat类型检测&lt;/h4&gt;  &lt;pre&gt;    &lt;code&gt;./npc nat&lt;/code&gt;&lt;/pre&gt;  &lt;p&gt;如果p2p双方都是Symmetric Nat，肯定不能成功，其他组合都有较大成功率。&lt;/p&gt;  &lt;h4&gt;    &lt;a href="https://github.com/cnlh/nps#&amp;#29366;&amp;#24577;&amp;#26816;&amp;#26597;"&gt;&lt;/a&gt;状态检查&lt;/h4&gt;  &lt;pre&gt;    &lt;code&gt;./npc status -config=npc配置文件路径&lt;/code&gt;&lt;/pre&gt;  &lt;h4&gt;    &lt;a href="https://github.com/cnlh/nps#&amp;#37325;&amp;#36733;&amp;#37197;&amp;#32622;&amp;#25991;&amp;#20214;"&gt;&lt;/a&gt;重载配置文件&lt;/h4&gt;  &lt;pre&gt;    &lt;code&gt;./npc restart -config=npc配置文件路径&lt;/code&gt;&lt;/pre&gt;  &lt;h4&gt;    &lt;a href="https://github.com/cnlh/nps#&amp;#36890;&amp;#36807;&amp;#20195;&amp;#29702;&amp;#36830;&amp;#25509;nps"&gt;&lt;/a&gt;通过代理连接nps&lt;/h4&gt;  &lt;p&gt;有时候运行npc的内网机器无法直接访问外网，此时可以可以通过socks5代理连接nps&lt;/p&gt;  &lt;p&gt;对于配置文件方式启动,设置&lt;/p&gt;  &lt;div&gt;    &lt;pre&gt;[common]proxy_url=socks5://111:222@127.0.0.1:8024&lt;/pre&gt;&lt;/div&gt;  &lt;p&gt;对于无配置文件模式,加上参数&lt;/p&gt;  &lt;pre&gt;    &lt;code&gt;-proxy=socks5://111:222@127.0.0.1:8024&lt;/code&gt;&lt;/pre&gt;  &lt;p&gt;支持socks5和http两种模式&lt;/p&gt;  &lt;p&gt;即socks5://username:password@ip:port&lt;/p&gt;  &lt;p&gt;或    &lt;a href="http://username:password@ip:port" rel="nofollow"&gt;http://username:password@ip:port&lt;/a&gt;&lt;/p&gt;  &lt;h4&gt;    &lt;a href="https://github.com/cnlh/nps#&amp;#32676;&amp;#26198;&amp;#25903;&amp;#25345;"&gt;&lt;/a&gt;群晖支持&lt;/h4&gt;  &lt;p&gt;可在releases中下载spk群晖套件，例如    &lt;code&gt;npc_x64-6.1_0.19.0-1.spk&lt;/code&gt;&lt;/p&gt;  &lt;h2&gt;    &lt;a href="https://github.com/cnlh/nps#&amp;#30456;&amp;#20851;&amp;#21151;&amp;#33021;"&gt;&lt;/a&gt;相关功能&lt;/h2&gt;  &lt;h3&gt;    &lt;a href="https://github.com/cnlh/nps#&amp;#32531;&amp;#23384;&amp;#25903;&amp;#25345;"&gt;&lt;/a&gt;缓存支持&lt;/h3&gt;  &lt;p&gt;对于web站点来说，一些静态文件往往消耗更大的流量，且在内网穿透中，静态文件还需到客户端获取一次，这将导致更大的流量消耗。nps在域名解析代理中支持对静态文件进行缓存。&lt;/p&gt;  &lt;p&gt;即假设一个站点有a.css，nps将只需从npc客户端读取一次该文件，然后把该文件的内容放在内存中，下一次将不再对npc客户端进行请求而直接返回内存中的对应内容。该功能默认是关闭的，如需开启请在    &lt;code&gt;nps.conf&lt;/code&gt;中设置    &lt;code&gt;http_cache=true&lt;/code&gt;，并设置    &lt;code&gt;http_cache_length&lt;/code&gt;（缓存文件的个数，消耗内存，不宜过大，0表示不限制个数）&lt;/p&gt;  &lt;h3&gt;    &lt;a href="https://github.com/cnlh/nps#&amp;#25968;&amp;#25454;&amp;#21387;&amp;#32553;&amp;#25903;&amp;#25345;"&gt;&lt;/a&gt;数据压缩支持&lt;/h3&gt;  &lt;p&gt;由于是内网穿透，内网客户端与服务端之间的隧道存在大量的数据交换，为节省流量，加快传输速度，由此本程序支持SNNAPY形式的压缩。&lt;/p&gt;  &lt;ul&gt;    &lt;li&gt;所有模式均支持数据压缩&lt;/li&gt;    &lt;li&gt;在web管理或客户端配置文件中设置&lt;/li&gt;&lt;/ul&gt;  &lt;h3&gt;    &lt;a href="https://github.com/cnlh/nps#&amp;#21152;&amp;#23494;&amp;#20256;&amp;#36755;"&gt;&lt;/a&gt;加密传输&lt;/h3&gt;  &lt;p&gt;如果公司内网防火墙对外网访问进行了流量识别与屏蔽，例如禁止了ssh协议等，通过设置 配置文件，将服务端与客户端之间的通信内容加密传输，将会有效防止流量被拦截。&lt;/p&gt;  &lt;ul&gt;    &lt;li&gt;nps使用tls加密，所以一定要保留conf目录下的密钥文件，同时也可以自行生成&lt;/li&gt;    &lt;li&gt;在web管理或客户端配置文件中设置&lt;/li&gt;&lt;/ul&gt;  &lt;h3&gt;    &lt;a href="https://github.com/cnlh/nps#&amp;#31449;&amp;#28857;&amp;#20445;&amp;#25252;"&gt;&lt;/a&gt;站点保护&lt;/h3&gt;  &lt;p&gt;域名代理模式所有客户端共用一个http服务端口，在知道域名后任何人都可访问，一些开发或者测试环境需要保密，所以可以设置用户名和密码，nps将通过 Http Basic Auth 来保护，访问时需要输入正确的用户名和密码。&lt;/p&gt;  &lt;ul&gt;    &lt;li&gt;在web管理或客户端配置文件中设置&lt;/li&gt;&lt;/ul&gt;  &lt;h3&gt;    &lt;a href="https://github.com/cnlh/nps#host&amp;#20462;&amp;#25913;"&gt;&lt;/a&gt;host修改&lt;/h3&gt;  &lt;p&gt;由于内网站点需要的host可能与公网域名不一致，域名代理支持host修改功能，即修改request的header中的host字段。&lt;/p&gt;  &lt;p&gt;    &lt;strong&gt;使用方法：在web管理中设置&lt;/strong&gt;&lt;/p&gt;  &lt;h3&gt;    &lt;a href="https://github.com/cnlh/nps#&amp;#33258;&amp;#23450;&amp;#20041;header"&gt;&lt;/a&gt;自定义header&lt;/h3&gt;  &lt;p&gt;支持对header进行新增或者修改，以配合服务的需要&lt;/p&gt;  &lt;h3&gt;    &lt;a href="https://github.com/cnlh/nps#404&amp;#39029;&amp;#38754;&amp;#37197;&amp;#32622;"&gt;&lt;/a&gt;404页面配置&lt;/h3&gt;  &lt;p&gt;支持域名解析模式的自定义404页面，修改/web/static/page/error.html中内容即可，暂不支持静态文件等内容&lt;/p&gt;  &lt;h3&gt;    &lt;a href="https://github.com/cnlh/nps#&amp;#27969;&amp;#37327;&amp;#38480;&amp;#21046;"&gt;&lt;/a&gt;流量限制&lt;/h3&gt;  &lt;p&gt;支持客户端级流量限制，当该客户端入口流量与出口流量达到设定的总量后会拒绝服务
，域名代理会返回404页面，其他代理会拒绝连接,使用该功能需要在    &lt;code&gt;nps.conf&lt;/code&gt;中设置    &lt;code&gt;allow_flow_limit&lt;/code&gt;，默认是关闭的。&lt;/p&gt;  &lt;h3&gt;    &lt;a href="https://github.com/cnlh/nps#&amp;#24102;&amp;#23485;&amp;#38480;&amp;#21046;"&gt;&lt;/a&gt;带宽限制&lt;/h3&gt;  &lt;p&gt;支持客户端级带宽限制，带宽计算方式为入口和出口总和，权重均衡,使用该功能需要在    &lt;code&gt;nps.conf&lt;/code&gt;中设置    &lt;code&gt;allow_rate_limit&lt;/code&gt;，默认是关闭的。&lt;/p&gt;  &lt;h3&gt;    &lt;a href="https://github.com/cnlh/nps#&amp;#36127;&amp;#36733;&amp;#22343;&amp;#34913;"&gt;&lt;/a&gt;负载均衡&lt;/h3&gt;  &lt;p&gt;本代理支持域名解析模式和tcp代理的负载均衡，在web域名添加或者编辑中内网目标分行填写多个目标即可实现轮训级别的负载均衡&lt;/p&gt;  &lt;h3&gt;    &lt;a href="https://github.com/cnlh/nps#&amp;#31471;&amp;#21475;&amp;#30333;&amp;#21517;&amp;#21333;"&gt;&lt;/a&gt;端口白名单&lt;/h3&gt;  &lt;p&gt;为了防止服务端上的端口被滥用，可在nps.conf中配置allow_ports限制可开启的端口，忽略或者不填表示端口不受限制，格式：&lt;/p&gt;  &lt;div&gt;    &lt;pre&gt;allow_ports=9001-9009,10001,11000-12000&lt;/pre&gt;&lt;/div&gt;  &lt;h3&gt;    &lt;a href="https://github.com/cnlh/nps#&amp;#31471;&amp;#21475;&amp;#33539;&amp;#22260;&amp;#26144;&amp;#23556;"&gt;&lt;/a&gt;端口范围映射&lt;/h3&gt;  &lt;p&gt;当客户端以配置文件的方式启动时，可以将本地的端口进行范围映射，仅支持tcp和udp模式，例如：&lt;/p&gt;  &lt;div&gt;    &lt;pre&gt;[tcp]mode=tcpserver_port=9001-9009,10001,11000-12000target_port=8001-8009,10002,13000-14000&lt;/pre&gt;&lt;/div&gt;  &lt;p&gt;逗号分隔，可单个或者范围，注意上下端口的对应关系，无法一一对应将不能成功&lt;/p&gt;  &lt;h3&gt;    &lt;a href="https://github.com/cnlh/nps#&amp;#31471;&amp;#21475;&amp;#33539;&amp;#22260;&amp;#26144;&amp;#23556;&amp;#21040;&amp;#20854;&amp;#20182;&amp;#26426;&amp;#22120;"&gt;&lt;/a&gt;端口范围映射到其他机器&lt;/h3&gt;  &lt;div&gt;    &lt;pre&gt;[tcp]mode=tcpserver_port=9001-9009,10001,11000-12000target_port=8001-8009,10002,13000-14000target_ip=10.1.50.2&lt;/pre&gt;&lt;/div&gt;  &lt;p&gt;填写target_ip后则表示映射的该地址机器的端口，忽略则便是映射本地127.0.0.1,仅范围映射时有效&lt;/p&gt;  &lt;h3&gt;    &lt;a href="https://github.com/cnlh/nps#&amp;#23432;&amp;#25252;&amp;#36827;&amp;#31243;"&gt;&lt;/a&gt;守护进程&lt;/h3&gt;  &lt;p&gt;本代理支持守护进程，使用示例如下，服务端客户端所有模式通用,支持linux，darwin，windows。&lt;/p&gt;  &lt;pre&gt;    &lt;code&gt;./(nps|npc) start|stop|restart|status 若有其他参数可加其他参数&lt;/code&gt;&lt;/pre&gt;  &lt;pre&gt;    &lt;code&gt;(nps|npc).exe start|stop|restart|status 若有其他参数可加其他参数&lt;/code&gt;&lt;/pre&gt;  &lt;h3&gt;    &lt;a href="https://github.com/cnlh/nps#kcp&amp;#21327;&amp;#35758;&amp;#25903;&amp;#25345;"&gt;&lt;/a&gt;KCP协议支持&lt;/h3&gt;  &lt;p&gt;KCP 是一个快速可靠协议，能以比 TCP浪费10%-20%的带宽的代价，换取平均延迟降低 30%-40%，在弱网环境下对性能能有一定的提升。可在nps.conf中修改    &lt;code&gt;bridge_type&lt;/code&gt;为kcp
，设置后本代理将开启udp端口（    &lt;code&gt;bridge_port&lt;/code&gt;）&lt;/p&gt;  &lt;p&gt;注意：当服务端为kcp时，客户端连接时也需要使用相同配置，无配置文件模式加上参数type=kcp,配置文件模式在配置文件中设置tp=kcp&lt;/p&gt;  &lt;h3&gt;    &lt;a href="https://github.com/cnlh/nps#&amp;#22495;&amp;#21517;&amp;#27867;&amp;#35299;&amp;#26512;"&gt;&lt;/a&gt;域名泛解析&lt;/h3&gt;  &lt;p&gt;支持域名泛解析，例如将host设置为*.proxy.com，a.proxy.com、b.proxy.com等都将解析到同一目标，在web管理中或客户端配置文件中将host设置为此格式即可。&lt;/p&gt;  &lt;h3&gt;    &lt;a href="https://github.com/cnlh/nps#url&amp;#36335;&amp;#30001;"&gt;&lt;/a&gt;URL路由&lt;/h3&gt;  &lt;p&gt;本代理支持根据URL将同一域名转发到不同的内网服务器，可在web中或客户端配置文件中设置，此参数也可忽略，例如在客户端配置文件中&lt;/p&gt;  &lt;div&gt;    &lt;pre&gt;[web1]host=a.proxy.comtarget_addr=127.0.0.1:7001location=/test[web2]host=a.proxy.comtarget_addr=127.0.0.1:7002location=/static&lt;/pre&gt;&lt;/div&gt;  &lt;p&gt;对于    &lt;code&gt;a.proxy.com/test&lt;/code&gt;将转发到    &lt;code&gt;web1&lt;/code&gt;，对于    &lt;code&gt;a.proxy.com/static&lt;/code&gt;将转发到    &lt;code&gt;web2&lt;/code&gt;&lt;/p&gt;  &lt;h3&gt;    &lt;a href="https://github.com/cnlh/nps#&amp;#38480;&amp;#21046;ip&amp;#35775;&amp;#38382;"&gt;&lt;/a&gt;限制ip访问&lt;/h3&gt;  &lt;p&gt;如果将一些危险性高的端口例如ssh端口暴露在公网上，可能会带来一些风险，本代理支持限制ip访问。&lt;/p&gt;  &lt;p&gt;    &lt;strong&gt;使用方法:&lt;/strong&gt;在配置文件nps.conf中设置    &lt;code&gt;ip_limit&lt;/code&gt;=true，设置后仅通过注册的ip方可访问。&lt;/p&gt;  &lt;p&gt;    &lt;strong&gt;ip注册&lt;/strong&gt;：&lt;/p&gt;  &lt;p&gt;    &lt;strong&gt;方式一：&lt;/strong&gt;在需要访问的机器上，运行客户端&lt;/p&gt;  &lt;pre&gt;    &lt;code&gt;./npc register -server=ip:port -vkey=公钥或客户端密钥 time=2&lt;/code&gt;&lt;/pre&gt;  &lt;p&gt;time为有效小时数，例如time=2，在当前时间后的两小时内，本机公网ip都可以访问nps代理.&lt;/p&gt;  &lt;p&gt;    &lt;strong&gt;方式二：&lt;/strong&gt;此外nps的web登陆也可提供验证的功能，成功登陆nps web admin后将自动为登陆的ip注册两小时的允许访问权限。&lt;/p&gt;  &lt;p&gt;    &lt;strong&gt;注意：&lt;/strong&gt;本机公网ip并不是一成不变的，请自行注意有效期的设置，同时同一网络下，多人也可能是在公用同一个公网ip。&lt;/p&gt;  &lt;h3&gt;    &lt;a href="https://github.com/cnlh/nps#&amp;#23458;&amp;#25143;&amp;#31471;&amp;#26368;&amp;#22823;&amp;#36830;&amp;#25509;&amp;#25968;"&gt;&lt;/a&gt;客户端最大连接数&lt;/h3&gt;  &lt;p&gt;为防止恶意大量长连接，影响服务端程序的稳定性，可以在web或客户端配置文件中为每个客户端设置最大连接数。该功能针对    &lt;code&gt;socks5&lt;/code&gt;、    &lt;code&gt;http正向代理&lt;/code&gt;、    &lt;code&gt;域名代理&lt;/code&gt;、    &lt;code&gt;tcp代理&lt;/code&gt;、    &lt;code&gt;udp代理&lt;/code&gt;、    &lt;code&gt;私密代理&lt;/code&gt;生效,使用该功能需要在    &lt;code&gt;nps.conf&lt;/code&gt;中设置    &lt;code&gt;allow_connection_num_limit=true&lt;/code&gt;，默认是关闭的。&lt;/p&gt;  &lt;h3&gt;    &lt;a href="https://github.com/cnlh/nps#&amp;#23458;&amp;#25143;&amp;#31471;&amp;#26368;&amp;#22823;&amp;#38567;&amp;#36947;&amp;#25968;&amp;#38480;&amp;#21046;"&gt;&lt;/a&gt;客户端最大隧道数限制&lt;/h3&gt;  &lt;p&gt;nps支持对客户端的隧道数量进行限制，该功能默认是关闭的，如需开启，请在    &lt;code&gt;nps.conf&lt;/code&gt;中设置    &lt;code&gt;allow_tunnel_num_limit=true&lt;/code&gt;。&lt;/p&gt;  &lt;h3&gt;    &lt;a href="https://github.com/cnlh/nps#&amp;#31471;&amp;#21475;&amp;#22797;&amp;#29992;"&gt;&lt;/a&gt;端口复用&lt;/h3&gt;  &lt;p&gt;在一些严格的网络环境中，对端口的个数等限制较大，nps支持强大端口复用功能。将    &lt;code&gt;bridge_port&lt;/code&gt;、    &lt;code&gt;http_proxy_port&lt;/code&gt;、    &lt;code&gt;https_proxy_port&lt;/code&gt;、    &lt;code&gt;web_port&lt;/code&gt;都设置为同一端口，也能正常使用。&lt;/p&gt;  &lt;ul&gt;    &lt;li&gt;使用时将需要复用的端口设置为与      &lt;code&gt;bridge_port&lt;/code&gt;一致即可，将自动识别。&lt;/li&gt;    &lt;li&gt;如需将web管理的端口也复用，需要配置      &lt;code&gt;web_host&lt;/code&gt;也就是一个二级域名以便区分&lt;/li&gt;&lt;/ul&gt;  &lt;h3&gt;    &lt;a href="https://github.com/cnlh/nps#&amp;#22810;&amp;#36335;&amp;#22797;&amp;#29992;"&gt;&lt;/a&gt;多路复用&lt;/h3&gt;  &lt;p&gt;nps主要通信默认基于多路复用，无需开启。&lt;/p&gt;  &lt;h3&gt;    &lt;a href="https://github.com/cnlh/nps#&amp;#29615;&amp;#22659;&amp;#21464;&amp;#37327;&amp;#28210;&amp;#26579;"&gt;&lt;/a&gt;环境变量渲染&lt;/h3&gt;  &lt;p&gt;npc支持环境变量渲染以适应在某些特殊场景下的要求。&lt;/p&gt;  &lt;p&gt;    &lt;strong&gt;在无配置文件启动模式下：&lt;/strong&gt;设置环境变量&lt;/p&gt;  &lt;pre&gt;    &lt;code&gt;export NPC_SERVER_ADDR=1.1.1.1:8284
export NPC_SERVER_VKEY=xxxxx&lt;/code&gt;&lt;/pre&gt;  &lt;p&gt;直接执行./npc即可运行&lt;/p&gt;  &lt;p&gt;    &lt;strong&gt;在配置文件启动模式下：&lt;/strong&gt;&lt;/p&gt;  &lt;div&gt;    &lt;pre&gt;[common]server_addr={{.NPC_SERVER_ADDR}}conn_type=tcpvkey={{.NPC_SERVER_VKEY}}auto_reconnection=true[web]host={{.NPC_WEB_HOST}}target_addr={{.NPC_WEB_TARGET}}&lt;/pre&gt;&lt;/div&gt;  &lt;p&gt;在配置文件中填入相应的环境变量名称，npc将自动进行渲染配置文件替换环境变量&lt;/p&gt;  &lt;h3&gt;    &lt;a href="https://github.com/cnlh/nps#&amp;#20581;&amp;#24247;&amp;#26816;&amp;#26597;"&gt;&lt;/a&gt;健康检查&lt;/h3&gt;  &lt;p&gt;当客户端以配置文件模式启动时，支持多节点的健康检查。配置示例如下&lt;/p&gt;  &lt;div&gt;    &lt;pre&gt;[health_check_test1]health_check_timeout=1health_check_max_failed=3health_check_interval=1health_http_url=/health_check_type=httphealth_check_target=127.0.0.1:8083,127.0.0.1:8082[health_check_test2]health_check_timeout=1health_check_max_failed=3health_check_interval=1health_check_type=tcphealth_check_target=127.0.0.1:8083,127.0.0.1:8082&lt;/pre&gt;&lt;/div&gt;  &lt;p&gt;    &lt;strong&gt;health关键词必须在开头存在&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;第一种是http模式，也就是以get的方式请求目标+url，返回状态码为200表示成功&lt;/p&gt;  &lt;p&gt;第一种是tcp模式，也就是以tcp的方式与目标建立连接，能成功建立连接表示成功&lt;/p&gt;  &lt;p&gt;如果失败次数超过    &lt;code&gt;health_check_max_failed&lt;/code&gt;，nps则会移除该npc下的所有该目标，如果失败后目标重新上线，nps将自动将目标重新加入。&lt;/p&gt;  &lt;table&gt;    &lt;tr&gt;      &lt;th&gt;项&lt;/th&gt;      &lt;th&gt;含义&lt;/th&gt;&lt;/tr&gt;    &lt;tr&gt;      &lt;td&gt;health_check_timeout&lt;/td&gt;      &lt;td&gt;健康检查超时时间&lt;/td&gt;&lt;/tr&gt;    &lt;tr&gt;      &lt;td&gt;health_check_max_failed&lt;/td&gt;      &lt;td&gt;健康检查允许失败次数&lt;/td&gt;&lt;/tr&gt;    &lt;tr&gt;      &lt;td&gt;health_check_interval&lt;/td&gt;      &lt;td&gt;健康检查间隔&lt;/td&gt;&lt;/tr&gt;    &lt;tr&gt;      &lt;td&gt;health_check_type&lt;/td&gt;      &lt;td&gt;健康检查类型&lt;/td&gt;&lt;/tr&gt;    &lt;tr&gt;      &lt;td&gt;health_check_target&lt;/td&gt;      &lt;td&gt;健康检查目标，多个以逗号（,）分隔&lt;/td&gt;&lt;/tr&gt;    &lt;tr&gt;      &lt;td&gt;health_check_type&lt;/td&gt;      &lt;td&gt;健康检查类型&lt;/td&gt;&lt;/tr&gt;    &lt;tr&gt;      &lt;td&gt;health_http_url&lt;/td&gt;      &lt;td&gt;健康检查url，仅http模式适用&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;  &lt;h3&gt;    &lt;a href="https://github.com/cnlh/nps#&amp;#26085;&amp;#24535;&amp;#36755;&amp;#20986;"&gt;&lt;/a&gt;日志输出&lt;/h3&gt;  &lt;h4&gt;    &lt;a href="https://github.com/cnlh/nps#&amp;#26085;&amp;#24535;&amp;#36755;&amp;#20986;&amp;#32423;&amp;#21035;"&gt;&lt;/a&gt;日志输出级别&lt;/h4&gt;  &lt;p&gt;    &lt;strong&gt;对于npc：&lt;/strong&gt;&lt;/p&gt;  &lt;pre&gt;    &lt;code&gt;-log_level=0~7 -log_path=npc.log&lt;/code&gt;&lt;/pre&gt;  &lt;pre&gt;    &lt;code&gt;LevelEmergency-&amp;gt;0  LevelAlert-&amp;gt;1

LevelCritical-&amp;gt;2 LevelError-&amp;gt;3

LevelWarning-&amp;gt;4 LevelNotice-&amp;gt;5

LevelInformational-&amp;gt;6 LevelDebug-&amp;gt;7&lt;/code&gt;&lt;/pre&gt;  &lt;p&gt;默认为全输出,级别为0到7&lt;/p&gt;  &lt;p&gt;    &lt;strong&gt;对于nps：&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;在    &lt;code&gt;nps.conf&lt;/code&gt;中设置相关配置即可&lt;/p&gt;  &lt;h2&gt;    &lt;a href="https://github.com/cnlh/nps#&amp;#30456;&amp;#20851;&amp;#35828;&amp;#26126;"&gt;&lt;/a&gt;相关说明&lt;/h2&gt;  &lt;h3&gt;    &lt;a href="https://github.com/cnlh/nps#&amp;#33719;&amp;#21462;&amp;#29992;&amp;#25143;&amp;#30495;&amp;#23454;ip"&gt;&lt;/a&gt;获取用户真实ip&lt;/h3&gt;  &lt;p&gt;在域名代理模式中，可以通过request请求 header 中的 X-Forwarded-For 和 X-Real-IP 来获取用户真实 IP。&lt;/p&gt;  &lt;p&gt;    &lt;strong&gt;本代理前会在每一个http(s)请求中添加了这两个 header。&lt;/strong&gt;&lt;/p&gt;  &lt;h3&gt;    &lt;a href="https://github.com/cnlh/nps#&amp;#28909;&amp;#26356;&amp;#26032;&amp;#25903;&amp;#25345;"&gt;&lt;/a&gt;热更新支持&lt;/h3&gt;  &lt;p&gt;对于绝大多数配置，在web管理中的修改将实时使用，无需重启客户端或者服务端&lt;/p&gt;  &lt;h3&gt;    &lt;a href="https://github.com/cnlh/nps#&amp;#23458;&amp;#25143;&amp;#31471;&amp;#22320;&amp;#22336;&amp;#26174;&amp;#31034;"&gt;&lt;/a&gt;客户端地址显示&lt;/h3&gt;  &lt;p&gt;在web管理中将显示客户端的连接地址&lt;/p&gt;  &lt;h3&gt;    &lt;a href="https://github.com/cnlh/nps#&amp;#27969;&amp;#37327;&amp;#32479;&amp;#35745;"&gt;&lt;/a&gt;流量统计&lt;/h3&gt;  &lt;p&gt;可统计显示每个代理使用的流量，由于压缩和加密等原因，会和实际环境中的略有差异&lt;/p&gt;  &lt;h3&gt;    &lt;a href="https://github.com/cnlh/nps#&amp;#24403;&amp;#21069;&amp;#23458;&amp;#25143;&amp;#31471;&amp;#24102;&amp;#23485;"&gt;&lt;/a&gt;当前客户端带宽&lt;/h3&gt;  &lt;p&gt;可统计每个客户端当前的带宽，可能和实际有一定差异，仅供参考。&lt;/p&gt;  &lt;h3&gt;    &lt;a href="https://github.com/cnlh/nps#&amp;#23458;&amp;#25143;&amp;#31471;&amp;#19982;&amp;#26381;&amp;#21153;&amp;#31471;&amp;#29256;&amp;#26412;&amp;#23545;&amp;#27604;"&gt;&lt;/a&gt;客户端与服务端版本对比&lt;/h3&gt;  &lt;p&gt;为了程序正常运行，客户端与服务端的核心版本必须一致，否则将导致客户端无法成功连接致服务端。&lt;/p&gt;  &lt;h2&gt;    &lt;a href="https://github.com/cnlh/nps#webapi"&gt;&lt;/a&gt;webAPI&lt;/h2&gt;  &lt;h3&gt;    &lt;a href="https://github.com/cnlh/nps#webapi&amp;#39564;&amp;#35777;&amp;#35828;&amp;#26126;"&gt;&lt;/a&gt;webAPI验证说明&lt;/h3&gt;  &lt;ul&gt;    &lt;li&gt;采用auth_key的验证方式&lt;/li&gt;    &lt;li&gt;在提交的每个请求后面附带两个参数，      &lt;code&gt;auth_key&lt;/code&gt;和      &lt;code&gt;timestamp&lt;/code&gt;&lt;/li&gt;&lt;/ul&gt;  &lt;pre&gt;    &lt;code&gt;auth_key的生成方式为：md5(配置文件中的auth_key+当前时间戳)&lt;/code&gt;&lt;/pre&gt;  &lt;pre&gt;    &lt;code&gt;timestamp为当前时间戳&lt;/code&gt;&lt;/pre&gt;  &lt;pre&gt;    &lt;code&gt;curl --request POST \
  --url http://127.0.0.1:8080/client/list \
  --data &amp;apos;auth_key=2a0000d9229e7dbcf79dd0f5e04bb084&amp;amp;timestamp=1553045344&amp;amp;start=0&amp;amp;limit=10&amp;apos;&lt;/code&gt;&lt;/pre&gt;  &lt;p&gt;    &lt;strong&gt;注意：&lt;/strong&gt;为保证安全，时间戳的有效范围为20秒内，所以每次提交请求必须重新生成。&lt;/p&gt;  &lt;h3&gt;    &lt;a href="https://github.com/cnlh/nps#&amp;#33719;&amp;#21462;&amp;#26381;&amp;#21153;&amp;#31471;&amp;#26102;&amp;#38388;"&gt;&lt;/a&gt;获取服务端时间&lt;/h3&gt;  &lt;p&gt;由于服务端与api请求的客户端时间差异不能太大，所以提供了一个可以获取服务端时间的接口&lt;/p&gt;  &lt;pre&gt;    &lt;code&gt;POST /auth/gettime&lt;/code&gt;&lt;/pre&gt;  &lt;h3&gt;    &lt;a href="https://github.com/cnlh/nps#&amp;#33719;&amp;#21462;&amp;#26381;&amp;#21153;&amp;#31471;authkey"&gt;&lt;/a&gt;获取服务端authKey&lt;/h3&gt;  &lt;p&gt;如果想获取authKey，服务端提供获取authKey的接口&lt;/p&gt;  &lt;pre&gt;    &lt;code&gt;POST /auth/getauthkey&lt;/code&gt;&lt;/pre&gt;  &lt;p&gt;将返回加密后的authKey，采用aes cbc加密，请使用与服务端配置文件中cryptKey相同的密钥进行解密&lt;/p&gt;  &lt;p&gt;    &lt;strong&gt;注意：&lt;/strong&gt;nps配置文件中    &lt;code&gt;auth_crypt_key&lt;/code&gt;需为16位&lt;/p&gt;  &lt;ul&gt;    &lt;li&gt;解密密钥长度128&lt;/li&gt;    &lt;li&gt;偏移量与密钥相同&lt;/li&gt;    &lt;li&gt;补码方式pkcs5padding&lt;/li&gt;    &lt;li&gt;解密串编码方式 十六进制&lt;/li&gt;&lt;/ul&gt;  &lt;h3&gt;    &lt;a href="https://github.com/cnlh/nps#&amp;#35814;&amp;#32454;&amp;#25991;&amp;#26723;"&gt;&lt;/a&gt;详细文档&lt;/h3&gt;  &lt;ul&gt;    &lt;li&gt;      &lt;strong&gt;此文档近期可能更新较慢，建议自行抓包&lt;/strong&gt;&lt;/li&gt;&lt;/ul&gt;  &lt;p&gt;为方便第三方扩展，在web模式下可利用webAPI进行相关操作，详情见    &lt;a href="https://github.com/cnlh/nps/wiki/webAPI%E6%96%87%E6%A1%A3"&gt;webAPI文档&lt;/a&gt;&lt;/p&gt;  &lt;h2&gt;    &lt;a href="https://github.com/cnlh/nps#&amp;#36129;&amp;#29486;"&gt;&lt;/a&gt;贡献&lt;/h2&gt;  &lt;h4&gt;    &lt;a href="https://github.com/cnlh/nps#&amp;#27426;&amp;#36814;&amp;#21442;&amp;#19982;&amp;#21040;&amp;#21046;&amp;#20316;docker&amp;#22270;&amp;#26631;&amp;#25991;&amp;#26723;&amp;#32763;&amp;#35793;&amp;#31561;&amp;#24037;&amp;#20316;"&gt;&lt;/a&gt;    &lt;strong&gt;欢迎参与到制作docker、图标、文档翻译等工作&lt;/strong&gt;&lt;/h4&gt;  &lt;ul&gt;    &lt;li&gt;如果遇到bug可以直接提交至dev分支&lt;/li&gt;    &lt;li&gt;使用遇到问题可以通过issues反馈&lt;/li&gt;    &lt;li&gt;项目处于开发阶段，还有很多待完善的地方，如果可以贡献代码，请提交 PR 至 dev 分支&lt;/li&gt;    &lt;li&gt;如果有新的功能特性反馈，可以通过issues或者qq群反馈&lt;/li&gt;&lt;/ul&gt;  &lt;h2&gt;    &lt;a href="https://github.com/cnlh/nps#&amp;#25424;&amp;#21161;"&gt;&lt;/a&gt;捐助&lt;/h2&gt;  &lt;p&gt;如果您觉得nps对你有帮助，欢迎给予我们一定捐助，也是帮助nps更好的发展。&lt;/p&gt;  &lt;h3&gt;  &lt;br /&gt;&lt;/h3&gt;  &lt;h2&gt;  &lt;br /&gt;&lt;/h2&gt;  &lt;p&gt;  &lt;br /&gt;&lt;/p&gt;
    &lt;div&gt; &lt;a href="https://itindex.net/"  title="IT 资讯"&gt;&lt;img src="https://itindex.net/images/iconWarning.gif" title="IT 资讯" border="0"/&gt; &lt;/a&gt;</description>
      <category />
      <guid isPermaLink="true">https://itindex.net/detail/59950-github-cnlh-nps</guid>
      <pubDate>Mon, 12 Aug 2019 09:52:34 CST</pubDate>
    </item>
    <item>
      <title>Web Components 入门实例教程</title>
      <link>https://itindex.net/detail/59920-web-components-%E5%AE%9E%E4%BE%8B</link>
      <description>&lt;p&gt;组件是前端的发展方向，现在流行的 React 和 Vue 都是组件框架。&lt;/p&gt;
 &lt;p&gt;谷歌公司由于掌握了 Chrome 浏览器，一直在推动浏览器的原生组件，即   &lt;a href="https://www.webcomponents.org/introduction"&gt;Web Components API&lt;/a&gt;。相比第三方框架，原生组件简单直接，符合直觉，不用加载任何外部模块，代码量小。目前，它还在不断发展，但已经可用于生产环境。&lt;/p&gt;

 &lt;p&gt;Web Components API 内容很多，本文不是全面的教程，只是一个简单演示，让大家看一下怎么用它开发组件。&lt;/p&gt;

 &lt;p&gt;  &lt;img alt="" src="https://www.wangbase.com/blogimg/asset/201908/bg2019080604.jpg" title=""&gt;&lt;/img&gt;&lt;/p&gt;

 &lt;h2&gt;一、自定义元素&lt;/h2&gt;

 &lt;p&gt;下图是一个用户卡片。&lt;/p&gt;

 &lt;p&gt;  &lt;img alt="" src="https://www.wangbase.com/blogimg/asset/201908/bg2019080405.jpg" title=""&gt;&lt;/img&gt;&lt;/p&gt;

 &lt;p&gt;本文演示如何把这个卡片，写成 Web Components 组件，这里是最后的  &lt;a href="https://jsbin.com/yobopor/1/edit?html,js,output"&gt;完整代码&lt;/a&gt;。&lt;/p&gt;

 &lt;p&gt;网页只要插入下面的代码，就会显示用户卡片。&lt;/p&gt;

 &lt;blockquote&gt;  &lt;pre&gt;   &lt;code&gt;
&amp;lt;user-card&amp;gt;&amp;lt;/user-card&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/blockquote&gt;

 &lt;p&gt;这种自定义的 HTML 标签，称为自定义元素（custom element）。根据规范，自定义元素的名称必须包含连词线，用与区别原生的 HTML 元素。所以，  &lt;code&gt;&amp;lt;user-card&amp;gt;&lt;/code&gt;不能写成  &lt;code&gt;&amp;lt;usercard&amp;gt;&lt;/code&gt;。&lt;/p&gt;

 &lt;h2&gt;二、  &lt;code&gt;customElements.define()&lt;/code&gt;&lt;/h2&gt;

 &lt;p&gt;自定义元素需要使用 JavaScript 定义一个类，所有  &lt;code&gt;&amp;lt;user-card&amp;gt;&lt;/code&gt;都会是这个类的实例。&lt;/p&gt;

 &lt;blockquote&gt;  &lt;pre&gt;   &lt;code&gt;
class UserCard extends HTMLElement {
  constructor() {
    super();
  }
}
&lt;/code&gt;&lt;/pre&gt;&lt;/blockquote&gt;

 &lt;p&gt;上面代码中，  &lt;code&gt;UserCard&lt;/code&gt;就是自定义元素的类。注意，这个类的父类是  &lt;code&gt;HTMLElement&lt;/code&gt;，因此继承了 HTML 元素的特性。&lt;/p&gt;

 &lt;p&gt;接着，使用浏览器原生的  &lt;code&gt;customElements.define()&lt;/code&gt;方法，告诉浏览器  &lt;code&gt;&amp;lt;user-card&amp;gt;&lt;/code&gt;元素与这个类关联。&lt;/p&gt;

 &lt;blockquote&gt;  &lt;pre&gt;   &lt;code&gt;
window.customElements.define(&amp;apos;user-card&amp;apos;, UserCard);
&lt;/code&gt;&lt;/pre&gt;&lt;/blockquote&gt;

 &lt;h2&gt;三、自定义元素的内容&lt;/h2&gt;

 &lt;p&gt;自定义元素  &lt;code&gt;&amp;lt;user-card&amp;gt;&lt;/code&gt;目前还是空的，下面在类里面给出这个元素的内容。&lt;/p&gt;

 &lt;blockquote&gt;  &lt;pre&gt;   &lt;code&gt;
class UserCard extends HTMLElement {
  constructor() {
    super();

    var image = document.createElement(&amp;apos;img&amp;apos;);
    image.src = &amp;apos;https://semantic-ui.com/images/avatar2/large/kristy.png&amp;apos;;
    image.classList.add(&amp;apos;image&amp;apos;);

    var container = document.createElement(&amp;apos;div&amp;apos;);
    container.classList.add(&amp;apos;container&amp;apos;);

    var name = document.createElement(&amp;apos;p&amp;apos;);
    name.classList.add(&amp;apos;name&amp;apos;);
    name.innerText = &amp;apos;User Name&amp;apos;;

    var email = document.createElement(&amp;apos;p&amp;apos;);
    email.classList.add(&amp;apos;email&amp;apos;);
    email.innerText = &amp;apos;yourmail@some-email.com&amp;apos;;

    var button = document.createElement(&amp;apos;button&amp;apos;);
    button.classList.add(&amp;apos;button&amp;apos;);
    button.innerText = &amp;apos;Follow&amp;apos;;

    container.append(name, email, button);
    this.append(image, container);
  }
}
&lt;/code&gt;&lt;/pre&gt;&lt;/blockquote&gt;

 &lt;p&gt;上面代码最后一行，  &lt;code&gt;this.append()&lt;/code&gt;的  &lt;code&gt;this&lt;/code&gt;表示自定义元素实例。&lt;/p&gt;

 &lt;p&gt;完成这一步以后，自定义元素内部的 DOM 结构就已经生成了。&lt;/p&gt;

 &lt;h2&gt;四、  &lt;code&gt;&amp;lt;template&amp;gt;&lt;/code&gt;标签&lt;/h2&gt;

 &lt;p&gt;使用 JavaScript 写上一节的 DOM 结构很麻烦，Web Components API 提供了  &lt;code&gt;&amp;lt;template&amp;gt;&lt;/code&gt;标签，可以在它里面使用 HTML 定义 DOM。&lt;/p&gt;

 &lt;blockquote&gt;  &lt;pre&gt;   &lt;code&gt;
&amp;lt;template id=&amp;quot;userCardTemplate&amp;quot;&amp;gt;
  &amp;lt;img src=&amp;quot;https://semantic-ui.com/images/avatar2/large/kristy.png&amp;quot; class=&amp;quot;image&amp;quot;&amp;gt;
  &amp;lt;div class=&amp;quot;container&amp;quot;&amp;gt;
    &amp;lt;p class=&amp;quot;name&amp;quot;&amp;gt;User Name&amp;lt;/p&amp;gt;
    &amp;lt;p class=&amp;quot;email&amp;quot;&amp;gt;yourmail@some-email.com&amp;lt;/p&amp;gt;
    &amp;lt;button class=&amp;quot;button&amp;quot;&amp;gt;Follow&amp;lt;/button&amp;gt;
  &amp;lt;/div&amp;gt;
&amp;lt;/template&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/blockquote&gt;

 &lt;p&gt;然后，改写一下自定义元素的类，为自定义元素加载  &lt;code&gt;&amp;lt;template&amp;gt;&lt;/code&gt;。&lt;/p&gt;

 &lt;blockquote&gt;  &lt;pre&gt;   &lt;code&gt;
class UserCard extends HTMLElement {
  constructor() {
    super();

    var templateElem = document.getElementById(&amp;apos;userCardTemplate&amp;apos;);
    var content = templateElem.content.cloneNode(true);
    this.appendChild(content);
  }
}  
&lt;/code&gt;&lt;/pre&gt;&lt;/blockquote&gt;

 &lt;p&gt;上面代码中，获取  &lt;code&gt;&amp;lt;template&amp;gt;&lt;/code&gt;节点以后，克隆了它的所有子元素，这是因为可能有多个自定义元素的实例，这个模板还要留给其他实例使用，所以不能直接移动它的子元素。&lt;/p&gt;

 &lt;p&gt;到这一步为止，完整的代码如下。&lt;/p&gt;

 &lt;blockquote&gt;  &lt;pre&gt;   &lt;code&gt;
&amp;lt;body&amp;gt;
  &amp;lt;user-card&amp;gt;&amp;lt;/user-card&amp;gt;
  &amp;lt;template&amp;gt;...&amp;lt;/template&amp;gt;

  &amp;lt;script&amp;gt;
    class UserCard extends HTMLElement {
      constructor() {
        super();

        var templateElem = document.getElementById(&amp;apos;userCardTemplate&amp;apos;);
        var content = templateElem.content.cloneNode(true);
        this.appendChild(content);
      }
    }
    window.customElements.define(&amp;apos;user-card&amp;apos;, UserCard);    
  &amp;lt;/script&amp;gt;
&amp;lt;/body&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/blockquote&gt;

 &lt;h2&gt;五、添加样式&lt;/h2&gt;

 &lt;p&gt;自定义元素还没有样式，可以给它指定全局样式，比如下面这样。&lt;/p&gt;

 &lt;blockquote&gt;  &lt;pre&gt;   &lt;code&gt;
user-card {
  /* ... */
}
&lt;/code&gt;&lt;/pre&gt;&lt;/blockquote&gt;

 &lt;p&gt;但是，组件的样式应该与代码封装在一起，只对自定义元素生效，不影响外部的全局样式。所以，可以把样式写在  &lt;code&gt;&amp;lt;template&amp;gt;&lt;/code&gt;里面。&lt;/p&gt;

 &lt;blockquote&gt;  &lt;pre&gt;   &lt;code&gt;
&amp;lt;template id=&amp;quot;userCardTemplate&amp;quot;&amp;gt;
  &amp;lt;style&amp;gt;
   :host {
     display: flex;
     align-items: center;
     width: 450px;
     height: 180px;
     background-color: #d4d4d4;
     border: 1px solid #d5d5d5;
     box-shadow: 1px 1px 5px rgba(0, 0, 0, 0.1);
     border-radius: 3px;
     overflow: hidden;
     padding: 10px;
     box-sizing: border-box;
     font-family: &amp;apos;Poppins&amp;apos;, sans-serif;
   }
   .image {
     flex: 0 0 auto;
     width: 160px;
     height: 160px;
     vertical-align: middle;
     border-radius: 5px;
   }
   .container {
     box-sizing: border-box;
     padding: 20px;
     height: 160px;
   }
   .container &amp;gt; .name {
     font-size: 20px;
     font-weight: 600;
     line-height: 1;
     margin: 0;
     margin-bottom: 5px;
   }
   .container &amp;gt; .email {
     font-size: 12px;
     opacity: 0.75;
     line-height: 1;
     margin: 0;
     margin-bottom: 15px;
   }
   .container &amp;gt; .button {
     padding: 10px 25px;
     font-size: 12px;
     border-radius: 5px;
     text-transform: uppercase;
   }
  &amp;lt;/style&amp;gt;

  &amp;lt;img src=&amp;quot;https://semantic-ui.com/images/avatar2/large/kristy.png&amp;quot; class=&amp;quot;image&amp;quot;&amp;gt;
  &amp;lt;div class=&amp;quot;container&amp;quot;&amp;gt;
    &amp;lt;p class=&amp;quot;name&amp;quot;&amp;gt;User Name&amp;lt;/p&amp;gt;
    &amp;lt;p class=&amp;quot;email&amp;quot;&amp;gt;yourmail@some-email.com&amp;lt;/p&amp;gt;
    &amp;lt;button class=&amp;quot;button&amp;quot;&amp;gt;Follow&amp;lt;/button&amp;gt;
  &amp;lt;/div&amp;gt;
&amp;lt;/template&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/blockquote&gt;

 &lt;p&gt;上面代码中，  &lt;code&gt;&amp;lt;template&amp;gt;&lt;/code&gt;样式里面的  &lt;code&gt;:host&lt;/code&gt;伪类，指代自定义元素本身。&lt;/p&gt;

 &lt;h2&gt;六、自定义元素的参数&lt;/h2&gt;

 &lt;p&gt;  &lt;code&gt;&amp;lt;user-card&amp;gt;&lt;/code&gt;内容现在是在  &lt;code&gt;&amp;lt;template&amp;gt;&lt;/code&gt;里面设定的，为了方便使用，把它改成参数。&lt;/p&gt;

 &lt;blockquote&gt;  &lt;pre&gt;   &lt;code&gt;
&amp;lt;user-card
  image=&amp;quot;https://semantic-ui.com/images/avatar2/large/kristy.png&amp;quot;
  name=&amp;quot;User Name&amp;quot;
  email=&amp;quot;yourmail@some-email.com&amp;quot;
&amp;gt;&amp;lt;/user-card&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/blockquote&gt;

 &lt;p&gt;  &lt;code&gt;&amp;lt;template&amp;gt;&lt;/code&gt;代码也相应改造。&lt;/p&gt;

 &lt;blockquote&gt;  &lt;pre&gt;   &lt;code&gt;
&amp;lt;template id=&amp;quot;userCardTemplate&amp;quot;&amp;gt;
  &amp;lt;style&amp;gt;...&amp;lt;/style&amp;gt;

  &amp;lt;img class=&amp;quot;image&amp;quot;&amp;gt;
  &amp;lt;div class=&amp;quot;container&amp;quot;&amp;gt;
    &amp;lt;p class=&amp;quot;name&amp;quot;&amp;gt;&amp;lt;/p&amp;gt;
    &amp;lt;p class=&amp;quot;email&amp;quot;&amp;gt;&amp;lt;/p&amp;gt;
    &amp;lt;button class=&amp;quot;button&amp;quot;&amp;gt;Follow John&amp;lt;/button&amp;gt;
  &amp;lt;/div&amp;gt;
&amp;lt;/template&amp;gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/blockquote&gt;

 &lt;p&gt;最后，改一下类的代码，把参数加到自定义元素里面。&lt;/p&gt;

 &lt;blockquote&gt;  &lt;pre&gt;   &lt;code&gt;
class UserCard extends HTMLElement {
  constructor() {
    super();

    var templateElem = document.getElementById(&amp;apos;userCardTemplate&amp;apos;);
    var content = templateElem.content.cloneNode(true);
    content.querySelector(&amp;apos;img&amp;apos;).setAttribute(&amp;apos;src&amp;apos;, this.getAttribute(&amp;apos;image&amp;apos;));
    content.querySelector(&amp;apos;.container&amp;gt;.name&amp;apos;).innerText = this.getAttribute(&amp;apos;name&amp;apos;);
    content.querySelector(&amp;apos;.container&amp;gt;.email&amp;apos;).innerText = this.getAttribute(&amp;apos;email&amp;apos;);
    this.appendChild(content);
  }
}
window.customElements.define(&amp;apos;user-card&amp;apos;, UserCard);    
&lt;/code&gt;&lt;/pre&gt;&lt;/blockquote&gt;

 &lt;h2&gt;七、Shadow DOM&lt;/h2&gt;

 &lt;p&gt;我们不希望用户能够看到  &lt;code&gt;&amp;lt;user-card&amp;gt;&lt;/code&gt;的内部代码，Web Component 允许内部代码隐藏起来，这叫做 Shadow DOM，即这部分 DOM 默认是隐藏的，开发者工具里面看不到。&lt;/p&gt;

 &lt;p&gt;自定义元素的  &lt;code&gt;this.attachShadow()&lt;/code&gt;方法开启 Shadow DOM，详见下面的代码。&lt;/p&gt;

 &lt;blockquote&gt;  &lt;pre&gt;   &lt;code&gt;
class UserCard extends HTMLElement {
  constructor() {
    super();
    var shadow = this.attachShadow( { mode: &amp;apos;closed&amp;apos; } );

    var templateElem = document.getElementById(&amp;apos;userCardTemplate&amp;apos;);
    var content = templateElem.content.cloneNode(true);
    content.querySelector(&amp;apos;img&amp;apos;).setAttribute(&amp;apos;src&amp;apos;, this.getAttribute(&amp;apos;image&amp;apos;));
    content.querySelector(&amp;apos;.container&amp;gt;.name&amp;apos;).innerText = this.getAttribute(&amp;apos;name&amp;apos;);
    content.querySelector(&amp;apos;.container&amp;gt;.email&amp;apos;).innerText = this.getAttribute(&amp;apos;email&amp;apos;);

    shadow.appendChild(content);
  }
}
window.customElements.define(&amp;apos;user-card&amp;apos;, UserCard);
&lt;/code&gt;&lt;/pre&gt;&lt;/blockquote&gt;

 &lt;p&gt;上面代码中，  &lt;code&gt;this.attachShadow()&lt;/code&gt;方法的参数  &lt;code&gt;{ mode: &amp;apos;closed&amp;apos; }&lt;/code&gt;，表示 Shadow DOM 是封闭的，不允许外部访问。&lt;/p&gt;

 &lt;p&gt;至此，这个 Web Component 组件就完成了，完整代码可以访问  &lt;a href="https://jsbin.com/yobopor/1/edit?html,js,output"&gt;这里&lt;/a&gt;。可以看到，整个过程还是很简单的，不像第三方框架那样有复杂的 API。&lt;/p&gt;

 &lt;h2&gt;八、组件的扩展&lt;/h2&gt;

 &lt;p&gt;在前面的基础上，可以对组件进行扩展。&lt;/p&gt;

 &lt;p&gt;  &lt;strong&gt;（1）与用户互动&lt;/strong&gt;&lt;/p&gt;

 &lt;p&gt;用户卡片是一个静态组件，如果要与用户互动，也很简单，就是在类里面监听各种事件。&lt;/p&gt;

 &lt;blockquote&gt;  &lt;pre&gt;   &lt;code&gt;
this.$button = shadow.querySelector(&amp;apos;button&amp;apos;);
this.$button.addEventListener(&amp;apos;click&amp;apos;, () =&amp;gt; {
  // do something
});
&lt;/code&gt;&lt;/pre&gt;&lt;/blockquote&gt;

 &lt;p&gt;  &lt;strong&gt;（2）组件的封装&lt;/strong&gt;&lt;/p&gt;

 &lt;p&gt;上面的例子中，  &lt;code&gt;&amp;lt;template&amp;gt;&lt;/code&gt;与网页代码放在一起，其实可以用脚本把  &lt;code&gt;&amp;lt;template&amp;gt;&lt;/code&gt;注入网页。这样的话，JavaScript 脚本跟  &lt;code&gt;&amp;lt;template&amp;gt;&lt;/code&gt;就能封装成一个 JS 文件，成为独立的组件文件。网页只要加载这个脚本，就能使用  &lt;code&gt;&amp;lt;user-card&amp;gt;&lt;/code&gt;组件。&lt;/p&gt;

 &lt;p&gt;这里就不展开了，更多 Web Components 的高级用法，可以接着学习下面两篇文章。&lt;/p&gt;

 &lt;blockquote&gt;
    &lt;ul&gt;
   &lt;li&gt;    &lt;a href="https://www.robinwieruch.de/web-components-tutorial/"&gt;Web Components Tutorial for Beginners&lt;/a&gt;&lt;/li&gt;
   &lt;li&gt;    &lt;a href="https://developers.google.com/web/fundamentals/web-components/customelements"&gt;Custom Elements v1: Reusable Web Components
&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;

 &lt;h2&gt;九、参考链接&lt;/h2&gt;

 &lt;ul&gt;
  &lt;li&gt;   &lt;a href="https://itnext.io/the-anatomy-of-web-components-d6afedb81b37"&gt;The anatomy of Web Components&lt;/a&gt;, Uday Hiwarale&lt;/li&gt;
&lt;/ul&gt;

 &lt;p&gt;（完）&lt;/p&gt;
 &lt;div&gt;  &lt;h3&gt;文档信息&lt;/h3&gt;
  &lt;ul&gt;
   &lt;li&gt;版权声明：自由转载-非商用-非衍生-保持署名（    &lt;a href="http://creativecommons.org/licenses/by-nc-nd/3.0/deed.zh"&gt;创意共享3.0许可证&lt;/a&gt;）&lt;/li&gt;
   &lt;li&gt;发表日期： 2019年8月 6日&lt;/li&gt;

&lt;/ul&gt;&lt;/div&gt; &lt;div&gt;&lt;/div&gt;&lt;div&gt; &lt;a href="https://itindex.net/"  title="IT 资讯"&gt;&lt;img src="https://itindex.net/images/iconWarning.gif" title="IT 资讯" border="0"/&gt; &lt;/a&gt;</description>
      <category>JavaScript</category>
      <guid isPermaLink="true">https://itindex.net/detail/59920-web-components-%E5%AE%9E%E4%BE%8B</guid>
      <pubDate>Tue, 06 Aug 2019 17:39:44 CST</pubDate>
    </item>
    <item>
      <title>JWT Tool：针对 JSON Web Tokens 的测试工具</title>
      <link>https://itindex.net/detail/59797-jwt-tool-json</link>
      <description>&lt;p&gt;  &lt;strong&gt;众望所归，大家期待已久的JWT渗透测试工具终于出炉啦！没错，今天给大家介绍的这款名叫JWT Tool的工具，就可以针对JSON Web Tokens进行渗透测试。&lt;/strong&gt;&lt;/p&gt;
 &lt;p&gt;  &lt;img alt="aaaaaaaaaaaaaaaaaaa.jpg" height="300" src="https://image.3001.net/images/20190703/1562142582_5d1c677682b3c.jpg!small" width="600"&gt;&lt;/img&gt;    &lt;/p&gt;
 &lt;h2&gt;什么是JWT？&lt;/h2&gt;
 &lt;p&gt;JWT是JSON Web Token的缩写，它是一串带有声明信息的字符串，由服务端使用加密算法对信息签名，以保证其完整性和不可伪造性。Token里可以包含所有必要的信息，这样服务端就无需保存任何关于用户或会话的信息了。JWT可用于身份认证，会话状态维持以及信息交换等任务。&lt;/p&gt;
 &lt;p&gt;JWT由三部分构成，分别称为header，payload和signature，各部分用“.”相连构成一个完整的Token，形如xxxxx.yyyyy.zzzzz。&lt;/p&gt;
 &lt;h3&gt;Header&lt;/h3&gt;
 &lt;p&gt;使用一个JSON格式字符串声明令牌的类型和签名用的算法等，形如{“alg”:”HS256″, “typ”: “JWT”}。该字符串经过Base64Url编码后形成JWT的第一部分xxxxx。&lt;/p&gt;
 &lt;p&gt;Base64Url编码可以用这段代码直观理解：  &lt;/p&gt;
 &lt;p&gt;&lt;/p&gt;
 &lt;pre&gt;  &lt;code&gt;   &lt;p&gt;from base64 import *&lt;/p&gt;   &lt;p&gt;def base64URLen(s):&lt;/p&gt;   &lt;p&gt;    t0=b64encode(s)&lt;/p&gt;   &lt;p&gt;   t1=t0.strip(&amp;apos;=&amp;apos;).replace(&amp;apos;+&amp;apos;,&amp;apos;-&amp;apos;).replace(&amp;apos;/&amp;apos;,&amp;apos;_&amp;apos;)&lt;/p&gt;   &lt;p&gt;    return t1&lt;/p&gt;   &lt;p&gt;​&lt;/p&gt;   &lt;p&gt;def base64URLde(s):&lt;/p&gt;   &lt;p&gt;    t0=s.replace(&amp;apos;-&amp;apos;,&amp;apos;+&amp;apos;).replace(&amp;apos;_&amp;apos;,&amp;apos;/&amp;apos;)&lt;/p&gt;   &lt;p&gt;    t1=t0+&amp;apos;=&amp;apos;*(4-len(t0)%4)%4&lt;/p&gt;   &lt;p&gt;    return b64decode(t1)&lt;/p&gt;&lt;/code&gt;&lt;/pre&gt;
 &lt;p&gt;&lt;/p&gt;
 &lt;h3&gt;Payload&lt;/h3&gt;
 &lt;p&gt;使用一个JSON格式字符串描述所要声明的信息，分为registered，public，状语从句：private三类，形如{“name”: “John Doe”, “admin”: true}，具体信息可参考RFC7519的JWT要求部分。&lt;/p&gt;
 &lt;p&gt;同样的，该字符串经过Base64Url编码形成JWT的第二部分yyyyy。&lt;/p&gt;
 &lt;h3&gt;Signature&lt;/h3&gt;
 &lt;p&gt;将xxxxx.yyyyy使用alg指定的算法加密，然后再Base64Url编码得到JWT的第三部分zzzzz。所支持的算法类型取决于实现，但HS256和none是强制要求实现的。&lt;/p&gt;
 &lt;h2&gt;JWT Tool&lt;/h2&gt;
 &lt;p&gt;简而言之，Jwt_tool.py这个工具及可以用来验证、伪造和破解JWT令牌。&lt;/p&gt;
 &lt;p&gt;其功能包括：&lt;/p&gt;
 &lt;blockquote&gt;  &lt;p&gt;1、 检测令牌的有效性；&lt;/p&gt;
  &lt;p&gt;2、 测试RS/HS256公钥错误匹配漏洞；&lt;/p&gt;
  &lt;p&gt;3、 测试alg=None签名绕过漏洞；&lt;/p&gt;
  &lt;p&gt;4、 测试密钥/密钥文件的有效性；&lt;/p&gt;
  &lt;p&gt;5、 通过高速字典攻击识别弱密钥；&lt;/p&gt;
  &lt;p&gt;6、 伪造新的令牌Header和Payload值，并使用密钥创建新的签名；&lt;/p&gt;
&lt;/blockquote&gt;
 &lt;h3&gt;适用范围&lt;/h3&gt;
 &lt;p&gt;该工具专为渗透测试人员设计，可用于检测令牌的安全等级，并检测可能的攻击向量。当然了，广大研究人员也可以用它来对自己使用了JWT的项目进行安全测评以及稳定性测评。&lt;/p&gt;
 &lt;h3&gt;工具要求&lt;/h3&gt;
 &lt;p&gt;本工具采用原生Python 2.x开发，使用的都是常用Python库。大家可以在字典攻击选项中配置自定义字典文件。&lt;/p&gt;
 &lt;h2&gt;工具安装&lt;/h2&gt;
 &lt;p&gt;大家可以直接下载代码库中的jwt_tool.py文件，或使用下列命令将代码库克隆至本地：&lt;/p&gt;
 &lt;pre&gt;  &lt;code&gt;git clone https://github.com/ticarpi/jwt_tool.git&lt;/code&gt;&lt;/pre&gt;
 &lt;h2&gt;工具使用&lt;/h2&gt;
 &lt;pre&gt;  &lt;code&gt;$python jwt_tool.py &amp;lt;JWT&amp;gt; (filename)&lt;/code&gt;&lt;/pre&gt;
 &lt;p&gt;第一个参数就是JWT本身，后面需要跟一个文件名或文件路径。&lt;/p&gt;
 &lt;p&gt;  &lt;strong&gt;样例：&lt;/strong&gt;&lt;/p&gt;
 &lt;pre&gt;  &lt;code&gt;$python jwt_tool.pyeyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJsb2dpbiI6InRpY2FycGkifQ.aqNCvShlNT9jBFTPBpHDbt2gBB1MyHiisSDdp8SQvgw/usr/share/wordlists/rockyou.txt&lt;/code&gt;&lt;/pre&gt;
 &lt;p&gt;本工具将会验证令牌的有效性，并输出Header和Payload的值。接下来，它会给用户提供可用的菜单选项。输入值可以为标准JWT格式或url-safe模式的JWT格式。&lt;/p&gt;
 &lt;h3&gt;使用提示&lt;/h3&gt;
 &lt;p&gt;大家还可以在Burp Search中使用正则表达式来寻找JWT（请确保开启了“大小写敏感“和“正则表达式”选项）：&lt;/p&gt;
 &lt;p&gt;&lt;/p&gt;
 &lt;pre&gt;  &lt;code&gt;   &lt;p&gt;[=]ey[A-Za-z0-9_-]*\.[A-Za-z0-9._-]* - url-safe JWT version&lt;/p&gt;   &lt;p&gt;[=]ey[A-Za-z0-9_\/+-]*\.[A-Za-z0-9._\/+-]* - all JWT versions&lt;/p&gt;&lt;/code&gt;&lt;/pre&gt;
 &lt;p&gt;&lt;/p&gt;
 &lt;h2&gt;项目地址&lt;/h2&gt;
 &lt;p&gt;JWT Tool：【  &lt;a href="https://github.com/ticarpi/jwt_tool"&gt;GitHub传送门&lt;/a&gt;】&lt;/p&gt;
 &lt;h2&gt;参考资料&lt;/h2&gt;
 &lt;blockquote&gt;  &lt;p&gt;1、    &lt;a href="https://jwt.io/introduction/"&gt;https://jwt.io/introduction/&lt;/a&gt;&lt;/p&gt;
  &lt;p&gt;2、    &lt;a href="https://auth0.com/blog/critical-vulnerabilities-in-json-web-token-libraries/"&gt;https://auth0.com/blog/critical-vulnerabilities-in-json-web-token-libraries/&lt;/a&gt;&lt;/p&gt;
  &lt;p&gt;3、    &lt;a href="https://www.ticarpi.com/introducing-jwt-tool/"&gt;https://www.ticarpi.com/introducing-jwt-tool/&lt;/a&gt;&lt;/p&gt;
  &lt;p&gt;4、    &lt;a href="https://pentesterlab.com/exercises/jwt"&gt;https://pentesterlab.com/exercises/jwt&lt;/a&gt;&lt;/p&gt;
  &lt;p&gt;5、    &lt;a href="https://pentesterlab.com/exercises/jwt_ii"&gt;https://pentesterlab.com/exercises/jwt_ii&lt;/a&gt;&lt;/p&gt;
  &lt;p&gt;6、    &lt;a href="https://pentesterlab.com/exercises/jwt_iii"&gt;https://pentesterlab.com/exercises/jwt_iii&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
 &lt;p&gt;  &lt;strong&gt; * 参考来源：   &lt;a href="https://github.com/ticarpi/jwt_tool"&gt;ticarpi&lt;/a&gt;，FB小编Alpha_h4ck编译，转载请注明来自FreeBuf.COM&lt;/strong&gt;&lt;/p&gt;
&lt;div&gt; &lt;a href="https://itindex.net/"  title="IT 资讯"&gt;&lt;img src="https://itindex.net/images/iconWarning.gif" title="IT 资讯" border="0"/&gt; &lt;/a&gt;</description>
      <category>工具 JSON JWT Web Token 测试工具</category>
      <guid isPermaLink="true">https://itindex.net/detail/59797-jwt-tool-json</guid>
      <pubDate>Sun, 07 Jul 2019 15:00:42 CST</pubDate>
    </item>
    <item>
      <title>Web 日志安全分析技巧</title>
      <link>https://itindex.net/detail/59741-web-%E6%97%A5%E5%BF%97-%E5%AE%89%E5%85%A8</link>
      <description>&lt;div&gt;  &lt;h3&gt;ox01  Web日志&lt;/h3&gt;  &lt;p&gt;Web访问日志记录了Web服务器接收处理请求及运行时错误等各种原始信息。通过对WEB日志进行的安全分析，不仅可以帮助我们定位攻击者，还可以帮助我们还原攻击路径，找到网站存在的安全漏洞并进行修复。&lt;/p&gt;  &lt;p&gt;我们来看一条Apache的访问日志：&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;/li&gt;&lt;/ul&gt;  &lt;pre&gt;   &lt;code&gt;127.0.0.1- - [11/Jun/2018:12:47:22+0800]&amp;quot;GET /login.html HTTP/1.1&amp;quot;200786&amp;quot;-&amp;quot;&amp;quot;Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.139 Safari/537.36&amp;quot;&lt;/code&gt;&lt;/pre&gt;  &lt;p&gt;通过这条Web访问日志，我们可以清楚的得知用户在什么IP、什么时间、用什么操作系统、什么浏览器的情况下访问了你网站的哪个页面，是否访问成功。&lt;/p&gt;  &lt;p&gt;本文通过介绍Web日志安全分析时的思路和常用的一些技巧。&lt;/p&gt;  &lt;h3&gt;0x02 日志分析技巧&lt;/h3&gt;  &lt;p&gt;在对WEB日志进行安全分析时，一般可以按照两种思路展开，逐步深入，还原整个攻击过程。&lt;/p&gt;  &lt;p&gt;第一种：确定入侵的时间范围，以此为线索，查找这个时间范围内可疑的日志，进一步排查，最终确定攻击者，还原攻击过程。&lt;/p&gt;  &lt;p&gt;第二种：攻击者在入侵网站后，通常会留下后门维持权限，以方便再次访问，我们可以找到该文件，并以此为线索来展开分析。&lt;/p&gt;  &lt;p&gt;常用分析工具：&lt;/p&gt;  &lt;p&gt;Window下，推荐用 EmEditor 进行日志分析，支持大文本，搜索效率还不错。&lt;/p&gt;  &lt;p&gt;Linux下，使用Shell命令组合查询分析。&lt;/p&gt;  &lt;p&gt;Shell+Linux命令实现日志分析，一般结合grep、awk等命令等实现了几个常用的日志分析统计技巧。&lt;/p&gt;  &lt;p&gt;Apache日志分析技巧：&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;/li&gt;   &lt;li&gt;&lt;/li&gt;   &lt;li&gt;&lt;/li&gt;   &lt;li&gt;&lt;/li&gt;   &lt;li&gt;&lt;/li&gt;   &lt;li&gt;&lt;/li&gt;   &lt;li&gt;&lt;/li&gt;   &lt;li&gt;&lt;/li&gt;   &lt;li&gt;&lt;/li&gt;   &lt;li&gt;&lt;/li&gt;   &lt;li&gt;&lt;/li&gt;   &lt;li&gt;&lt;/li&gt;   &lt;li&gt;&lt;/li&gt;   &lt;li&gt;&lt;/li&gt;   &lt;li&gt;&lt;/li&gt;   &lt;li&gt;&lt;/li&gt;   &lt;li&gt;&lt;/li&gt;   &lt;li&gt;&lt;/li&gt;   &lt;li&gt;&lt;/li&gt;   &lt;li&gt;&lt;/li&gt;   &lt;li&gt;&lt;/li&gt;   &lt;li&gt;&lt;/li&gt;   &lt;li&gt;&lt;/li&gt;&lt;/ul&gt;  &lt;pre&gt;   &lt;code&gt;1、列出当天访问次数最多的IP命令：&lt;/code&gt;   &lt;code&gt;cut -d- -f1log_file|uniq -c |sort-rn | head -20&lt;/code&gt;   &lt;code&gt;    &lt;br /&gt;&lt;/code&gt;   &lt;code&gt;2、查看当天有多少个IP访问：&lt;/code&gt;   &lt;code&gt;awk&amp;apos;{print $1}&amp;apos;log_file|sort|uniq|wc -l&lt;/code&gt;   &lt;code&gt;    &lt;br /&gt;&lt;/code&gt;   &lt;code&gt;3、查看某一个页面被访问的次数：&lt;/code&gt;   &lt;code&gt;grep &amp;quot;/index.php&amp;quot; log_file |wc -l&lt;/code&gt;   &lt;code&gt;    &lt;br /&gt;&lt;/code&gt;   &lt;code&gt;4、查看每一个IP访问了多少个页面：&lt;/code&gt;   &lt;code&gt;awk&amp;apos;{++S[$1]} END {for (a in S) print a,S[a]}&amp;apos;log_file&lt;/code&gt;   &lt;code&gt;    &lt;br /&gt;&lt;/code&gt;   &lt;code&gt;5、将每个IP访问的页面数进行从小到大排序：&lt;/code&gt;   &lt;code&gt;awk&amp;apos;{++S[$1]} END {for (a in S) print S[a],a}&amp;apos;log_file |sort-n&lt;/code&gt;   &lt;code&gt;    &lt;br /&gt;&lt;/code&gt;   &lt;code&gt;6、查看某一个IP访问了哪些页面：&lt;/code&gt;   &lt;code&gt;grep^111.111.111.111log_file| awk&amp;apos;{print $1,$7}&amp;apos;&lt;/code&gt;   &lt;code&gt;    &lt;br /&gt;&lt;/code&gt;   &lt;code&gt;7、去掉搜索引擎统计当天的页面：&lt;/code&gt;   &lt;code&gt;awk&amp;apos;{print $12,$1}&amp;apos;log_file |grep^\&amp;quot;Mozilla | awk &amp;apos;{print $2}&amp;apos; |sort | uniq | wc -l&lt;/code&gt;   &lt;code&gt;    &lt;br /&gt;&lt;/code&gt;   &lt;code&gt;8、查看2018年6月21日14时这一个小时内有多少IP访问:&lt;/code&gt;   &lt;code&gt;awk &amp;apos;{print $4,$1}&amp;apos; log_file | grep 21/Jun/2018:14 | awk &amp;apos;{print $2}&amp;apos;| sort | uniq | wc -l&lt;/code&gt;&lt;/pre&gt;  &lt;p&gt;&lt;/p&gt;  &lt;h3&gt;0x03 日志分析案例&lt;/h3&gt;  &lt;p&gt;Web日志分析实例：通过nginx代理转发到内网某服务器，内网服务器某站点目录下被上传了多个图片木马，虽然II7下不能解析，但还是想找出谁通过什么路径上传的。&lt;/p&gt;  &lt;p&gt;在这里，我们遇到了一个问题：由于设置了代理转发，只记录了代理服务器的ip，并没有记录访问者IP？这时候，如何去识别不同的访问者和攻击源呢？&lt;/p&gt;  &lt;p&gt;这是管理员日志配置不当的问题，但好在我们可以通过浏览器指纹来定位不同的访问来源，还原攻击路径。&lt;/p&gt;  &lt;p&gt;1、定位攻击源&lt;/p&gt;  &lt;p&gt;首先访问图片木马的记录，只找到了一条，由于所有访问日志只记录了代理IP，并不能通过IP来还原攻击路径，这时候，可以利用浏览器指纹来定位。&lt;/p&gt;  &lt;p&gt;   &lt;img&gt;&lt;/img&gt;&lt;/p&gt;  &lt;p&gt;浏览器指纹：&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;/li&gt;&lt;/ul&gt;  &lt;pre&gt;   &lt;code&gt;Mozilla/4.0+(compatible;+MSIE+7.0;+Windows+NT+6.1;+WOW64;+Trident/7.0;+SLCC2;+.NET+CLR+2.0.50727;+.NET+CLR+3.5.30729;+.NET+CLR+3.0.30729;+.NET4.0C;+.NET4.0E)&lt;/code&gt;&lt;/pre&gt;  &lt;p&gt;2、搜索相关日志记录&lt;/p&gt;  &lt;p&gt;通过筛选与该浏览器指纹有关的日志记录，可以清晰地看到攻击者的攻击路径。&lt;/p&gt;  &lt;p&gt;   &lt;img&gt;&lt;/img&gt;&lt;/p&gt;  &lt;p&gt;3、对找到的访问日志进行解读，攻击者大致的访问路径如下：&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;/li&gt;   &lt;li&gt;&lt;/li&gt;   &lt;li&gt;&lt;/li&gt;   &lt;li&gt;&lt;/li&gt;   &lt;li&gt;&lt;/li&gt;&lt;/ul&gt;  &lt;pre&gt;   &lt;code&gt;A、攻击者访问首页和登录页&lt;/code&gt;   &lt;code&gt;B、攻击者访问MsgSjlb.aspx和MsgSebd.aspx&lt;/code&gt;   &lt;code&gt;C、攻击者访问Xzuser.aspx&lt;/code&gt;   &lt;code&gt;D、攻击者多次POST（怀疑通过这个页面上传模块缺陷）&lt;/code&gt;   &lt;code&gt;E、攻击者访问了图片木马&lt;/code&gt;&lt;/pre&gt;  &lt;p&gt;打开网站，访问Xzuser.aspx，确认攻击者通过该页面的进行文件上传了图片木马，同时，发现网站了存在越权访问漏洞，攻击者访问特定URL，无需登录即可进入后台界面。通过日志分析找到网站的漏洞位置并进行修复。&lt;/p&gt;  &lt;h3&gt;0x04 日志统计分析技巧&lt;/h3&gt;  &lt;p&gt;统计爬虫：&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;/li&gt;&lt;/ul&gt;  &lt;pre&gt;   &lt;code&gt;grep-E&amp;apos;Googlebot|Baiduspider&amp;apos;/www/logs/access.2019-02-23.log | awk&amp;apos;{ print$1}&amp;apos;| sort | uniq&lt;/code&gt;&lt;/pre&gt;  &lt;p&gt;统计浏览器：   &lt;br /&gt;&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;/li&gt;&lt;/ul&gt;  &lt;pre&gt;   &lt;code&gt;cat /www/logs/access.2019-02-23.log| grep -v -E &amp;apos;MSIE|Firefox|Chrome|Opera|Safari|Gecko|Maxthon&amp;apos; |sort| uniq -c |sort -r -n| head -n 100&lt;/code&gt;&lt;/pre&gt;  &lt;p&gt;IP 统计：&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;/li&gt;   &lt;li&gt;&lt;/li&gt;   &lt;li&gt;&lt;/li&gt;   &lt;li&gt;&lt;/li&gt;   &lt;li&gt;&lt;/li&gt;   &lt;li&gt;&lt;/li&gt;   &lt;li&gt;&lt;/li&gt;   &lt;li&gt;&lt;/li&gt;   &lt;li&gt;&lt;/li&gt;   &lt;li&gt;&lt;/li&gt;   &lt;li&gt;&lt;/li&gt;&lt;/ul&gt;  &lt;pre&gt;   &lt;code&gt;grep&amp;apos;23/May/2019&amp;apos;/www/logs/access.2019-02-23.log | awk&amp;apos;{print$1}&amp;apos;| awk -F&amp;apos;.&amp;apos;&amp;apos;{print$1&amp;quot;.&amp;quot;$2&amp;quot;.&amp;quot;$3&amp;quot;.&amp;quot;$4}&amp;apos;| sort | uniq -c | sort -r -n | head -n10&lt;/code&gt;   &lt;code&gt;2206219.136.134.13&lt;/code&gt;   &lt;code&gt;1497182.34.15.248&lt;/code&gt;   &lt;code&gt;1431211.140.143.100&lt;/code&gt;   &lt;code&gt;1431119.145.149.106&lt;/code&gt;   &lt;code&gt;142761.183.15.179&lt;/code&gt;   &lt;code&gt;1427218.6.8.189&lt;/code&gt;   &lt;code&gt;1422124.232.150.171&lt;/code&gt;   &lt;code&gt;1421106.187.47.224&lt;/code&gt;   &lt;code&gt;142061.160.220.252&lt;/code&gt;   &lt;code&gt;1418114.80.201.18&lt;/code&gt;&lt;/pre&gt;  &lt;p&gt;统计网段：   &lt;br /&gt;&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;/li&gt;&lt;/ul&gt;  &lt;pre&gt;   &lt;code&gt;cat/www/logs/access.2019-02-23.log | awk&amp;apos;{print$1}&amp;apos;| awk -F&amp;apos;.&amp;apos;&amp;apos;{print$1&amp;quot;.&amp;quot;$2&amp;quot;.&amp;quot;$3&amp;quot;.0&amp;quot;}&amp;apos;| sort | uniq -c | sort -r -n | head -n200&lt;/code&gt;&lt;/pre&gt;  &lt;p&gt;统计域名：&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;/li&gt;&lt;/ul&gt;  &lt;pre&gt;   &lt;code&gt;cat  /www/logs/access.2019-02-23.log |awk &amp;apos;{print$2}&amp;apos;|sort|uniq -c|sort-rn|more&lt;/code&gt;&lt;/pre&gt;  &lt;pre&gt;HTTP 状态：   &lt;br /&gt;&lt;/pre&gt;  &lt;ul&gt;   &lt;li&gt;&lt;/li&gt;   &lt;li&gt;&lt;/li&gt;   &lt;li&gt;&lt;/li&gt;   &lt;li&gt;&lt;/li&gt;   &lt;li&gt;&lt;/li&gt;&lt;/ul&gt;  &lt;pre&gt;   &lt;code&gt;cat/www/logs/access.2019-02-23.log |awk &amp;apos;{print $9}&amp;apos;|sort|uniq -c|sort -rn|more&lt;/code&gt;   &lt;code&gt;5056585304&lt;/code&gt;   &lt;code&gt;1125579200&lt;/code&gt;   &lt;code&gt;7602400&lt;/code&gt;   &lt;code&gt;5301&lt;/code&gt;&lt;/pre&gt;  &lt;p&gt;URL 统计：&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;/li&gt;&lt;/ul&gt;  &lt;pre&gt;   &lt;code&gt;cat  /www/logs/access.2019-02-23.log |awk &amp;apos;{print$7}&amp;apos;|sort|uniq -c|sort-rn|more&lt;/code&gt;&lt;/pre&gt;  &lt;p&gt;文件流量统计：&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;/li&gt;   &lt;li&gt;&lt;/li&gt;&lt;/ul&gt;  &lt;pre&gt;   &lt;code&gt;cat /www/logs/access.2019-02-23.log |awk &amp;apos;{sum[$7]+=$10}END{for(i in sum){print sum[i],i}}&amp;apos;|sort -rn|more&lt;/code&gt;   &lt;code&gt;grep&amp;apos; 200 &amp;apos;/www/logs/access.2019-02-23.log |awk&amp;apos;{sum[$7]+=$10}END{for(i in sum){print sum[i],i}}&amp;apos;|sort -rn|more&lt;/code&gt;&lt;/pre&gt;  &lt;p&gt;URL访问量统计：&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;/li&gt;&lt;/ul&gt;  &lt;pre&gt;   &lt;code&gt;cat/www/logs/access.2019-02-23.log | awk&amp;apos;{print$7}&amp;apos;| egrep&amp;apos;\?|&amp;amp;&amp;apos;| sort | uniq -c | sort -rn | more&lt;/code&gt;&lt;/pre&gt;  &lt;p&gt;脚本运行速度：&lt;/p&gt;  &lt;p&gt;查出运行速度最慢的脚本&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;/li&gt;&lt;/ul&gt;  &lt;pre&gt;   &lt;code&gt;grep-v0$ /www/logs/access.2019-02-23.log | awk -F&amp;apos;\&amp;quot; &amp;apos;&amp;apos;{print$4&amp;quot; &amp;quot;$1}&amp;apos;web.log | awk&amp;apos;{print$1&amp;quot; &amp;quot;$8}&amp;apos;| sort -n -k1-r | uniq &amp;gt; /tmp/slow_url.txt&lt;/code&gt;&lt;/pre&gt;  &lt;p&gt;IP, URL 抽取：&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;/li&gt;&lt;/ul&gt;  &lt;pre&gt;   &lt;code&gt;tail-f /www/logs/access.2019-02-23.log | grep&amp;apos;/test.html&amp;apos;| awk&amp;apos;{print$1&amp;quot; &amp;quot;$7}&amp;apos;&lt;/code&gt;&lt;/pre&gt;  &lt;p&gt;   &lt;strong&gt;我创建了一个免费的小密圈，    &lt;strong&gt;诚邀你一起加入分享知识。&lt;/strong&gt;&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;   &lt;img&gt;&lt;/img&gt;&lt;/p&gt;&lt;/div&gt;&lt;div&gt; &lt;a href="https://itindex.net/"  title="IT 资讯"&gt;&lt;img src="https://itindex.net/images/iconWarning.gif" title="IT 资讯" border="0"/&gt; &lt;/a&gt;</description>
      <category>dev</category>
      <guid isPermaLink="true">https://itindex.net/detail/59741-web-%E6%97%A5%E5%BF%97-%E5%AE%89%E5%85%A8</guid>
      <pubDate>Tue, 25 Jun 2019 00:00:00 CST</pubDate>
    </item>
    <item>
      <title>让前端开发者失业的技术，Flutter Web初体验</title>
      <link>https://itindex.net/detail/59622-%E5%89%8D%E7%AB%AF-%E5%BC%80%E5%8F%91-%E5%A4%B1%E4%B8%9A</link>
      <description>&lt;blockquote&gt;Flutter是一种新型的“客户端”技术。它的最终目标是替代包含几乎所有平台的开发：iOS，Android，Web，桌面；做到了一次编写，多处运行。掌握Flutter web可能是Web前端开发者翻盘的唯一机会。&lt;/blockquote&gt;
 &lt;p&gt;  &lt;img alt="&amp;#22270;&amp;#29255;&amp;#25551;&amp;#36848;" src="https://segmentfault.com/img/bVbsZew?w=800&amp;h=492" title="&amp;#22270;&amp;#29255;&amp;#25551;&amp;#36848;"&gt;&lt;/img&gt;&lt;/p&gt;
 &lt;p&gt;在前些日子举办的Google IO 2019 年度开发者大会上，Flutter web作为一个很亮眼的技术受到了开发者的追捧。这是继Flutter支持Android、IOS等设备之后，又一个里程碑式的版本，后续还会支持windows、linux、Macos、chroms等其他嵌入式设备。Flutter本身是一个类似于RN、WEEX、hHybrid等多端统一跨平台解决方案，真正做到了一次编写，多处运行，它的发展超出了很多人的想象，值得前端开发者去关注，今天我们来体验一下Flutter Web。&lt;/p&gt;
 &lt;h2&gt;概览&lt;/h2&gt;
 &lt;p&gt;先了解一下Flutter， 它是一个由谷歌开发的开源移动应用软件开发工具包，用于为Android和iOS开发应用，同时也将是Google Fuchsia下开发应用的主要工具。自从FLutter 1.5.4版本之后，支持了Web端的开发。它采用Dart语言来进行开发，与JavaScript相比，Dart在 JIT（即时编译）模式下，速度与 JavaScript基本持平。但是当Dart以 AOT模式运行时，Dart性能要高于JavaScript。&lt;/p&gt;
 &lt;p&gt;Flutter内置了UI界面，与Hybrid App、React Native这些跨平台技术不同，Flutter既没有使用WebView，也没有使用各个平台的原生控件，而是本身实现一个统一接口的渲染引擎来绘制UI，Dart直接编译成了二进制文件，这样做可以保证不同平台UI的一致性。它也可以复用Java、Kotlin、Swift或OC代码，访问Android和iOS上的原生系统功能，比如蓝牙、相机、WiFi等等。我们公司的Now直播、企鹅辅导等项目、阿里的闲鱼等商业化项目已经大量在使用。&lt;/p&gt;
 &lt;h2&gt;架构&lt;/h2&gt;
 &lt;p&gt;  &lt;img alt="Flutter &amp;#30340; Mobile &amp;#26550;&amp;#26500;" src="https://segmentfault.com/img/bVbsZeN?w=960&amp;h=540" title="Flutter &amp;#30340; Mobile &amp;#26550;&amp;#26500;"&gt;&lt;/img&gt;&lt;/p&gt;
 &lt;p&gt;Flutter的顶层是用drat编写的框架，包含Material（Android风格UI）和Cupertino（iOS风格）的UI界面，下面是通用的Widgets（组件），之后是一些动画、绘制、渲染、手势库等。  &lt;br /&gt;框架下面是引擎，主要用C / C ++编写，引擎包含三个核心库，Skia是Flutter的2D渲染引擎，它是Google的一个2D图形处理函数库，包含字型、坐标转换，以及点阵图，都有高效能且简洁的表现。Skia是跨平台的，并提供了非常友好的API。第二是Dart 运行时环境以及第三文本渲染布局引擎。  &lt;br /&gt;最底层的嵌入层，它所关心的是如何将图片组合到屏幕上，渲染变成像素。这一层的功能是用来解决跨平台的。&lt;/p&gt;
 &lt;p&gt;了解了FLutter 之后，我来说一下今天的重头戏，Flutter for Web。要想知道Flutter为什么能在web上运行，得先来看看它的架构。&lt;/p&gt;
 &lt;p&gt;  &lt;img alt="Flutter &amp;#30340; web&amp;#26550;&amp;#26500;" src="https://segmentfault.com/img/bVbsZeU?w=800&amp;h=327" title="Flutter &amp;#30340; web&amp;#26550;&amp;#26500;"&gt;&lt;/img&gt;&lt;/p&gt;
 &lt;p&gt;通过对比，可以发现，web框架层和mobile的几乎一模一样。因此只需要重新实现一下引擎和嵌入层，不用变动Flutter API就可以完全可以将UI代码从Android / IOS Flutter App移植到Web。Dart能够使用Dart2Js编译器把Dart代码编译成Js代码。大多数原生App元素能够通过DOM实现，DOM实现不了的元素可以通过Canvas来实现。&lt;/p&gt;
 &lt;h2&gt;安装&lt;/h2&gt;
 &lt;p&gt;Flutter Web开发环境搭建，以我的windows环境为例进行讲解，其他环境类似，安装环境比较繁琐，需要耐心，有Android开发经验最好。&lt;/p&gt;
 &lt;h3&gt;1、在  &lt;strong&gt;Windows平台&lt;/strong&gt;开发的话，官方的环境要求是Windows 7 SP1或更高版本（64位）。&lt;/h3&gt;
 &lt;h3&gt;2、  &lt;strong&gt;Java环境&lt;/strong&gt;，安装Java 1.8 + 版本之上，并配置环境变量，因为android开发依赖Java环境。&lt;/h3&gt;
 &lt;p&gt;对于Java程序开发而言，主要会使用JDK的两个命令：javac.exe、java.exe。路径：C:Javajdk1.8.0_181bin。但是这些命令由于不属于windows自己的命令，所以要想使用，就需要进行路径配置。单击“计算机-属性-高级系统设置”，单击“环境变量”。在“系统变量”栏下单击“新建”，创建新的系统环境变量（或用户变量，等效）。&lt;/p&gt;
 &lt;p&gt;  &lt;img alt="&amp;#22270;&amp;#29255;&amp;#25551;&amp;#36848;" src="https://segmentfault.com/img/bVbsZfv?w=561&amp;h=529" title="&amp;#22270;&amp;#29255;&amp;#25551;&amp;#36848;"&gt;&lt;/img&gt;&lt;/p&gt;
 &lt;p&gt;(1)新建-&amp;gt;变量名&amp;quot;JAVA_HOME&amp;quot;，变量值&amp;quot;C:Javajdk1.8.0_181&amp;quot;（即JDK的安装路径）   &lt;br /&gt;(2)编辑-&amp;gt;变量名&amp;quot;Path&amp;quot;，在原变量值的最后面加上“;%JAVA_HOME%bin;%JAVA_HOME%jrebin”   &lt;br /&gt;(3)新建-&amp;gt;变量名“CLASSPATH”,变量值“.;%JAVA_HOME%lib;%JAVA_HOME%libdt.jar;%JAVA_HOME%libtools.jar”&lt;/p&gt;
 &lt;h3&gt;3、  &lt;strong&gt;Android Studio编辑器&lt;/strong&gt;，安装Android Studio, 3.0或更高版本。我们需要用它来导入Android license和管理Android SDK以及Android虚拟机。（默认安装即可）&lt;/h3&gt;
 &lt;p&gt;安装完成之后设置代理，左上角的File-》setting-》搜索proxy，设置公司代理，用来加速下载Android SDK。&lt;/p&gt;
 &lt;p&gt;  &lt;img alt="&amp;#22270;&amp;#29255;&amp;#25551;&amp;#36848;" src="https://segmentfault.com/img/bVbsZfL?w=470&amp;h=387" title="&amp;#22270;&amp;#29255;&amp;#25551;&amp;#36848;"&gt;&lt;/img&gt;&lt;/p&gt;
 &lt;p&gt;之后点击右上角方盒按钮（SDK Manager），用来选择安装SDK版本，最好选Android 9版本，API28，会有一个很长时间的下载过程。SDK是开发必须的代码库。默认情况下，Flutter使用的Android SDK版本是基于你的 adb （Android Debug Bridge，管理连接手机，已打包在SDK）工具版本。 如果您想让Flutter使用不同版本的Android SDK，则必须将该 ANDROID_HOME 环境变量设置为SDK安装目录。&lt;/p&gt;
 &lt;p&gt;  &lt;img alt="&amp;#22270;&amp;#29255;&amp;#25551;&amp;#36848;" src="https://segmentfault.com/img/bVbsZf9?w=514&amp;h=357" title="&amp;#22270;&amp;#29255;&amp;#25551;&amp;#36848;"&gt;&lt;/img&gt;&lt;/p&gt;
 &lt;p&gt;右上角有个小手机类型的按钮（AVD Manager），用来设置Android模拟器，创建一个虚拟机。如果你有一台安卓手机，也可以连接USB接口，替代虚拟机。这个过程是调试必须的。安装完成之后，在 AVD (Android Virtual Device Manager) 中，点击工具栏的 Run。模拟器启动并显示所选操作系统版本或设备的启动画面。代表了正确安装。&lt;/p&gt;
 &lt;p&gt;  &lt;img alt="&amp;#22270;&amp;#29255;&amp;#25551;&amp;#36848;" src="https://segmentfault.com/img/bVbsZgr?w=508&amp;h=344" title="&amp;#22270;&amp;#29255;&amp;#25551;&amp;#36848;"&gt;&lt;/img&gt;&lt;/p&gt;
 &lt;h3&gt;4、  &lt;strong&gt;安装Flutter SDK&lt;/strong&gt;
&lt;/h3&gt;
 &lt;p&gt;下载Flutter SDK有多种方法，看看哪种更适合自己：  &lt;br /&gt;Flutter官网下载最新Beta版本的进行安装：  &lt;a href="https://flutter.dev/docs/development/tools/sdk/releases" rel="nofollow noreferrer"&gt;https://flutter.dev/docs/deve...&lt;/a&gt;  &lt;br /&gt;也可Flutter github项目中去下载，地址为：  &lt;a href="https://github.com/flutter/flutter/releases" rel="nofollow noreferrer"&gt;https://github.com/flutter/fl...&lt;/a&gt;  &lt;br /&gt;版本越新越好，不要低于1.5.4。&lt;/p&gt;
 &lt;p&gt;将安装包zip解压到你想安装Flutter SDK的路径（如：C:srcflutter；注意，不要将flutter安装到需要一些高权限的路径如C:Program Files）。记住，之后往环境变量的path中添加；C:srcflutterbin，以便于你能在命令行中使用flutter。&lt;/p&gt;
 &lt;p&gt;使用镜像  &lt;br /&gt;由于在国内安装Flutter相关的依赖可能会受到限制，Flutter官方为中国开发者搭建了临时镜像，大家可以将如下环境变量加入到用户环境变量中：  &lt;br /&gt;  &lt;code&gt;PUB_HOSTED_URL：https://pub.flutter-io.cn&lt;/code&gt;  &lt;br /&gt;  &lt;code&gt;FLUTTER_STORAGE_BASE_URL： https://storage.flutter-io.cn&lt;/code&gt;&lt;/p&gt;
 &lt;p&gt;  &lt;img alt="&amp;#22270;&amp;#29255;&amp;#25551;&amp;#36848;" src="https://segmentfault.com/img/bVbsZgW?w=394&amp;h=406" title="&amp;#22270;&amp;#29255;&amp;#25551;&amp;#36848;"&gt;&lt;/img&gt;&lt;/p&gt;
 &lt;h3&gt;5、安装Dart与Pub。安装webdev、stagehand&lt;/h3&gt;
 &lt;p&gt;Pub是Dart的包管理工具，类似npm，捆绑安装。  &lt;br /&gt;Dart安装版地址：  &lt;a href="http://www.gekorm.com/dart-windows/" rel="nofollow noreferrer"&gt;http://www.gekorm.com/dart-wi...&lt;/a&gt;  &lt;br /&gt;默认安装即可，安装之后记住Dart的路径，并且配置到环境变量path中，以便于可以在命令行中使用dart与pub，默认的路径是：C:Program FilesDartdart-sdkbin  &lt;br /&gt;先安装stagehand，stagehand是创建项目必须的工具。查看一下  &lt;code&gt;C:\Users\chunpengliu\AppData\Roaming\Pub\Cache\bin&lt;/code&gt;目录下是否包含stagehand和webdev，如果有，添加到环境变量的path里面，如果没有，按下面方法安装：&lt;/p&gt;
 &lt;pre&gt;  &lt;code&gt;pub global activate stagehand&lt;/code&gt;&lt;/pre&gt;
 &lt;p&gt;webdev是一个类似于Koa的web服务器，执行以下命令安装&lt;/p&gt;
 &lt;pre&gt;  &lt;code&gt;pub global activate webdev
# or
flutter packages pub global activate webdev&lt;/code&gt;&lt;/pre&gt;
 &lt;h3&gt;6、配置编辑器安装Flutter和Dart插件&lt;/h3&gt;
 &lt;p&gt;Flutter插件是用来支持Flutter开发工作流 (运行、调试、热重载等)。  &lt;br /&gt;Dart插件 提供代码分析 (输入代码时进行验证、代码补全等)。Android Studio的设置在File-》setting-》plugins-》搜索Flutter和Dart，安装之后重启。&lt;/p&gt;
 &lt;p&gt;  &lt;img alt="&amp;#22270;&amp;#29255;&amp;#25551;&amp;#36848;" src="https://segmentfault.com/img/bVbsZh7?w=754&amp;h=462" title="&amp;#22270;&amp;#29255;&amp;#25551;&amp;#36848;"&gt;&lt;/img&gt;&lt;/p&gt;
 &lt;p&gt;VS code的设置在extension-》搜索Flutter和Dart，安装之后重启。&lt;/p&gt;
 &lt;p&gt;  &lt;img alt="&amp;#22270;&amp;#29255;&amp;#25551;&amp;#36848;" src="https://segmentfault.com/img/bVbsZh8?w=511&amp;h=365" title="&amp;#22270;&amp;#29255;&amp;#25551;&amp;#36848;"&gt;&lt;/img&gt;&lt;/p&gt;
 &lt;h3&gt;7、运行 flutter doctor&lt;/h3&gt;
 &lt;p&gt;打开一个新的命令提示符或PowerShell窗口并运行以下命令以查看是否需要安装任何依赖项来完成安装：&lt;/p&gt;
 &lt;pre&gt;  &lt;code&gt;flutter doctor&lt;/code&gt;&lt;/pre&gt;
 &lt;p&gt; 这是一个漫长的过程，flutter会检测你的环境，并安装所有的依赖，直至：No issues found！，如果有缺失，会就会再那一项前面打x。你需要一一解决。&lt;/p&gt;
 &lt;p&gt;  &lt;img alt="&amp;#22270;&amp;#29255;&amp;#25551;&amp;#36848;" src="https://segmentfault.com/img/bVbsZiA?w=652&amp;h=201" title="&amp;#22270;&amp;#29255;&amp;#25551;&amp;#36848;"&gt;&lt;/img&gt;&lt;/p&gt;
 &lt;p&gt;一切就绪！&lt;/p&gt;
 &lt;h2&gt;创建应用&lt;/h2&gt;
 &lt;h3&gt;1、启动 VS Code&lt;/h3&gt;
 &lt;p&gt;调用 View&amp;gt;Command Palette…（快捷键ctrl+shift+p）  &lt;br /&gt;输入 ‘flutter’, 然后选择 ‘Flutter: New web Project’ &lt;/p&gt;
 &lt;p&gt;  &lt;img alt="&amp;#22270;&amp;#29255;&amp;#25551;&amp;#36848;" src="https://segmentfault.com/img/bVbsZiT?w=322&amp;h=158" title="&amp;#22270;&amp;#29255;&amp;#25551;&amp;#36848;"&gt;&lt;/img&gt;&lt;/p&gt;
 &lt;p&gt;输入 Project 名称 (如flutterweb), 然后按回车键  &lt;br /&gt;指定放置项目的位置，然后按蓝色的确定按钮  &lt;br /&gt;等待项目创建继续，并显示main.dart文件。到此，一个Demo创建完成。&lt;/p&gt;
 &lt;p&gt;  &lt;img alt="&amp;#22270;&amp;#29255;&amp;#25551;&amp;#36848;" src="https://segmentfault.com/img/bVbsZiW?w=954&amp;h=448" title="&amp;#22270;&amp;#29255;&amp;#25551;&amp;#36848;"&gt;&lt;/img&gt;&lt;/p&gt;
 &lt;p&gt;我们看到了熟悉的HTML文件以及项目入口文件main.dart。  &lt;br /&gt;web目录下的index.html是项目的入口文件。main.dart初始化文件，图片相关资源放在此目录。  &lt;br /&gt;lib目录下的main.dart，是主程序代码所在的地方。  &lt;br /&gt;每个pub包或者Flutter项目都包含一个pubspec.yaml。它包含与此项目相关的依赖项和元数据。  &lt;br /&gt;analysis_options.yaml是配置项目的lint规则。  &lt;br /&gt;/dart_tool 是项目打包运行编译生成的文件，页面主程序main.dart.js就在其中。&lt;/p&gt;
 &lt;h3&gt;2、调试Demo，打开命令行，进入到项目根目录，执行：&lt;/h3&gt;
 &lt;pre&gt;  &lt;code&gt;webdev flutterweb&lt;/code&gt;&lt;/pre&gt;
 &lt;p&gt; 编译、打包完成之后，自动启动（或者按F5）默认浏览器，看一下转换后的HTML页面结构：&lt;/p&gt;
 &lt;p&gt;  &lt;img alt="&amp;#22270;&amp;#29255;&amp;#25551;&amp;#36848;" src="https://segmentfault.com/img/bVbsZjv?w=736&amp;h=955" title="&amp;#22270;&amp;#29255;&amp;#25551;&amp;#36848;"&gt;&lt;/img&gt;&lt;/p&gt;
 &lt;p&gt;lib/main.dart是主程序，源码非常简单，整个页面用widgets堆叠而成，区别于传统的html和css。&lt;/p&gt;
 &lt;pre&gt;  &lt;code&gt;import &amp;apos;package:flutter_web/material.dart&amp;apos;;

void main() =&amp;gt; runApp(MyApp());

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: &amp;apos;Flutter Demo&amp;apos;,
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: MyHomePage(title: &amp;apos;Flutter Demo Home Page&amp;apos;),
    );
  }
}

class MyHomePage extends StatelessWidget {
  MyHomePage({Key key, this.title}) : super(key: key);

  final String title;

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text(title),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: &amp;lt;Widget&amp;gt;[
            Text(
              &amp;apos;Hello, World!&amp;apos;,
            ),
          ],
        ),
      ), 
    );
  }
}&lt;/code&gt;&lt;/pre&gt;
 &lt;p&gt;区别与flutter App应用，我们导入的是flutter_web/material.dart库而非flutter/material.dart，这是因为目前App的接口并非和Web的完全通用，不过随着谷歌开发的继续，它们最终会被合并到一块。  &lt;br /&gt;打开pubspec.yaml（类似于package.json）,可以看到只有两个依赖包flutter_web和flutter_web_ui，这两个都已在github上开源。dev的依赖页非常少，两个编译相关的包，和一个静态文件分析包。&lt;/p&gt;
 &lt;pre&gt;  &lt;code&gt;name: flutterweb
description: An app built using Flutter for web
environment:
  # You must be using Flutter &amp;gt;=1.5.0 or Dart &amp;gt;=2.3.0
  sdk: &amp;apos;&amp;gt;=2.3.0-dev.0.1 &amp;lt;3.0.0&amp;apos;
dependencies:
  flutter_web: any
  flutter_web_ui: any
dev_dependencies:
  build_runner: ^1.4.0
  build_web_compilers: ^2.0.0
  pedantic: ^1.0.0
dependency_overrides:
  flutter_web:
    git:
      url: https://github.com/flutter/flutter_web
      path: packages/flutter_web
  flutter_web_ui:
    git:
      url: https://github.com/flutter/flutter_web
      path: packages/flutter_web_ui&lt;/code&gt;&lt;/pre&gt;
 &lt;h2&gt;实战&lt;/h2&gt;
 &lt;p&gt;接下来，我们创建一个具有图文功能的下载，根据实例来学习flutter，我们将实现下图的页面。它是一个上下两栏的布局，下栏又分为左右两栏。&lt;/p&gt;
 &lt;p&gt;  &lt;img alt="&amp;#22270;&amp;#29255;&amp;#25551;&amp;#36848;" src="https://segmentfault.com/img/bVbsZki?w=1258&amp;h=666" title="&amp;#22270;&amp;#29255;&amp;#25551;&amp;#36848;"&gt;&lt;/img&gt;&lt;/p&gt;
 &lt;p&gt;第一步：更改主应用内容，打开lib/main.dart文件，替换class MyApp，首先是根组件MyApp，它是一个类组件继承自无状态组件，是项目的主题配置，在home属性中调用了Home组件：&lt;/p&gt;
 &lt;pre&gt;  &lt;code&gt;class MyApp extends StatelessWidget {
  // 应用的根组件
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: &amp;apos;腾讯新闻客户端下载页&amp;apos;, //meta 里的titile
      debugShowCheckedModeBanner: false, // 关闭调试bar
      theme: ThemeData(
        primarySwatch: Colors.blue, // 页面主题 Material风格
      ),
      home: Home(), // 启动首页
    );
  }
}&lt;/code&gt;&lt;/pre&gt;
 &lt;p&gt;第二步，在Home类中，是我们要渲染的页面顶导，运用了AppBar组件，它包括了一个居中的页面标题和居右的搜索按钮。文本可以像css一样设置外观样式。&lt;/p&gt;
 &lt;pre&gt;  &lt;code&gt;class Home extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      backgroundColor: Colors.white,
      appBar: AppBar(
        backgroundColor: Colors.white,
        elevation: 0.0,
        centerTitle: true,
        title: Text( // 中心文本
          &amp;quot;下载页&amp;quot;,
          style:
              TextStyle(color: Colors.black, fontSize: 16.0, fontWeight: FontWeight.w500),
        ),
// 搜索图标及特性
        actions: &amp;lt;Widget&amp;gt;[ 
          Padding(
            padding: const EdgeInsets.symmetric(horizontal: 20.0),
            child: Icon(
              Icons.search,
              color: Colors.black,
            ),
          )
        ],
      ),
//调用body渲染类，此处可以添加多个方法调用
      body: Stack(
        children: [
            Body() 
        ],
      ),
    );
  }
}&lt;/code&gt;&lt;/pre&gt;
 &lt;p&gt; 第三步，创建页面主体内容，一张图加多个文本，使用了文本组件和图片组件，页面结构采用了flex布局，由于两个Expanded的Flex值均为1，因此将在两个组件之间平均分配空间。SizedBox组件相当于一个空盒子，用来设置margin的距离&lt;/p&gt;
 &lt;pre&gt;  &lt;code&gt;class Body extends StatelessWidget {
  const Body({Key key}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return Row(
      crossAxisAlignment: CrossAxisAlignment.stretch,
      mainAxisAlignment: MainAxisAlignment.spaceBetween,
      children: &amp;lt;Widget&amp;gt;[
        Expanded( // 左侧
          flex: 1,
          child: Image.asset(// 图片组件
            &amp;quot;background-image.jpg&amp;quot;, // 这是一张在web/asserts/下的背景图
            fit: BoxFit.contain,
          ),
        ),
        const SizedBox(width: 90.0),
        Expanded( // 右侧
          flex:1,
          child: Column(
            mainAxisAlignment: MainAxisAlignment.center,
            crossAxisAlignment: CrossAxisAlignment.start,
            children: &amp;lt;Widget&amp;gt;[
              Text( // 文本组件
                &amp;quot;腾讯新闻&amp;quot;,
                style: TextStyle(
                    color: Colors.black, fontWeight: FontWeight.w600, fontSize: 50.0, fontFamily: &amp;apos;Merriweather&amp;apos;),
              ),
              const SizedBox(height: 14.0),// SizedBox用来增加间距
              Text(
                &amp;quot;腾讯新闻是腾讯公司为用户打造的一款全天候、全方位、及时报道的新闻产品，为用户提供高效优质的资讯、视频和直播服务。资讯超新超全，内容独家优质，话题评论互动。&amp;quot;,
                style: TextStyle(
                    color: Colors.black, fontWeight: FontWeight.w400, fontSize: 24.0, fontFamily: &amp;quot;Microsoft Yahei&amp;quot;),
                textAlign: TextAlign.justify,
              ),
              const SizedBox(height: 20.0), 
              FlatButton(
                onPressed: () {}, // 下载按钮的响应事件
                color: Color(0xFFCFE8E4),
                shape: RoundedRectangleBorder(
                  borderRadius: BorderRadius.circular(16.0),
                ),
                child: Padding(
                  padding: const EdgeInsets.all(12.0),
                  child: Text(&amp;quot;点击下载&amp;quot;, style: TextStyle(fontFamily: &amp;quot;Open Sans&amp;quot;)),
                ),
              ),
            ],
          ),
        ),
        const SizedBox(width: 100.0),
      ],
    );
  }
}&lt;/code&gt;&lt;/pre&gt;
 &lt;p&gt; 到此，页面创建结束，保存，运行webdev serve，就可以看到效果了。&lt;/p&gt;
 &lt;h2&gt;总结&lt;/h2&gt;
 &lt;p&gt;FLutter web是Flutter 的一个分支，在开发完App之后，UI层面的FLutter代码在不修改的情况下可以直接编译为Web版，基本可以做到代码100%复用，体验还不错。目前Flutter web作为预览版无论从性能上、易用上还是布局上都超出了预期，触摸体验挺好，虽然体验比APP差一些，但是比传统的web要好很多。试想一下 Flutter 开发iOS 和Android的App 还免费赠送一份Web版，并且比传统的web开发出来的体验还好。Write once ，Run anywhere。何乐而不为？&lt;/p&gt;
 &lt;p&gt;我觉得随着谷歌的持续优化，等到正式版发布之后，开发体验越来越好，Flutter开发者会吃掉H5很大一部分份额。Flutter 可能会给目前客户端的开发模式带来一些变革以及分工的变化， Flutter目前的开发体验不是很好， 但是潜力很大，值得前端人员去学习。&lt;/p&gt;
 &lt;p&gt;但是目前还是有一部分问题，Flutter web是为客户端开发（尤其是安卓）人员开发准备的，对于前端理解来说学习成本有点高。目前FLutter web和 flutter 还是两个项目，编译环境也是分开的，需要在代码里面修改Flutter相关库的引用为Flutter_web，组件还不能达到完全通用，这个谷歌承诺正在解决中，谷歌的最终目标是Web、移动App、桌面端win mac linux、以及嵌入式版的Flutter代码库之间保持100%的代码可移植性。&lt;/p&gt;
 &lt;p&gt;个人感觉，开发体验还不太好，还有很多坑要去踩，版本变更很快。还有社区资源稀少的问题，需要一定长期的积累。兼容性问题，代码转换后大量使用了web components，除了chrome之外，兼容性还是有些问题。&lt;/p&gt;
 &lt;h2&gt;安利时间&lt;/h2&gt;
 &lt;p&gt;我们在web开发过程中，都见过或者使用过一些奇技淫巧，这种技术我们统称为黑魔法，这些黑魔法散落在各个角落，为了方便大家查阅和学习，我们做了收集、整理和归类，并在github上做了一个项目——  &lt;a href="https://github.com/Tnfe/awesome-blackmagic" rel="nofollow noreferrer"&gt;awesome-blackmargic&lt;/a&gt;，希望各位爱钻研的开发者能够喜欢，也希望大家可以把自己的独门绝技分享出来，如果有兴趣可以给我们发pr。&lt;/p&gt;
 &lt;p&gt;如果你对Flutter感兴趣，想进一步了解Flutter，加入我们的QQ群（784383520）吧！&lt;/p&gt;
&lt;div&gt; &lt;a href="https://itindex.net/"  title="IT 资讯"&gt;&lt;img src="https://itindex.net/images/iconWarning.gif" title="IT 资讯" border="0"/&gt; &lt;/a&gt;</description>
      <category>javascript flutter</category>
      <guid isPermaLink="true">https://itindex.net/detail/59622-%E5%89%8D%E7%AB%AF-%E5%BC%80%E5%8F%91-%E5%A4%B1%E4%B8%9A</guid>
      <pubDate>Wed, 22 May 2019 17:26:18 CST</pubDate>
    </item>
    <item>
      <title>活动 Web 页面人机识别验证的探索与实践</title>
      <link>https://itindex.net/detail/59430-%E6%B4%BB%E5%8A%A8-web-%E9%A1%B5%E9%9D%A2</link>
      <description>&lt;p&gt;  &lt;strong&gt;标签：&lt;/strong&gt;    &lt;a href="https://blogread.cn/it/tags.php?tag=%E4%BA%BA%E6%9C%BA%E8%AF%86%E5%88%AB" target="_blank"&gt;人机识别&lt;/a&gt;&lt;/p&gt; &lt;p&gt;    在电商行业，线上的营销活动特别多。在移动互联网时代，一般为了活动的快速上线和内容的即时更新，大部分的业务场景仍然通过 Web 页面来承载。但由于 Web 页面天生“环境透明”，相较于移动客户端页面在安全性上存在更大的挑战。本文主要以移动端 Web 页面为基础来讲述如何提升页面安全性。&lt;/p&gt; &lt;h2&gt;活动 Web 页面的安全挑战&lt;/h2&gt; &lt;p&gt;    对于营销活动类的 Web 页面，领券、领红包、抽奖等活动方式很常见。此类活动对于普通用户来说大多数时候就是“拼手气”，而对于非正常用户来说，可以通过直接刷活动 API 接口的“作弊”方式来提升“手气”。这样的话，对普通用户来说，就变得很不公平。&lt;/p&gt; &lt;p&gt;    对于活动运营的主办方来说，如果风控措施做的不好，这类刷接口的“拼手气”方式可能会对企业造成较大的损失。如本来计划按 7 天发放的红包，在上线 1 天就被刷光了，活动的营销成本就会被意外提升。主办方想发放给用户的满减券、红包，却大部分被黄牛使用自动脚本刷走，而真正想参与活动的用，却无法享受活动优惠。&lt;/p&gt; &lt;p&gt;    终端用户到底是人还是机器，网络请求是否为真实用户发起，是否存在安全漏洞并且已被“羊毛党”恶意利用等等，这些都是运营主办方要担心的问题。&lt;/p&gt; &lt;h2&gt;安全防范的基本流程&lt;/h2&gt; &lt;p&gt;    为了提升活动 Web 页面的安全性，通常会引入专业的风控服务。引入风控服务后，安全防护的流程大致如图所示。&lt;/p&gt; &lt;div&gt;  &lt;img alt="&amp;#23433;&amp;#20840;&amp;#38450;&amp;#25252;&amp;#27969;&amp;#31243;" border="0" height="90" hspace="0" src="http://p0.meituan.net/scarlett/25016588314ff5433ac647e2fdff938132973.png@680w" vspace="0" width="600"&gt;&lt;/img&gt;&lt;/div&gt; &lt;ul&gt;  &lt;li&gt;   &lt;p&gt;    Web 前端：用户通过 Web 页面来参与活动，同时 Web 前端也会收集用于人机识别验证的用户交互行为数据。由于不同终端（移动端 H5 页面和 PC 端页面）交互形式不同，收集用户交互行为数据的侧重点也会有所不同。&lt;/p&gt;&lt;/li&gt;  &lt;li&gt;   &lt;p&gt;    风控服务：一般大公司都会有专业的风控团队来提供风控服务，在美团内部有智能反爬系统来基于地理位置、IP地址等大数据来提供频次限制、黑白名单限制等常规的基础风控拦截服务。甚至还有依托于海量的全业务场景的用户大数据，使用贝叶斯模型、神经网络等来构建专业度较深的服务。风控服务可以为 Web 前端提供通用的独立验证 SDK：验证码、滑块验证等区分人机的“图灵验证”，也可以为服务端提供 Web API 接口的验证等。&lt;/p&gt;&lt;/li&gt;  &lt;li&gt;   &lt;p&gt;    后端业务服务：负责处理活动业务逻辑，如给用户发券、发红包，处理用户抽奖等。请求需要经过风控服务的验证，确保其安全性，然后再来处理实际业务逻辑，通常，在处理完实际业务逻辑时，还会有针对业务本身的风控防范。&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;    对于活动 Web 页面来说，加入的风控服务主要为了做人机识别验证。在人机识别验证的专业领域上，我们可以先看看业界巨头 Google 是怎么做的。&lt;/p&gt; &lt;h2&gt;Google 如何处理人机验证&lt;/h2&gt; &lt;p&gt;    Google 使用的人机验证服务是著名的 reCAPTCHA（Completely Automated Public Turing Test To Tell Computers and Humans Apart，区分人机的全自动图灵测试系统），也是应用最广的验证码系统。早年的 reCAPTCHA 验证码是这样的：&lt;/p&gt; &lt;div&gt;  &lt;img alt="&amp;#26089;&amp;#26399;&amp;#30340;reCAPTCHA" src="http://p1.meituan.net/scarlett/6f5077bc14b5ea604dc8ea678801735a21741.png"&gt;&lt;/img&gt;&lt;/div&gt; &lt;p&gt;    如今的 reCAPTCHA 已经不再需要人工输入难以识别的字符，它会检测用户的终端环境，追踪用户的鼠标轨迹，只需用户点击“我不是机器人”就能进行人机验证（reCAPTCHA骗用户进行数据标注而进行AI训练的验证另说）。&lt;/p&gt; &lt;div&gt;  &lt;img alt="&amp;#29616;&amp;#22312;&amp;#30340;reCAPTCHA" src="http://p0.meituan.net/scarlett/0a10a249e191ac2648c6447dac1d66f7194112.gif"&gt;&lt;/img&gt;&lt;/div&gt; &lt;p&gt;    reCAPTCHA 的验证方式从早先的输入字符到现在的轻点按钮，在用户体验上，有了较大的提升。&lt;/p&gt; &lt;p&gt;    而在活动场景中引入人机识别验证，如果只是简单粗暴地增加验证码，或者只是像 reCAPTCHA 那样增加点击“我不是机器人”的验证，都会牺牲用户体验，降低用户参加活动的积极性。&lt;/p&gt; &lt;p&gt;    Google 的普通 Web 页面的浏览和有强交互的活动 Web 页面虽是不同的业务场景，但对于活动 Web 页面来说，强交互恰好为人机识别验证提供了用户交互行为数据收集的契机。&lt;/p&gt; &lt;h2&gt;人机识别验证的技术挑战&lt;/h2&gt; &lt;p&gt;    理想的方案是在用户无感知的情况下做人机识别验证，这样既确保了安全又对用户体验无损伤。&lt;/p&gt; &lt;p&gt;    从实际的业务场景出发再结合 Web 本身的环境，如果想实现理想的方案，可能会面临如下的技术挑战：&lt;/p&gt; &lt;ul&gt;  &lt;li&gt;   &lt;p&gt;（1）需要根据用户的使用场景来定制人机识别验证的算法：Web 前端负责收集、上报用户交互行为数据，风控服务端校验上报的数据是否符合正常的用户行为逻辑。&lt;/p&gt;&lt;/li&gt;  &lt;li&gt;   &lt;p&gt;（2）确保 Web 前端和风控服务端之间通信和数据传输的安全性。&lt;/p&gt;&lt;/li&gt;  &lt;li&gt;   &lt;p&gt;（3）确保上述两大挑战中提到的逻辑和算法不会被代码反编译来破解。&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;    在上述的三个挑战中，（1）已经实现了人机识别验证的功能，而（2）和（3）都是为了确保人机识别验证不被破解而做的安全防范。接下来，本文会分别针对这三个技术挑战来说明如何设计技术方案。&lt;/p&gt; &lt;h2&gt;挑战一：根据用户使用场景来定制人机识别验证算法&lt;/h2&gt; &lt;p&gt;    先来分析一下用户的使用场景，正常用户参与活动的步骤是用户进入活动页面后，会有短暂的停留，然后点击按钮参与活动。这里所说的“参与活动”，最终都会在活动页面发起一个接口的请求。如果是非正常用户，可以直接跳过以上的实际动作而去直接请求参与活动的接口。&lt;/p&gt; &lt;p&gt;    那么区别于正常用户和非正常用户就是那些被跳过的动作，对实际动作进一步归纳如下：&lt;/p&gt; &lt;ol&gt;  &lt;li&gt;   &lt;p&gt;进入页面。&lt;/p&gt;&lt;/li&gt;  &lt;li&gt;   &lt;p&gt;短暂的停留。&lt;/p&gt;&lt;/li&gt;  &lt;li&gt;   &lt;p&gt;滚动页面。&lt;/p&gt;&lt;/li&gt;  &lt;li&gt;   &lt;p&gt;点击按钮。&lt;/p&gt;&lt;/li&gt;&lt;/ol&gt; &lt;p&gt;    以上的动作又可以分为必需的操作和可选的操作。对这一连串动作产生的日志数据进行收集，在请求参与活动的接口时，将这些数据提交至后端，验证其合法性。这就是一个简单的人机识别验证。&lt;/p&gt; &lt;p&gt;    在验证动作的合法性时，需要考虑到这些动作数据是不是能被轻易模拟。另外，动作的发生应该有一条时间线，可以给每个动作都增加一个时间戳，比如点击按钮肯定是在进入页面之后发生的。&lt;/p&gt; &lt;p&gt;    一些特定的动作的日志数据也会有合理的区间，进入页面的动作如果以 JS 资源加载的时间为基准，那么加载时间可能大于 100 毫秒，小于 5 秒。而对于移动端的按钮点击，点击时记录的坐标值也会有对应的合理区间，这些合理的区间会根据实际的环境和情况来进行设置。&lt;/p&gt; &lt;p&gt;    除此之外，设备环境的数据也可以进行收集，包括用户参与活动时使用的终端类型、浏览器的类型、浏览器是否为客户端的容器等，如果使用了客户端，客户端是否会携带特殊的标识等。&lt;/p&gt; &lt;p&gt;    最后，还可以收集一些“无效”的数据，这些数据用于障人耳目，验证算法会将其忽略。尽管收集数据的动作是透明的，但是验证数据合法性不是透明的，攻击者无法知道，验证的算法中怎么区分哪些是有效、哪些是无效。这已经有点“蜜罐数据”的意思了。&lt;/p&gt; &lt;h2&gt;挑战二：确保通信的安全性&lt;/h2&gt; &lt;p&gt;    收集的敏感数据要发送给风控服务端，进而确保通信过程的安全。&lt;/p&gt; &lt;ol&gt;  &lt;li&gt;   &lt;p&gt;Web API 接口不能被中途拦截和篡改，通信协议使用 HTTPS 是最基本的要求；同时还要让服务端生成唯一的 Token，在通信过程中都要携带该 Token。&lt;/p&gt;&lt;/li&gt;  &lt;li&gt;   &lt;p&gt;接口携带的敏感数据不能是明文的，敏感数据要进行加密，这样攻击者无法通过网络抓包来详细了解敏感数据的内容。&lt;/p&gt;&lt;/li&gt;&lt;/ol&gt; &lt;h3&gt;Token 的设计&lt;/h3&gt; &lt;p&gt;    Token 是一个简短的字符串，主要为了确保通信的安全。用户进入活动 Web 页面后，请求参与活动的接口之前，会从服务端获取 Token。该 Token 的生成算法要确保 Token 的唯一性，通过接口或 Cookie 传递给前端，然后，前端在真正请求参与活动的接口时需要带上该 Token，风控服务端需要验证 Token 的合法性。也就是说，Token 由服务端生成，传给前端，前端再原封不动的回传给服务端。一旦加入了 Token 的步骤，攻击者就不能直接去请求参与活动的接口了。&lt;/p&gt; &lt;p&gt;    Token 由风控服务端基于用户的身份，根据一定的算法来生成，无法伪造，为了提升安全等级，Token 需要具有时效性，比如 10 分钟。可以使用 Redis 这类缓存服务来存储 Token，使用用户身份标识和 Token 建立 KV 映射表，并设置过期时间为 10 分钟。&lt;/p&gt; &lt;p&gt;    虽然前端在 Cookie 中可以获取到 Token，但是前端不能对 Token 做持久化的缓存。一旦在 Cookie 中获取到了 Token，那么前端可以立即从 Cookie 中删除该 Token，这样能尽量确保 Token 的安全性和时效性。Token 存储在 Redis 中，也不会因为用户在参与活动时频繁的切换页面请求，而对服务造成太大的压力。&lt;/p&gt; &lt;p&gt;    另外，Token 还可以有更多的用处：&lt;/p&gt; &lt;ul&gt;  &lt;li&gt;   &lt;p&gt;标识参与活动用户的有效性。&lt;/p&gt;&lt;/li&gt;  &lt;li&gt;   &lt;p&gt;敏感数据对称加密时生成动态密钥。&lt;/p&gt;&lt;/li&gt;  &lt;li&gt;   &lt;p&gt;API 接口的数字签名。&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt; &lt;h3&gt;敏感数据加密&lt;/h3&gt; &lt;p&gt;    通信时，传递的敏感数据可以使用常见的对称加密算法进行加密。&lt;/p&gt; &lt;p&gt;    为了提升加密的安全等级，加密时的密钥可以动态生成，前端和风控服务端约定好动态密钥的生成规则即可。加密的算法和密钥也要确保不被暴露。&lt;/p&gt; &lt;p&gt;    通过对敏感数据加密，攻击者在不了解敏感数据内容的前提下就更别提模拟构造请求内容了。&lt;/p&gt; &lt;h2&gt;挑战三：化解纸老虎的尴尬&lt;/h2&gt; &lt;p&gt;    有经验的 Web 开发者看到这里，可能已经开始质疑了：在透明的前端环境中折腾安全不是白折腾吗？这就好比费了很大的劲却只是造了一个“纸老虎”，质疑是有道理的，但是且慢，通过一些安全机制的加强是可以让“纸老虎”尽可能的逼真。&lt;/p&gt; &lt;p&gt;    本文一再提及的 Web 环境的透明性，是因为在实际的生产环境中的问题：前端的代码在压缩后，通过使用浏览器自带的格式化工具和断点工具，仍然具备一定的可读性，花点时间仍然可以理解代码的逻辑，这就给攻击者提供了大好的代码反编译机会。&lt;/p&gt; &lt;p&gt;    如果要化解“纸老虎”的尴尬，就要对前端的代码进行混淆。&lt;/p&gt; &lt;h3&gt;前端代码混淆&lt;/h3&gt; &lt;p&gt;    前端的 JS 代码压缩工具基本都是对变量、函数名称等进行缩短，压缩对于混淆的作用是比较弱。除了对代码进行压缩，还需要进行专门的混淆。&lt;/p&gt; &lt;p&gt;    对代码进行混淆可以降低可读性，混淆工具有条件的话最好自研，开源的工具要慎用。或者基于 Uglify.js 来自定义混淆的规则，混淆程度越高可读性就越低。&lt;/p&gt; &lt;p&gt;    代码混淆也需要把握一个度，太复杂的混淆可能会让代码无法运行，也有可能会影响本身的执行效率。同时还需要兼顾混淆后的代码体积，混淆前后的体积不能有太大的差距，合理的混淆程度很重要。&lt;/p&gt; &lt;div&gt;  &lt;img alt="JS&amp;#20195;&amp;#30721;&amp;#28151;&amp;#28102;" border="0" height="177" hspace="0" src="http://p0.meituan.net/scarlett/ff719172c0afa591a7a173c3f6a0fd05260530.png@800w" vspace="0" width="600"&gt;&lt;/img&gt;&lt;/div&gt; &lt;p&gt;    断点工具的防范会更麻烦些。在使用断点工具时通常都会导致代码延迟执行，而正常的业务逻辑都会立即执行，这是一个可以利用的点，可以考虑在代码执行间隔上来防范断点工具。&lt;/p&gt; &lt;p&gt;    通过代码混淆和对代码进行特殊的处理，可以让格式化工具和断点工具变得没有用武之地。唯一有些小遗憾，就是处理后的代码也不能正常使用 Source Map 的功能了。&lt;/p&gt; &lt;p&gt;    有了代码混淆，反编译的成本会非常高，这样“纸老虎”已经变得很逼真了。&lt;/p&gt; &lt;h2&gt;技术方案设计&lt;/h2&gt; &lt;p&gt;    在讲解完如何解决关键的技术挑战后，就可以把相应的方案串起来，然后设计成一套可以实施的技术方案了。相对理想的技术方案架构图如下：&lt;/p&gt; &lt;div&gt;  &lt;img alt="&amp;#20154;&amp;#26426;&amp;#35782;&amp;#21035;&amp;#30340;&amp;#25216;&amp;#26415;&amp;#26041;&amp;#26696;" border="0" height="326" hspace="0" src="http://p1.meituan.net/scarlett/b147b264d60d4067662ab86279505326211342.png@860w" vspace="0" width="600"&gt;&lt;/img&gt;&lt;/div&gt; &lt;p&gt;    下面会按步骤来讲解技术方案的处理流程：&lt;/p&gt; &lt;p&gt;      &lt;strong&gt;Step 0 基础风控拦截&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;    基础风控拦截是上面提到的频次、名单等的拦截限制，在 Nginx 层就能直接实施拦截。如果发现是恶意请求，直接将请求过滤返回 403，这是初步的拦截，用户在请求 Web 页面的时候就开始起作用了。&lt;/p&gt; &lt;p&gt;      &lt;strong&gt;Step 1 风控服务端生成 Token 后传给前端&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;    Step 0 可能还没进入到活动 Web 页面，进入活动 Web 页面后才真正开始人机识别验证的流程，前端会先开始获取 Token。&lt;/p&gt; &lt;p&gt;      &lt;strong&gt;Step  2 前端生成敏感数据&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;    敏感数据应包含用户交互行为数据、设备环境数据、活动业务逻辑数据以及无效数据。&lt;/p&gt; &lt;p&gt;      &lt;strong&gt;Step 3 使用 HTTPS 的签名接口发送数据&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;    Token 可以作为 Authorization 的值添加到 Header 中，数据接口的签名可以有效防止 CSRF 的攻击。&lt;/p&gt; &lt;p&gt;      &lt;strong&gt;Step 4 数据接口的校验&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;    风控服务端收到请求后，会先验证数据接口签名中的 Token 是否有效。验证完 Token，才会对敏感数据进行解密。数据解密成功，再进一步对人机识别的数据合法性进行校验。&lt;/p&gt; &lt;p&gt;      &lt;strong&gt;Step 5 业务逻辑的处理&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;    前面的步骤为了做人机识别验证，这些验证不涉及到业务逻辑。在所有这些验证都通过后，后端业务服务才会开始处理实际的活动业务逻辑。处理完活动业务逻辑，最终才会返回用户参与活动的结果。&lt;/p&gt; &lt;h2&gt;总结&lt;/h2&gt; &lt;p&gt;    为了提升活动 Web 页面的安全性，使用了各种各样的技术方案，我们将这些技术方案组合起来才能发挥安全防范的作用，如果其中某个环节处理不当，都可能会被当作漏洞来利用，从而导致整个验证方案被攻破。&lt;/p&gt; &lt;p&gt;    为了验证技术方案的有效性，可以持续观察活动 API 接口的请求成功率。从请求成功率的数据中进一步分析“误伤”和“拦截”的数据，以进一步确定是否要对方案进行调优。&lt;/p&gt; &lt;p&gt;    通过上述的人机识别验证的组合方案，可以大幅提升活动 Web 页面的安全性。在活动 Web 页面应作为一个标准化的安全防范流程，除了美团，像淘宝和天猫也有类似的流程。由于活动运营的环节和方法多且复杂，仅仅提升了 Web 页面也不敢保证就是铁板一块，安全需要关注的环节还很多，安全攻防是一项长期的“拉锯升级战”，安全防范措施也需要持续地优化升级。&lt;/p&gt; &lt;h2&gt;参考资料&lt;/h2&gt; &lt;ul&gt;  &lt;li&gt;   &lt;p&gt;    &lt;a href="https://www.google.com/recaptcha/intro/v3.html"&gt;https://www.google.com/recaptcha/intro/v3.html&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;  &lt;li&gt;   &lt;p&gt;    &lt;a href="https://segmentfault.com/a/1190000006226236"&gt;https://segmentfault.com/a/1190000006226236&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;  &lt;li&gt;   &lt;p&gt;    &lt;a href="https://www.freebuf.com/articles/web/102269.html"&gt;https://www.freebuf.com/articles/web/102269.html&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt; &lt;div&gt;本文最初发表于美团技术博客：  &lt;a href="https://tech.meituan.com/2019/03/07/humans-and-bots-apart-for-activity-web-security.html"&gt;https://tech.meituan.com/2019/03/07/humans-and-bots-apart-for-activity-web-security.html&lt;/a&gt;&lt;/div&gt;
				 &lt;p&gt;  &lt;strong&gt;您可能还对下面的文章感兴趣：&lt;/strong&gt;&lt;/p&gt;
				 &lt;p&gt;很抱歉，暂时没有...... &lt;/p&gt; &lt;img alt="" height="1" src="http://feeds.feedburner.com/~r/blogreadIT/~4/WO6r7Z_ZqW0" width="1"&gt;&lt;/img&gt;&lt;div&gt; &lt;a href="https://itindex.net/"  title="IT 资讯"&gt;&lt;img src="https://itindex.net/images/iconWarning.gif" title="IT 资讯" border="0"/&gt; &lt;/a&gt;</description>
      <category>算法</category>
      <guid isPermaLink="true">https://itindex.net/detail/59430-%E6%B4%BB%E5%8A%A8-web-%E9%A1%B5%E9%9D%A2</guid>
      <pubDate>Tue, 09 Apr 2019 00:38:55 CST</pubDate>
    </item>
    <item>
      <title>基于Web页面验证码机制漏洞的检测</title>
      <link>https://itindex.net/detail/59377-web-%E9%A1%B5%E9%9D%A2-%E9%AA%8C%E8%AF%81%E7%A0%81</link>
      <description>&lt;p&gt;  &lt;strong&gt;*声明：本篇文章仅供渗透测试参考，严禁用于非法用途。&lt;/strong&gt;&lt;/p&gt;
 &lt;p&gt;  &lt;strong&gt;在当今互联网上，每个用户或多或少都在部分网站上注册过一些帐号，当这些帐号涉及到金钱或者利益的时候，帐号的安全就是一个非常值得重视的问题，因此帐号的安全是各个厂商所非常关注的一个点。但是依然会存在一些厂商在身份验证这一块上存在着漏洞，并不是厂商不注重这个问题，只是在代码层的验证过程中的逻辑出现了一些差异，往往这些逻辑漏洞利用起来比较容易。&lt;/strong&gt;&lt;/p&gt;
 &lt;h2&gt;一、不可靠的前端校验&lt;/h2&gt;
 &lt;p&gt;在现实环境中，会有许多的网站他们没有严格进行身份校验，他们往往是通过依靠帐号密码发送后回传的状态码来判断用户身份是否正确，这就暴露出了很大的漏洞，这种漏洞利用起来就相当的容易，往往只需要一个安全界的神器BURP就可以完成身份验证的绕过，在登录的时候输入正确的账户以及随意的密码，将报文拦截下来，然后选择burp里面的拦截返回包的功能，捕捉返回的状态码。&lt;/p&gt;
 &lt;p&gt;  &lt;img alt="&amp;#22522;&amp;#20110;web&amp;#39029;&amp;#38754;&amp;#39564;&amp;#35777;&amp;#30721;&amp;#26426;&amp;#21046;&amp;#28431;&amp;#27934;&amp;#30340;&amp;#26816;&amp;#27979;" src="https://image.3001.net/images/20190307/1551948220_5c80d9bc26d27.png!small" width="690"&gt;&lt;/img&gt;  &lt;img alt="&amp;#22522;&amp;#20110;Web&amp;#39029;&amp;#38754;&amp;#39564;&amp;#35777;&amp;#30721;&amp;#26426;&amp;#21046;&amp;#28431;&amp;#27934;&amp;#30340;&amp;#26816;&amp;#27979;" src="https://image.3001.net/images/20190307/1551948322_5c80da22b945c.png!small" width="690"&gt;&lt;/img&gt;将返回包中的状态码修改为正常登录的状态码，当然这里的状态码不一定都是0和1这种，各种状态码都有可能存在，那么我们怎么样判断正确的状态码是什么呢？&lt;/p&gt;
 &lt;p&gt;这里我们就需要自己手动注册一个用户，然后进行正常登录，并且抓取返回的状态码，当你发现发回的报文中，仅仅只存在状态码，并没有其他set-cookie或者tocken等信息的时候，那么这个登录界面就有极大的可能性存在这种漏洞。这是比较致命的一种漏洞，那么你可能就会有其他的问题了，即使他存在了这种漏洞，但是我们不太可能拥有其他大量的帐号，这个漏洞的危害不就没什么用了码？这就是我接下来要说的问题。&lt;/p&gt;
 &lt;p&gt;&lt;/p&gt;
 &lt;p&gt;&lt;/p&gt;
 &lt;h2&gt;二、遍历手机号&lt;/h2&gt;
 &lt;p&gt;&lt;/p&gt;
 &lt;p&gt;&lt;/p&gt;
 &lt;p&gt;现在大多数的网站都存在着手机号注册的这一个功能，一般来说同一个手机号只能注册一个帐号，所以手机号也是能作为帐号，这就是能利用的一个点，当手机号能成为帐号的时候，那么之前所存在的疑问就解决了一半，既然知道手机是可以用来登录的帐号，那么如何来获得这些手机号呢？这个问题其实是一个非常好的问题，对于手机号来说，一共有11位数，要想胡乱的猜测一个手机号是否在这个平台上注册过，一次性猜中的概率是微乎其微，但是有的网站的忘记密码这一功能就存在利用的方法（不过这种漏洞厂商大多数是忽略的），但是我认为他的危害性还是有的。在我们忘记密码的时候输入手机号码，发送手机验证码的时候，部分网站都会先查询这个手机号是否在这个网站上注册过，要是没有则会提示号码不存在，存在则发送短信。那么可以使用这一个逻辑来进行用户手机号遍历。顺带提一下手机号码可以使用手机号码字典生成器来生成，然后用来遍历。&lt;/p&gt;
 &lt;p&gt;&lt;/p&gt;
 &lt;p&gt;&lt;/p&gt;
 &lt;p&gt;  &lt;img alt="&amp;#22522;&amp;#20110;Web&amp;#39029;&amp;#38754;&amp;#39564;&amp;#35777;&amp;#30721;&amp;#26426;&amp;#21046;&amp;#28431;&amp;#27934;&amp;#30340;&amp;#26816;&amp;#27979;" src="https://image.3001.net/images/20190307/1551950808_5c80e3d83d187.png!small" width="690"&gt;&lt;/img&gt;&lt;/p&gt;
 &lt;p&gt;&lt;/p&gt;
 &lt;p&gt;&lt;/p&gt;
 &lt;p&gt;如图所示，用户不存在则是另外的信息。我们只需根据length长度来辨别，也可以自己写py脚本来遍历保存注册用户。这一个点可以获取到大量的用户手机号。&lt;/p&gt;
 &lt;p&gt;&lt;/p&gt;
 &lt;p&gt;&lt;/p&gt;
 &lt;h2&gt;三、可爆破的手机验证码&lt;/h2&gt;
 &lt;p&gt;&lt;/p&gt;
 &lt;p&gt;&lt;/p&gt;
 &lt;p&gt;前面介绍了前端校验绕过的方法以及用户手机号获取的方式，接下来来讲解一下手机验证码的问题。我放一张思维导图来供大家参考&lt;/p&gt;
 &lt;p&gt;&lt;/p&gt;
 &lt;p&gt;&lt;/p&gt;
 &lt;p&gt;  &lt;img alt="&amp;#22522;&amp;#20110;Web&amp;#39029;&amp;#38754;&amp;#39564;&amp;#35777;&amp;#30721;&amp;#26426;&amp;#21046;&amp;#28431;&amp;#27934;&amp;#30340;&amp;#26816;&amp;#27979;" src="https://image.3001.net/images/20190307/1551951219_5c80e573e97c5.png!small" width="690"&gt;&lt;/img&gt;手机验证码存在的位置可能有三个点：登录、注册、密码找回这三个点。其中注册这个点的危害相对较小，除非找到一个可以批量注册帐号的点。&lt;/p&gt;
 &lt;p&gt;&lt;/p&gt;
 &lt;p&gt;&lt;/p&gt;
 &lt;p&gt;那么危害较大的就剩下登录和密码找回了，实际这两个点的原理是一样的，只不过利用的环境有所不同。&lt;/p&gt;
 &lt;p&gt;&lt;/p&gt;
 &lt;p&gt;&lt;/p&gt;
 &lt;p&gt;目前登录时候使用手机验证码登录的网站数量不是占很大的百分比，本文就以找回密码这块来说明。&lt;/p&gt;
 &lt;p&gt;&lt;/p&gt;
 &lt;p&gt;&lt;/p&gt;
 &lt;p&gt;我们在测试之前首先要进行判断的时候他的手机短信验证码的长度、时效以及页面是否存在有比较难的图片验证码，也就是难以用python的库直接识别的图片验证码（识别率低于50%）。这是我们首先要注意的，其次提交一次表单，抓包来看看，是否存在有前端加密，或者sign等。我以手机验证码长度为4位和6位来分类。&lt;/p&gt;
 &lt;p&gt;&lt;/p&gt;
 &lt;p&gt;&lt;/p&gt;
 &lt;h3&gt;  &lt;strong&gt;第一类：4位手机验证码&lt;/strong&gt;&lt;/h3&gt;
 &lt;p&gt;&lt;/p&gt;
 &lt;p&gt;&lt;/p&gt;
 &lt;p&gt;当我们发现手机验证码长度为4位的时候，时效为5分钟左右，并且没有什么复杂前端加密或者sign和复杂的图片验证码的时候，那么恭喜你，你可能找到了一个可以爆破出验证码的点，这种漏洞虽然是爆破，但是他利用所花费的时间确实非常低的，通常可以在很短的时间内重置或者登录一个手机号。这对厂商来说就是一个高危漏洞，相信他会给你不错的报酬。&lt;/p&gt;
 &lt;p&gt;&lt;/p&gt;
 &lt;p&gt;&lt;/p&gt;
 &lt;p&gt;上面的这种属于较为简单的漏洞，笔者在前段时间测试的时候发现了带有sign标记的4位验证码，这种的爆破的难度就有所提升了，他的sign是根据当前的时间戳以及手机号验证码等信息进行加密后生成的，要想去破解这个加密算法，是不太现实的。于是笔者就使用了一种骚思路，可能各位安全界的大佬们也用过，那就是python的selenium库来模拟浏览器自动化点击测试，但是这个就需要自己去根据网站的实际情况以及窗口位置来编写脚本。关于selenium的提供一个  &lt;a href="https://mp.weixin.qq.com/s/oIaFb6VCWGx8mjcpIjQXDA"&gt;学习链接&lt;/a&gt;。&lt;/p&gt;
 &lt;p&gt;&lt;/p&gt;
 &lt;p&gt;&lt;/p&gt;
 &lt;h3&gt;  &lt;strong&gt;第二类：6位手机验证码&lt;/strong&gt;&lt;/h3&gt;
 &lt;p&gt;&lt;/p&gt;
 &lt;p&gt;&lt;/p&gt;
 &lt;p&gt;通常来说6位的验证码，30分钟的时效是一个挺安全的设计，因为在30分钟内想跑完100W条数据的难度还是挺大，并且网站通常会根据发包速率来进行限制，一旦你的发包速率突破设定，你将会被403，也就是你的IP会被封禁一段时间，有这些设置的验证码是安全的，但是如果说时效在1小时甚至更长，并且不限制IP的发包速率了话，那么利用也是可以利用的，只不过利用的成本过高，所以基本不考虑。因此在导图中写到基本不不去考虑。&lt;/p&gt;
 &lt;p&gt;&lt;/p&gt;
 &lt;p&gt;&lt;/p&gt;
 &lt;p&gt; &lt;/p&gt;
 &lt;p&gt;&lt;/p&gt;
 &lt;p&gt;&lt;/p&gt;
 &lt;h2&gt;四、现实环境下的漏洞案例思路以及分析&lt;/h2&gt;
 &lt;p&gt;&lt;/p&gt;
 &lt;p&gt;&lt;/p&gt;
 &lt;p&gt;接下来给大家带来一个真实的漏洞案例，也是我本人所挖掘到的一个高危漏洞&lt;/p&gt;
 &lt;p&gt;&lt;/p&gt;
 &lt;p&gt;&lt;/p&gt;
 &lt;p&gt;  &lt;img alt="&amp;#22522;&amp;#20110;Web&amp;#39029;&amp;#38754;&amp;#39564;&amp;#35777;&amp;#30721;&amp;#26426;&amp;#21046;&amp;#28431;&amp;#27934;&amp;#30340;&amp;#26816;&amp;#27979;" src="https://image.3001.net/images/20190307/1551955837_5c80f77d4b292.png!small" width="690"&gt;&lt;/img&gt;&lt;/p&gt;
 &lt;p&gt;在登陆界面，由于图片验证码长期有效，所以猜测可以爆破。         &lt;/p&gt;
 &lt;p&gt;&lt;/p&gt;
 &lt;p&gt;&lt;/p&gt;
 &lt;p&gt;通过两次提交发现图片验证码在一定时间内是不会发生变化的，尽管已经经过了一次校验 。因为查看js发现验证码是由手机验证码经过sha256后从第六位开始取4位收到的验证码，测试时候输入的验证码为1602         &lt;/p&gt;
 &lt;p&gt;&lt;/p&gt;
 &lt;p&gt;&lt;/p&gt;
 &lt;p&gt;  &lt;img alt="&amp;#22522;&amp;#20110;Web&amp;#39029;&amp;#38754;&amp;#39564;&amp;#35777;&amp;#30721;&amp;#26426;&amp;#21046;&amp;#28431;&amp;#27934;&amp;#30340;&amp;#26816;&amp;#27979;" src="https://image.3001.net/images/20190307/1551956042_5c80f84a1a488.png!small" width="690"&gt;&lt;/img&gt;  &lt;img alt="&amp;#22522;&amp;#20110;Web&amp;#39029;&amp;#38754;&amp;#39564;&amp;#35777;&amp;#30721;&amp;#26426;&amp;#21046;&amp;#28431;&amp;#27934;&amp;#30340;&amp;#26816;&amp;#27979;" src="https://image.3001.net/images/20190307/1551956051_5c80f853db17d.png!small" width="690"&gt;&lt;/img&gt;证明了这个加密算法，于是利用脚本生成了0000-9999的加密后的字典用来爆破。在爆破过程中发现，验证码的时效1分钟左右，并不足以完成爆破。于是就换了另外一种思路，既然通过爆破是没有办法完成验证码的限制，则想到了程序员在编写代码的时候他会不会犯一种错误，猜想他是否会将过期后的验证码重置为一串特定的字符。既然有了这种猜想，那么就肯定需要来进行一波验证，首先根据他的加密算法发现他的是sha256，也就是每一位验证码数据只会在0-f之间生成，于是生成了一个0000-ffff的字典，来进行了一波爆破，就如猜想的一样，爆破出一个意外的数值，当然并不是在第一次爆破过程中发现的，第一次可能是一个意外，于是我便借用了别人的手机进行了几次尝试后，发现这个数值是固定的，那么这个漏洞就证明成立的了。&lt;/p&gt;
 &lt;p&gt;&lt;/p&gt;
 &lt;p&gt;&lt;/p&gt;
 &lt;p&gt;  &lt;img alt="&amp;#22522;&amp;#20110;Web&amp;#39029;&amp;#38754;&amp;#39564;&amp;#35777;&amp;#30721;&amp;#26426;&amp;#21046;&amp;#28431;&amp;#27934;&amp;#30340;&amp;#26816;&amp;#27979;" src="https://image.3001.net/images/20190307/1551956463_5c80f9ef30556.png!small" width="690"&gt;&lt;/img&gt;这样就挖掘出了一个任意登录帐号的漏洞，刚好这个网站又存在如之前所说的手机号遍历的问题，于是结合这两个点所产生的结果就是可以登录任意用户。&lt;/p&gt;
 &lt;p&gt;&lt;/p&gt;
 &lt;p&gt;&lt;/p&gt;
 &lt;p&gt;当然关于挖掘到这方面的漏洞不止一个，但是碍于厂商修复尚未完成不宜公开其他漏洞          &lt;br /&gt;     &lt;/p&gt;
 &lt;p&gt;&lt;/p&gt;
 &lt;p&gt;&lt;/p&gt;
 &lt;p&gt;分析：对于这个漏洞点的发现其实是因为当时测试时候的突发奇想，本身这个漏洞前端sha256加密截取4位这个算法不认真找都不容易发现，单单是这一个点就能拦住许多想爆破的人，验证码本身是为0000-9999的纯数字，很难联想到是从sha256中截取的字符串，但是当你绕过这个问题的时候，验证码的时效性就又成为了你的下一个问题，笔者在挖掘出这个特殊字符串的时候也是有点吃惊的，毕竟这个想法是我在挖掘的时候的突发奇想，也就是脑子一热冒出来的想法。所以当你在挖掘的时候被一个点困住的时候，不要死磕，可以发散一下思维说不定就能想到设计者在设计的时候所可能犯下的错误，4299这个数字在爆破出来后我对原先加密算法的字典里进行了一波搜索，发现并不存在4299这个数值的，可能设计者当初在设计的时候认为4299并2不属于任何0000-9999加密后的数值，以为这么设计不会产生问题。其实漏洞挖掘本身就是一个三分实力七分运气的事，本着常心肯定会挖掘出的。所以提升自己的能力、改善自己的心态将会成为你挖掘漏洞的时候的一大利器。&lt;/p&gt;
 &lt;p&gt;&lt;/p&gt;
 &lt;p&gt;&lt;/p&gt;
 &lt;p&gt;&lt;/p&gt;
 &lt;p&gt;&lt;/p&gt;
 &lt;p&gt;&lt;/p&gt;
 &lt;h3&gt;&lt;/h3&gt;
&lt;div&gt; &lt;a href="https://itindex.net/"  title="IT 资讯"&gt;&lt;img src="https://itindex.net/images/iconWarning.gif" title="IT 资讯" border="0"/&gt; &lt;/a&gt;</description>
      <category>漏洞 验证码</category>
      <guid isPermaLink="true">https://itindex.net/detail/59377-web-%E9%A1%B5%E9%9D%A2-%E9%AA%8C%E8%AF%81%E7%A0%81</guid>
      <pubDate>Sat, 16 Mar 2019 09:00:01 CST</pubDate>
    </item>
    <item>
      <title>为什么 web 开发人员需要迁移到. NET Core, 并使用 ASP.NET Core MVC 构建 web 和 webservice/API - 张善友 - 博客园</title>
      <link>https://itindex.net/detail/59346-web-%E5%BC%80%E5%8F%91-%E9%9C%80%E8%A6%81</link>
      <description>&lt;div&gt;    &lt;h3&gt;      &lt;a href="http://www.cnblogs.com/shanyou/p/8983695.html"&gt;2018 .NET开发者调查报告: .NET Core 是怎么样的状态&lt;/a&gt;，这里我们看到了还有非常多的.net开发人员还在观望，本文给大家一个建议。这仅代表我的个人意见, 我有充分的理由推荐.net 程序员使用      &lt;strong&gt;. net core&lt;/strong&gt;而不是      &lt;strong&gt;. net Framework&lt;/strong&gt;。有些人可能不同意我的观点, 但是分享想法和讨论它是好的。.net 程序员或他们所在的团队总有各种理由说他们的系统还在使用旧系统, 这显然是企业开发人员的事情。所以, 我将列出一些关于谁应该迁移到使用. net core而不是. net 框架。以下是我的想法:&lt;/h3&gt;    &lt;ol&gt;      &lt;li&gt;如果您是        &lt;strong&gt;旧式&lt;/strong&gt;Windows 服务、web 应用程序或 web 服务的维护者, 则您需要继续使用. NET 框架。&lt;/li&gt;      &lt;li&gt;如果您的应用程序将部署在旧的 Windows 服务器上，比如windows 2003/xp, 您需要继续使用. NET 框架。&lt;/li&gt;      &lt;li&gt;如果您确信您的系统近期不会部署到云中, 那么您现在就可以继续使用. NET 框架。&lt;/li&gt;      &lt;li&gt;如果您对使用. net 框架没有任何选择，比如来自公司的要求, 您需要继续使用. net 框架，这种情况对你的发展是不利的，我劝你学习.net core, 换家更有追求的公司。&lt;/li&gt;&lt;/ol&gt;    &lt;h5&gt;初学者, 只学习. NET Core!&lt;/h5&gt;    &lt;p&gt;如果你是一个初学者开始学习 ASP.NET 或 ASP.NET MVC, 你可能并不知道什么是. net Framework和. net ore。不用担心!我建议您看下官方文档      &lt;a href="https://docs.microsoft.com/zh-cn/aspnet/index" title=""&gt;https://docs.microsoft.com/zh-cn/aspnet/index&lt;/a&gt;, 您可以轻松地看到比较和差异。下面是我可以分享的一些. net framework和. net core的部分, 您可以点击每个链接以获取开发的工具。&lt;/p&gt;    &lt;table&gt;      &lt;tr&gt;        &lt;td&gt; &lt;/td&gt;        &lt;td&gt;          &lt;strong&gt;.NET Framework&lt;/strong&gt;&lt;/td&gt;        &lt;td&gt;          &lt;strong&gt;.NET Core&lt;/strong&gt;&lt;/td&gt;&lt;/tr&gt;      &lt;tr&gt;        &lt;td&gt;          &lt;strong&gt;Technology&lt;/strong&gt;&lt;/td&gt;        &lt;td&gt;First Release 2002 (Mature)&lt;/td&gt;        &lt;td&gt;First Release 2016 (Mature)&lt;/td&gt;&lt;/tr&gt;      &lt;tr&gt;        &lt;td&gt;          &lt;strong&gt;Latest Version&lt;/strong&gt;&lt;/td&gt;        &lt;td&gt;4.7.2 (          &lt;a href="https://referencesource.microsoft.com/" rel="noopener" target="_blank"&gt;Reference Source&lt;/a&gt;)&lt;/td&gt;        &lt;td&gt;2.0.6 (          &lt;a href="https://github.com/dotnet/core" rel="noopener" target="_blank"&gt;Open Source Software&lt;/a&gt;)          &lt;br /&gt;SDK Version 2.1.3&lt;/td&gt;&lt;/tr&gt;      &lt;tr&gt;        &lt;td&gt;          &lt;strong&gt;SDK&lt;/strong&gt;&lt;/td&gt;        &lt;td&gt;          &lt;a href="https://www.microsoft.com/net/download/windows" rel="noopener" target="_blank"&gt;Windows&lt;/a&gt;Only (Version 7, 8, 10)&lt;/td&gt;        &lt;td&gt;          &lt;a href="https://www.microsoft.com/net/download/windows" rel="noopener" target="_blank"&gt;Windows&lt;/a&gt;(Version 7, 8, 10),          &lt;br /&gt;          &lt;a href="https://www.microsoft.com/net/download/linux" rel="noopener" target="_blank"&gt;Linux&lt;/a&gt;(redhat, Ubuntu &amp;gt;14.04, Fedora, Debian, CentOS 7, openSUSE 24, Oracle Linux 7, SLES 12),          &lt;br /&gt;          &lt;a href="https://www.microsoft.com/net/download/macos"&gt;Mac&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;      &lt;tr&gt;        &lt;td&gt;          &lt;strong&gt;ASP.NET Performance&lt;/strong&gt;&lt;/td&gt;        &lt;td&gt;57,843 Request/Seconds (Plain Text)&lt;/td&gt;        &lt;td&gt;          &lt;a href="https://www.techempower.com/benchmarks/#section=data-r13&amp;hw=ph&amp;test=plaintext" rel="noopener" target="_blank"&gt;1,822,366 Request/Seconds (Plain Text)&lt;/a&gt;          &lt;br /&gt;Here is some real world news as reference:          &lt;a href="https://www.ageofascent.com/2016/02/18/asp-net-core-exeeds-1-15-million-requests-12-6-gbps/" rel="noopener" target="_blank"&gt;ASP.NET Core – 2300% More Requests Served Per Second&lt;/a&gt;.&lt;/td&gt;&lt;/tr&gt;      &lt;tr&gt;        &lt;td&gt;          &lt;strong&gt;Best IDE/Editor&lt;/strong&gt;&lt;/td&gt;        &lt;td&gt;          &lt;a href="https://www.visualstudio.com/thank-you-downloading-visual-studio/?sku=Community&amp;rel=15" rel="noopener" target="_blank"&gt;Visual Studio 2017 Community&lt;/a&gt;(latest, FREE)&lt;/td&gt;        &lt;td&gt;          &lt;a href="https://www.visualstudio.com/thank-you-downloading-visual-studio/?sku=Community&amp;rel=15" rel="noopener" target="_blank"&gt;Visual Studio 2017 Community&lt;/a&gt;(latest, FREE),          &lt;br /&gt;          &lt;a href="https://code.visualstudio.com/download" rel="noopener" target="_blank"&gt;Visual Studio Code&lt;/a&gt;for Windows, Linux and Mac (FREE),          &lt;br /&gt;          &lt;a href="https://www.visualstudio.com/thank-you-downloading-visual-studio-mac/?sku=communitymac&amp;rel=15" rel="noopener" target="_blank"&gt;Visual Studio for Mac Community&lt;/a&gt;(FREE)&lt;/td&gt;&lt;/tr&gt;      &lt;tr&gt;        &lt;td&gt;          &lt;strong&gt;Web Framework&lt;/strong&gt;&lt;/td&gt;        &lt;td&gt;Web Form, ASP, MVC (          &lt;a href="https://www.asp.net/mvc"&gt;Web&lt;/a&gt;and          &lt;a href="https://docs.microsoft.com/en-us/aspnet/web-api/overview/getting-started-with-aspnet-web-api/tutorial-your-first-web-api"&gt;Web API&lt;/a&gt;)&lt;/td&gt;        &lt;td&gt;MVC Core (          &lt;a href="https://docs.microsoft.com/en-us/aspnet/core/mvc/overview"&gt;Web&lt;/a&gt;,          &lt;a href="https://docs.microsoft.com/en-us/aspnet/core/mvc/razor-pages/?tabs=visual-studio"&gt;Razor Page&lt;/a&gt;,          &lt;a href="https://docs.microsoft.com/en-us/aspnet/core/tutorials/first-web-api"&gt;Web API&lt;/a&gt;)&lt;/td&gt;&lt;/tr&gt;      &lt;tr&gt;        &lt;td&gt;          &lt;strong&gt;Entity Framework (ORM)&lt;/strong&gt;&lt;/td&gt;        &lt;td&gt;          &lt;a href="https://www.nuget.org/packages/EntityFramework/"&gt;Entity Framework 6.2 (latest)&lt;/a&gt;          &lt;br /&gt;(Microsoft SQL Server, Oracle, MySQL (Official), PostgreSL, SQLite, IBM Data Server (DB2))&lt;/td&gt;        &lt;td&gt;          &lt;a href="https://www.nuget.org/packages/Microsoft.EntityFrameworkCore/"&gt;Entity Framework Core 2.0.1 (latest)&lt;/a&gt;          &lt;br /&gt;(InMemory (for Testing), Microsoft SQL Server, SQLite, PostgreSQL (Npgsql), IBM Data Server (DB2), MySQL (Official), MySQL
(Pomelo), Microsoft SQL Server Compact Edition, Devart (MySQL, Oracle, PostgreSQL, SQLite, DB2, and more),          &lt;br /&gt;Oracle (not yet available), MyCat, Firebird-Community)&lt;/td&gt;&lt;/tr&gt;      &lt;tr&gt;        &lt;td&gt;          &lt;strong&gt;Frontend&lt;/strong&gt;&lt;/td&gt;        &lt;td&gt;Plain MVC, Angular (mostly using MVC)&lt;/td&gt;        &lt;td&gt;Plain MVC, Angular, React, and Redux&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;    &lt;p&gt; &lt;/p&gt;    &lt;h5&gt;只需要5分钟入门使用. NET Core&lt;/h5&gt;    &lt;p&gt;如果您在移动笔记本上看这篇文章, 请下载并安装当前操作系统 (Windows、Linux、Mac) 的      &lt;a href="https://www.microsoft.com/net/download/windows"&gt;. NET Core SDK&lt;/a&gt;。您不需要安装 Visual Studio 2017 就可以使用命令行开发. NET Core应用。你完成安装 SDK 后, 打开      &lt;strong&gt;Shell&lt;/strong&gt;或      &lt;strong&gt;PowerShell&lt;/strong&gt;(在 Windows 中)、      &lt;strong&gt;终端&lt;/strong&gt;(在 Linux 或 Mac 中), 输入以下命令:&lt;/p&gt;    &lt;p&gt;      &lt;code&gt;dotnet new console -o myApp        &lt;br /&gt;cd myApp        &lt;br /&gt;dotnet run&lt;/code&gt;&lt;/p&gt;    &lt;p&gt;恭喜您, 你已经使用. NET Core 创建了第一个控制台应用程序。现在, 您可以通过将此应用程序发布到所需的任何平台来部署。在 Mac 机上,&lt;/p&gt;    &lt;p&gt;      &lt;code&gt;dotnet publish --runtime osx-x64&lt;/code&gt;&lt;/p&gt;    &lt;p&gt;或者安卓,&lt;/p&gt;    &lt;p&gt;      &lt;code&gt;dotnet publish --runtime Android&lt;/code&gt;&lt;/p&gt;    &lt;p&gt;下面是      &lt;a href="https://docs.microsoft.com/en-us/dotnet/core/rid-catalog"&gt;runtime identifier catalog&lt;/a&gt;的完整列表。那么, 这个命令实际上做了什么:&lt;/p&gt;    &lt;p&gt;      &lt;code&gt;dotnet new console -o myApp&lt;/code&gt;&lt;/p&gt;    &lt;p&gt;当我们运行这个命令时, 它实际上是在文件夹中创建一个      &lt;strong&gt;控制台&lt;/strong&gt;应用程序项目      &lt;code&gt;&lt;/code&gt;      &lt;code&gt;myApp&lt;/code&gt;。如果您查看文件夹      &lt;code&gt;&lt;/code&gt;      &lt;code&gt;myApp&lt;/code&gt;, 则应该看到以下文件&lt;/p&gt;    &lt;p&gt;      &lt;code&gt;myApp.csproj        &lt;br /&gt;Program.cs&lt;/code&gt;&lt;/p&gt;    &lt;p&gt;文件本身只是一个简单的Hello world。      &lt;code&gt;Program.cs&lt;/code&gt;&lt;/p&gt;    &lt;p&gt;using System;      &lt;br /&gt;       &lt;br /&gt;namespace myApp      &lt;br /&gt;{      &lt;br /&gt;     class Program      &lt;br /&gt;     {      &lt;br /&gt;         static void Main(string[] args)      &lt;br /&gt;         {      &lt;br /&gt;             Console.WriteLine(&amp;quot;Hello World!&amp;quot;);      &lt;br /&gt;         }      &lt;br /&gt;     }      &lt;br /&gt;}&lt;/p&gt;    &lt;p&gt;如果执行此命令,&lt;/p&gt;    &lt;p&gt;      &lt;code&gt;dotnet new --list&lt;/code&gt;&lt;/p&gt;    &lt;p&gt;它将从框中列出可用模板。这是你可能会看到的,&lt;/p&gt;    &lt;p&gt;      &lt;a href="https://www.rizamarhaban.com/wp-content/uploads/2017/12/dotnet-new-list.png"&gt;        &lt;img alt="" height="747" src="https://www.rizamarhaban.com/wp-content/uploads/2017/12/dotnet-new-list.png" width="1570"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;    &lt;p&gt;如果用mvc替换console时, 它将创建一个使用      &lt;strong&gt;ASP.NET core MVC&lt;/strong&gt;的 web 应用程序项目。&lt;/p&gt;    &lt;h5&gt;迁移到 ASP.NET Core 意味着迁移到现代 Web 应用程序&lt;/h5&gt;    &lt;p&gt;我可以转移到 ASP.NET Core吗？简单的回答当然是      &lt;strong&gt;否, &lt;/strong&gt;您不能仅仅是使用 Visual Studio 2017 打开旧的 ASP.NET Web Form或 mvc 5就可以完成转换到 ASP.NET Core mvc。你可以参考以下老代码迁移策略：&lt;/p&gt;    &lt;ol&gt;      &lt;li&gt;如果你的的 web 应用程序使用        &lt;strong&gt;web form&lt;/strong&gt;, 则不能直接将其转换或迁移到 ASP.NET Core。 因为 Web form和 MVC 有着完全不同的体系结构模型。MVC 使用模型、视图和控制器的分离。也没有 webform 控件组件 (如 web 窗体)。ASP.NETCore MVC 使用纯 HTML5 元素。当然您可以使用        &lt;a href="https://docs.microsoft.com/en-us/aspnet/core/mvc/views/tag-helpers/intro"&gt;TagHelpers&lt;/a&gt;来创建自定义 HTML 属性, 这些特性将转换为普通 HTML5。&lt;/li&gt;      &lt;li&gt;如果你的 web 应用程序使用的是 ASP.NET MVC 5, 则你可以首先创建一个新的 ASP.NET Core MVC 项目，        &lt;em&gt;复制粘贴&lt;/em&gt;某些代码到 ASP.NET Core。这将需要一些调整, 特别是在RazorPage。&lt;/li&gt;      &lt;li&gt;如果你的 web 应用程序只是一个 web api , 则你可以首先创建一个新的 ASP.NET Core Web API项目，不是简单复制一些代码。这里需要做些调整, 因为 ASP.NET Core web api 使用的是 web api 2。&lt;/li&gt;      &lt;li&gt;使用 HTML5! HTML5 仅用于现代 web 应用程序标准。使用来自        &lt;strong&gt;W3C&lt;/strong&gt;(万维网        &lt;strong&gt;联合体&lt;/strong&gt;) 标准的        &lt;strong&gt;          &lt;a href="https://www.w3.org/TR/2010/WD-html5-20100624/"&gt;HTML5&lt;/a&gt;&lt;/strong&gt;。而不仅仅是来自        &lt;strong&gt;Microsoft Edge&lt;/strong&gt;、        &lt;strong&gt;Chrome&lt;/strong&gt;、        &lt;strong&gt;Firefox&lt;/strong&gt;等的标准。因为每个浏览器都有自己的功能, 称为        &lt;strong&gt;平台&lt;/strong&gt;标准, 而某些浏览器平台功能不成为 W3C 标准。如果只使用 chrome 功能标准, 则 web 可能只会被 chrome 绑定, 并且无法在其他浏览器上打开。并非所有浏览器都支持其他浏览器功能。&lt;/li&gt;      &lt;li&gt;响应式布局，响应式布局，响应式布局! 重要的事情要说三遍。我们时常听到开发者说, &amp;quot;        &lt;em&gt;不, 我们不需要响应式布局, 这只是桌面浏览器, 我们只是让它静态布局&lt;/em&gt;&amp;quot;。如果你的网站to c的, 你必须做响应式布局, 因为现在移动时代，更多的用户将使用他们的ios/android上面的移动浏览器查看。&lt;/li&gt;      &lt;li&gt;不要在开发项目中直接使用 CSS。使用        &lt;a href="http://sass-lang.com/"&gt;SASS&lt;/a&gt;或者        &lt;a href="https://en.wikipedia.org/wiki/Less_(stylesheet_language)"&gt;LESS&lt;/a&gt;.。您可以使用 ASP.NET Core轻松完成此项任务。您甚至可以添加Gulp、Grunt或者webpack来编译 CSS。&lt;/li&gt;&lt;/ol&gt;    &lt;p&gt;如果您的代码遵循      &lt;a href="https://en.wikipedia.org/wiki/SOLID_(object-oriented_design)"&gt;S.O.L.I.D Principle&lt;/a&gt;原则进行正确的开发, 我相信, 迁移工作应该是很容易的, 而不是太多的调整。但是, 如果您的代码是意大利面条，则需要进行重构，.NET Core默认就使用依赖关系注入。这是ASP.NET常见最佳实践，当然是现在做更好, 而不是不做。好处也很多, 你可以学到一些新的东西, 您的新 web 应用程序将具有更好的性能, 更加现代化和可维护性。&lt;/p&gt;    &lt;h5&gt;对老板说:迁移到. NET Core&lt;/h5&gt;    &lt;p&gt;我知道你的老板会回答什么, 是的, 那      &lt;em&gt;恐怖&lt;/em&gt;语句 &amp;quot;      &lt;em&gt;兼容吗？&lt;/em&gt;&amp;quot;&lt;/p&gt;    &lt;p&gt;我的建议是说: &amp;quot;      &lt;em&gt;是的, 它是兼容的! 他们都是. NET。但我们需要一些调整, 一些需要小的编码更改，以符合编程的最佳实践&lt;/em&gt;&amp;quot;&lt;/p&gt;    &lt;p&gt;我们需要迁移到.NET Core的精神是, 如果不是现在, 那么何时？现在马上就有发布.NET Core 2.1, 一切都改变了。技术发生了变化 (      &lt;strong&gt;现代 Web 应用程序&lt;/strong&gt;、移动、增强现实等)、基础结构已更改 (      &lt;strong&gt;云、AI&lt;/strong&gt;)、开发体系结构也已更改 (      &lt;strong&gt;容器、无&lt;/strong&gt;服务器) 等。&lt;/p&gt;    &lt;p&gt;咱们这行业不尊重传统，只尊重创新. --- 微软CEO Satya Nadella&lt;/p&gt;    &lt;h5&gt;没那么容易&lt;/h5&gt;    &lt;p&gt;答案是肯定的。但是, 并不意味着不可能。它需要勇气和知识。      &lt;strong&gt;愿. NET 力量与您同在!&lt;/strong&gt;&lt;/p&gt;&lt;/div&gt;
    &lt;div&gt; &lt;a href="https://itindex.net/"  title="IT 资讯"&gt;&lt;img src="https://itindex.net/images/iconWarning.gif" title="IT 资讯" border="0"/&gt; &lt;/a&gt;</description>
      <category />
      <guid isPermaLink="true">https://itindex.net/detail/59346-web-%E5%BC%80%E5%8F%91-%E9%9C%80%E8%A6%81</guid>
      <pubDate>Fri, 08 Mar 2019 15:46:36 CST</pubDate>
    </item>
    <item>
      <title>常见六大Web 安全攻防解析</title>
      <link>https://itindex.net/detail/59265-%E5%B8%B8%E8%A7%81-web-%E5%AE%89%E5%85%A8</link>
      <description>&lt;h2&gt;前言&lt;/h2&gt;
 &lt;p&gt;在互联网时代，数据安全与个人隐私受到了前所未有的挑战，各种新奇的攻击技术层出不穷。如何才能更好地保护我们的数据？本文主要侧重于分析几种常见的攻击的类型以及防御的方法。&lt;/p&gt;
 &lt;p&gt;  &lt;strong&gt;想阅读更多优质原创文章请猛戳   &lt;a href="https://github.com/ljianshu/Blog" rel="nofollow noreferrer"&gt;GitHub博客&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
 &lt;h2&gt;一、XSS&lt;/h2&gt;
 &lt;p&gt;XSS (Cross-Site Scripting)，跨站脚本攻击，因为缩写和 CSS重叠，所以只能叫 XSS。跨站脚本攻击是指通过存在安全漏洞的Web网站注册用户的浏览器内运行非法的HTML标签或JavaScript进行的一种攻击。&lt;/p&gt;
 &lt;p&gt;跨站脚本攻击有可能造成以下影响:&lt;/p&gt;
 &lt;ul&gt;
  &lt;li&gt;利用虚假输入表单骗取用户个人信息。&lt;/li&gt;
  &lt;li&gt;利用脚本窃取用户的Cookie值，被害者在不知情的情况下，帮助攻击者发送恶意请求。&lt;/li&gt;
  &lt;li&gt;显示伪造的文章或图片。&lt;/li&gt;
&lt;/ul&gt;
 &lt;p&gt;  &lt;strong&gt;XSS 的原理是恶意攻击者往 Web 页面里插入恶意可执行网页脚本代码，当用户浏览该页之时，嵌入其中 Web 里面的脚本代码会被执行，从而可以达到攻击者盗取用户信息或其他侵犯用户安全隐私的目的&lt;/strong&gt;。&lt;/p&gt;
 &lt;p&gt;XSS 的攻击方式千变万化，但还是可以大致细分为几种类型。&lt;/p&gt;
 &lt;h3&gt;1.非持久型 XSS（反射型 XSS ）&lt;/h3&gt;
 &lt;p&gt;非持久型 XSS 漏洞，一般是通过给别人发送  &lt;strong&gt;带有恶意脚本代码参数的 URL&lt;/strong&gt;，当 URL 地址被打开时，特有的恶意代码参数被 HTML 解析、执行。&lt;/p&gt;
 &lt;p&gt;  &lt;img alt="" src="https://segmentfault.com/img/remote/1460000018073848?w=732&amp;h=149" title=""&gt;&lt;/img&gt;  &lt;br /&gt;举一个例子，比如页面中包含有以下代码：&lt;/p&gt;
 &lt;pre&gt;  &lt;code&gt;&amp;lt;select&amp;gt;
    &amp;lt;script&amp;gt;
        document.write(&amp;apos;&amp;apos;
            + &amp;apos;&amp;lt;option value=1&amp;gt;&amp;apos;
            +     location.href.substring(location.href.indexOf(&amp;apos;default=&amp;apos;) + 8)
            + &amp;apos;&amp;lt;/option&amp;gt;&amp;apos;
        );
        document.write(&amp;apos;&amp;lt;option value=2&amp;gt;English&amp;lt;/option&amp;gt;&amp;apos;);
    &amp;lt;/script&amp;gt;
&amp;lt;/select&amp;gt;&lt;/code&gt;&lt;/pre&gt;
 &lt;p&gt;攻击者可以直接通过 URL (类似：  &lt;code&gt;https://xxx.com/xxx?default=&amp;lt;script&amp;gt;alert(document.cookie)&amp;lt;/script&amp;gt;&lt;/code&gt;) 注入可执行的脚本代码。不过一些浏览器如Chrome其内置了一些XSS过滤器，可以防止大部分反射型XSS攻击。&lt;/p&gt;
 &lt;p&gt;非持久型 XSS 漏洞攻击有以下几点特征：&lt;/p&gt;
 &lt;ul&gt;
  &lt;li&gt;即时性，不经过服务器存储，直接通过 HTTP 的 GET 和 POST 请求就能完成一次攻击，拿到用户隐私数据。&lt;/li&gt;
  &lt;li&gt;攻击者需要诱骗点击,必须要通过用户点击链接才能发起&lt;/li&gt;
  &lt;li&gt;反馈率低，所以较难发现和响应修复&lt;/li&gt;
  &lt;li&gt;盗取用户敏感保密信息&lt;/li&gt;
&lt;/ul&gt;
 &lt;p&gt;为了防止出现非持久型 XSS 漏洞，需要确保这么几件事情：&lt;/p&gt;
 &lt;ul&gt;
  &lt;li&gt;Web 页面渲染的所有内容或者渲染的数据都必须来自于服务端。&lt;/li&gt;
  &lt;li&gt;尽量不要从    &lt;code&gt;URL&lt;/code&gt;，   &lt;code&gt;document.referrer&lt;/code&gt;，   &lt;code&gt;document.forms&lt;/code&gt; 等这种 DOM API 中获取数据直接渲染。&lt;/li&gt;
  &lt;li&gt;尽量不要使用    &lt;code&gt;eval&lt;/code&gt;,    &lt;code&gt;new Function()&lt;/code&gt;，   &lt;code&gt;document.write()&lt;/code&gt;，   &lt;code&gt;document.writeln()&lt;/code&gt;，   &lt;code&gt;window.setInterval()&lt;/code&gt;，   &lt;code&gt;window.setTimeout()&lt;/code&gt;，   &lt;code&gt;innerHTML&lt;/code&gt;，   &lt;code&gt;document.createElement()&lt;/code&gt; 等可执行字符串的方法。&lt;/li&gt;
  &lt;li&gt;如果做不到以上几点，也必须对涉及 DOM 渲染的方法传入的字符串参数做 escape 转义。&lt;/li&gt;
  &lt;li&gt;前端渲染的时候对任何的字段都需要做 escape 转义编码。&lt;/li&gt;
&lt;/ul&gt;
 &lt;h3&gt;2.持久型 XSS（存储型 XSS）&lt;/h3&gt;
 &lt;p&gt;持久型 XSS 漏洞，一般存在于 Form 表单提交等交互功能，如文章留言，提交文本信息等，黑客利用的 XSS 漏洞，将内容经正常功能提交进入数据库持久保存，当前端页面获得后端从数据库中读出的注入代码时，恰好将其渲染执行。&lt;/p&gt;
 &lt;p&gt;  &lt;img alt="" src="https://segmentfault.com/img/remote/1460000018073849?w=595&amp;h=185" title=""&gt;&lt;/img&gt;&lt;/p&gt;
 &lt;p&gt;举个例子，对于评论功能来说，就得防范持久型 XSS 攻击，因为我可以在评论中输入以下内容&lt;/p&gt;
 &lt;p&gt;  &lt;img alt="" src="https://segmentfault.com/img/remote/1460000018073850?w=652&amp;h=114" title=""&gt;&lt;/img&gt;&lt;/p&gt;
 &lt;p&gt;主要注入页面方式和非持久型 XSS 漏洞类似，只不过持久型的不是来源于 URL，referer，forms 等，而是来源于  &lt;strong&gt;后端从数据库中读出来的数据&lt;/strong&gt; 。持久型 XSS 攻击不需要诱骗点击，黑客只需要在提交表单的地方完成注入即可，但是这种 XSS 攻击的成本相对还是很高。&lt;/p&gt;
 &lt;p&gt;攻击成功需要同时满足以下几个条件：&lt;/p&gt;
 &lt;ul&gt;
  &lt;li&gt;POST 请求提交表单后端没做转义直接入库。&lt;/li&gt;
  &lt;li&gt;后端从数据库中取出数据没做转义直接输出给前端。&lt;/li&gt;
  &lt;li&gt;前端拿到后端数据没做转义直接渲染成 DOM。&lt;/li&gt;
&lt;/ul&gt;
 &lt;p&gt;持久型 XSS 有以下几个特点：&lt;/p&gt;
 &lt;ul&gt;
  &lt;li&gt;持久性，植入在数据库中&lt;/li&gt;
  &lt;li&gt;盗取用户敏感私密信息&lt;/li&gt;
  &lt;li&gt;危害面广&lt;/li&gt;
&lt;/ul&gt;
 &lt;h3&gt;3.如何防御&lt;/h3&gt;
 &lt;p&gt;对于 XSS 攻击来说，通常有两种方式可以用来防御。&lt;/p&gt;
 &lt;h4&gt;1) CSP&lt;/h4&gt;
 &lt;p&gt;CSP 本质上就是建立白名单，开发者明确告诉浏览器哪些外部资源可以加载和执行。我们只需要配置规则，如何拦截是由浏览器自己实现的。我们可以通过这种方式来尽量减少 XSS 攻击。&lt;/p&gt;
 &lt;p&gt;通常可以通过两种方式来开启 CSP：&lt;/p&gt;
 &lt;ul&gt;
  &lt;li&gt;设置 HTTP Header 中的 Content-Security-Policy&lt;/li&gt;
  &lt;li&gt;设置 meta 标签的方式 &amp;lt;meta http-equiv=&amp;quot;Content-Security-Policy&amp;quot;&amp;gt;&lt;/li&gt;
&lt;/ul&gt;
 &lt;p&gt;这里以设置 HTTP Header 来举例：&lt;/p&gt;
 &lt;ul&gt;  &lt;li&gt;只允许加载本站资源&lt;/li&gt;&lt;/ul&gt;
 &lt;pre&gt;  &lt;code&gt;Content-Security-Policy: default-src &amp;apos;self&amp;apos;&lt;/code&gt;&lt;/pre&gt;
 &lt;ul&gt;  &lt;li&gt;只允许加载 HTTPS 协议图片&lt;/li&gt;&lt;/ul&gt;
 &lt;pre&gt;  &lt;code&gt;Content-Security-Policy: img-src https://*&lt;/code&gt;&lt;/pre&gt;
 &lt;ul&gt;  &lt;li&gt;允许加载任何来源框架&lt;/li&gt;&lt;/ul&gt;
 &lt;pre&gt;  &lt;code&gt;Content-Security-Policy: child-src &amp;apos;none&amp;apos;&lt;/code&gt;&lt;/pre&gt;
 &lt;p&gt;如需了解更多属性，请查看  &lt;a href="https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Security-Policy" rel="nofollow noreferrer"&gt;Content-Security-Policy文档&lt;/a&gt;&lt;/p&gt;
 &lt;p&gt;对于这种方式来说，只要开发者配置了正确的规则，那么即使网站存在漏洞，攻击者也不能执行它的攻击代码，并且 CSP 的兼容性也不错。&lt;/p&gt;
 &lt;h4&gt;2) 转义字符&lt;/h4&gt;
 &lt;p&gt;用户的输入永远不可信任的，最普遍的做法就是转义输入输出的内容，对于引号、尖括号、斜杠进行转义&lt;/p&gt;
 &lt;pre&gt;  &lt;code&gt;function escape(str) {
  str = str.replace(/&amp;amp;/g, &amp;apos;&amp;amp;amp;&amp;apos;)
  str = str.replace(/&amp;lt;/g, &amp;apos;&amp;amp;lt;&amp;apos;)
  str = str.replace(/&amp;gt;/g, &amp;apos;&amp;amp;gt;&amp;apos;)
  str = str.replace(/&amp;quot;/g, &amp;apos;&amp;amp;quto;&amp;apos;)
  str = str.replace(/&amp;apos;/g, &amp;apos;&amp;amp;#39;&amp;apos;)
  str = str.replace(/`/g, &amp;apos;&amp;amp;#96;&amp;apos;)
  str = str.replace(/\//g, &amp;apos;&amp;amp;#x2F;&amp;apos;)
  return str
}&lt;/code&gt;&lt;/pre&gt;
 &lt;p&gt;但是对于显示富文本来说，显然不能通过上面的办法来转义所有字符，因为这样会把需要的格式也过滤掉。对于这种情况，通常采用白名单过滤的办法，当然也可以通过黑名单过滤，但是考虑到需要过滤的标签和标签属性实在太多，更加推荐使用白名单的方式。&lt;/p&gt;
 &lt;pre&gt;  &lt;code&gt;const xss = require(&amp;apos;xss&amp;apos;)
let html = xss(&amp;apos;&amp;lt;h1 id=&amp;quot;title&amp;quot;&amp;gt;XSS Demo&amp;lt;/h1&amp;gt;&amp;lt;script&amp;gt;alert(&amp;quot;xss&amp;quot;);&amp;lt;/script&amp;gt;&amp;apos;)
// -&amp;gt; &amp;lt;h1&amp;gt;XSS Demo&amp;lt;/h1&amp;gt;&amp;amp;lt;script&amp;amp;gt;alert(&amp;quot;xss&amp;quot;);&amp;amp;lt;/script&amp;amp;gt;
console.log(html)&lt;/code&gt;&lt;/pre&gt;
 &lt;p&gt;以上示例使用了 js-xss 来实现，可以看到在输出中保留了 h1 标签且过滤了 script 标签。&lt;/p&gt;
 &lt;h4&gt;3) HttpOnly Cookie。&lt;/h4&gt;
 &lt;p&gt;这是预防XSS攻击窃取用户cookie最有效的防御手段。Web应用程序在设置cookie时，将其属性设为HttpOnly，就可以避免该网页的cookie被客户端恶意JavaScript窃取，保护用户cookie信息。&lt;/p&gt;
 &lt;h2&gt;二、CSRF&lt;/h2&gt;
 &lt;p&gt;CSRF(Cross Site Request Forgery)，即跨站请求伪造，是一种常见的Web攻击，它利用用户已登录的身份，在用户毫不知情的情况下，以用户的名义完成非法操作。&lt;/p&gt;
 &lt;h3&gt;1.CSRF攻击的原理&lt;/h3&gt;
 &lt;p&gt;下面先介绍一下CSRF攻击的原理：&lt;/p&gt;
 &lt;p&gt;  &lt;img alt="" src="https://segmentfault.com/img/remote/1460000018073851?w=432&amp;h=303" title=""&gt;&lt;/img&gt;&lt;/p&gt;
 &lt;p&gt;完成 CSRF 攻击必须要有三个条件：&lt;/p&gt;
 &lt;ul&gt;
  &lt;li&gt;用户已经登录了站点 A，并在本地记录了 cookie&lt;/li&gt;
  &lt;li&gt;在用户没有登出站点 A 的情况下（也就是 cookie 生效的情况下），访问了恶意攻击者提供的引诱危险站点 B (B 站点要求访问站点A)。&lt;/li&gt;
  &lt;li&gt;站点 A 没有做任何 CSRF 防御&lt;/li&gt;
&lt;/ul&gt;
 &lt;p&gt;我们来看一个例子： 当我们登入转账页面后，突然眼前一亮  &lt;strong&gt;惊现&amp;quot;XXX隐私照片，不看后悔一辈子&amp;quot;的链接&lt;/strong&gt;，耐不住内心躁动，立马点击了该危险的网站（页面代码如下图所示），但当这页面一加载，便会执行  &lt;code&gt;submitForm&lt;/code&gt;这个方法来提交转账请求，从而将10块转给黑客。&lt;/p&gt;
 &lt;p&gt;  &lt;img alt="" src="https://segmentfault.com/img/remote/1460000018073852?w=548&amp;h=388" title=""&gt;&lt;/img&gt;&lt;/p&gt;
 &lt;h3&gt;2.如何防御&lt;/h3&gt;
 &lt;p&gt;防范 CSRF 攻击可以遵循以下几种规则：&lt;/p&gt;
 &lt;ul&gt;
  &lt;li&gt;Get 请求不对数据进行修改&lt;/li&gt;
  &lt;li&gt;不让第三方网站访问到用户 Cookie&lt;/li&gt;
  &lt;li&gt;阻止第三方网站请求接口&lt;/li&gt;
  &lt;li&gt;请求时附带验证信息，比如验证码或者 Token&lt;/li&gt;
&lt;/ul&gt;
 &lt;h4&gt;1) SameSite&lt;/h4&gt;
 &lt;p&gt;可以对 Cookie 设置 SameSite 属性。该属性表示 Cookie 不随着跨域请求发送，可以很大程度减少 CSRF 的攻击，但是该属性目前并不是所有浏览器都兼容。&lt;/p&gt;
 &lt;h4&gt;2) Referer Check&lt;/h4&gt;
 &lt;p&gt;HTTP Referer是header的一部分，当浏览器向web服务器发送请求时，一般会带上Referer信息告诉服务器是从哪个页面链接过来的，服务器籍此可以获得一些信息用于处理。可以通过检查请求的来源来防御CSRF攻击。正常请求的referer具有一定规律，如在提交表单的referer必定是在该页面发起的请求。所以  &lt;strong&gt;通过检查http包头referer的值是不是这个页面，来判断是不是CSRF攻击&lt;/strong&gt;。&lt;/p&gt;
 &lt;p&gt;但在某些情况下如从https跳转到http，浏览器处于安全考虑，不会发送referer，服务器就无法进行check了。若与该网站同域的其他网站有XSS漏洞，那么攻击者可以在其他网站注入恶意脚本，受害者进入了此类同域的网址，也会遭受攻击。出于以上原因，无法完全依赖Referer Check作为防御CSRF的主要手段。但是可以通过Referer Check来监控CSRF攻击的发生。&lt;/p&gt;
 &lt;h4&gt;3)  Anti CSRF Token&lt;/h4&gt;
 &lt;p&gt;目前比较完善的解决方案是加入Anti-CSRF-Token。即发送请求时在HTTP 请求中以参数的形式加入一个随机产生的token，并在服务器建立一个拦截器来验证这个token。服务器读取浏览器当前域cookie中这个token值，会进行校验该请求当中的token和cookie当中的token值是否都存在且相等，才认为这是合法的请求。否则认为这次请求是违法的，拒绝该次服务。&lt;/p&gt;
 &lt;p&gt;  &lt;strong&gt;这种方法相比Referer检查要安全很多&lt;/strong&gt;，token可以在用户登陆后产生并放于session或cookie中，然后在每次请求时服务器把token从session或cookie中拿出，与本次请求中的token 进行比对。由于token的存在，攻击者无法再构造出一个完整的URL实施CSRF攻击。但在处理多个页面共存问题时，当某个页面消耗掉token后，其他页面的表单保存的还是被消耗掉的那个token，其他页面的表单提交时会出现token错误。&lt;/p&gt;
 &lt;h4&gt;4) 验证码&lt;/h4&gt;
 &lt;p&gt;应用程序和用户进行交互过程中，特别是账户交易这种核心步骤，强制用户输入验证码，才能完成最终请求。在通常情况下，验证码够很好地遏制CSRF攻击。  &lt;strong&gt;但增加验证码降低了用户的体验，网站不能给所有的操作都加上验证码&lt;/strong&gt;。所以只能将验证码作为一种辅助手段，在关键业务点设置验证码。&lt;/p&gt;
 &lt;h2&gt;三、点击劫持&lt;/h2&gt;
 &lt;p&gt;点击劫持是一种视觉欺骗的攻击手段。攻击者将需要攻击的网站通过 iframe 嵌套的方式嵌入自己的网页中，并将 iframe 设置为透明，在页面中透出一个按钮诱导用户点击。&lt;/p&gt;
 &lt;h3&gt;1. 特点&lt;/h3&gt;
 &lt;ul&gt;
  &lt;li&gt;隐蔽性较高，骗取用户操作&lt;/li&gt;
  &lt;li&gt;&amp;quot;UI-覆盖攻击&amp;quot;&lt;/li&gt;
  &lt;li&gt;利用iframe或者其它标签的属性&lt;/li&gt;
&lt;/ul&gt;
 &lt;h3&gt;2. 点击劫持的原理&lt;/h3&gt;
 &lt;p&gt;用户在登陆 A 网站的系统后，被攻击者诱惑打开第三方网站，而第三方网站通过 iframe 引入了 A 网站的页面内容，用户在第三方网站中点击某个按钮（被装饰的按钮），实际上是点击了 A 网站的按钮。  &lt;br /&gt;接下来我们举个例子：我在优酷发布了很多视频，想让更多的人关注它，就可以通过点击劫持来实现&lt;/p&gt;
 &lt;pre&gt;  &lt;code&gt;iframe {
width: 1440px;
height: 900px;
position: absolute;
top: -0px;
left: -0px;
z-index: 2;
-moz-opacity: 0;
opacity: 0;
filter: alpha(opacity=0);
}
button {
position: absolute;
top: 270px;
left: 1150px;
z-index: 1;
width: 90px;
height:40px;
}
&amp;lt;/style&amp;gt;
......
&amp;lt;button&amp;gt;点击脱衣&amp;lt;/button&amp;gt;
&amp;lt;img src=&amp;quot;http://pic1.win4000.com/wallpaper/2018-03-19/5aaf2bf0122d2.jpg&amp;quot;&amp;gt;
&amp;lt;iframe src=&amp;quot;http://i.youku.com/u/UMjA0NTg4Njcy&amp;quot; scrolling=&amp;quot;no&amp;quot;&amp;gt;&amp;lt;/iframe&amp;gt;&lt;/code&gt;&lt;/pre&gt;
 &lt;p&gt;  &lt;img alt="" src="https://segmentfault.com/img/remote/1460000018073853?w=1259&amp;h=283" title=""&gt;&lt;/img&gt;  &lt;br /&gt;从上图可知，攻击者通过图片作为页面背景，隐藏了用户操作的真实界面，当你按耐不住好奇点击按钮以后，真正的点击的其实是隐藏的那个页面的订阅按钮，然后就会在你不知情的情况下订阅了。  &lt;br /&gt;  &lt;img alt="" src="https://segmentfault.com/img/remote/1460000018073854?w=643&amp;h=276" title=""&gt;&lt;/img&gt;&lt;/p&gt;
 &lt;h3&gt;3. 如何防御&lt;/h3&gt;
 &lt;h4&gt;1）X-FRAME-OPTIONS&lt;/h4&gt;
 &lt;p&gt;  &lt;code&gt;X-FRAME-OPTIONS&lt;/code&gt;是一个 HTTP 响应头，在现代浏览器有一个很好的支持。这个 HTTP 响应头 就是为了防御用 iframe 嵌套的点击劫持攻击。&lt;/p&gt;
 &lt;p&gt;该响应头有三个值可选，分别是&lt;/p&gt;
 &lt;ul&gt;
  &lt;li&gt;DENY，表示页面不允许通过 iframe 的方式展示&lt;/li&gt;
  &lt;li&gt;SAMEORIGIN，表示页面可以在相同域名下通过 iframe 的方式展示&lt;/li&gt;
  &lt;li&gt;ALLOW-FROM，表示页面可以在指定来源的 iframe 中展示&lt;/li&gt;
&lt;/ul&gt;
 &lt;h4&gt;2）JavaScript 防御&lt;/h4&gt;
 &lt;p&gt;对于某些远古浏览器来说，并不能支持上面的这种方式，那我们只有通过 JS 的方式来防御点击劫持了。&lt;/p&gt;
 &lt;pre&gt;  &lt;code&gt;&amp;lt;head&amp;gt;
  &amp;lt;style id=&amp;quot;click-jack&amp;quot;&amp;gt;
    html {
      display: none !important;
    }
  &amp;lt;/style&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;
  &amp;lt;script&amp;gt;
    if (self == top) {
      var style = document.getElementById(&amp;apos;click-jack&amp;apos;)
      document.body.removeChild(style)
    } else {
      top.location = self.location
    }
  &amp;lt;/script&amp;gt;
&amp;lt;/body&amp;gt;&lt;/code&gt;&lt;/pre&gt;
 &lt;p&gt;以上代码的作用就是当通过 iframe 的方式加载页面时，攻击者的网页直接不显示所有内容了。&lt;/p&gt;
 &lt;h2&gt;四、URL跳转漏洞&lt;/h2&gt;
 &lt;p&gt;定义：借助未验证的URL跳转，将应用程序引导到不安全的第三方区域，从而导致的安全问题。&lt;/p&gt;
 &lt;h3&gt;1.URL跳转漏洞原理&lt;/h3&gt;
 &lt;p&gt;黑客利用URL跳转漏洞来诱导安全意识低的用户点击，导致用户信息泄露或者资金的流失。其原理是黑客构建恶意链接(链接需要进行伪装,尽可能迷惑),发在QQ群或者是浏览量多的贴吧/论坛中。  &lt;br /&gt;安全意识低的用户点击后,经过服务器或者浏览器解析后，跳到恶意的网站中。  &lt;br /&gt;  &lt;img alt="" src="https://segmentfault.com/img/remote/1460000018073855?w=741&amp;h=134" title=""&gt;&lt;/img&gt;&lt;/p&gt;
 &lt;p&gt;恶意链接需要进行伪装,经常的做法是熟悉的链接后面加上一个恶意的网址，这样才迷惑用户。  &lt;br /&gt;  &lt;img alt="" src="https://segmentfault.com/img/remote/1460000018073856?w=865&amp;h=165" title=""&gt;&lt;/img&gt;&lt;/p&gt;
 &lt;p&gt;诸如伪装成像如下的网址，你是否能够识别出来是恶意网址呢？&lt;/p&gt;
 &lt;pre&gt;  &lt;code&gt;http://gate.baidu.com/index?act=go&amp;amp;url=http://t.cn/RVTatrd
http://qt.qq.com/safecheck.html?flag=1&amp;amp;url=http://t.cn/RVTatrd
http://tieba.baidu.com/f/user/passport?jumpUrl=http://t.cn/RVTatrd&lt;/code&gt;&lt;/pre&gt;
 &lt;h3&gt;2.实现方式：&lt;/h3&gt;
 &lt;ul&gt;
  &lt;li&gt;Header头跳转&lt;/li&gt;
  &lt;li&gt;Javascript跳转&lt;/li&gt;
  &lt;li&gt;META标签跳转&lt;/li&gt;
&lt;/ul&gt;
 &lt;p&gt;这里我们举个Header头跳转实现方式：&lt;/p&gt;
 &lt;pre&gt;  &lt;code&gt;&amp;lt;?php
$url=$_GET[&amp;apos;jumpto&amp;apos;];
header(&amp;quot;Location: $url&amp;quot;);
?&amp;gt;&lt;/code&gt;&lt;/pre&gt;
 &lt;pre&gt;  &lt;code&gt;http://www.wooyun.org/login.php?jumpto=http://www.evil.com&lt;/code&gt;&lt;/pre&gt;
 &lt;p&gt;这里用户会认为  &lt;code&gt;www.wooyun.org&lt;/code&gt;都是可信的，但是点击上述链接将导致用户最终访问  &lt;code&gt;www.evil.com&lt;/code&gt;这个恶意网址。&lt;/p&gt;
 &lt;h3&gt;3.如何防御&lt;/h3&gt;
 &lt;h4&gt;1)referer的限制&lt;/h4&gt;
 &lt;p&gt;如果确定传递URL参数进入的来源，我们可以通过该方式实现安全限制，保证该URL的有效性，避免恶意用户自己生成跳转链接&lt;/p&gt;
 &lt;h4&gt;2)加入有效性验证Token&lt;/h4&gt;
 &lt;p&gt;我们保证所有生成的链接都是来自于我们可信域的，通过在生成的链接里加入用户不可控的Token对生成的链接进行校验，可以避免用户生成自己的恶意链接从而被利用，但是如果功能本身要求比较开放，可能导致有一定的限制。&lt;/p&gt;
 &lt;h2&gt;五、SQL注入&lt;/h2&gt;
 &lt;p&gt;SQL注入是一种常见的Web安全漏洞，攻击者利用这个漏洞，可以访问或修改数据，或者利用潜在的数据库漏洞进行攻击。&lt;/p&gt;
 &lt;h3&gt;1.SQL注入的原理&lt;/h3&gt;
 &lt;p&gt;我们先举一个万能钥匙的例子来说明其原理：&lt;/p&gt;
 &lt;p&gt;  &lt;img alt="" src="https://segmentfault.com/img/remote/1460000018073857?w=827&amp;h=323" title=""&gt;&lt;/img&gt;&lt;/p&gt;
 &lt;pre&gt;  &lt;code&gt;&amp;lt;form action=&amp;quot;/login&amp;quot; method=&amp;quot;POST&amp;quot;&amp;gt;
    &amp;lt;p&amp;gt;Username: &amp;lt;input type=&amp;quot;text&amp;quot; name=&amp;quot;username&amp;quot; /&amp;gt;&amp;lt;/p&amp;gt;
    &amp;lt;p&amp;gt;Password: &amp;lt;input type=&amp;quot;password&amp;quot; name=&amp;quot;password&amp;quot; /&amp;gt;&amp;lt;/p&amp;gt;
    &amp;lt;p&amp;gt;&amp;lt;input type=&amp;quot;submit&amp;quot; value=&amp;quot;登陆&amp;quot; /&amp;gt;&amp;lt;/p&amp;gt;
&amp;lt;/form&amp;gt;&lt;/code&gt;&lt;/pre&gt;
 &lt;p&gt;后端的 SQL 语句可能是如下这样的：&lt;/p&gt;
 &lt;pre&gt;  &lt;code&gt;let querySQL = `
    SELECT *
    FROM user
    WHERE username=&amp;apos;${username}&amp;apos;
    AND psw=&amp;apos;${password}&amp;apos;
`;
// 接下来就是执行 sql 语句...&lt;/code&gt;&lt;/pre&gt;
 &lt;p&gt;这是我们经常见到的登录页面，但如果有一个恶意攻击者输入的用户名是   &lt;code&gt;admin&amp;apos; --&lt;/code&gt;，密码随意输入，就可以直接登入系统了。why! ----这就是SQL注入&lt;/p&gt;
 &lt;p&gt;我们之前预想的SQL 语句是:&lt;/p&gt;
 &lt;pre&gt;  &lt;code&gt;SELECT * FROM user WHERE username=&amp;apos;admin&amp;apos; AND psw=&amp;apos;password&amp;apos;&lt;/code&gt;&lt;/pre&gt;
 &lt;p&gt;但是恶意攻击者用奇怪用户名将你的 SQL 语句变成了如下形式：&lt;/p&gt;
 &lt;pre&gt;  &lt;code&gt;SELECT * FROM user WHERE username=&amp;apos;admin&amp;apos; --&amp;apos; AND psw=&amp;apos;xxxx&amp;apos;&lt;/code&gt;&lt;/pre&gt;
 &lt;p&gt;在 SQL 中,  &lt;code&gt;&amp;apos; --&lt;/code&gt;是闭合和注释的意思，-- 是注释后面的内容的意思，所以查询语句就变成了：&lt;/p&gt;
 &lt;pre&gt;  &lt;code&gt;SELECT * FROM user WHERE username=&amp;apos;admin&amp;apos;&lt;/code&gt;&lt;/pre&gt;
 &lt;p&gt;所谓的万能密码,本质上就是SQL注入的一种利用方式。&lt;/p&gt;
 &lt;p&gt;一次SQL注入的过程包括以下几个过程：&lt;/p&gt;
 &lt;ul&gt;
  &lt;li&gt;获取用户请求参数&lt;/li&gt;
  &lt;li&gt;拼接到代码当中&lt;/li&gt;
  &lt;li&gt;SQL语句按照我们构造参数的语义执行成功&lt;/li&gt;
&lt;/ul&gt;
 &lt;p&gt;**SQL注入的必备条件：  &lt;br /&gt;1.可以控制输入的数据  &lt;br /&gt;2.服务器要执行的代码拼接了控制的数据**。  &lt;br /&gt;  &lt;img alt="" src="https://segmentfault.com/img/remote/1460000018073858?w=716&amp;h=179" title=""&gt;&lt;/img&gt;  &lt;br /&gt;我们会发现SQL注入流程中与正常请求服务器类似，只是黑客控制了数据，构造了SQL查询，而正常的请求不会SQL查询这一步，  &lt;strong&gt;SQL注入的本质:数据和代码未分离，即数据当做了代码来执行。&lt;/strong&gt;&lt;/p&gt;
 &lt;h3&gt;2.危害&lt;/h3&gt;
 &lt;ul&gt;
  &lt;li&gt;
   &lt;p&gt;获取数据库信息&lt;/p&gt;
   &lt;ul&gt;
    &lt;li&gt;管理员后台用户名和密码&lt;/li&gt;
    &lt;li&gt;获取其他数据库敏感信息：用户名、密码、手机号码、身份证、银行卡信息……&lt;/li&gt;
    &lt;li&gt;整个数据库：脱裤&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
  &lt;li&gt;获取服务器权限&lt;/li&gt;
  &lt;li&gt;植入Webshell，获取服务器后门&lt;/li&gt;
  &lt;li&gt;读取服务器敏感文件&lt;/li&gt;
&lt;/ul&gt;
 &lt;h3&gt;3.如何防御&lt;/h3&gt;
 &lt;ul&gt;
  &lt;li&gt;
   &lt;strong&gt;严格限制Web应用的数据库的操作权限&lt;/strong&gt;，给此用户提供仅仅能够满足其工作的最低权限，从而最大限度的减少注入攻击对数据库的危害&lt;/li&gt;
  &lt;li&gt;
   &lt;strong&gt;后端代码检查输入的数据是否符合预期&lt;/strong&gt;，严格限制变量的类型，例如使用正则表达式进行一些匹配处理。&lt;/li&gt;
  &lt;li&gt;
   &lt;strong&gt;对进入数据库的特殊字符（&amp;apos;，&amp;quot;，，&amp;lt;，&amp;gt;，&amp;amp;，*，; 等）进行转义处理，或编码转换&lt;/strong&gt;。基本上所有的后端语言都有对字符串进行转义处理的方法，比如 lodash 的 lodash._escapehtmlchar 库。&lt;/li&gt;
  &lt;li&gt;
   &lt;strong&gt;所有的查询语句建议使用数据库提供的参数化查询接口&lt;/strong&gt;，参数化的语句使用参数而不是将用户输入变量嵌入到 SQL 语句中，即不要直接拼接 SQL 语句。例如 Node.js 中的 mysqljs 库的 query 方法中的 ? 占位参数。&lt;/li&gt;
&lt;/ul&gt;
 &lt;h2&gt;六、OS命令注入攻击&lt;/h2&gt;
 &lt;p&gt;OS命令注入和SQL注入差不多，只不过SQL注入是针对数据库的，而OS命令注入是针对操作系统的。OS命令注入攻击指通过Web应用，执行非法的操作系统命令达到攻击的目的。只要在能调用Shell函数的地方就有存在被攻击的风险。倘若调用Shell时存在疏漏，就可以执行插入的非法命令。&lt;/p&gt;
 &lt;p&gt;命令注入攻击可以向Shell发送命令，让Windows或Linux操作系统的命令行启动程序。也就是说，通过命令注入攻击可执行操作系统上安装着的各种程序。&lt;/p&gt;
 &lt;h3&gt;1.原理&lt;/h3&gt;
 &lt;p&gt;  &lt;img alt="" src="https://segmentfault.com/img/remote/1460000018073859?w=657&amp;h=154" title=""&gt;&lt;/img&gt;  &lt;br /&gt;黑客构造命令提交给web应用程序，web应用程序提取黑客构造的命令，拼接到被执行的命令中，因黑客注入的命令打破了原有命令结构，导致web应用执行了额外的命令，最后web应用程序将执行的结果输出到响应页面中。&lt;/p&gt;
 &lt;p&gt;我们通过一个例子来说明其原理，假如需要实现一个需求：用户提交一些内容到服务器，然后在服务器执行一些系统命令去返回一个结果给用户&lt;/p&gt;
 &lt;pre&gt;  &lt;code&gt;// 以 Node.js 为例，假如在接口中需要从 github 下载用户指定的 repo
const exec = require(&amp;apos;mz/child_process&amp;apos;).exec;
let params = {/* 用户输入的参数 */};
exec(`git clone ${params.repo} /some/path`);&lt;/code&gt;&lt;/pre&gt;
 &lt;p&gt;如果   &lt;code&gt;params.repo&lt;/code&gt; 传入的是   &lt;code&gt;https://github.com/admin/admin.github.io.git&lt;/code&gt; 确实能从指定的 git repo 上下载到想要的代码。  &lt;br /&gt;但是如果   &lt;code&gt;params.repo&lt;/code&gt; 传入的是   &lt;code&gt;https://github.com/xx/xx.git &amp;amp;&amp;amp; rm -rf /* &amp;amp;&amp;amp;&lt;/code&gt; 恰好你的服务是用 root 权限起的就糟糕了。&lt;/p&gt;
 &lt;h3&gt;2.如何防御&lt;/h3&gt;
 &lt;ul&gt;
  &lt;li&gt;后端对前端提交内容进行规则限制（比如正则表达式）。&lt;/li&gt;
  &lt;li&gt;在调用系统命令前对所有传入参数进行命令行参数转义过滤。&lt;/li&gt;
  &lt;li&gt;不要直接拼接命令语句，借助一些工具做拼接、转义预处理，例如 Node.js 的    &lt;code&gt;shell-escape npm&lt;/code&gt;包&lt;/li&gt;
&lt;/ul&gt;
 &lt;p&gt;  &lt;strong&gt;给大家推荐一个好用的BUG监控工具   &lt;a href="https://www.fundebug.com/?utm_source=liao" rel="nofollow noreferrer"&gt;Fundebug&lt;/a&gt;，欢迎免费试用！&lt;/strong&gt;&lt;/p&gt;
 &lt;h2&gt;参考资料&lt;/h2&gt;
 &lt;ul&gt;
  &lt;li&gt;   &lt;a href="https://zoumiaojiang.com/article/common-web-security/" rel="nofollow noreferrer"&gt;常见Web 安全攻防总结&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;   &lt;a href="https://juejin.im/book/5bdc715fe51d454e755f75ef" rel="nofollow noreferrer"&gt;前端面试之道&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;   &lt;a href="https://book.douban.com/subject/25863515/" rel="nofollow noreferrer"&gt;图解Http&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;   &lt;a href="https://wetest.qq.com/lab/view/136.html" rel="nofollow noreferrer"&gt;Web安全知多少&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;   &lt;a href="https://blog.csdn.net/qq_32523587/article/details/79613768" rel="nofollow noreferrer"&gt;web安全之点击劫持(clickjacking)&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;   &lt;a href="http://drops.xmd5.com/static/drops/papers-58.html" rel="nofollow noreferrer"&gt;URL重定向/跳转漏洞&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;   &lt;a href="https://mooc.study.163.com/smartSpec/detail/1001227001.htm" rel="nofollow noreferrer"&gt;网易web白帽子&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt; &lt;a href="https://itindex.net/"  title="IT 资讯"&gt;&lt;img src="https://itindex.net/images/iconWarning.gif" title="IT 资讯" border="0"/&gt; &lt;/a&gt;</description>
      <category>node.js java javascript 前端 程序员</category>
      <guid isPermaLink="true">https://itindex.net/detail/59265-%E5%B8%B8%E8%A7%81-web-%E5%AE%89%E5%85%A8</guid>
      <pubDate>Thu, 31 Jan 2019 09:06:34 CST</pubDate>
    </item>
    <item>
      <title>深入了解Json Web Token之概念篇</title>
      <link>https://itindex.net/detail/58629-json-web-token</link>
      <description>&lt;p&gt;&lt;/p&gt;
 &lt;p&gt;  &lt;strong&gt;以下，可能你能够在各大网站上搜到，但是对于JWE 的内容，却鲜有见闻。下文是我读了json web token handle book后，用自己的理解写下的，如有疑问，欢迎评论。主要参考文本   &lt;a href="https://auth0.com/resources/ebooks/jwt-handbook"&gt;JWT Hand Book&lt;/a&gt;，部分文字翻译自该手册。&lt;/strong&gt;&lt;/p&gt;
 &lt;h2&gt;0×00 什么是 JWT&lt;/h2&gt;
 &lt;p&gt;一个JWT，应该是如下形式的：&lt;/p&gt;
 &lt;pre&gt;  &lt;code&gt;eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.
eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWV9.
TJVA95OrM7E2cBab30RMHrHDcEfxjoYZgeFONFh7HgQ
&lt;/code&gt;&lt;/pre&gt;
 &lt;p&gt;这些东西看上很凌乱，但是非常  &lt;strong&gt;紧凑&lt;/strong&gt;，并且是  &lt;strong&gt;可打印的&lt;/strong&gt;主要用于  &lt;strong&gt;验证&lt;/strong&gt;签名的真实性。&lt;/p&gt;
 &lt;h3&gt;JWT 解决什么问题？&lt;/h3&gt;
 &lt;p&gt;JWT的主要目的是在服务端和客户端之间以安全的方式来转移声明。主要的应用场景如下所示：&lt;/p&gt;
 &lt;p&gt;1.认证 Authentication；&lt;/p&gt;
 &lt;p&gt;2.授权 Authorization // 注意这两个单词的区别；&lt;/p&gt;
 &lt;p&gt;3.联合识别；&lt;/p&gt;
 &lt;p&gt;4.客户端会话（无状态的会话）；&lt;/p&gt;
 &lt;p&gt;5.客户端机密。&lt;/p&gt;
 &lt;h3&gt;JWT 的一些名词解释&lt;/h3&gt;
 &lt;p&gt;1.JWS：Signed JWT签名过的jwt&lt;/p&gt;
 &lt;p&gt;2.JWE：Encrypted JWT部分payload经过加密的jwt；&lt;/p&gt;
 &lt;p&gt;目前加密payload的操作不是很普及；&lt;/p&gt;
 &lt;p&gt;3.JWK：JWT的密钥，也就是我们常说的scret；&lt;/p&gt;
 &lt;p&gt;4.JWKset：JWT key set在非对称加密中，需要的是密钥对而非单独的密钥，在后文中会阐释；&lt;/p&gt;
 &lt;p&gt;5.JWA：当前JWT所用到的密码学算法；&lt;/p&gt;
 &lt;p&gt;6.nonsecure JWT：当头部的签名算法被设定为none的时候，该JWT是不安全的；因为签名的部分空缺，所有人都可以修改。&lt;/p&gt;
 &lt;h2&gt;0×01 JWT的组成&lt;/h2&gt;
 &lt;p&gt;一个通常你看到的jwt，由以下三部分组成，它们分别是：&lt;/p&gt;
 &lt;p&gt;1.header：主要声明了JWT的签名算法；&lt;/p&gt;
 &lt;p&gt;2.payload：主要承载了各种声明并传递明文数据；&lt;/p&gt;
 &lt;p&gt;3.signture：拥有该部分的JWT被称为JWS，也就是签了名的JWS；没有该部分的JWT被称为nonsecure JWT 也就是不安全的JWT，此时header中声明的签名算法为none。&lt;/p&gt;
 &lt;p&gt;三个部分用·分割。形如   &lt;code&gt;xxxxx.yyyyy.zzzzz&lt;/code&gt;的样式。&lt;/p&gt;
 &lt;h3&gt;JWT header&lt;/h3&gt;
 &lt;pre&gt;  &lt;code&gt;{
  &amp;quot;typ&amp;quot;: &amp;quot;JWT&amp;quot;,
  &amp;quot;alg&amp;quot;: &amp;quot;none&amp;quot;,
  &amp;quot;jti&amp;quot;: &amp;quot;4f1g23a12aa&amp;quot;
}
&lt;/code&gt;&lt;/pre&gt;
 &lt;p&gt;  &lt;strong&gt;jwt header 的组成&lt;/strong&gt;&lt;/p&gt;
 &lt;p&gt;头通常由两部分组成：令牌的类型，即JWT，以及正在使用的散列算法，例如HMAC SHA256或RSA。&lt;/p&gt;
 &lt;p&gt;当然，还有两个可选的部分，一个是jti，也就是JWT ID，代表了正在使用JWT的编号，这个编号在对应服务端应当唯一。当然，jti也可以放在payload中。&lt;/p&gt;
 &lt;p&gt;另一个是cty，也就是content type。这个比较少见，当payload为任意数据的时候，这个头无需设置，但是当内容也带有jwt的时候。也就是嵌套JWT的时候，这个值必须设定为jwt。这种情况比较少见。&lt;/p&gt;
 &lt;p&gt;  &lt;strong&gt;jwt header 的加密算法&lt;/strong&gt;&lt;/p&gt;
 &lt;p&gt;加密的方式如下：&lt;/p&gt;
 &lt;pre&gt;  &lt;code&gt;base64UrlEncode(header)
&amp;gt;&amp;gt; eyJ0eXAiOiJKV1QiLCJhbGciOiJub25lIiwianRpIjoiNGYxZzIzYTEyYWEifQ
&lt;/code&gt;&lt;/pre&gt;
 &lt;h3&gt;JWT payload&lt;/h3&gt;
 &lt;pre&gt;  &lt;code&gt;{
  &amp;quot;iss&amp;quot;: &amp;quot;http://shaobaobaoer.cn&amp;quot;,
  &amp;quot;aud&amp;quot;: &amp;quot;http://shaobaobaoer.cn/webtest/jwt_auth/&amp;quot;,
  &amp;quot;jti&amp;quot;: &amp;quot;4f1g23a12aa&amp;quot;,
  &amp;quot;iat&amp;quot;: 1534070547,
  &amp;quot;nbf&amp;quot;: 1534070607,
  &amp;quot;exp&amp;quot;: 1534074147,
  &amp;quot;uid&amp;quot;: 1,
  &amp;quot;data&amp;quot;: {
    &amp;quot;uname&amp;quot;: &amp;quot;shaobao&amp;quot;,
    &amp;quot;uEmail&amp;quot;: &amp;quot;shaobaobaoer@126.com&amp;quot;,
    &amp;quot;uID&amp;quot;: &amp;quot;0xA0&amp;quot;,
    &amp;quot;uGroup&amp;quot;: &amp;quot;guest&amp;quot;
  }
}
&lt;/code&gt;&lt;/pre&gt;
 &lt;p&gt;  &lt;strong&gt;jwt payload的组成&lt;/strong&gt;&lt;/p&gt;
 &lt;p&gt;payload通常由三个部分组成，分别是 Registered Claims ; Public Claims ; Private Claims ;每个声明，都有各自的字段。&lt;/p&gt;
 &lt;p&gt;Registered Claims&lt;/p&gt;
 &lt;blockquote&gt;  &lt;p&gt;iss  【issuer】发布者的url地址&lt;/p&gt;
  &lt;p&gt;sub 【subject】该JWT所面向的用户，用于处理特定应用，不是常用的字段&lt;/p&gt;
  &lt;p&gt;aud 【audience】接受者的url地址&lt;/p&gt;
  &lt;p&gt;exp 【expiration】 该jwt销毁的时间；unix时间戳&lt;/p&gt;
  &lt;p&gt;nbf  【not before】 该jwt的使用时间不能早于该时间；unix时间戳&lt;/p&gt;
  &lt;p&gt;iat   【issued at】 该jwt的发布时间；unix 时间戳&lt;/p&gt;
  &lt;p&gt;jti    【JWT ID】 该jwt的唯一ID编号&lt;/p&gt;
&lt;/blockquote&gt;
 &lt;p&gt;Public Claims这些可以由使用JWT的那些标准化组织根据需要定义，应当参考文档  &lt;a href="https://www.iana.org/assignments/jwt/jwt.xhtml"&gt;IANA JSON Web Token Registry&lt;/a&gt;。&lt;/p&gt;
 &lt;p&gt;Private Claims这些是为在同意使用它们的各方之间共享信息而创建的自定义声明，既不是注册声明也不是公开声明。上面的payload中，没有public claims只有private claims。&lt;/p&gt;
 &lt;p&gt;  &lt;strong&gt;jwt payload 的加密算法&lt;/strong&gt;&lt;/p&gt;
 &lt;p&gt;加密的方式如下：&lt;/p&gt;
 &lt;pre&gt;  &lt;code&gt;base64UrlEncode(payload)
&amp;gt;&amp;gt; eyJpc3MiOiJodHRwOi8vc2hhb2Jhb2Jhb2VyLmNuIiwiYXVkIjoiaHR0cDovL3NoYW9iYW9iYW9lci5jbi93ZWJ0ZXN0L2p3dF9hdXRoLyIsImp0aSI6IjRmMWcyM2ExMmFhIiwiaWF0IjoxNTM0MDcwNTQ3LCJuYmYiOjE1MzQwNzA2MDcsImV4cCI6MTUzNDA3NDE0NywidWlkIjoxLCJkYXRhIjp7InVuYW1lIjoic2hhb2JhbyIsInVFbWFpbCI6InNoYW9iYW9iYW9lckAxMjYuY29tIiwidUlEIjoiMHhBMCIsInVHcm91cCI6Imd1ZXN0In19
&lt;/code&gt;&lt;/pre&gt;
 &lt;h3&gt;  &lt;strong&gt;暴露的信息&lt;/strong&gt;&lt;/h3&gt;
 &lt;p&gt;所以，在JWT中，不应该在载荷里面加入任何敏感的数据。在上面的例子中，我们传输的是用户的User ID，邮箱等。这个值实际上不是什么敏感内容，一般情况下被知道也是安全的。但是像密码这样的内容就不能被放在JWT中了。如果将用户的密码放在了JWT中，那么怀有恶意的第三方通过Base64解码就能很快地知道你的密码了。&lt;/p&gt;
 &lt;p&gt;当然，这也是有解决方案的，那就是加密payload。在之后会说到。&lt;/p&gt;
 &lt;h2&gt;0×02  JWS 的概念&lt;/h2&gt;
 &lt;h3&gt;JWS 的结构&lt;/h3&gt;
 &lt;p&gt;JWS ，也就是JWT Signature，其结构就是在之前nonsecure JWT的基础上，在头部声明签名算法，并在最后添加上签名。创建签名，是保证jwt不能被他人随意篡改。&lt;/p&gt;
 &lt;p&gt;为了完成签名，除了用到header信息和payload信息外，还需要算法的密钥，也就是secret。当利用非对称加密方法的时候，这里的secret为私钥。&lt;/p&gt;
 &lt;p&gt;为了方便后文的展开，我们把JWT的密钥或者密钥对，统一称为JSON Web Key，也就是JWK。&lt;/p&gt;
 &lt;p&gt;  &lt;strong&gt;jwt signature 的签名算法&lt;/strong&gt;&lt;/p&gt;
 &lt;pre&gt;  &lt;code&gt;RSASSA || ECDSA || HMACSHA256(
  base64UrlEncode(header) + &amp;quot;.&amp;quot; +
  base64UrlEncode(payload),
  secret)
&amp;gt;&amp;gt; GQPGEpixjPZSZ7CmqXB-KIGNzNl4Y86d3XOaRsfiXmQ
&amp;gt;&amp;gt; # 上面这个是用 HMAC SHA256生成的
&lt;/code&gt;&lt;/pre&gt;
 &lt;p&gt;到目前为止，jwt的签名算法有三种。&lt;/p&gt;
 &lt;p&gt;对称加密HMAC【哈希消息验证码】：HS256/HS384/HS512&lt;/p&gt;
 &lt;p&gt;非对称加密RSASSA【RSA签名算法】（RS256/RS384/RS512）和ECDSA【椭圆曲线数据签名算法】（ES256/ES384/ES512）&lt;/p&gt;
 &lt;p&gt;最后将签名与之前的两段内容用.连接，就可以得到经过签名的JWT，也就是JWS。&lt;/p&gt;
 &lt;pre&gt;  &lt;code&gt;eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiIsImp0aSI6IjRmMWcyM2ExMmFhIn0.eyJpc3MiOiJodHRwOi8vc2hhb2Jhb2Jhb2VyLmNuIiwiYXVkIjoiaHR0cDovL3NoYW9iYW9iYW9lci5jbi93ZWJ0ZXN0L2p3dF9hdXRoLyIsImp0aSI6IjRmMWcyM2ExMmFhIiwiaWF0IjoxNTM0MDcwNTQ3LCJuYmYiOjE1MzQwNzA2MDcsImV4cCI6MTUzNDA3NDE0NywidWlkIjoxLCJkYXRhIjp7InVuYW1lIjoic2hhb2JhbyIsInVFbWFpbCI6InNoYW9iYW9iYW9lckAxMjYuY29tIiwidUlEIjoiMHhBMCIsInVHcm91cCI6Imd1ZXN0In19.GQPGEpixjPZSZ7CmqXB-KIGNzNl4Y86d3XOaRsfiXmQ
&lt;/code&gt;&lt;/pre&gt;
 &lt;p&gt;当验证签名的时候，利用公钥或者密钥来解密Sign，和 base64UrlEncode(header) + “.” + base64UrlEncode(payload) 的内容完全一样的时候，表示验证通过。&lt;/p&gt;
 &lt;h3&gt;JWS 的额外头部声明&lt;/h3&gt;
 &lt;p&gt;如果对于CA有些概念的话，这些内容会比较好理解一些。为了确保服务器的密钥对可靠有效，同时也方便第三方CA机构来签署JWT而非本机服务器签署JWT，对于JWS的头部，可以有额外的声明，以下声明是可选的，具体取决于JWS的使用方式。如下所示：&lt;/p&gt;
 &lt;p&gt;&lt;/p&gt;
 &lt;blockquote&gt;  &lt;p&gt;jku: 发送JWK的地址；最好用HTTPS来传输&lt;/p&gt;
  &lt;p&gt;jwk: 就是之前说的JWK&lt;/p&gt;
  &lt;p&gt;kid: jwk的ID编号&lt;/p&gt;
  &lt;p&gt;x5u: 指向一组X509公共证书的URL&lt;/p&gt;
  &lt;p&gt;x5c: X509证书链&lt;/p&gt;
  &lt;p&gt;x5t：X509证书的SHA-1指纹&lt;/p&gt;
  &lt;p&gt;x5t#S256: X509证书的SHA-256指纹&lt;/p&gt;
  &lt;p&gt;typ: 在原本未加密的JWT的基础上增加了 JOSE 和 JOSE+ JSON。JOSE序列化后文会说及。适用于JOSE标头的对象与此JWT混合的情况。&lt;/p&gt;
  &lt;p&gt;crit: 字符串数组，包含声明的名称，用作实现定义的扩展，必须由 this-&amp;gt;JWT的解析器处理。不常见。&lt;/p&gt;
&lt;/blockquote&gt;
 &lt;p&gt;&lt;/p&gt;
 &lt;h3&gt;多重验证与JWS序列化&lt;/h3&gt;
 &lt;p&gt;当需要多重签名或者JOSE表头的对象与JWS混合的时候，往往需要用到JWS的序列化。JWS的序列化结构如下所示:&lt;/p&gt;
 &lt;pre&gt;  &lt;code&gt;{
    &amp;quot;payload&amp;quot;: &amp;quot;eyJpc3MiOiJqb2UiLA0KICJleHAiOjEzMDA4MTkzODAsDQogImh0dHA6Ly9leGFtcGxlLmNvbS9pc19yb290Ijp0cnVlfQ&amp;quot;,
&amp;quot;signatures&amp;quot;: 
    [
        {
            &amp;quot;protected&amp;quot;: &amp;quot;eyJhbGciOiJSUzI1NiJ9&amp;quot;,
            &amp;quot;header&amp;quot;: { &amp;quot;kid&amp;quot;: &amp;quot;2010-12-29&amp;quot; },
            &amp;quot;signature&amp;quot;:&amp;quot;signature1&amp;quot;
        },
        {
            &amp;quot;protected&amp;quot;: &amp;quot;eyJhbGciOiJSUzI1NiJ9&amp;quot;,
            &amp;quot;header&amp;quot;: { &amp;quot;kid&amp;quot;: &amp;quot;e9bc097a-ce51-4036-9562-d2ade882db0d&amp;quot; },
            &amp;quot;signature&amp;quot;:&amp;quot;signature2&amp;quot;
        },
        ...
    ]
}
&lt;/code&gt;&lt;/pre&gt;
 &lt;p&gt;结构很容易理解。首先是payload字段，这个不用多讲，之后是signatures字段，这是一个数组，代表着多个签名。每个签名的结构如下：&lt;/p&gt;
 &lt;p&gt;protected：之前的头部声明，利用b64uri加密；&lt;/p&gt;
 &lt;p&gt;header：JWS的额外声明，这段内容不会放在签名之中，无需验证；&lt;/p&gt;
 &lt;p&gt;signature：也就是对当前header+payload的签名。&lt;/p&gt;
 &lt;h2&gt;0×03 JWE 相关概念&lt;/h2&gt;
 &lt;blockquote&gt;  &lt;p&gt;JWE是一个很新的概念，总之，除了jwt的官方手册外，很少有网站或者博客会介绍这个东西。也并非所有的库都支持JWE。这里记录一下自己看官方手册后理解下来的东西。&lt;/p&gt;
&lt;/blockquote&gt;
 &lt;p&gt;JWS是去验证数据的，而JWE（JSON Web Encryption）是保护数据不被第三方的人看到的。通过JWE，JWT变得更加安全。&lt;/p&gt;
 &lt;p&gt;JWE和JWS的公钥私钥方案不相同，JWS中，私钥持有者加密令牌，公钥持有者验证令牌。而JWE中，私钥一方应该是唯一可以解密令牌的一方。&lt;/p&gt;
 &lt;p&gt;在JWE中，公钥持有可以将新的数据放入JWT中，但是JWS中，公钥持有者只能验证数据，不能引入新的数据。因此，对于公钥/私钥的方案而言，JWS和JWE是互补的。&lt;/p&gt;
 &lt;table&gt;



    

  &lt;tr&gt;
   &lt;th&gt; &lt;/th&gt;
   &lt;th&gt;JWS&lt;/th&gt;
   &lt;th&gt;JWE&lt;/th&gt;
&lt;/tr&gt;


  &lt;tr&gt;
   &lt;td&gt;producer&lt;/td&gt;
   &lt;td&gt;pri_key&lt;/td&gt;
   &lt;td&gt;pub_key&lt;/td&gt;
&lt;/tr&gt;
  &lt;tr&gt;
   &lt;td&gt;consumer&lt;/td&gt;
   &lt;td&gt;pub_key&lt;/td&gt;
   &lt;td&gt;pri_key&lt;/td&gt;
&lt;/tr&gt;

&lt;/table&gt;
 &lt;h3&gt;JWE 的构成&lt;/h3&gt;
 &lt;p&gt;一个JWE，应该是如下形式的：&lt;/p&gt;
 &lt;pre&gt;  &lt;code&gt;eyJhbGciOiJSU0ExXzUiLCJlbmMiOiJBMTI4Q0JDLUhTMjU2In0.
UGhIOguC7IuEvf_NPVaXsGMoLOmwvc1GyqlIKOK1nN94nHPoltGRhWhw7Zx0-kFm1NJn8LE9XShH59_
i8J0PH5ZZyNfGy2xGdULU7sHNF6Gp2vPLgNZ__deLKxGHZ7PcHALUzoOegEI-8E66jX2E4zyJKxYxzZIItRzC5hlRirb6Y5Cl_p-ko3YvkkysZIFNPccxRU7qve1WYPxqbb2Yw8kZqa2rMWI5ng8Otv
zlV7elprCbuPhcCdZ6XDP0_F8rkXds2vE4X-ncOIM8hAYHHi29NX0mcKiRaD0-D-ljQTPcFPgwCp6X-nZZd9OHBv-B3oWh2TbqmScqXMR4gp_A.
AxY8DCtDaGlsbGljb3RoZQ.
KDlTtXchhZTGufMYmOYGS4HffxPSUrfmqCHXaI9wOGY.
9hH0vgRfYgPnAHOd8stkvw
&lt;/code&gt;&lt;/pre&gt;
 &lt;p&gt;如你所见JWE一共有五个部分，分别是：&lt;/p&gt;
 &lt;blockquote&gt;  &lt;p&gt;The protected header，类似于JWS的头部；&lt;/p&gt;
  &lt;p&gt;The encrypted key，用于加密密文和其他加密数据的对称密钥；&lt;/p&gt;
  &lt;p&gt;The initialization vector，初始IV值，有些加密方式需要额外的或者随机的数据；&lt;/p&gt;
  &lt;p&gt;The encrypted data (cipher text)，密文数据；&lt;/p&gt;
  &lt;p&gt;The authentication tag，由算法产生的附加数据，来防止密文被篡改。&lt;/p&gt;
&lt;/blockquote&gt;
 &lt;h3&gt;JWE 密钥加密算法&lt;/h3&gt;
 &lt;p&gt;一般来说，JWE需要对密钥进行加密，这就意味着同一个JWT中至少有两种加密算法在起作用。但是并非将密钥拿来就能用，我们需要对密钥进行加密后，利用JWK密钥管理模式来导出这些密钥。JWK的管理模式有以下五种，分别是：&lt;/p&gt;
 &lt;blockquote&gt;  &lt;p&gt;Key Encryption&lt;/p&gt;
  &lt;p&gt;Key Wrapping&lt;/p&gt;
  &lt;p&gt;Direct Key Agreement&lt;/p&gt;
  &lt;p&gt;Key Agreement with Key Wrapping&lt;/p&gt;
  &lt;p&gt;Direct Encryption&lt;/p&gt;
&lt;/blockquote&gt;
 &lt;p&gt;并不是所有的JWA都能够支持这五种密钥管理管理模式，也并非每种密钥管理模式之间都可以相互转换。可以参考  &lt;a href="https://github.com/Spomky-Labs/jose/blob/master/doc/operation/Encrypt.md"&gt;Spomky-Labs/jose中给出的表格&lt;/a&gt;至于各个密钥管理模式的细节，还请看JWT的官方手册，解释起来较为复杂。&lt;/p&gt;
 &lt;h3&gt;JWE Header&lt;/h3&gt;
 &lt;p&gt;就好像是JWS的头部一样。JWE的头部也有着自己规定的额外声明字段，如下所示：&lt;/p&gt;
 &lt;blockquote&gt;  &lt;p&gt;type：一般是 jwt&lt;/p&gt;
  &lt;p&gt;alg：算法名称，和JWS相同，该算法用于加密稍后用于加密内容的实际密钥&lt;/p&gt;
  &lt;p&gt;enc：算法名称，用上一步生成的密钥加密内容的算法。&lt;/p&gt;
  &lt;p&gt;zip：加密前压缩数据的算法。该参数可选，如果不存在则不执行压缩，通常的值为 DEF，也就是   &lt;a href="https://tools.ietf.org/html/rfc1951"&gt;deflate算法&lt;/a&gt;&lt;/p&gt;
  &lt;p&gt;jku/jkw/kid/x5u/x5c/x5t/x5t#S256/typ/cty/crit：和JWS额额外声明一样。&lt;/p&gt;
&lt;/blockquote&gt;
 &lt;h3&gt;JWE 的加密过程&lt;/h3&gt;
 &lt;p&gt;&lt;/p&gt;
 &lt;p&gt;步骤2和步骤3，更具不同的密钥管理模式，应该有不同的处理方式。在此只罗列一些通常情况。&lt;/p&gt;
 &lt;p&gt;之前谈及，JWE一共有五个部分。现在来详细说一下加密的过程：&lt;/p&gt;
 &lt;p&gt;1.根据头部alg的声明，生成一定大小的随机数；&lt;/p&gt;
 &lt;p&gt;2.根据密钥管理模式确定加密密钥；&lt;/p&gt;
 &lt;p&gt;3.根据密钥管理模式确定JWE加密密钥，得到CEK；&lt;/p&gt;
 &lt;p&gt;4.计算初始IV，如果不需要，跳过此步骤；&lt;/p&gt;
 &lt;p&gt;5.如果ZIP头申明了，则压缩明文；&lt;/p&gt;
 &lt;p&gt;6.使用CEK，IV和附加认证数据，通过enc头声明的算法来加密内容，结果为加密数据和认证标记；&lt;/p&gt;
 &lt;p&gt;7.压缩内容，返回token。&lt;/p&gt;
 &lt;p&gt;&lt;/p&gt;
 &lt;p&gt;&lt;/p&gt;
 &lt;pre&gt;  &lt;code&gt;   &lt;p&gt;base64(header) + &amp;apos;.&amp;apos; +&lt;/p&gt;   &lt;p&gt;base64(encryptedKey) + &amp;apos;.&amp;apos; + // Steps 2 and 3&lt;/p&gt;   &lt;p&gt;base64(initializationVector) + &amp;apos;.&amp;apos; + // Step 4&lt;/p&gt;   &lt;p&gt;base64(ciphertext) + &amp;apos;.&amp;apos; + // Step 6&lt;/p&gt;   &lt;p&gt;base64(authenticationTag) // Step 6&lt;/p&gt;&lt;/code&gt;&lt;/pre&gt;
 &lt;p&gt;&lt;/p&gt;
 &lt;p&gt;&lt;/p&gt;
 &lt;h3&gt;多重验证与JWE序列化&lt;/h3&gt;
 &lt;p&gt;和JWS类似，JWE也定义了紧凑的序列化格式，用来完成多种形式的加密。大致格式如下所示：&lt;/p&gt;
 &lt;pre&gt;  &lt;code&gt;{
    &amp;quot;protected&amp;quot;: &amp;quot;eyJlbmMiOiJBMTI4Q0JDLUhTMjU2In0&amp;quot;,
    &amp;quot;unprotected&amp;quot;: { &amp;quot;jku&amp;quot;:&amp;quot;https://server.example.com/keys.jwks&amp;quot; },
    &amp;quot;recipients&amp;quot;:[
        {
        &amp;quot;header&amp;quot;: { &amp;quot;alg&amp;quot;:&amp;quot;RSA1_5&amp;quot;,&amp;quot;kid&amp;quot;:&amp;quot;2011-04-29&amp;quot; },
        &amp;quot;encrypted_key&amp;quot;:
        &amp;quot;UGhIOguC7Iu...cqXMR4gp_A&amp;quot;
        },
        {
        &amp;quot;header&amp;quot;: { &amp;quot;alg&amp;quot;:&amp;quot;A128KW&amp;quot;,&amp;quot;kid&amp;quot;:&amp;quot;7&amp;quot; },
        &amp;quot;encrypted_key&amp;quot;: &amp;quot;6KB707dM9YTIgH...9locizkDTHzBC2IlrT1oOQ&amp;quot;
        }
    ],
    &amp;quot;iv&amp;quot;: &amp;quot;AxY8DCtDaGlsbGljb3RoZQ&amp;quot;,
    &amp;quot;ciphertext&amp;quot;: &amp;quot;KDlTtXchhZTGufMYmOYGS4HffxPSUrfmqCHXaI9wOGY&amp;quot;,
    &amp;quot;tag&amp;quot;: &amp;quot;Mz-VPPyU4RlcuYv1IwIvzw&amp;quot;
}
&lt;/code&gt;&lt;/pre&gt;
 &lt;p&gt;结构很容易理解，如下所示：&lt;/p&gt;
 &lt;blockquote&gt;  &lt;p&gt;protected：之前的头部声明，利用b64uri加密；&lt;/p&gt;
  &lt;p&gt;unprotected：一般放JWS的额外声明，这段内容不会被b64加密；&lt;/p&gt;
  &lt;p&gt;iv：64加密后的iv参数；&lt;/p&gt;
  &lt;p&gt;add：额外认证数据；&lt;/p&gt;
  &lt;p&gt;ciphertext：b64加密后的加密数据；&lt;/p&gt;
  &lt;p&gt;recipients：b64加密后的认证标志-加密链，这是一个数组，每个数组中包含了两个信息；&lt;/p&gt;
  &lt;p&gt;header：主要是声明当前密钥的算法；&lt;/p&gt;
  &lt;p&gt;encrypted_key：JWE加密密钥。&lt;/p&gt;
&lt;/blockquote&gt;
 &lt;h2&gt;0×04 JWT 的工作原理&lt;/h2&gt;
 &lt;p&gt;&lt;/p&gt;
 &lt;p&gt;这里通过juice shop来说下jwt是如何工作的。&lt;/p&gt;
 &lt;p&gt;在身份验证中，当用户使用其凭据成功登录时，将返回JSON Web令牌。如下所示：往此时，返回了jwt的令牌。&lt;/p&gt;
 &lt;p&gt;  &lt;img alt="image.png" height="240.18987341772151" src="http://image.3001.net/images/20180815/15343166576029.png!small" width="690"&gt;&lt;/img&gt;&lt;/p&gt;
 &lt;p&gt;每当用户想要访问受保护的路由或资源时，用户将使用承载【bearer】模式发送JWT，通常在Authorization标头中。标题的内容应如下所示：&lt;/p&gt;
 &lt;pre&gt;  &lt;code&gt;Authorization: Bearer &amp;lt;token&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
 &lt;p&gt;随后，服务器会取出token中的内容，来返回对应的内容。须知，这个token不一定会储存在cookie中，如果存在cookie中的话，需要设置为http-only，防止XSS。另外，还可以放在别的地方，比如localStorage、sessionStorage。如果使用vue的话，还可以存在vuex里面。&lt;/p&gt;
 &lt;p&gt;另外，如果在如  &lt;code&gt;Authorization: Bearer&lt;/code&gt;中发送令牌，则跨域资源共享（CORS）将不会成为问题，因为它不使用cookie。&lt;/p&gt;
 &lt;p&gt;此时，去访问认证页面，请求头如下所示，如预期所见，是利用Authorization:Bearer的请求头去访问的。&lt;/p&gt;
 &lt;p&gt;  &lt;img alt="image.png" height="194" src="http://image.3001.net/images/20180815/15343166269531.png!small" width="690"&gt;&lt;/img&gt;&lt;/p&gt;
 &lt;p&gt;关于更多的关于JWT认证的内容，可以看  &lt;a href="http://blog.leapoahead.com/2015/09/07/user-authentication-with-jwt/"&gt;八幅漫画理解使用JSON Web Token设计单点登录系统 ——— by John Wu&lt;/a&gt;&lt;/p&gt;
 &lt;h3&gt;ECDSA|RSASSA or HMAC ？ 应该选用哪个？&lt;/h3&gt;
 &lt;p&gt;&lt;/p&gt;
 &lt;p&gt;之前看JWT的时候看到论坛里的一个话题，觉得很有意思，用自己的理解来说一下  &lt;a href="https://stackoverflow.com/questions/38588319/understanding-rsa-signing-for-jwt"&gt;https://stackoverflow.com/questions/38588319/understanding-rsa-signing-for-jwt&lt;/a&gt;。&lt;/p&gt;
 &lt;p&gt;首先，我们必须明确一点，无论用的是 HMAC，RSASSA，ECDSA；密钥，公钥，私钥都不会发送给客户端，仅仅会保留在服务端上。&lt;/p&gt;
 &lt;p&gt;对称的算法HMAC适用于单点登录，一对一的场景中。速度很快。&lt;/p&gt;
 &lt;p&gt;但是面对一对多的情况，比如一个APP中的不同服务模块，需要JWT登录的时候，主服务端【APP】拥有一个私钥来完成签名即可，而用户带着JWT在访问不同服务模块【副服务端】的时候，副服务端只要用公钥来验证签名就可以了。从一定程度上也减少了主服务端的压力。&lt;/p&gt;
 &lt;p&gt;当然，还有一种情况就是不同成员进行开发的时候，大家可以用统一的私钥来完成签名，然后用各自的公钥去完成对JWT的认证，也是一种非常好的开发手段。&lt;/p&gt;
 &lt;p&gt;因此，构建一个没有多个小型“微服务应用程序”的应用程序，并且开发人员只有一组的，选择HMAC来签名即可。其他情况下，尽量选择RSA。&lt;/p&gt;
 &lt;p&gt;  &lt;strong&gt;*本文作者   &lt;a href="http://www.freebuf.com/wp-admin/edit.php?post_type=post&amp;author=267567"&gt;NinthDevilHunster&lt;/a&gt;，转载请注明来自FreeBuf.COM&lt;/strong&gt;&lt;/p&gt;
&lt;div&gt; &lt;a href="https://itindex.net/"  title="IT 资讯"&gt;&lt;img src="https://itindex.net/images/iconWarning.gif" title="IT 资讯" border="0"/&gt; &lt;/a&gt;</description>
      <category>WEB安全 JWT token</category>
      <guid isPermaLink="true">https://itindex.net/detail/58629-json-web-token</guid>
      <pubDate>Fri, 17 Aug 2018 08:00:18 CST</pubDate>
    </item>
    <item>
      <title>什么是 JWT  -- JSON WEB TOKEN - 简书</title>
      <link>https://itindex.net/detail/58305-jwt-json-web</link>
      <description>&lt;div&gt;    &lt;h1&gt;什么是JWT&lt;/h1&gt;    &lt;blockquote&gt;      &lt;p&gt;Json web token (JWT), 是为了在网络应用环境间传递声明而执行的一种基于JSON的开放标准（        &lt;a href="https://link.jianshu.com?t=https://tools.ietf.org/html/rfc7519" rel="nofollow" target="_blank"&gt;(RFC 7519&lt;/a&gt;).该token被设计为紧凑且安全的，特别适用于分布式站点的单点登录（SSO）场景。JWT的声明一般被用来在身份提供者和服务提供者间传递被认证的用户身份信息，以便于从资源服务器获取资源，也可以增加一些额外的其它业务逻辑所必须的声明信息，该token也可直接被用于认证，也可被加密。&lt;/p&gt;&lt;/blockquote&gt;    &lt;h2&gt;起源&lt;/h2&gt;    &lt;p&gt;说起JWT，我们应该来谈一谈基于token的认证和传统的session认证的区别。&lt;/p&gt;    &lt;h3&gt;传统的session认证&lt;/h3&gt;    &lt;p&gt;我们知道，http协议本身是一种无状态的协议，而这就意味着如果用户向我们的应用提供了用户名和密码来进行用户认证，那么下一次请求时，用户还要再一次进行用户认证才行，因为根据http协议，我们并不能知道是哪个用户发出的请求，所以为了让我们的应用能识别是哪个用户发出的请求，我们只能在服务器存储一份用户登录的信息，这份登录信息会在响应时传递给浏览器，告诉其保存为cookie,以便下次请求时发送给我们的应用，这样我们的应用就能识别请求来自哪个用户了,这就是传统的基于session认证。&lt;/p&gt;    &lt;p&gt;但是这种基于session的认证使应用本身很难得到扩展，随着不同客户端用户的增加，独立的服务器已无法承载更多的用户，而这时候基于session认证应用的问题就会暴露出来.&lt;/p&gt;    &lt;h4&gt;基于session认证所显露的问题&lt;/h4&gt;    &lt;p&gt;      &lt;strong&gt;Session&lt;/strong&gt;: 每个用户经过我们的应用认证之后，我们的应用都要在服务端做一次记录，以方便用户下次请求的鉴别，通常而言session都是保存在内存中，而随着认证用户的增多，服务端的开销会明显增大。&lt;/p&gt;    &lt;p&gt;      &lt;strong&gt;扩展性&lt;/strong&gt;: 用户认证之后，服务端做认证记录，如果认证的记录被保存在内存中的话，这意味着用户下次请求还必须要请求在这台服务器上,这样才能拿到授权的资源，这样在分布式的应用上，相应的限制了负载均衡器的能力。这也意味着限制了应用的扩展能力。&lt;/p&gt;    &lt;p&gt;      &lt;strong&gt;CSRF&lt;/strong&gt;: 因为是基于cookie来进行用户识别的, cookie如果被截获，用户就会很容易受到跨站请求伪造的攻击。&lt;/p&gt;    &lt;h2&gt;基于token的鉴权机制&lt;/h2&gt;    &lt;p&gt;基于token的鉴权机制类似于http协议也是无状态的，它不需要在服务端去保留用户的认证信息或者会话信息。这就意味着基于token认证机制的应用不需要去考虑用户在哪一台服务器登录了，这就为应用的扩展提供了便利。&lt;/p&gt;    &lt;p&gt;流程上是这样的：&lt;/p&gt;    &lt;ul&gt;      &lt;li&gt;用户使用用户名密码来请求服务器&lt;/li&gt;      &lt;li&gt;服务器进行验证用户的信息&lt;/li&gt;      &lt;li&gt;服务器通过验证发送给用户一个token&lt;/li&gt;      &lt;li&gt;客户端存储token，并在每次请求时附送上这个token值&lt;/li&gt;      &lt;li&gt;服务端验证token值，并返回数据&lt;/li&gt;&lt;/ul&gt;    &lt;p&gt;这个token必须要在每次请求时传递给服务端，它应该保存在请求头里， 另外，服务端要支持      &lt;code&gt;CORS(跨来源资源共享)&lt;/code&gt;策略，一般我们在服务端这么做就可以了      &lt;code&gt;Access-Control-Allow-Origin: *&lt;/code&gt;。&lt;/p&gt;    &lt;p&gt;那么我们现在回到JWT的主题上。&lt;/p&gt;    &lt;h2&gt;JWT长什么样？&lt;/h2&gt;    &lt;p&gt;JWT是由三段信息构成的，将这三段信息文本用      &lt;code&gt;.&lt;/code&gt;链接一起就构成了Jwt字符串。就像这样:&lt;/p&gt;    &lt;pre&gt;      &lt;code&gt;eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWV9.TJVA95OrM7E2cBab30RMHrHDcEfxjoYZgeFONFh7HgQ&lt;/code&gt;&lt;/pre&gt;    &lt;h2&gt;JWT的构成&lt;/h2&gt;    &lt;p&gt;第一部分我们称它为头部（header),第二部分我们称其为载荷（payload, 类似于飞机上承载的物品)，第三部分是签证（signature).&lt;/p&gt;    &lt;h3&gt;header&lt;/h3&gt;    &lt;p&gt;jwt的头部承载两部分信息：&lt;/p&gt;    &lt;ul&gt;      &lt;li&gt;声明类型，这里是jwt&lt;/li&gt;      &lt;li&gt;声明加密的算法 通常直接使用 HMAC SHA256&lt;/li&gt;&lt;/ul&gt;    &lt;p&gt;完整的头部就像下面这样的JSON：&lt;/p&gt;    &lt;pre&gt;      &lt;code&gt;{
  &amp;apos;typ&amp;apos;: &amp;apos;JWT&amp;apos;,
  &amp;apos;alg&amp;apos;: &amp;apos;HS256&amp;apos;
}&lt;/code&gt;&lt;/pre&gt;    &lt;p&gt;然后将头部进行base64加密（该加密是可以对称解密的),构成了第一部分.&lt;/p&gt;    &lt;pre&gt;      &lt;code&gt;eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9&lt;/code&gt;&lt;/pre&gt;    &lt;h3&gt;playload&lt;/h3&gt;    &lt;p&gt;载荷就是存放有效信息的地方。这个名字像是特指飞机上承载的货品，这些有效信息包含三个部分&lt;/p&gt;    &lt;ul&gt;      &lt;li&gt;标准中注册的声明&lt;/li&gt;      &lt;li&gt;公共的声明&lt;/li&gt;      &lt;li&gt;私有的声明&lt;/li&gt;&lt;/ul&gt;    &lt;p&gt;      &lt;strong&gt;标准中注册的声明&lt;/strong&gt;(建议但不强制使用) ：&lt;/p&gt;    &lt;ul&gt;      &lt;li&gt;        &lt;strong&gt;iss&lt;/strong&gt;: jwt签发者&lt;/li&gt;      &lt;li&gt;        &lt;strong&gt;sub&lt;/strong&gt;: jwt所面向的用户&lt;/li&gt;      &lt;li&gt;        &lt;strong&gt;aud&lt;/strong&gt;: 接收jwt的一方&lt;/li&gt;      &lt;li&gt;        &lt;strong&gt;exp&lt;/strong&gt;: jwt的过期时间，这个过期时间必须要大于签发时间&lt;/li&gt;      &lt;li&gt;        &lt;strong&gt;nbf&lt;/strong&gt;: 定义在什么时间之前，该jwt都是不可用的.&lt;/li&gt;      &lt;li&gt;        &lt;strong&gt;iat&lt;/strong&gt;: jwt的签发时间&lt;/li&gt;      &lt;li&gt;        &lt;strong&gt;jti&lt;/strong&gt;: jwt的唯一身份标识，主要用来作为一次性token,从而回避重放攻击。&lt;/li&gt;&lt;/ul&gt;    &lt;p&gt;      &lt;strong&gt;公共的声明&lt;/strong&gt;：      &lt;br /&gt;公共的声明可以添加任何的信息，一般添加用户的相关信息或其他业务需要的必要信息.但不建议添加敏感信息，因为该部分在客户端可解密.&lt;/p&gt;    &lt;p&gt;      &lt;strong&gt;私有的声明&lt;/strong&gt;：      &lt;br /&gt;私有声明是提供者和消费者所共同定义的声明，一般不建议存放敏感信息，因为base64是对称解密的，意味着该部分信息可以归类为明文信息。&lt;/p&gt;    &lt;p&gt;定义一个payload:&lt;/p&gt;    &lt;pre&gt;      &lt;code&gt;{
  &amp;quot;sub&amp;quot;: &amp;quot;1234567890&amp;quot;,
  &amp;quot;name&amp;quot;: &amp;quot;John Doe&amp;quot;,
  &amp;quot;admin&amp;quot;: true
}&lt;/code&gt;&lt;/pre&gt;    &lt;p&gt;然后将其进行base64加密，得到Jwt的第二部分。&lt;/p&gt;    &lt;pre&gt;      &lt;code&gt;eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWV9&lt;/code&gt;&lt;/pre&gt;    &lt;h3&gt;signature&lt;/h3&gt;    &lt;p&gt;jwt的第三部分是一个签证信息，这个签证信息由三部分组成：&lt;/p&gt;    &lt;ul&gt;      &lt;li&gt;header (base64后的)&lt;/li&gt;      &lt;li&gt;payload (base64后的)&lt;/li&gt;      &lt;li&gt;secret&lt;/li&gt;&lt;/ul&gt;    &lt;p&gt;这个部分需要base64加密后的header和base64加密后的payload使用      &lt;code&gt;.&lt;/code&gt;连接组成的字符串，然后通过header中声明的加密方式进行加盐      &lt;code&gt;secret&lt;/code&gt;组合加密，然后就构成了jwt的第三部分。&lt;/p&gt;    &lt;pre&gt;      &lt;code&gt;// javascript
var encodedString = base64UrlEncode(header) + &amp;apos;.&amp;apos; + base64UrlEncode(payload);

var signature = HMACSHA256(encodedString, &amp;apos;secret&amp;apos;); // TJVA95OrM7E2cBab30RMHrHDcEfxjoYZgeFONFh7HgQ&lt;/code&gt;&lt;/pre&gt;    &lt;p&gt;将这三部分用      &lt;code&gt;.&lt;/code&gt;连接成一个完整的字符串,构成了最终的jwt:&lt;/p&gt;    &lt;pre&gt;      &lt;code&gt;eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWV9.TJVA95OrM7E2cBab30RMHrHDcEfxjoYZgeFONFh7HgQ&lt;/code&gt;&lt;/pre&gt;    &lt;p&gt;      &lt;strong&gt;注意：secret是保存在服务器端的，jwt的签发生成也是在服务器端的，secret就是用来进行jwt的签发和jwt的验证，所以，它就是你服务端的私钥，在任何场景都不应该流露出去。一旦客户端得知这个secret, 那就意味着客户端是可以自我签发jwt了。&lt;/strong&gt;&lt;/p&gt;    &lt;h3&gt;如何应用&lt;/h3&gt;    &lt;p&gt;一般是在请求头里加入      &lt;code&gt;Authorization&lt;/code&gt;，并加上      &lt;code&gt;Bearer&lt;/code&gt;标注：&lt;/p&gt;    &lt;pre&gt;      &lt;code&gt;fetch(&amp;apos;api/user/1&amp;apos;, {
  headers: {
    &amp;apos;Authorization&amp;apos;: &amp;apos;Bearer &amp;apos; + token
  }
})&lt;/code&gt;&lt;/pre&gt;    &lt;p&gt;服务端会验证token，如果验证通过就会返回相应的资源。整个流程就是这样的:&lt;/p&gt;    &lt;div&gt;      &lt;div&gt;        &lt;div&gt;&lt;/div&gt;        &lt;div&gt;          &lt;img&gt;&lt;/img&gt;&lt;/div&gt;&lt;/div&gt;      &lt;div&gt;jwt-diagram&lt;/div&gt;&lt;/div&gt;    &lt;h2&gt;总结&lt;/h2&gt;    &lt;h3&gt;优点&lt;/h3&gt;    &lt;ul&gt;      &lt;li&gt;因为json的通用性，所以JWT是可以进行跨语言支持的，像JAVA,JavaScript,NodeJS,PHP等很多语言都可以使用。&lt;/li&gt;      &lt;li&gt;因为有了payload部分，所以JWT可以在自身存储一些其他业务逻辑所必要的非敏感信息。&lt;/li&gt;      &lt;li&gt;便于传输，jwt的构成非常简单，字节占用很小，所以它是非常便于传输的。&lt;/li&gt;      &lt;li&gt;它不需要在服务端保存会话信息, 所以它易于应用的扩展&lt;/li&gt;&lt;/ul&gt;    &lt;h3&gt;安全相关&lt;/h3&gt;    &lt;ul&gt;      &lt;li&gt;不应该在jwt的payload部分存放敏感信息，因为该部分是客户端可解密的部分。&lt;/li&gt;      &lt;li&gt;保护好secret私钥，该私钥非常重要。&lt;/li&gt;      &lt;li&gt;如果可以，请使用https协议&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;
    &lt;div&gt; &lt;a href="https://itindex.net/"  title="IT 资讯"&gt;&lt;img src="https://itindex.net/images/iconWarning.gif" title="IT 资讯" border="0"/&gt; &lt;/a&gt;</description>
      <category />
      <guid isPermaLink="true">https://itindex.net/detail/58305-jwt-json-web</guid>
      <pubDate>Sat, 28 Apr 2018 14:05:21 CST</pubDate>
    </item>
    <item>
      <title>Web新标准：指纹和面容识别可取代登录密码</title>
      <link>https://itindex.net/detail/58234-web-%E6%A0%87%E5%87%86-%E6%8C%87%E7%BA%B9</link>
      <description>&lt;p&gt;  FIDO（线上快速身份验证）联盟和 W3C（万维网联盟）现已推出新的 Web 认证标准，新标准将更便利地为每个站点提供独立的加密证书，也就是说，你可以通过无密码的 FIDO 身份验证来访问 PC 浏览器中的任何在线服务，用户们将拥有更安全的登录方式，不再是在账号密码框中输入一串串字符，而是改用生物识别（指纹、刷脸、瞳孔）技术和 USB 令牌来实现网站登录。  &lt;br /&gt;  &lt;br /&gt;  &lt;a href="https://resource.feng.com/resource/h062/h29/img201804110210410.jpg"&gt;   &lt;img src="https://resource.feng.com/resource/h062/h29/img201804110210410.jpg"&gt;&lt;/img&gt;&lt;/a&gt;  &lt;br /&gt;  &lt;br /&gt;新标准被称为 WebAuthn，简而言之就是允许现有的安全设备 API 接入网站验证，比如指纹识别器，相机传感器和 USB 密钥。这不仅给广大用户带来便利，更重要的是，可以有效地避免密码泄露的风险。  &lt;br /&gt;  &lt;br /&gt;现有的 Web 登录模式通常需要用户记住一个账号名和自己设定的密码，而一旦用户信息被泄露，密码也将不再安全，一个网站的密码不安全，往往就意味着，用户手中的多个 Web 密码都不再安全。新标准则无需担心这样的泄密问题，哪怕被入侵者跟踪到用户行为，也无法轻易取得 Web 准入资格。传统的钓鱼攻击变得更加困难，它为有安全意识的用户和企业提供了保护自己的重要途径。  &lt;br /&gt;  &lt;br /&gt;此前谷歌、微软和 Facebook 等主要服务上运用了免密码登录规范，主要是通过 USB 密钥来完成安全登录。现在，通过 WebAuthn，更多的用户将能够体验安全登录。当然，新标准的出现并不是让你很快就放弃你的密码，不过它将逐渐把你的密码习惯转向更依赖于生物识别登录。  &lt;br /&gt;  &lt;br /&gt;Firefox 浏览器最新版本目前已支持 WebAuthn，Google Chrome 和 Microsoft Edge 也会在未来几个月内跟进。苹果的 Safari 暂时还没有消息，但随着苹果全线 iPhone 和 iPad 都拥有 Face ID 或 Touch ID 功能（包括 MacBook Pro），在 Safari 上实现 Face ID 或者 Touch ID 登录网站服务简直不要太顺其自然。  &lt;br /&gt;  &lt;br /&gt;目前从技术上讲，新标准还是处于“推荐”阶段，想要正式批准，各大浏览器的支持将成为重要的一步。苹果有时候在新标准采用方面有点慢半拍，不过 WebAuthn 绝对是值得快速跟进的新变革。&lt;/p&gt; &lt;p&gt;   &lt;a href="https://www.feng.com/iPhone/news/2018-04-11/_696878.shtml"&gt;阅读全文&lt;/a&gt;&lt;/p&gt;&lt;div&gt; &lt;a href="https://itindex.net/"  title="IT 资讯"&gt;&lt;img src="https://itindex.net/images/iconWarning.gif" title="IT 资讯" border="0"/&gt; &lt;/a&gt;</description>
      <category>新闻</category>
      <guid isPermaLink="true">https://itindex.net/detail/58234-web-%E6%A0%87%E5%87%86-%E6%8C%87%E7%BA%B9</guid>
      <pubDate>Wed, 11 Apr 2018 02:08:50 CST</pubDate>
    </item>
    <item>
      <title>十倍效能提升：Web 基础研发体系的建立</title>
      <link>https://itindex.net/detail/58170-%E6%95%88%E8%83%BD-%E6%8F%90%E5%8D%87-web</link>
      <description>&lt;div&gt;  &lt;h2&gt;1 导读&lt;/h2&gt;  &lt;p&gt;web 基础研发体系指的是， web 研发中一线工程师所直接操作的技术、工具，以及所属组织架构的总和。在过去提升企业研发效能的讨论中，围绕的主题基本都是——”通过云计算、云存储等方式将底层核心技术封装成基础设施“。而我们在实践中发现，在&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;互联网渗入到各行各业，业务爆发&lt;/li&gt;   &lt;li&gt;企业竞争白热化，对速度和品质要求越来越高&lt;/li&gt;   &lt;li&gt;一线工程师队伍越来越庞大，管理成本增高&lt;/li&gt;&lt;/ul&gt;  &lt;p&gt;这样的多重背景下，除了底层核心技术外，一线 web 研发效能的问题也逐渐成为决胜战场的重要因素。&lt;/p&gt;  &lt;p&gt;然而在现实中我们看到，因为一线的研发工作可替换性强，所以并没有受到足够的重视，同时也缺少更统一、更有深度的规划和管理。实际上，将一线工程师所直接接触到的应用框架、测试、部署、监控等领域作为一个完整的体系来思考，并打造成一体化的基础设施，能为企业的业务研发带来巨大的效能提升。&lt;/p&gt;  &lt;p&gt;在《月相》一章中，我们将介绍Web 基础研发体系有哪些构成部分，并且将深入到关键性的技术和问题中。《潮汐》一章将介绍如何配合这套研发体系，在组织结构上做出一些调整，通过管理手段进一步挖掘团队潜力，打造更高效的组织。&lt;/p&gt;  &lt;p&gt;另外，希望这些内容也能为一线工程师提供一些职业规划上的引导。&lt;/p&gt;  &lt;h2&gt;2 月相&lt;/h2&gt;  &lt;p&gt;我们将要讨论的研发体系，涵盖了”研发流程“和”系统“两个维度。可以用一张大图来描绘：&lt;/p&gt;  &lt;p&gt;   &lt;img alt="" src="https://gw.alipayobjects.com/zos/rmsportal/zohnkBUNTDTAAbVFuSLC.png"&gt;&lt;/img&gt;&lt;/p&gt;  &lt;p&gt;可以看到，将这些内容作为一个整体，符合目前互联网公司”核心技术“ + ”web 研发能力“ 的模式，能快速产出应用。其中，”用户“、”权限“、”流程“可以说是绝大部分系统的铁三角，因此我们也划入到了基础研发体系中。&lt;/p&gt;  &lt;p&gt;接下来看每个部分。从流程的角度来说，提升效能的关键在于”工具化“和”自动化“，我们就以这两点来切入。&lt;/p&gt;  &lt;h3&gt;2.1 设计&lt;/h3&gt;  &lt;p&gt;首先是设计，设计与编码的结合是目前业界想象空间最大，但也是最不成熟的领域。对于自动化的实现，目前的尝试大致可以归纳成两类：&lt;/p&gt;  &lt;p&gt;第一类，与设计师约定规则，按规则转化设计稿。这种方式的关键在于，“既要规则简单易于被设计师接受，又要保证视觉上的关系能完整转化成程序中的关系“。我们举个例子来说明”视觉上的关系“和”常见的程序中的关系“: 网页上这样一个场景：&lt;/p&gt;  &lt;p&gt;   &lt;img alt="" src="https://gw.alipayobjects.com/zos/rmsportal/dZMEFHouRPlZzQTQAbSW.png"&gt;&lt;/img&gt;&lt;/p&gt;  &lt;p&gt;可以很容易地理解为一个 Tab 组件里面嵌着一个按钮，他们是”嵌套关系“，在程序中用 html 可能这样写:&lt;/p&gt;  &lt;pre&gt;   &lt;code&gt;&amp;lt;Tabs&amp;gt;
  &amp;lt;Tabs.Pane title=&amp;quot;tab1&amp;quot;&amp;gt;	
	&amp;lt;Button/&amp;gt;
  &amp;lt;/Tabs.Pane&amp;gt;
  &amp;lt;Tabs.Pane title=&amp;quot;tab2&amp;quot; /&amp;gt;
&amp;lt;/Tab&amp;gt;&lt;/code&gt;&lt;/pre&gt;  &lt;p&gt;但是在现代的设计工具中，图层信息表示的仅仅是视觉上的前后关系。&lt;/p&gt;  &lt;p&gt;   &lt;img alt="" height="348" src="https://gw.alipayobjects.com/zos/rmsportal/ZCDWDNmnxkcRQTeKUmyZ.png" width="781"&gt;&lt;/img&gt;&lt;/p&gt;  &lt;p&gt;这就出现了一种不匹配，设计师可以通过一万种方式来表达同样的视觉效果。因此，要保证正确识别关系，必须和设计师约定只能以某种方式来创建图层。但问题是这种约定本身对设计师来说没有实际意义，对他来说只是约束。除了嵌套关系以外，位置关系也是同样的问题——目前设计工具产出的设计稿只是某一种具体尺寸的视觉效果，而我们实际产品的尺寸会因设备不同而不同的，甚至可以随着浏览器窗口的缩放等功能动态变化：&lt;/p&gt;  &lt;p&gt;   &lt;img alt="" src="https://gw.alipayobjects.com/zos/rmsportal/RKrfxAzZPrJsYHpulxhg.gif"&gt;&lt;/img&gt;&lt;/p&gt;  &lt;p&gt;怎么来表示这种变化对设计师来说也是额外的约束。乐观的是，从技术角度来说，总归是可实施的。&lt;/p&gt;  &lt;p&gt;第二类尝试，像游戏一样做专用的设计工具，则从根本上解决了上述问题。&lt;/p&gt;  &lt;p&gt;   &lt;img alt="" height="900" src="https://gw.alipayobjects.com/zos/rmsportal/rSuwQORzqSMuTBBUAkuZ.png" width="900"&gt;&lt;/img&gt;&lt;/p&gt;  &lt;p&gt;(   &lt;a href="https://reactstudio.com/"&gt;React Studio&lt;/a&gt;)&lt;/p&gt;  &lt;p&gt;思路很简单，既然设计师能有多种方式来表达，那么我们从工具角度来约束，是不是就不会有问题了？虽然同样有约束，但是对设计师来说负担要小多了，不需要额外记忆，按照工具的指引使用即可。我们甚至还可以提供一些高级功能防止出现一些人为错误，以此来吸引设计师。这种方式唯一的缺点是有一次性的学习成本。&lt;/p&gt;  &lt;p&gt;虽然目前的自动化方案，都还只是从“视觉稿”到“程序静态视图”的自动化，并不包括交互逻辑的自动化，但已经有了巨大的意义。在前端程序员工作的统计中发现，他们有一半以上的时间都是在”调整大小、调整位置、对像素、对色值“，而且越是好的前端，这个时间比例越大。因为写逻辑是可以通过提升自身素质实现量级缩小的，而写样式这个工作本身很难实现量级的时间缩短。&lt;/p&gt;  &lt;p&gt;如果在研发体系中，设计稿能自动转化成可用的代码，无疑对传统的 web 页面研发会有巨大的提升。虽然做专用工具看起来应该是最终的方向，但在目前的现实环境中，可能会因为加重设计师的使用负担而被抵制，所以通过在原有设计工具上做约定的方式来过渡可能更合适。在用约定的方案里，怎样让约定即不给设计师造成太大的负担，又能解决上述的规则转化问题，就成了重点。在实践中的解法是，通过工具的高级能力来补偿设计师。这部分细节已在《   &lt;a href="http://www.cnblogs.com/sskyy/p/7813943.html"&gt;设计稿自动生成可用页面的展望&lt;/a&gt;》中详细描述过，这里不再赘述。&lt;/p&gt;  &lt;h3&gt;2.2 研发、测试和监控&lt;/h3&gt;  &lt;p&gt;我们将这三个环节合在一起来讨论，是因为他们存在技术决策上的上下游关系。过去在大团队中规划研发体系，常常会出现一种现象，就是研发、测试、监控都是由不同团队规划的，而每个团队都想着做平台。后来慢慢发现这个思路是有问题的，因为做平台必然要考虑到不同端的接入，要花成本将自己的服务抽象得足够底层，花成本对不同的端做适配。而在这三个环节中，研发中的   &lt;strong&gt;运行时框架(应用框架)&lt;/strong&gt;是工具化和自动化的核心，只要对运行时框架多进行一点点投入，后面测试、反馈、监控的研发成本就能降到非常低！&lt;/p&gt;  &lt;p&gt;举个前端的例子。在搭建可视化页面搭建平台时，我们设计了一个将“所有组件数据都统一到一棵树”上的方案。&lt;/p&gt;  &lt;p&gt;   &lt;img alt="" height="791" src="https://gw.alipayobjects.com/zos/rmsportal/FWYKxWErwBlYheDQOKXM.png" width="929"&gt;&lt;/img&gt;&lt;/p&gt;  &lt;p&gt;在传统的 React 中所有组件的 state 和 props 合起来才能表达一个页面唯一的状态，state 和 props 分散在组件中，不易收集。而在这个设计中，全局的 state tree 即表达了页面的一个状态，如果将每一次变化后的state tree 都存起来，即可通过回放来展现页面动态变化的过程。更进一步的是，利用这个特性，我们在 200 行代码之内就实现了“录制即测试用例”的功能。用户无需写任何晦涩的用例代码，在调试自己写的页面时只要觉得没问题，就可以将刚才的调试过程保存成一个用例。&lt;/p&gt;  &lt;p&gt;   &lt;img alt="" src="https://gw.alipayobjects.com/zos/rmsportal/mRJjqeSNCIGTbQyUUEbp.gif"&gt;&lt;/img&gt;&lt;/p&gt;  &lt;p&gt;再举一个接口层的例子。我们运行时框架的接口采用了 GraphQL ，并且告别了手动写接口的形式，全部利用视图勾选生成。&lt;/p&gt;  &lt;p&gt;   &lt;img alt="" src="https://gw.alipayobjects.com/zos/rmsportal/AYctHHVuVqMkcFIJYKKi.gif"&gt;&lt;/img&gt;&lt;/p&gt;  &lt;p&gt;这解决了两个研发中常见的问题：&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;杜绝了手工约定接口时可能出现的拼写等错误。&lt;/li&gt;   &lt;li&gt;能自动统计到所有对某一接口进行消费的页面，一旦接口进行调整，可以自动通知到下游，甚至能自动生成适配代码，不影响下游。&lt;/li&gt;&lt;/ul&gt;  &lt;p&gt;这也就极大地减轻了测试环节的压力。之前的思路基本都是通过扫描代码去发现接口错误，要消耗大量资源，现在看起来没必要了。&lt;/p&gt;  &lt;p&gt;这两个例子都是从研发的角度来思考所看到的收益，我们再单独从测试与监控的角度来看。&lt;/p&gt;  &lt;p&gt;测试领域有一个热点，—— UI 自动化。目前的 UI 自动化有两种方案，图片对比 与 dom 树对比。&lt;/p&gt;  &lt;p&gt;   &lt;img alt="" src="https://gw.alipayobjects.com/zos/rmsportal/XUMcGlAMLtZrtZTjGMJb.png"&gt;&lt;/img&gt;&lt;/p&gt;  &lt;p&gt;(   &lt;a href="https://screenster.io/"&gt;Screenster&lt;/a&gt;)&lt;/p&gt;  &lt;p&gt;这两种方案都有一个共同的缺点，即“无法正确地识别变化的类型”。例如现在有个需求，视图上的两个元素需要调换一下位置，但逻辑并没有变，希望测试平台不报警。除非人工干预，否则这两种方案都很难判断出来，因为他们是以”最后渲染结果“作为判断依据的。但是如果我们的测试是针对运行时框架来设计的话，就很容易实现。以上面研发时所讲的组件树方案为例，页面到底有没有逻辑性的变化只和 state tree 有关，因为页面的状态是 state tree，而逻辑操作的也是 state tree，所以我们只要认为 state tree 没变，就可以认为页面没有发生变化，不用触发报警。&lt;/p&gt;  &lt;p&gt;除了能识别变化外，利用运行时框架的设计，我们还能实现更先进的功能，例如 B/S 架构中还原浏览器端出错现场的问题。在过去 debug 时，我们通常都要与测试交流，按照操作步骤手工还原到现场，如果能由程序自动化一次性达到出错现场，那无疑能给 debug 速度带来质的提升。要实现这种能力的关键点在于，任何表示页面状态的数据，都要能暴露到外部，也能由外部传入进行重置。一旦有一个决定页面状态的变量在函数中，不能取出，不能序列化后传给服务端，就无法做到。毫无疑问，这种能力也是需要应用框架来支持的。例子中 state tree 的设计，有一部分原因就是出于支持这种能力的考虑。&lt;/p&gt;  &lt;p&gt;再来看监控领域的热点，“无埋点”监控，和自动化测试有异曲同工之妙。“无埋点”指的是无手工在代码中的埋点，通常是使用可视化的技术来进行“标记”。&lt;/p&gt;  &lt;p&gt;   &lt;img alt="" height="896" src="https://gw.alipayobjects.com/zos/rmsportal/gQWHDbfoSyYymCZkQSWo.png" width="918"&gt;&lt;/img&gt;&lt;/p&gt;  &lt;p&gt;(   &lt;a href="https://www.growingio.com/"&gt;GrowingIO&lt;/a&gt;)&lt;/p&gt;  &lt;p&gt;目前业界的一些方案中，遇到的问题同样是不能正确地识别变化。例如当页面上的元素改变了位置，埋点能不能不受影响？在可视化搭建平台这个项目里，我们同样是在应用框架这个层面设计了解决方案：&lt;/p&gt;  &lt;p&gt;我们的页面使用一种类似于模板的方式来嵌套组件，这个结构我们称为 component tree，这个结构是静态可分析的，所以可以很容易地实现可视化。用户如果想要控制组件使其产生变化，那么必须给组件取个唯一的名字，在逻辑代码中使用这个名字对它的数据进行操作来实现改变。&lt;/p&gt;  &lt;p&gt;有了这个前提，无需任何额外的投入，就已经实现了“无埋点”。因为“埋点”本身就是对逻辑功能的统计，所以埋点一定会埋在有逻辑相关的组件上，因此一定会有唯一的名字，那么无论组件怎么变化，只要没有被删除，我们的埋点信息就不会受到影响。同时，如果一个有埋点的组件出现了改名或者删除，我们还能自动提示报警。而这些功能，同样是在不到200行的代码就实现了。&lt;/p&gt;  &lt;p&gt;   &lt;img alt="" src="https://gw.alipayobjects.com/zos/rmsportal/UmylSoMxOmzVKJkYMmrw.gif"&gt;&lt;/img&gt;&lt;/p&gt;  &lt;p&gt;(埋点取名)&lt;/p&gt;  &lt;p&gt;综上，从测试和监控两个角度我们也可以看到，只要运行时框架提供一点点帮助，就能以极小的成本来实施。针对确定的上游研发框架来进行下游的开发，不用再考虑对各种框架的兼容问题，也可以让下游在能力上走得更远，实现更多先进的功能。&lt;/p&gt;  &lt;h3&gt;2.3 框架核心技术&lt;/h3&gt;  &lt;p&gt;我们在线下交流中发现，很多团队对框架的投入只停留在写小工具和包装开源框架上。因为看不清方向，不知道如何投入，也不知道投入后有多少收益，所以不敢深入。其实方向和具体应该投入哪些技术，都是有迹可循的。这个踪迹的源头我们在 《   &lt;a href="http://www.cnblogs.com/sskyy/p/4592353.html"&gt;理想的应用框架&lt;/a&gt;》中曾提到过的，就是程序的本质——   &lt;strong&gt;数据和逻辑&lt;/strong&gt;。&lt;/p&gt;  &lt;h4&gt;2.3.1 数据&lt;/h4&gt;  &lt;p&gt;先具象一点来说数据。框架的数据就是框架运行时内部保存的对象等数据结构，只要回答好两个问题就能展现出强大的威力：&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;数据在哪？&lt;/li&gt;   &lt;li&gt;数据的生命周期是怎样的？&lt;/li&gt;&lt;/ul&gt;  &lt;p&gt;知道数据在哪，是管理数据的基本条件。应用的任何状态，都可以看做是内部数据的一种表现。因此只有框架掌握了所有数据，才有可能实现例如还原现场之类的功能。这对我们的研发有两点指导意义：&lt;/p&gt;  &lt;p&gt;一是在使用已经有控制反转和依赖注入的 web 框架时，应该完全遵循框架的约定，将服务等对象的管理完全由框架。有的框架语法写起来比较麻烦，可以通过命令行或者IDE工具来自动生成。&lt;/p&gt;  &lt;p&gt;二是在我们改造或者创造框架时，应该把数据的统一管理作为最基本的底线，这是上下游实现自动化的基础。上一节中所提到的测试录制的能力，就是建立在统一数据源的基础上。再举个更有意思的例子，过去的前端的 ajax 请求基本都是独立调用 api，无中心的模式。这种模式可能会出现的问题是：&lt;/p&gt;  &lt;p&gt;请求A发出后，由于网络等问题，一直未返回，这时用户有重新发送一次请求 A1。结果 A1 迅速返回在回调函数中提示成功。然后请求 A 超时返回，在回调中提示失败，导致最后用户看到的是失败的信息。&lt;/p&gt;  &lt;p&gt;   &lt;img alt="" src="https://gw.alipayobjects.com/zos/rmsportal/NnlAsoOtCaPVoVuaUvxB.png"&gt;&lt;/img&gt;&lt;/p&gt;  &lt;p&gt;当引入 saga 之后，所有异步的操作都统一收归到通信管道中，就能进行跨请求的管理了。单个异步请求的取消、多个异步请求到底是独立、还是竞争、还是只保持最后一个，就都能很容易地实现了。基于中心化的请求管理，还能进行可视化：&lt;/p&gt;  &lt;p&gt;   &lt;img alt="" src="https://gw.alipayobjects.com/zos/rmsportal/rAIVUbhZHyQIpLTfsnEv.png"&gt;&lt;/img&gt;&lt;/p&gt;  &lt;p&gt;   &lt;img alt="" src="https://gw.alipayobjects.com/zos/rmsportal/HVnuRNheHVwtWFLRYljb.jpg"&gt;&lt;/img&gt;&lt;/p&gt;  &lt;p&gt;(kuker)&lt;/p&gt;  &lt;p&gt;继续讲到第二个问题，数据的生命周期是怎样的？生命周期通常是由外部事件来触发，或者自己运行到某一阶段自动触发的。对深度开发来说，有两个基础能力必须由框架来提供。即框架要支持：&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;    &lt;strong&gt;手动驱动生命周期&lt;/strong&gt;&lt;/li&gt;   &lt;li&gt;    &lt;strong&gt;内部数据的复制和置换&lt;/strong&gt;&lt;/li&gt;&lt;/ul&gt;  &lt;p&gt;手动驱动生命周期对自动化测试之类的功能来说很重要，特别是在做一些基础性的测试时，有了这个能力就不用再完全模拟外部的触发条件。而内部数据的复制和置换则能为录制、还原现场、协同等高级功能提供基础。我们现在就在尝试基于这种能力，实现“用户可以将自己的出错场景一键发送给开发人员来复现”的功能。值得注意的是，有的语言中复制对象是非常昂贵的操作，这时可能就需要考虑，是否使用 immutable 的数据格式会更好？还是依靠一些约定和标记提供自身提供廉价的复制能力？限于篇幅，在此就不再展开。对框架中的数据问题感兴趣的读者可以去搜索 Single Source of Truth 和 Shared Mutable State 之类的话题，业界已经有非常多的精彩讨论。&lt;/p&gt;  &lt;h4&gt;2.3.2 逻辑&lt;/h4&gt;  &lt;p&gt;聊完数据，终于来到最有意思的逻辑部分。框架从某种意义上来说，就是提供了一种逻辑表达的方式。要在逻辑表达上提升效能，有两个发展阶段：&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;提供一些模式或技术。让用户写出低耦合、易重用、易扩展的代码。在写代码时提高效能。例如 MVC、IOC 等等。&lt;/li&gt;   &lt;li&gt;针对不同场景设计更合理的 DSL，能实现代码、图等表达方式的互相转换。在研发的整条链路上实现自动化。&lt;/li&gt;&lt;/ul&gt;  &lt;p&gt;我们看到大部分的框架都处于第一个阶段，不管是服务器端的 MVC 还是前端的 MVVM 。但也有少量第二阶段的尝试。例如 Flow Based Programming，试图完全用数据流向的角度来诠释业务中的逻辑。它的代码可以天然被分析成图，甚至能在运行时进行观察：&lt;/p&gt;  &lt;p&gt;   &lt;img alt="" height="585" src="https://gw.alipayobjects.com/zos/rmsportal/iKSmHVoPSUEcoxYFaBfY.jpeg" width="900"&gt;&lt;/img&gt;&lt;/p&gt;  &lt;p&gt;(   &lt;a href="https://noflojs.org/"&gt;noflo&lt;/a&gt;)&lt;/p&gt;  &lt;p&gt;还有《理想的应用框架》中提到的基于事件来表示业务逻辑，也是一种 DSL。但这些尝试离最终的目标仍然有差距，最终理想的状态应该是能实现业务流程图、时序图、决策树等业务领域常用的表达方式与代码的互转。虽然有差距，而且看起来要走的路还很长，但是针对一些已经比较稳定的场景，已经有一些好的经验。CMS 框架   &lt;a href="https://www.drupal.org/"&gt;Drupal&lt;/a&gt;就是一个很好的例子。它定义好了数据发布的整个流程和相应的钩子系统，让开发者用模块的方式在钩子里去修改或者增加自己的功能。曾经一度实现了一个非常繁荣的社区。更值得肯定的是，社区中很多模块都是可视化的，最终用户不需要写任何代码，按照模块的可视化指引就能完成相应的功能。这实际上就等同于 DSL 与代码的互转了。&lt;/p&gt;  &lt;p&gt;不管哪一个阶段的关键技术，都离不开分析   &lt;strong&gt;语义&lt;/strong&gt;的能力。直白一点来说，就是“知道哪段代码是干什么”的能力。&lt;/p&gt;  &lt;p&gt;在第一阶段的框架中，最影响效能的因素并不是”要写代码的多少“，而是写按框架概念写出来的代码是否易于理解、易于维护。这一点在越是大型、越是多人参与的项目中，越是明显。而代码的“语义”是否清晰在某种程度上直接决定了我们是否能通过技术手段来提升可维护性。例如，在使用依赖注入的系统中，如果所有代码的注入声明都清晰地表明了注入的到底是什么的话，那我们就很容通过语言层面的支持或者简单字符串匹配得到依赖关系图。反之，如果注入的信息模糊，既可能是函数也可能是 model，没有任何明显约束的话，那就可能得通过语法树，找到注入的入口才能分析出来，这样实现的成本就成倍增加了。&lt;/p&gt;  &lt;p&gt;   &lt;img alt="" height="506" src="https://gw.alipayobjects.com/zos/rmsportal/ShayQXLlsZMIxwwiphfS.png" width="900"&gt;&lt;/img&gt;&lt;/p&gt;  &lt;p&gt;(   &lt;a href="http://rekit.js.org/"&gt;Rekit Studio&lt;/a&gt;依赖分析图)&lt;/p&gt;  &lt;p&gt;相比于依赖分析，更重要的是“   &lt;strong&gt;调用关系分析&lt;/strong&gt;”，它对于帮助理解流程，特别是排查问题特别有用。举个简单的例子，在数据驱动的前端框架中，因为视图完全是数据的展现，发现视图不对了，如果能动态展示出修改了数据的业务堆栈(不是函数堆栈)，就非常有用。不需要再一步一步断点。&lt;/p&gt;  &lt;p&gt;   &lt;img alt="" height="472" src="https://gw.alipayobjects.com/zos/rmsportal/JYzLTXXKlbsLvlYNRrGR.png" width="900"&gt;&lt;/img&gt;&lt;/p&gt;  &lt;p&gt;当然实现起来也更难。难点有两个：一是依赖分析一般是运行前的，是静态的，而调用关系一般是运行时的，是动态的；二是依赖通常是声明出来，容易读出来，而调用通常是在主动式的语句中，会遇到条件判断、循环、甚至通过变量在不同函数、类作用域中传递，比较难分析。这种难，其实也就是语义不清。在框架的设计或者我们自己的改造中，可以通过三点来尽量提供明确的语义：&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;    &lt;strong&gt;尽量转主动为被动&lt;/strong&gt;&lt;/li&gt;   &lt;li&gt;    &lt;strong&gt;尽量片段化&lt;/strong&gt;&lt;/li&gt;   &lt;li&gt;    &lt;strong&gt;消除用户代码中的副作用和对外部作用域中变量的依赖&lt;/strong&gt;&lt;/li&gt;&lt;/ul&gt;  &lt;p&gt;前两点很好理解，被动声明式的代码结构更容易被分析。虽然在实践的时候需要大量经验，来保障设计出来的声明格式即能覆盖所有场景又要容易编写，但是它带来的收益也是最可观的。GraphQL 就是一个最好的例子，在服务器端用声明的结构将数据结构和关系表达出来，在客户端用声明的结构将要获取的数据结构表达出来，后端就可以使用统一的引擎来生成调用，省去的大量写接口的时间。第二点，尽量片段化是指我们在引导用户写代码的时候，应该把生命周期等等概念拆得尽可能小，使语义更细致。写起来繁琐的问题可以通过工具或者语法糖去解决。&lt;/p&gt;  &lt;p&gt;第三点最重要，消除副作用指的是任何时候运行用户的代码片段应该都不会对外部环境产生影响。而消除对外部作用域中变量的依赖指的是对要用的数据、服务尽量都用参数的形式传入。这样做的好处有两个，对于一些复杂的，难以分析的调用的关系，可以将要观测的对象包装一下再传入，这样就能动态得到调用关系。在整体运行前，因为无副作用，也可以很容易地通过试运行这些片段来得到一些信息。虽然现在的语法树工具已经比较流行，但真的要完全通过语法分析来得到足够的语义仍然有很大的工作量。而上述的这三点，可以看做是快速、廉价的实现方式，并且实践中效果非常不错。&lt;/p&gt;  &lt;h4&gt;综合&lt;/h4&gt;  &lt;p&gt;最后值得一提的是，上面所讲到的数据和逻辑中的原则与技术并不是相互独立的。在《   &lt;a href="http://www.cnblogs.com/sskyy/p/6496287.html"&gt;前端服务化——页面搭建工具的死与生&lt;/a&gt;》和《   &lt;a href="http://www.cnblogs.com/sskyy/p/7002404.html"&gt;通天塔之石——企业级前端组件库方案&lt;/a&gt;》这两篇文章中看到，我们所使用的很多技术，其实是混合支撑着数据修改追溯、组件属性可视化等功能。他们中间有的也有着依赖关系。但相比于“数据和逻辑”这两个源头，这些并不重要。只要掌握了这两个源头面对的问题，其他都是能推导出来的。&lt;/p&gt;  &lt;p&gt;对开源框架如何使用也是同样的道理。对于严肃的企业生产来说，应该找到业务所面临场景的源头，吸收解决问题的先进的想法，但自己实现，就像编程语言各自实现语言特性一样。而不应该只是停留在包装开源框架这个层次。开源框架为了适应尽量广的场景，有更大的群众基础，给出的一定是普适性的方案，这种普适性在业务发展到一定程度，有了足够多的独特性之后就会变成巨大的包袱反噬研发效能。等到了这个时候再考虑自己研发，其迁移、适配、研发成本以及带来的风险可能会变得非常大。而我们从前文看到，掌握了框架研发的几个核心，从小的场景就开始投入，成本并不高。最重要的是长久积累形成体系后，所带来的“流程上自动化“、”降低下游实现成本”等能力能持续地帮助企业提升研发效能。&lt;/p&gt;  &lt;h3&gt;2.3 通用子系统与核心接口&lt;/h3&gt;  &lt;p&gt;从流程的角度来看，提升效能的主要是靠自动化。而从系统的角度来说，则主要是靠能力的复用。”用户“、”流程“、”权限“几乎是任何业务系统中都存在的，因此将这三者也纳入到了基础研发体系的范围。在这里我们并不打算深入到每个系统所面临的具体问题中，只讲两点：&lt;/p&gt;  &lt;p&gt;一、产品化或者子系统化，不要过早平台化，对将来系统整体打包有益。过去的互联网公司习惯将这些公用系统平台化，各个业务系统来接入。但这几年互联网业务进入的都是新领域，面临的市场、用户常常是需要隔离的。这个时候系统整体复制的能力就变得非常重要，所以一开始就将这三者以子系统或者子产品的方式来对待，能为之后的发展提供更多的灵活性。&lt;/p&gt;  &lt;p&gt;二、三者不是并列关系，不用纠结于能力解耦，制定核心系统接入规范才是最重要的。权限系统无论是 RBAC 还是 DAC 都离不开用户系统的支持。流程则是既依赖于权限也依赖于用户。如果把运行时框架看做是主板，这三者应该是主板上的补充部分，一起为核心系统的接入提供针脚。同样是为了系统整体打包的能力，应该尽早制定核心系统接入的规范。&lt;/p&gt;  &lt;h2&gt;3 潮汐&lt;/h2&gt;  &lt;p&gt;在《月相》一章我们探讨了 web 基础研发体系的构成及部分重难点。相比于具体技术本身，这套方案对组织成长和重塑的意义更大。在这一章中我们会先从大团队中两个有启发性的问题出发，逐步深入到如何打造一个更高效的研发组织方案中。虽然问题出现是在大团队的，但对小团队仍有两点借鉴意义：&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;小团队随着业务发展会长成大团队，也可能碰到一样的问题。&lt;/li&gt;   &lt;li&gt;问题本身萌芽于成长过程之中，予以正确的指导能更加节约人力，助力公司发展。&lt;/li&gt;&lt;/ul&gt;  &lt;h3&gt;3.1 平台林立&lt;/h3&gt;  &lt;p&gt;首先注意，我们讨论的仍是 web 层的问题。这个现象在有多个不同业务的大公司中最常见。出现这种现象的原因有两个，一是公司到了万人规模，实际上就相当于上百个百人规模的小公司，必然想法很多，出现重复的自然也多。&lt;/p&gt;  &lt;p&gt;另一个更重要是，在 web 这个领域，特别是前端，   &lt;strong&gt;基础设施变化太快&lt;/strong&gt;。&lt;/p&gt;  &lt;p&gt;无论是浏览器底层所支持的 api，还是 javascript 语言本身变化都非常快。底层一变化，研发的各个环节必然出现基于新技术的空缺，很多框架和平台就是随着这些空缺出现的。现象本身存在即合理，但如果有更好的统一管理，是能从如下两个方面提取出巨大的效能的。&lt;/p&gt;  &lt;p&gt;一、   &lt;strong&gt;如果将研发流程中的各个环节中独立的平台统一，可以极大地加速业务开发&lt;/strong&gt;。直接决定业务发展速度的是进行业务开发的工程师。他们最希望的就是只有一个平台将研发的所有流程都搞定，并且尽量自动化。平台一多，对业务开发工程师来说，学习、沟通、协作的成本就会陡增。这个成本有多大？在我们通过线下了解发现，这个成本很多时候甚至会超过业务开发本身。&lt;/p&gt;  &lt;p&gt;二、   &lt;strong&gt;加大对趋势和方向的研究，预防无序的框架和平台的投入，这样能尽量防止走偏和无效劳动，也是一种提升&lt;/strong&gt;。越是大的团队，这一点越明显。“基础设施变化”这样一个滚滚巨轮这些年压碎了多少框架和平台，其中很多产生的效益都不足以覆盖其研发成本。更坏的是，出于个人利益等原因，有的平台过时了也不肯下线，阻挡了整个团队随基础设施一起进步的机遇，消耗的是更多的未来的人力。&lt;/p&gt;  &lt;p&gt;我们在《月相》中提出的研发体系就是实现这两个提升的具体手段。&lt;/p&gt;  &lt;p&gt;首先，有一个完整的体系来将研发流程当成一个整体对待，并且通过统一的平台来实现，能更好地实现流程的自动化。降低一线工程师沟通、学习成本。&lt;/p&gt;  &lt;p&gt;其次，对运行时框架的投入，本身就包含着对趋势和新技术的研究，可以缓解被基础设施带着跑的问题。并且我们看到运行时框架研究到了一定程度，能够极大的减少后续测试、监控实现的成本，也降低了基础设施变化所产生的多米诺效应。这里对管理带来的反思是，我们应该谨慎“平台化”的思考。特别是下游环节，因为“平台化”的思维，必然要考虑对各种不同的端进行适配，必然要制定各种规范，这些都是人力成本。如《月相》中所示，上游理清楚并且统一后，下游是能有针对性地、很低成本地实现的，根本不需要“平台级”的成本投入。当然，在这里所说的只是减少技术上的投入，环节本身还是非常重要的。&lt;/p&gt;  &lt;p&gt;平台林立从某一方面来说也表示着团队内部有着大量的无序的力量，这种力量在团队出现不同环节的分工时就产生了，尽早地建立研发体系就能尽早地将这些力量用起来，创造真正的价值。&lt;/p&gt;  &lt;h3&gt;3.2 资源池&lt;/h3&gt;  &lt;p&gt;很多大公司的 web 研发团队都被当成资源池来用，哪个业务需要就投入到哪里。现象的直接原因有两个：一是   &lt;strong&gt;从管理的角度来说，web 层的研发工作相对来说可替换性强，具备形成资源池的可能&lt;/strong&gt;。二是   &lt;strong&gt;web 研发处于业务决策链底层，人员相对来说最紧张，因此通过资源池的方式能动态地支持业务开发，是最简单的解决方案&lt;/strong&gt;。但这个方案其实是相当低效的。我们从对工程师个人的关注来切入这个话题。&lt;/p&gt;  &lt;p&gt;首先从主观的角度出发，一个有激情，对职业未来充满憧憬的工程师与苦大仇深的工程师在效率上是有成倍差别的。除了其本身的性格外，造就这两种态度有很大一部分是职业上升渠道的问题。首先，和任何能被当成资源池来用的工作一样，因为可替换性强，所以不容易被重视。其次，目前的上升渠道不够。web 研发工程师的上升渠道要么是纵向的，当业务发展得足够好，重要性提高，成为系统负责人。要么是横向的，随着团队扩大，管理需要，成为管理者。这两者一个基于业务一个基于人力，和技术相关不大。所以有才华的工程师自然会想要造框架、造平台，努力成为公司技术中重要的一部分。但没有正确的引导，就会成为上面所说”无序的力量“，发展得不对反而会变成公司的消耗。而当他发现自己付出的努力得不到回报的时，就有可能变成苦大仇深的工程师。&lt;/p&gt;  &lt;p&gt;最终影响的不只是工程师自身，公司也会要在管理成本上为其买单。我们在与一些资深 hr 交流时，他们进一步说明了这个问题。在公司工作了四、五年的员工，是已经融入了公司，理解公司文化也了解公司问题的人，算是中流砥柱。如果得不到好的上升，可能会有两种情况：其中有想法有行动力的，多半会选择离开。既会对组织稳定性会造成影响，也会让公司付出的培养成本付诸东流，对公司来说可算是很大的损失；另一种更不好的则是既不离开，也不像以前一样努力。他们在团队内有一定的话语权，却丧失了进去的激情，不再发挥积极的作用。当公司需要快速扩张、快速发生变革的时候，他们就会成为隐性的管理成本。&lt;/p&gt;  &lt;p&gt;而解决方案，其实很简单。大公司内部通常都有”框架组“、”平台组“类似的部门，但基本都停留在”可用“阶段就完成任务了。这远远不够，如果将建立 web 基础研发体系作为目标，以产品化为衡量标准，加强重视和投入。 web 工程师的上升渠道就会得以扩张，公司内无序的力量就会进入到正确的领域。创造的价值又能进一步为研发提供能量，形成一个正循环，逐步缓解人力紧张的态势，资源池现象也就自然会消失。这很像我们身体受伤时，外部肿胀只是炎症的表现，消炎了，肿胀自然也就好了。重点是找到关键进行消炎，而不是围着外部现象思考。&lt;/p&gt;  &lt;p&gt;   &lt;img alt="" src="https://gw.alipayobjects.com/zos/rmsportal/ziSawgUzzIGMBQURexZP.png"&gt;&lt;/img&gt;&lt;/p&gt;  &lt;p&gt;建立体系还能带来的好处是，通过提升 web 研发的效率，降低业务研发所需的人数，能帮助大公司重新回到小步快跑的节奏。张小龙有一篇演讲《   &lt;a href="http://tech.qq.com/a/20161029/018612.htm"&gt;警惕KPI和复杂流程&lt;/a&gt;》，讲到了小团队的重要性，随着互联网公司的竞争越来越激烈，这种重要性会变得越来越高。我们从一些互联网的新巨头上，其实已经看见了“   &lt;strong&gt;核心技术+基础web研发能力&lt;/strong&gt;”来快速出产品，占领市场的趋势。对小公司来说，统一的 web 基础研发体系，是帮助实现超车的重要一环。对大公司来说，则是进一步挖掘效能，防止掉队的必修课了。&lt;/p&gt;  &lt;h2&gt;4 后记&lt;/h2&gt;  &lt;p&gt;这篇文章笔者前后重写了三次，因为面对 web 一线工程师这样一个庞大的群体，效能提升已经不仅仅是技术或管理某一方面的事情，而是要综合各个方面来寻求个人和公司发展的共赢。 web 一线研发是很多工程师进入这个领域最开始做的事情，但是笔者看到了很多有才华的人困在了低效、重复的工作里面，努力了也因为方向不对而徒劳。这对个人和公司都是损失。在技术上找到方向，在管理上予以支持，多方发力，其实能提升的效能远超十倍。当然，一篇文章不足以实现任何改变，这篇文章最主要的目还是抛砖引玉，也希望对这个方向有想法，志同道合的朋友联系我，一起交流，一起推动。&lt;/p&gt;  &lt;p&gt;邮箱:   &lt;a href="mailto:ariesate@outlook.com" target="_blank"&gt;ariesate@outlook.com&lt;/a&gt;。&lt;/p&gt;  &lt;h2&gt;5 答读者问&lt;/h2&gt;  &lt;p&gt;问：研发体系的统一规划不是破坏了竞争和创新吗？&lt;/p&gt;  &lt;p&gt;答：统一规划并不是指不要竞争，不要创新。而是防止开倒车的情况出现，是给竞争和创新指定一个方向。例如我们在文中理清上下游关系，目的是指导研发力量应该往哪里投入，在投入的过程中仍然可以采取竞争的形式。&lt;/p&gt;  &lt;p&gt; &lt;/p&gt;  &lt;p&gt;问：框架研发提升效能的趋势？&lt;/p&gt;  &lt;p&gt;答：分两个方向。一是框架本身，会朝着“增强对用户代码的理解和控制力”这个方向前进。用户按框架写的代码，能不能通过工具分析出具体的语义？人工的低级错误能不能自动检测出来并自动修正？能不能转化成某种人类习惯的表达方式，比如图？当控制力达到一定程度后，这些能力都实现后，再往下应该就是代码的自动生成。&lt;/p&gt;  &lt;p&gt;另一个值得一提的是框架能力与业务特有属性会一起沉淀到 IDE 上，会出现面向专有框架的 IDE，面向单个具体工程的 IDE。分析图，自动扫描工具都由 IDE 作为载体，就像很多游戏的专用编辑器一样。只有沉淀到 IDE 上才是最便捷、最有针对性的。对这个方向感兴趣的读者可以跟我邮件讨论，目前我们已经有一些初步的想法。&lt;/p&gt;  &lt;p&gt; &lt;/p&gt;  &lt;p&gt;问：文章中讲到的问题都是大公司的，对小团队来说，什么时候应该开始建立自己的基础研发体系？&lt;/p&gt;  &lt;p&gt;答：研发体系的建立可以分为规划和实施两个阶段。规划的话，从一开始就应该有所规划。在前期人力不够的情况下，不用强行追求打造自己的框架和工具，可以用开源的。但应该始终把开源的东西拿到自己的体系中，清楚地知道它在自己体系中的角色，也清晰地知道自己用了它的什么特性，未来还需要补充什么。什么时候开始实施其实有一个象征性的标准，也是我们前面在无序的力量中提到的——出现了不同环节的分工时。有的团队业务扩张太快，人力一直不够，那么建议按五分之一到三分之一的比例来抽出人力打造基础设施。磨刀不误砍柴工，何况投资得到的回报是电锯呢。&lt;/p&gt;&lt;/div&gt;&lt;div&gt; &lt;a href="https://itindex.net/"  title="IT 资讯"&gt;&lt;img src="https://itindex.net/images/iconWarning.gif" title="IT 资讯" border="0"/&gt; &lt;/a&gt;</description>
      <category>dev</category>
      <guid isPermaLink="true">https://itindex.net/detail/58170-%E6%95%88%E8%83%BD-%E6%8F%90%E5%8D%87-web</guid>
      <pubDate>Wed, 21 Mar 2018 00:00:00 CST</pubDate>
    </item>
    <item>
      <title>最好用的开源Web漏扫工具梳理</title>
      <link>https://itindex.net/detail/57742-%E6%9C%80%E5%A5%BD-%E5%BC%80%E6%BA%90-web</link>
      <description>&lt;p&gt;  &lt;strong&gt;赛门铁克2017年互联网安全威胁报告中提出在他们今年扫描的网站中，有76%都含有恶意软件。如果你在用WordPress，SUCURI的另一份报告也显示，超过70％的被扫描网站也都存在一个或多个漏洞。&lt;/strong&gt;&lt;/p&gt;
 &lt;p&gt;  &lt;img alt="1.png" height="417" src="http://image.3001.net/images/20171127/15117492138607.png!small" width="500"&gt;&lt;/img&gt;&lt;/p&gt;
 &lt;p&gt;如果你刚好是某个网络应用程序的所有者，怎样才能保证你的网站是安全的、不会泄露敏感信息？&lt;/p&gt;
 &lt;p&gt;如果是基于云的安全解决方案，那么可能只需要进行常规漏扫。但如果不是，我们就必须执行例行扫描，采取必要的行动降低安全风险。&lt;/p&gt;
 &lt;p&gt;当然很多付费扫描器功能会更加全面、严谨，包含报表输出、警报、详细的应急指南等等附加功能。&lt;/p&gt;
 &lt;p&gt;开源工具最大的缺点是漏洞库可能没有付费软件那么全面。&lt;/p&gt;
 &lt;h2&gt;1. Arachni&lt;/h2&gt;
 &lt;p&gt;Arachni是一款基于Ruby框架搭建的高性能安全扫描程序，适用于现代Web应用程序。可用于Mac、Windows及Linux系统的可移植二进制文件。&lt;/p&gt;
 &lt;p&gt;  &lt;img alt="2.png" height="303" src="http://image.3001.net/images/20171127/15117492585019.png!small" width="500"&gt;&lt;/img&gt;&lt;/p&gt;
 &lt;p&gt;Arachni不仅能对基本的静态或CMS网站进行扫描，还能够做到对以下平台指纹信息（(硬盘序列号和网卡物理地址)）的识别。且同时支持主动检查和被动检查。&lt;/p&gt;
 &lt;blockquote&gt;  &lt;p&gt;Windows、Solaris、Linux、BSD、Unix&lt;/p&gt;
  &lt;p&gt;Nginx、Apache、Tomcat、IIS、Jetty&lt;/p&gt;
  &lt;p&gt;Java、Ruby、Python、ASP、PHP&lt;/p&gt;
  &lt;p&gt;Django、Rails、CherryPy、CakePHP、ASP.NET MVC、Symfony&lt;/p&gt;
&lt;/blockquote&gt;
 &lt;p&gt;一般检测的漏洞类型包括：&lt;/p&gt;
 &lt;blockquote&gt;  &lt;p&gt;NoSQL/Blind/SQL/Code/LDAP/Command/XPath注入&lt;/p&gt;
  &lt;p&gt;跨站请求伪造&lt;/p&gt;
  &lt;p&gt;路径遍历&lt;/p&gt;
  &lt;p&gt;本地/远程文件包含&lt;/p&gt;
  &lt;p&gt;Response splitting&lt;/p&gt;
  &lt;p&gt;跨站脚本&lt;/p&gt;
  &lt;p&gt;未验证的DOM重定向&lt;/p&gt;
  &lt;p&gt;源代码披露&lt;/p&gt;
&lt;/blockquote&gt;
 &lt;p&gt;另外，你可以选择输出HTML、XML、Text、JSON、YAML等格式的审计报告。&lt;/p&gt;
 &lt;p&gt;Arachni帮助我们以插件的形式将扫描范围扩展到更深层的级别。Arachni的详细介绍与下载地址：click   &lt;a href="http://www.arachni-scanner.com/features/framework/"&gt;here&lt;/a&gt;。&lt;/p&gt;
 &lt;h2&gt;2. XssPy&lt;/h2&gt;
 &lt;p&gt;一个有力的事实是，微软、斯坦福、摩托罗拉、Informatica等很多大型企业机构都在用这款基于python的XSS（跨站脚本）漏洞扫描器。它的编写者Faizan Ahmad才华出众，XssPy是一个非常智能的工具，不仅能检查主页或给定页面，还能够检查网站上的所有链接以及子域。因此，XssPy的扫描非常细致且范围广泛。&lt;/p&gt;
 &lt;p&gt;下载地址：click   &lt;a href="https://github.com/faizann24/XssPy"&gt;here&lt;/a&gt;。&lt;/p&gt;
 &lt;h2&gt;3. w3af&lt;/h2&gt;
 &lt;p&gt;w3af是一个从2006年年底开始的基于Python的开源项目，可用于Linux和Windows系统。w3af能够检测200多个漏洞，包括OWASP top 10中提到的。&lt;/p&gt;
 &lt;p&gt;  &lt;img alt="3.png" height="251" src="http://image.3001.net/images/20171127/15117492927610.png!small" width="400"&gt;&lt;/img&gt;&lt;/p&gt;
 &lt;p&gt;w3af能够帮你将payload注入header、URL、cookies、字符串查询、post-data等，利用Web应用程序进行审计，且支持各种记录方法完成报告，例如：&lt;/p&gt;
 &lt;blockquote&gt;  &lt;p&gt;CSV&lt;/p&gt;
  &lt;p&gt;HTML&lt;/p&gt;
  &lt;p&gt;Console&lt;/p&gt;
  &lt;p&gt;Text&lt;/p&gt;
  &lt;p&gt;XML&lt;/p&gt;
  &lt;p&gt;Email&lt;/p&gt;
&lt;/blockquote&gt;
 &lt;p&gt;这个程序建立在一个插件架构上，所有可用插件地址：click  &lt;a href="http://w3af.org/plugins"&gt; here&lt;/a&gt;。&lt;/p&gt;
 &lt;p&gt;w3af下载地址：click   &lt;a href="http://w3af.org/"&gt;here&lt;/a&gt;。&lt;/p&gt;
 &lt;h2&gt;4. Nikto&lt;/h2&gt;
 &lt;p&gt;相信很多人对Nikto并不陌生，这是由Netsparker（专做web安全扫描器企业，总部坐标英国）赞助的开源项目，旨在发现Web服务器配置错误、插件和Web漏洞。Nikto对6500多个风险项目进行过综合测试。支持HTTP代理、SSL或NTLM身份验证等，还能确定每个目标扫描的最大执行时间。&lt;/p&gt;
 &lt;p&gt;Nikto也适用于Kali Linux。&lt;/p&gt;
 &lt;p&gt;  &lt;img alt="4.png" height="415" src="http://image.3001.net/images/20171127/15117493223191.png!small" width="579"&gt;&lt;/img&gt;&lt;/p&gt;
 &lt;p&gt;Nikto在企业内部网络解决方案中查找web服务器安全风险的应用前景非常广阔。&lt;/p&gt;
 &lt;p&gt;下载地址：click   &lt;a href="https://github.com/sullo/nikto"&gt;here&lt;/a&gt;。&lt;/p&gt;
 &lt;h2&gt;5. Wfuzz&lt;/h2&gt;
 &lt;p&gt;Wfuzz（Web Fuzzer）也是渗透中会用到的应用程序评估工具。它可以对任何字段的HTTP请求中的数据进行模糊处理，对Web应用程序进行审查。&lt;/p&gt;
 &lt;p&gt;Wfuzz需要在被扫描的计算机上安装Python。具体的使用指南可参见这个：  &lt;a href="https://wfuzz.readthedocs.io/en/latest/"&gt;链接&lt;/a&gt;。&lt;/p&gt;
 &lt;p&gt;Wfuzz下载地址：click   &lt;a href="https://github.com/xmendez/wfuzz"&gt;here&lt;/a&gt;。&lt;/p&gt;
 &lt;h2&gt;  &lt;strong&gt;6. OWASP ZAP&lt;/strong&gt;&lt;/h2&gt;
 &lt;p&gt;ZAP（Zet Attack Proxy）是全球数百名志愿者程序员在积极更新维护的著名渗透测试工具之一。它是一款跨平台的Java工具，甚至都可以在Raspberry Pi上运行。ZAP在浏览器和Web应用程序之间拦截和检查消息。&lt;/p&gt;
 &lt;p&gt;  &lt;img alt="5.jpeg" height="400" src="http://image.3001.net/images/20171127/15117493471009.jpeg!small" width="500"&gt;&lt;/img&gt;&lt;/p&gt;
 &lt;p&gt;ZAP值得一提的优良功能：&lt;/p&gt;
 &lt;blockquote&gt;  &lt;p&gt;Fuzzer&lt;/p&gt;
  &lt;p&gt;自动与被动扫描&lt;/p&gt;
  &lt;p&gt;支持多种脚本语言&lt;/p&gt;
  &lt;p&gt;Forced browsing（强制浏览）&lt;/p&gt;
&lt;/blockquote&gt;
 &lt;p&gt;下载地址：click   &lt;a href="https://github.com/zaproxy/zaproxy"&gt;here&lt;/a&gt;。&lt;/p&gt;
 &lt;h2&gt;7. Wapiti&lt;/h2&gt;
 &lt;p&gt;Wapiti扫描特定的目标网页，寻找能够注入数据的脚本和表单，从而验证其中是否存在漏洞。它不是对源代码的安全检查，而是执行黑盒扫描。&lt;/p&gt;
 &lt;p&gt;  &lt;img alt="6.png" height="277" src="http://image.3001.net/images/20171127/15117493781613.png!small" width="350"&gt;&lt;/img&gt;&lt;/p&gt;
 &lt;p&gt;支持GET和POST HTTP请求方式、HTTP和HTTPS代理以及多个认证等。&lt;/p&gt;
 &lt;p&gt;下载地址：click  &lt;a href="http://wapiti.sourceforge.net/"&gt; here&lt;/a&gt;。&lt;/p&gt;
 &lt;h2&gt;8. Vega&lt;/h2&gt;
 &lt;p&gt;Vega由Subgraph开发，Subgraph是一个用Java编写的多平台支持工具，用于查找XSS，SQLi、RFI和很多其它的漏洞。&lt;/p&gt;
 &lt;p&gt;Vega的图形用户界面相对来说比较美观。它可以通过特定的凭证登录某个应用后执行自动扫描。&lt;/p&gt;
 &lt;p&gt;  &lt;img alt="7.png" height="395" src="http://image.3001.net/images/20171127/15117494229375.png!small" width="450"&gt;&lt;/img&gt;&lt;/p&gt;
 &lt;p&gt;如果你懂开发，还可以利用vega API创建新的攻击模块。&lt;/p&gt;
 &lt;p&gt;下载地址：click   &lt;a href="https://subgraph.com/vega/"&gt;here&lt;/a&gt;。&lt;/p&gt;
 &lt;h2&gt;9. SQLmap&lt;/h2&gt;
 &lt;p&gt;顾名思义，我们可以借助sqlmap对数据库进行渗透测试和漏洞查找。&lt;/p&gt;
 &lt;p&gt;  &lt;img alt="8.png" height="274" src="http://image.3001.net/images/20171127/15117494531932.png!small" width="500"&gt;&lt;/img&gt;&lt;/p&gt;
 &lt;p&gt;支持所有操作系统上的Python 2.6或2.7。如果你正在查找SQL注入和数据库漏洞利用，sqlmap是一个好助手。&lt;/p&gt;
 &lt;p&gt;下载地址：click   &lt;a href="https://github.com/sqlmapproject/sqlmap"&gt;here&lt;/a&gt;。&lt;/p&gt;
 &lt;h2&gt;10. Grabber&lt;/h2&gt;
 &lt;p&gt;这也是一个做得不错的Python小工具。这里列举一些特色功能：&lt;/p&gt;
 &lt;blockquote&gt;  &lt;p&gt;JavaScript源代码分析器&lt;/p&gt;
  &lt;p&gt;跨站点脚本、SQL注入、SQL盲注&lt;/p&gt;
  &lt;p&gt;利用PHP-SAT的PHP应用程序测试&lt;/p&gt;
&lt;/blockquote&gt;
 &lt;p&gt;下载地址：click  &lt;a href="http://rgaucher.info/beta/grabber/"&gt; here&lt;/a&gt;。&lt;/p&gt;
 &lt;h2&gt;11. Golismero&lt;/h2&gt;
 &lt;p&gt;这是一个管理和运行Wfuzz、DNS recon、sqlmap、OpenVas、机器人分析器等一些流行安全工具的框架。&lt;/p&gt;
 &lt;p&gt;  &lt;img alt="9.jpg" height="328" src="http://image.3001.net/images/20171127/15117494859252.jpg!small" width="450"&gt;&lt;/img&gt;&lt;/p&gt;
 &lt;p&gt;Golismero非常智能，能够整合其它工具的测试反馈，输出一个统一的结果。&lt;/p&gt;
 &lt;p&gt;下载地址：click  &lt;a href="http://www.golismero.com/"&gt; here&lt;/a&gt;。&lt;/p&gt;
 &lt;h2&gt;12. OWASP Xenotix XSS&lt;/h2&gt;
 &lt;p&gt;OWASP的Xenotix XSS是一个用于查找和利用跨站点脚本的高级框架，内置了三个智能模糊器，用于快速扫描和结果优化。&lt;/p&gt;
 &lt;p&gt;  &lt;img alt="10.png" height="298" src="http://image.3001.net/images/20171127/15117495152127.png!small" width="500"&gt;&lt;/img&gt;&lt;/p&gt;
 &lt;p&gt;这款工具有上百个功能，详细的功能列表与下载地址：click   &lt;a href="https://www.owasp.org/index.php/OWASP_Xenotix_XSS_Exploit_Framework"&gt;here&lt;/a&gt;。&lt;/p&gt;
 &lt;p&gt;网络安全对于在线业务至关重要，希望上面这些免费的漏扫程序能够帮助各位读者及时发现风险，在被恶意人员利用之前即完成漏洞修复。&lt;/p&gt;
 &lt;p&gt;  &lt;strong&gt;*参考来源：   &lt;a href="https://geekflare.com/open-source-web-security-scanner/"&gt;geekflare&lt;/a&gt;，FB小编柚子编译，转载请注明来自FreeBuf.COM&lt;/strong&gt;&lt;/p&gt;
&lt;div&gt; &lt;a href="https://itindex.net/"  title="IT 资讯"&gt;&lt;img src="https://itindex.net/images/iconWarning.gif" title="IT 资讯" border="0"/&gt; &lt;/a&gt;</description>
      <category>WEB安全 开源 漏洞</category>
      <guid isPermaLink="true">https://itindex.net/detail/57742-%E6%9C%80%E5%A5%BD-%E5%BC%80%E6%BA%90-web</guid>
      <pubDate>Sat, 02 Dec 2017 15:00:59 CST</pubDate>
    </item>
    <item>
      <title>docker - 从安装到部署一个web应用(go、java) - CSDN博客</title>
      <link>https://itindex.net/detail/57738-docker-web-%E5%BA%94%E7%94%A8</link>
      <description>&lt;div&gt;    &lt;p&gt;说明:      &lt;br /&gt;1.权限是root，不是则先提升权限&lt;/p&gt;    &lt;hr&gt;&lt;/hr&gt;    &lt;h1&gt;一:安装docker&lt;/h1&gt;    &lt;p&gt;1.      &lt;a href="https://docs.docker.com/engine/installation/binaries/"&gt;https://docs.docker.com/engine/installation/binaries/&lt;/a&gt;      &lt;br /&gt;下载docker最新版二进制tar.gz&lt;/p&gt;    &lt;pre&gt;      &lt;code&gt;linux下:
wget https://get.docker.com/builds/Darwin/x86_64/docker-1.11.0.tgz&lt;/code&gt;&lt;/pre&gt;    &lt;p&gt;2.丢到 $path中&lt;/p&gt;    &lt;pre&gt;      &lt;code&gt;mv docker /usr/local/sbin&lt;/code&gt;&lt;/pre&gt;    &lt;p&gt;3.启动&lt;/p&gt;    &lt;pre&gt;      &lt;code&gt;docker daemon &amp;amp;&lt;/code&gt;&lt;/pre&gt;    &lt;hr&gt;&lt;/hr&gt;    &lt;h1&gt;二.在容器上运行tomcat&lt;/h1&gt;    &lt;p&gt;docker官方镜像仓库由于有墙，所以下载的很慢。目前我用的是时速云的镜像。&lt;/p&gt;    &lt;p&gt;第一步:拉取镜像到本地      &lt;br /&gt;      &lt;code&gt;docker pull index.tenxcloud.com/tenxcloud/tomcat&lt;/code&gt;&lt;/p&gt;    &lt;p&gt;第二步:为镜像添加一个别名      &lt;br /&gt;      &lt;code&gt;docker tag index.tenxcloud.com/tenxcloud/tomcat tomcat-1&lt;/code&gt;&lt;/p&gt;    &lt;p&gt;第二步:启动tomcat      &lt;br /&gt;      &lt;code&gt;docker run -p 5000:8080 --name container1 tomcat-1&lt;/code&gt;      &lt;br /&gt;如此一来，tomcat就启动了，-p 5000:8080的意思是把容器tomcat的8080端口隐射到宿主机的端口上，这样外网访问5000就能访问到我们的container1的8080 tomcat上面了.&lt;/p&gt;    &lt;p&gt;如此一来，一个简单的tomcat就跑起来了.&lt;/p&gt;    &lt;p&gt;此处容器container1 和 镜像tomcat-1，我的理解是镜像就是一个模板，container1就是根据这个模板创造的一个真正的盆子，这个盆子里面就跑着我们的tomcat. 所以我们可以用同一个镜像创建许多container。&lt;/p&gt;    &lt;h1&gt;三.在tomcat上面部署我们的应用&lt;/h1&gt;    &lt;p&gt;接下来我们要部署我们的应用上去，思路是进入到container1里面去，此时可以把container1想象为一个新的机器，我们只需要到tomcat的webapp丢war，然后重启就行了.&lt;/p&gt;    &lt;h3&gt;1.进入容器内部&lt;/h3&gt;    &lt;p&gt;      &lt;code&gt;docker exec -it container2 /bin/bash&lt;/code&gt;&lt;/p&gt;    &lt;h3&gt;2.查看tomcat webapp路径&lt;/h3&gt;    &lt;p&gt;/tomcat/webapps&lt;/p&gt;    &lt;h2&gt;3.传war&lt;/h2&gt;    &lt;p&gt;把war丢到宿主机 在丢到container里面丢到tomcat/webapps&lt;/p&gt;    &lt;p&gt;      &lt;code&gt;docker cp DemoOne.war container2:tomcat/webapps&lt;/code&gt;&lt;/p&gt;    &lt;p&gt;太TM惊喜了，docker本身就支持啊！！！666666.&lt;/p&gt;    &lt;h2&gt;4.重启容器&lt;/h2&gt;    &lt;p&gt;不需要了。。。docker自动帮你部署了      &lt;br /&gt;      &lt;img alt="&amp;#36825;&amp;#37324;&amp;#20889;&amp;#22270;&amp;#29255;&amp;#25551;&amp;#36848;" src="http://img.blog.csdn.net/20160513214503969" title=""&gt;&lt;/img&gt;&lt;/p&gt;    &lt;h2&gt;5.访问应用&lt;/h2&gt;    &lt;p&gt;      &lt;img alt="&amp;#36825;&amp;#37324;&amp;#20889;&amp;#22270;&amp;#29255;&amp;#25551;&amp;#36848;" src="http://img.blog.csdn.net/20160513214616516" title=""&gt;&lt;/img&gt;&lt;/p&gt;    &lt;hr&gt;&lt;/hr&gt;    &lt;p&gt;至此，一个完整的docker部署tomcat及上线一个java web应用流程就走通了.      &lt;br /&gt;说实话，走通后才发现是这么的简单。之前概念上面不懂的地方这下也基本通了。      &lt;br /&gt;不得不说很Nice，和预想中的完全一样，就把dokcer给你创建的container当成一个新的linux用就行啦！&lt;/p&gt;    &lt;hr&gt;&lt;/hr&gt;    &lt;h1&gt;使用docker部署一套应用系统&lt;/h1&gt;    &lt;p&gt;接下来部署一套完整的系统，包括如下组件：      &lt;br /&gt;负载均衡：Haproxy      &lt;br /&gt;JAVA工：tomcat      &lt;br /&gt;缓存：Redis Master、Slave&lt;/p&gt;    &lt;p&gt;流程是Java开一个restful接口，为redis写入一个数据，      &lt;br /&gt;再开一个restful接口，从redis读取一个数据。&lt;/p&gt;    &lt;p&gt;系统结构如图：      &lt;br /&gt;      &lt;img alt="&amp;#36825;&amp;#37324;&amp;#20889;&amp;#22270;&amp;#29255;&amp;#25551;&amp;#36848;" src="http://img.blog.csdn.net/20160516100043406" title=""&gt;&lt;/img&gt;&lt;/p&gt;    &lt;p&gt;步骤：      &lt;br /&gt;1.准备java工程，并打包成war      &lt;br /&gt;2.拉取haproxy镜像，并运行&lt;/p&gt;    &lt;pre&gt;      &lt;code&gt;//注意 --name不能放在最后，6555:80 80不可更改，是haproxy本身的端口docker run-d-p6555:80--linkcontainer2:container2--name haproxy-1haproxy&lt;/code&gt;&lt;/pre&gt;    &lt;p&gt;      &lt;img alt="&amp;#36825;&amp;#37324;&amp;#20889;&amp;#22270;&amp;#29255;&amp;#25551;&amp;#36848;" src="http://img.blog.csdn.net/20160516142942872" title=""&gt;&lt;/img&gt;      &lt;br /&gt;可以看到，haproxy已经成功实现了代理的功能.      &lt;br /&gt;目前的镜像不知道为什么不能通过修改haproxy.cfg的方式来支持，后续研究&lt;/p&gt;    &lt;hr&gt;&lt;/hr&gt;    &lt;p&gt;之后再补上golang镜像及应用部署的流程&lt;/p&gt;&lt;/div&gt;
    &lt;div&gt; &lt;a href="https://itindex.net/"  title="IT 资讯"&gt;&lt;img src="https://itindex.net/images/iconWarning.gif" title="IT 资讯" border="0"/&gt; &lt;/a&gt;</description>
      <category />
      <guid isPermaLink="true">https://itindex.net/detail/57738-docker-web-%E5%BA%94%E7%94%A8</guid>
      <pubDate>Sat, 02 Dec 2017 09:37:33 CST</pubDate>
    </item>
    <item>
      <title>Web GIS 离线解决方案</title>
      <link>https://itindex.net/detail/57564-web-gis-%E7%A6%BB%E7%BA%BF</link>
      <description>&lt;h2&gt;1、背景&lt;/h2&gt;
 &lt;p&gt;在离线环境下（局域网中）的GIS系统中如何使用地图？这里的地图主要指的是地图底图，有了底图切片数据，我们就可以看到地图，在上面加上自己的业务数据图层，进行相关操作。&lt;/p&gt;
 &lt;p&gt;要在离线环境下看到GIS地图，就要有底图切片数据，地图的底图切片数据在一定时间内是不会变化的，可以使用一些地图下载器下载地图切片，如这个  &lt;a href="http://www.cnblogs.com/luxiaoxun/p/4454880.html"&gt;地图下载器&lt;/a&gt;。&lt;/p&gt;
 &lt;p&gt;在CS系统中可以基于GMap.Net来做，参考《  &lt;a href="http://www.cnblogs.com/luxiaoxun/p/4454880.html"&gt;百度谷歌离线地图解决方案&lt;/a&gt;》。&lt;/p&gt;
 &lt;p&gt;下面介绍下Web系统如何使用GIS切片数据，开发web GIS系统。&lt;/p&gt;
 &lt;h2&gt;2、使用GeoWebCache发布WMS服务&lt;/h2&gt;
 &lt;p&gt;Geowebcache是基于Java的Web开源项目，主要用于缓存各种WMS数据源的地图瓦片，它实现了多种服务接口，包括WMS-C，WMTS，TMS，KML。&lt;/p&gt;
 &lt;p&gt;Geowebcache作为一个独立的开源项目，在最近被Geosever的几个版本所集成，主要是对发布的WMS图层建立缓存切片。&lt;/p&gt;
 &lt;p&gt;服务发布步骤：&lt;/p&gt;
 &lt;p&gt;1）官网下载   &lt;a href="http://www.geowebcache.org/"&gt;geowebcache-1.8.0-war.zip&lt;/a&gt;，直接解压得到geowebcache.war文件，将该文件直接拷贝至tomcat目录下的webapps下即可，启动tomcat会对war包进行解压。&lt;/p&gt;
 &lt;p&gt;2）修改geowebcache的配置文件geowebcache-core-context.xml。该文件在Tomcat的webapps\geowebcache\WEB-INF下，修改如下：&lt;/p&gt;
 &lt;pre&gt;&amp;lt;bean id=&amp;quot;gwcXmlConfig&amp;quot; class=&amp;quot;org.geowebcache.config.XMLConfiguration&amp;quot;&amp;gt;
&amp;lt;constructor-arg ref=&amp;quot;gwcAppCtx&amp;quot; /&amp;gt;
&amp;lt;!--&amp;lt;constructor-arg ref=&amp;quot;gwcDefaultStorageFinder&amp;quot; /&amp;gt;--&amp;gt;
    &amp;lt;constructor-arg value=&amp;quot;D:\\GisMap\\&amp;quot; /&amp;gt;
&amp;lt;!-- By default GWC will look for geowebcache.xml in {GEOWEBCACHE_CACHE_DIR},
         if not found will look at GEOSEVER_DATA_DIR/gwc/
         alternatively you can specify an absolute or relative path to a directory
         by replacing the gwcDefaultStorageFinder constructor argument above by the directory
         path, like constructor-arg value=&amp;quot;/etc/geowebcache&amp;quot;     
    --&amp;gt;
&amp;lt;property name=&amp;quot;template&amp;quot; value=&amp;quot;/geowebcache.xml&amp;quot;&amp;gt;
&amp;lt;description&amp;gt;Set the location of the template configuration file to copy over to the
        cache directory if one doesn&amp;apos;t already exist.
&amp;lt;/description&amp;gt;
&amp;lt;/property&amp;gt;
&amp;lt;/bean&amp;gt;&lt;/pre&gt;
 &lt;p&gt;修改gwcXmlConfig实例化时使用固定路径，该路径可以为任意新建路径文件夹。Geowebcache启动之后会检查此文件夹下是否存在gewebcache.xml文件，如果不存在则按模板新建立并读取使用，如果存在则直接读取使用。&lt;/p&gt;
 &lt;p&gt;3）修改第2步中的gewebcache.xml文件：&lt;/p&gt;
 &lt;pre&gt;&amp;lt;layers&amp;gt;
    &amp;lt;arcgisLayer&amp;gt;
        &amp;lt;name&amp;gt;ARCGIS-Demo&amp;lt;/name&amp;gt;
        &amp;lt;tilingScheme&amp;gt;D:\\GisMap\\Layer\\conf.xml&amp;lt;/tilingScheme&amp;gt;
        &amp;lt;tileCachePath&amp;gt;D:\\GisMap\\Layer\\_alllayers&amp;lt;/tileCachePath&amp;gt;
    &amp;lt;/arcgisLayer&amp;gt;
&amp;lt;/layers&amp;gt;&lt;/pre&gt;
 &lt;p&gt;在layers节点里添加arcgisLayer节点（默认生成的gewebcache.xml的layers节点有许多其他冗余数据，可删除可保留）。Name节点表示待添加图层的名称（这里配置为ARCGIS-Demo），titlingscheme节点为conf.xml文件的路径，tileCachePath为瓦片数据的路径。&lt;/p&gt;
 &lt;p&gt;4）瓦片地图的准备&lt;/p&gt;
 &lt;p&gt;  &lt;a href="http://www.importnew.com/26979.html/434101-20151205204823377-727538421" rel="attachment wp-att-26980"&gt;   &lt;img alt="" src="http://incdn1.b0.upaiyun.com/2017/10/bcb70c3757c08c56aea488a56f927f4a.jpg" title="434101-20151205204823377-727538421"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;
 &lt;p&gt;其中conf.xml为配置文件，conf.cdi为显示区域约束文件，_alllayers文件夹下则存放了切片数据，Status.gdb为切片状态情况记录（可直接删除）。&lt;/p&gt;
 &lt;p&gt;通过瓦片下载器下载瓦片地图，然后生成的切片数据_alllayers文件夹：&lt;/p&gt;
 &lt;p&gt;  &lt;a href="http://www.importnew.com/26979.html/434101-20151205205039033-156452984" rel="attachment wp-att-26981"&gt;   &lt;img alt="" src="http://incdn1.b0.upaiyun.com/2017/10/40901603e94cfaf5e4610be93d8d19ef.png" title="434101-20151205205039033-156452984"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;
 &lt;p&gt;L01-L10表示地图缩放级数，按照ArcGIS切片目录组织，切片命名规则也和ArcGIS切片数据命名规则一致。（conf.xml、conf.cdi和_alllayers在同级目录）。&lt;/p&gt;
 &lt;p&gt;5)启动tomcat，继而启动Geowebcache服务，浏览器访问 localhost:8080/geowebcache，如果一切正确的话可以看到下面的页面&lt;/p&gt;
 &lt;p&gt;  &lt;a href="http://www.importnew.com/26979.html/434101-20151205205137018-98249724" rel="attachment wp-att-26982"&gt;   &lt;img alt="" src="http://incdn1.b0.upaiyun.com/2017/10/a549e2ece820d9b0e5d699f875bead74.jpg" title="434101-20151205205137018-98249724"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;
 &lt;p&gt;该页面简单说明了Geowebcache的一些情况。&lt;/p&gt;
 &lt;p&gt;点击“A list of all the layers and automatic demos”连接可以看到下面：&lt;/p&gt;
 &lt;p&gt;  &lt;a href="http://www.importnew.com/26979.html/434101-20151205205408643-1452263007" rel="attachment wp-att-26983"&gt;   &lt;img alt="" src="http://incdn1.b0.upaiyun.com/2017/10/9a26399bd8d3d70a4eab7658df53d9b4.jpg" title="434101-20151205205408643-1452263007"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;
 &lt;p&gt;该页面显示了geowebcache.xml配置的图层信息。图中可以看到只配置了一个名字为ARCGIS-Demo的图层，使用的EPSG3857坐标系，发布的图片格式为png格式，点击png链接即可看到瓦片地图。&lt;/p&gt;
 &lt;p&gt;  &lt;a href="http://www.importnew.com/26979.html/434101-20151205205500518-1996834144" rel="attachment wp-att-26984"&gt;   &lt;img alt="" src="http://incdn1.b0.upaiyun.com/2017/10/f593bb4900f90206c976450188729066.jpg" title="434101-20151205205500518-1996834144"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;
 &lt;p&gt;这里地图显示的级别和坐标系配置都来自conf.xml文件。这里的前端js使用的是Openlayers。查看网页源码：&lt;/p&gt;
 &lt;pre&gt;&amp;lt;html xmlns=&amp;quot;http://www.w3.org/1999/xhtml&amp;quot;&amp;gt;&amp;lt;head&amp;gt;
&amp;lt;meta http-equiv=&amp;quot;imagetoolbar&amp;quot; content=&amp;quot;no&amp;quot;&amp;gt;
&amp;lt;title&amp;gt;ARCGIS-Demo EPSG:3857_ARCGIS-Demo image/png&amp;lt;/title&amp;gt;
&amp;lt;style type=&amp;quot;text/css&amp;quot;&amp;gt;
body { font-family: sans-serif; font-weight: bold; font-size: .8em; }
body { border: 0px; margin: 0px; padding: 0px; }
#map { width: 85%; height: 85%; border: 0px; padding: 0px; }
&amp;lt;/style&amp;gt;
&amp;lt;script src=&amp;quot;../openlayers/OpenLayers.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;    
&amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;               
var map, demolayer;                               
  // sets the chosen modifiable parameter        
  function setParam(name, value){                
   str = &amp;quot;demolayer.mergeNewParams({&amp;quot; + name + &amp;quot;: &amp;apos;&amp;quot; + value + &amp;quot;&amp;apos;})&amp;quot; 
   // alert(str);                                   
   eval(str);                                    
  }                                              
OpenLayers.DOTS_PER_INCH = 96.0;
OpenLayers.Util.onImageLoadErrorColor = &amp;apos;transparent&amp;apos;;
function init(){
var mapOptions = { 
resolutions: [156543.033928, 78271.5169639999, 39135.7584820001, 19567.8792409999, 9783.93962049996, 4891.96981024998, 2445.98490512499, 1222.99245256249, 611.49622628138, 305.748113140558, 152.874056570411, 76.4370282850732, 38.2185141425366, 19.1092570712683, 9.55462853563415, 4.77731426794937, 2.38865713397468, 1.19432856685505, 0.597164283559817, 0.298582141647617],
projection: new OpenLayers.Projection(&amp;apos;EPSG:3857&amp;apos;),
maxExtent: new OpenLayers.Bounds(-20037508.342787,-20037508.342780996,20037508.342780996,20037508.342787),
units: &amp;quot;meters&amp;quot;,
controls: []
};
map = new OpenLayers.Map(&amp;apos;map&amp;apos;, mapOptions );
map.addControl(new OpenLayers.Control.PanZoomBar({
        position: new OpenLayers.Pixel(2, 15)
}));
map.addControl(new OpenLayers.Control.Navigation());
map.addControl(new OpenLayers.Control.Scale($(&amp;apos;scale&amp;apos;)));
map.addControl(new OpenLayers.Control.MousePosition({element: $(&amp;apos;location&amp;apos;)}));
demolayer = new OpenLayers.Layer.WMS(
&amp;quot;ARCGIS-Demo&amp;quot;,&amp;quot;../service/wms&amp;quot;,
{layers: &amp;apos;ARCGIS-Demo&amp;apos;, format: &amp;apos;image/png&amp;apos; },
{ tileSize: new OpenLayers.Size(256,256),
 tileOrigin: new OpenLayers.LonLat(-2.0037508342787E7, 2.0037508342787E7)});
map.addLayer(demolayer);
map.zoomToExtent(new OpenLayers.Bounds(-20037497.2108,-19929239.113399997,20037497.2108,18379686.9965));
// The following is just for GetFeatureInfo, which is not cached. Most people do not need this 
map.events.register(&amp;apos;click&amp;apos;, map, function (e) {
  document.getElementById(&amp;apos;nodelist&amp;apos;).innerHTML = &amp;quot;Loading... please wait...&amp;quot;;
  var params = {
    REQUEST: &amp;quot;GetFeatureInfo&amp;quot;,
    EXCEPTIONS: &amp;quot;application/vnd.ogc.se_xml&amp;quot;,
    BBOX: map.getExtent().toBBOX(),
    X: e.xy.x,
    Y: e.xy.y,
    INFO_FORMAT: &amp;apos;text/html&amp;apos;,
    QUERY_LAYERS: map.layers[0].params.LAYERS,
    FEATURE_COUNT: 50,
    Layers: &amp;apos;ARCGIS-Demo&amp;apos;,
    Styles: &amp;apos;&amp;apos;,
    Srs: &amp;apos;EPSG:3857&amp;apos;,
    WIDTH: map.size.w,
    HEIGHT: map.size.h,
    format: &amp;quot;image/png&amp;quot; };
  OpenLayers.loadURL(&amp;quot;../service/wms&amp;quot;, params, this, setHTML, setHTML);
  OpenLayers.Event.stop(e);
  });
}
function setHTML(response){
    document.getElementById(&amp;apos;nodelist&amp;apos;).innerHTML = response.responseText;
};
&amp;lt;/script&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;body onload=&amp;quot;init()&amp;quot;&amp;gt;
&amp;lt;div id=&amp;quot;params&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;
&amp;lt;div id=&amp;quot;map&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;
&amp;lt;div id=&amp;quot;nodelist&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;
&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;&lt;/pre&gt;
 &lt;p&gt;个人比较喜欢leaflet这个GIS javascript库，使用leaflet加载GeoWebCache发布的这个服务：&lt;/p&gt;
 &lt;pre&gt;&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html&amp;gt;
&amp;lt;head&amp;gt;
    &amp;lt;title&amp;gt;Leaflet - Offline Demo&amp;lt;/title&amp;gt;
    &amp;lt;link rel=&amp;quot;stylesheet&amp;quot; href=&amp;quot;https://unpkg.com/leaflet@1.0.3/dist/leaflet.css&amp;quot; /&amp;gt;
    &amp;lt;script src=&amp;quot;https://unpkg.com/leaflet@1.0.3/dist/leaflet.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;
    &amp;lt;div id=&amp;quot;map&amp;quot; style=&amp;quot;height:100vh;&amp;quot; &amp;gt;&amp;lt;/div&amp;gt;
    &amp;lt;script type=&amp;quot;text/javascript&amp;quot;&amp;gt;
        
    var mapCenter = new L.LatLng(32.1280, 118.7742); //南京
        
    var map = new L.Map(&amp;apos;map&amp;apos;, {
        center : mapCenter,
        zoom : 4
    });

    var wmsLayer = L.tileLayer.wms(&amp;quot;http://localhost:8080/geowebcache/service/wms&amp;quot;, {
        layers: &amp;apos;ARCGIS-Demo&amp;apos;,
        format: &amp;apos;image/png&amp;apos;
    });
    wmsLayer.addTo(map);

    var marker = new L.Marker(mapCenter);
    map.addLayer(marker);
    marker.bindPopup(&amp;quot;&amp;lt;p&amp;gt;Hello! ;}&amp;lt;/p&amp;gt;&amp;quot;).openPopup();
        
    &amp;lt;/script&amp;gt;
&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;&lt;/pre&gt;
 &lt;h2&gt;3、使用自定义的Http服务&lt;/h2&gt;
 &lt;p&gt;GeowebCache本质上就是个Http服务，通过请求参数获取配置文件中的路径中的切片数据，返回给请求方。&lt;/p&gt;
 &lt;p&gt;我们可以自己写个独立的Http服务，从数据库中读取切片数据返回给请求方。&lt;/p&gt;
 &lt;p&gt;切片请求地址类似：http://localhost:8899/1818940751/{z}/{x}/{y}&lt;/p&gt;
 &lt;p&gt;其中“1818940751”是下载器下载的地图类型，z/x/y分别是zoom和地图切片行列号。&lt;/p&gt;
 &lt;p&gt;前端js使用leaflet加载：&lt;/p&gt;
 &lt;pre&gt;var amapNormalUrl = &amp;apos;http://localhost:8899/788865972/{z}/{x}/{y}&amp;apos;;
var amapNormalLayer = new L.TileLayer(amapNormalUrl, {
    minZoom : 1,
    maxZoom : 18,
    attribution : &amp;apos;高德普通地图&amp;apos;
});

var mapCenter = new L.LatLng(32.1280, 118.7742); //南京
var map = new L.Map(&amp;apos;map&amp;apos;, {
        center : mapCenter,
        zoom : 9,
        minZoom: 1,
        maxZoom: 18,
        layers : [ amapNormalLayer ]
});&lt;/pre&gt;
 &lt;p&gt;前端js可以自定义投影Projection算法，而国内google地图、高德地图和腾讯地图都是标准的墨卡托投影，可以直接用leaflet加载。&lt;/p&gt;
 &lt;p&gt;配合一些画图插件，再配合一些后台POI检索服务，如：&lt;/p&gt;
 &lt;p&gt;《  &lt;a href="http://www.cnblogs.com/luxiaoxun/p/5020247.html"&gt;使用Lucene索引和检索POI数据&lt;/a&gt;》&lt;/p&gt;
 &lt;p&gt;《  &lt;a href="http://www.cnblogs.com/luxiaoxun/p/4477591.html"&gt;使用Solr进行空间搜索&lt;/a&gt;》&lt;/p&gt;
 &lt;p&gt;则能做出如下效果：&lt;/p&gt;
 &lt;p&gt;  &lt;a href="http://www.importnew.com/26979.html/434101-20151205205957111-581180773" rel="attachment wp-att-26985"&gt;   &lt;img alt="" src="http://incdn1.b0.upaiyun.com/2017/10/b142db8a0826c5c2f64a5d3d7b9bab04.jpg" title="434101-20151205205957111-581180773"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;
 &lt;p&gt;总结：介绍了如何使用下载的离线切片数据在局域网环境下发布Web GIS地图服务，前端配合使用一些js插件，实现web下空间数据的检索。&lt;/p&gt;
 &lt;p&gt;自定义的Http地图服务代码：https://github.com/luxiaoxun/Code4Java&lt;/p&gt;
 &lt;p&gt;附件：&lt;/p&gt;
 &lt;p&gt;conf.cdi&lt;/p&gt;
 &lt;pre&gt;&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;utf-8&amp;quot; ?&amp;gt;
&amp;lt;EnvelopeN xsi:type=&amp;apos;typens:EnvelopeN&amp;apos; 
    xmlns:xsi=&amp;apos;http://www.w3.org/2001/XMLSchema-instance&amp;apos; 
    xmlns:xs=&amp;apos;http://www.w3.org/2001/XMLSchema&amp;apos; 
    xmlns:typens=&amp;apos;http://www.esri.com/schemas/ArcGIS/10.1&amp;apos;&amp;gt;
    
    &amp;lt;XMin&amp;gt;-20037497.2108&amp;lt;/XMin&amp;gt;
    &amp;lt;YMin&amp;gt;-19929239.113399997&amp;lt;/YMin&amp;gt;
    &amp;lt;XMax&amp;gt;20037497.2108&amp;lt;/XMax&amp;gt;
    &amp;lt;YMax&amp;gt;18379686.9965&amp;lt;/YMax&amp;gt;

&amp;lt;/EnvelopeN&amp;gt;&lt;/pre&gt;
 &lt;p&gt;conf.xml&lt;/p&gt;
 &lt;pre&gt;&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;utf-8&amp;quot;?&amp;gt;
&amp;lt;CacheInfo xsi:type=&amp;quot;typens:CacheInfo&amp;quot; xmlns:xsi=&amp;quot;http://www.w3.org/2001/XMLSchema-instance&amp;quot; xmlns:xs=&amp;quot;http://www.w3.org/2001/XMLSchema&amp;quot; xmlns:typens=&amp;quot;http://www.esri.com/schemas/ArcGIS/10.1&amp;quot;&amp;gt;
    &amp;lt;TileCacheInfo xsi:type=&amp;quot;typens:TileCacheInfo&amp;quot;&amp;gt;
        &amp;lt;SpatialReference xsi:type=&amp;quot;typens:ProjectedCoordinateSystem&amp;quot;&amp;gt;
            &amp;lt;WKT&amp;gt;PROJCS[&amp;quot;WGS_1984_Web_Mercator_Auxiliary_Sphere&amp;quot;,GEOGCS[&amp;quot;GCS_WGS_1984&amp;quot;,DATUM[&amp;quot;D_WGS_1984&amp;quot;,SPHEROID[&amp;quot;WGS_1984&amp;quot;,6378137.0,298.257223563]],PRIMEM[&amp;quot;Greenwich&amp;quot;,0.0],UNIT[&amp;quot;Degree&amp;quot;,0.0174532925199433]],PROJECTION[&amp;quot;Mercator_Auxiliary_Sphere&amp;quot;],PARAMETER[&amp;quot;False_Easting&amp;quot;,0.0],PARAMETER[&amp;quot;False_Northing&amp;quot;,0.0],PARAMETER[&amp;quot;Central_Meridian&amp;quot;,0.0],PARAMETER[&amp;quot;Standard_Parallel_1&amp;quot;,0.0],PARAMETER[&amp;quot;Auxiliary_Sphere_Type&amp;quot;,0.0],UNIT[&amp;quot;Meter&amp;quot;,1.0],AUTHORITY[&amp;quot;EPSG&amp;quot;,3857]]&amp;lt;/WKT&amp;gt;
            &amp;lt;XOrigin&amp;gt;-20037700&amp;lt;/XOrigin&amp;gt;
            &amp;lt;YOrigin&amp;gt;-30241100&amp;lt;/YOrigin&amp;gt;
            &amp;lt;XYScale&amp;gt;148923141.92838538&amp;lt;/XYScale&amp;gt;
            &amp;lt;ZOrigin&amp;gt;-100000&amp;lt;/ZOrigin&amp;gt;
            &amp;lt;ZScale&amp;gt;10000&amp;lt;/ZScale&amp;gt;
            &amp;lt;MOrigin&amp;gt;-100000&amp;lt;/MOrigin&amp;gt;
            &amp;lt;MScale&amp;gt;10000&amp;lt;/MScale&amp;gt;
            &amp;lt;XYTolerance&amp;gt;0.001&amp;lt;/XYTolerance&amp;gt;
            &amp;lt;ZTolerance&amp;gt;0.001&amp;lt;/ZTolerance&amp;gt;
            &amp;lt;MTolerance&amp;gt;0.001&amp;lt;/MTolerance&amp;gt;
            &amp;lt;HighPrecision&amp;gt;true&amp;lt;/HighPrecision&amp;gt;
            &amp;lt;WKID&amp;gt;3857&amp;lt;/WKID&amp;gt;
        &amp;lt;/SpatialReference&amp;gt;
        
        &amp;lt;TileOrigin xsi:type=&amp;quot;typens:PointN&amp;quot;&amp;gt;
            &amp;lt;X&amp;gt;-20037508.342787001&amp;lt;/X&amp;gt;
            &amp;lt;Y&amp;gt;20037508.342787001&amp;lt;/Y&amp;gt;
        &amp;lt;/TileOrigin&amp;gt;
    
        &amp;lt;TileCols&amp;gt;256&amp;lt;/TileCols&amp;gt;
        &amp;lt;TileRows&amp;gt;256&amp;lt;/TileRows&amp;gt;
        &amp;lt;DPI&amp;gt;96&amp;lt;/DPI&amp;gt;
        &amp;lt;LODInfos xsi:type=&amp;quot;typens:ArrayOfLODInfo&amp;quot;&amp;gt;
            &amp;lt;LODInfo xsi:type=&amp;quot;typens:LODInfo&amp;quot;&amp;gt;
                &amp;lt;LevelID&amp;gt;0&amp;lt;/LevelID&amp;gt;
                &amp;lt;Scale&amp;gt;591657527.591555&amp;lt;/Scale&amp;gt;
                &amp;lt;Resolution&amp;gt;156543.03392799999&amp;lt;/Resolution&amp;gt;
            &amp;lt;/LODInfo&amp;gt;
            &amp;lt;LODInfo xsi:type=&amp;quot;typens:LODInfo&amp;quot;&amp;gt;
                &amp;lt;LevelID&amp;gt;1&amp;lt;/LevelID&amp;gt;
                &amp;lt;Scale&amp;gt;295828763.79577702&amp;lt;/Scale&amp;gt;
                &amp;lt;Resolution&amp;gt;78271.516963999893&amp;lt;/Resolution&amp;gt;
            &amp;lt;/LODInfo&amp;gt;
            &amp;lt;LODInfo xsi:type=&amp;quot;typens:LODInfo&amp;quot;&amp;gt;
                &amp;lt;LevelID&amp;gt;2&amp;lt;/LevelID&amp;gt;
                &amp;lt;Scale&amp;gt;147914381.89788899&amp;lt;/Scale&amp;gt;
                &amp;lt;Resolution&amp;gt;39135.758482000099&amp;lt;/Resolution&amp;gt;
            &amp;lt;/LODInfo&amp;gt;
            &amp;lt;LODInfo xsi:type=&amp;quot;typens:LODInfo&amp;quot;&amp;gt;
                &amp;lt;LevelID&amp;gt;3&amp;lt;/LevelID&amp;gt;
                &amp;lt;Scale&amp;gt;73957190.948944002&amp;lt;/Scale&amp;gt;
                &amp;lt;Resolution&amp;gt;19567.879240999901&amp;lt;/Resolution&amp;gt;
            &amp;lt;/LODInfo&amp;gt;
            &amp;lt;LODInfo xsi:type=&amp;quot;typens:LODInfo&amp;quot;&amp;gt;
                &amp;lt;LevelID&amp;gt;4&amp;lt;/LevelID&amp;gt;
                &amp;lt;Scale&amp;gt;36978595.474472001&amp;lt;/Scale&amp;gt;
                &amp;lt;Resolution&amp;gt;9783.9396204999593&amp;lt;/Resolution&amp;gt;
            &amp;lt;/LODInfo&amp;gt;
            &amp;lt;LODInfo xsi:type=&amp;quot;typens:LODInfo&amp;quot;&amp;gt;
                &amp;lt;LevelID&amp;gt;5&amp;lt;/LevelID&amp;gt;
                &amp;lt;Scale&amp;gt;18489297.737236001&amp;lt;/Scale&amp;gt;
                &amp;lt;Resolution&amp;gt;4891.9698102499797&amp;lt;/Resolution&amp;gt;
            &amp;lt;/LODInfo&amp;gt;
            &amp;lt;LODInfo xsi:type=&amp;quot;typens:LODInfo&amp;quot;&amp;gt;
                &amp;lt;LevelID&amp;gt;6&amp;lt;/LevelID&amp;gt;
                &amp;lt;Scale&amp;gt;9244648.8686180003&amp;lt;/Scale&amp;gt;
                &amp;lt;Resolution&amp;gt;2445.9849051249898&amp;lt;/Resolution&amp;gt;
            &amp;lt;/LODInfo&amp;gt;
            &amp;lt;LODInfo xsi:type=&amp;quot;typens:LODInfo&amp;quot;&amp;gt;
                &amp;lt;LevelID&amp;gt;7&amp;lt;/LevelID&amp;gt;
                &amp;lt;Scale&amp;gt;4622324.4343090001&amp;lt;/Scale&amp;gt;
                &amp;lt;Resolution&amp;gt;1222.9924525624899&amp;lt;/Resolution&amp;gt;
            &amp;lt;/LODInfo&amp;gt;
            &amp;lt;LODInfo xsi:type=&amp;quot;typens:LODInfo&amp;quot;&amp;gt;
                &amp;lt;LevelID&amp;gt;8&amp;lt;/LevelID&amp;gt;
                &amp;lt;Scale&amp;gt;2311162.2171550002&amp;lt;/Scale&amp;gt;
                &amp;lt;Resolution&amp;gt;611.49622628138002&amp;lt;/Resolution&amp;gt;
            &amp;lt;/LODInfo&amp;gt;
            &amp;lt;LODInfo xsi:type=&amp;quot;typens:LODInfo&amp;quot;&amp;gt;
                &amp;lt;LevelID&amp;gt;9&amp;lt;/LevelID&amp;gt;
                &amp;lt;Scale&amp;gt;1155581.108577&amp;lt;/Scale&amp;gt;
                &amp;lt;Resolution&amp;gt;305.74811314055802&amp;lt;/Resolution&amp;gt;
            &amp;lt;/LODInfo&amp;gt;
            &amp;lt;LODInfo xsi:type=&amp;quot;typens:LODInfo&amp;quot;&amp;gt;
                &amp;lt;LevelID&amp;gt;10&amp;lt;/LevelID&amp;gt;
                &amp;lt;Scale&amp;gt;577790.55428899999&amp;lt;/Scale&amp;gt;
                &amp;lt;Resolution&amp;gt;152.874056570411&amp;lt;/Resolution&amp;gt;
            &amp;lt;/LODInfo&amp;gt;
            &amp;lt;LODInfo xsi:type=&amp;quot;typens:LODInfo&amp;quot;&amp;gt;
                &amp;lt;LevelID&amp;gt;11&amp;lt;/LevelID&amp;gt;
                &amp;lt;Scale&amp;gt;288895.27714399999&amp;lt;/Scale&amp;gt;
                &amp;lt;Resolution&amp;gt;76.437028285073197&amp;lt;/Resolution&amp;gt;
            &amp;lt;/LODInfo&amp;gt;
            &amp;lt;LODInfo xsi:type=&amp;quot;typens:LODInfo&amp;quot;&amp;gt;
                &amp;lt;LevelID&amp;gt;12&amp;lt;/LevelID&amp;gt;
                &amp;lt;Scale&amp;gt;144447.638572&amp;lt;/Scale&amp;gt;
                &amp;lt;Resolution&amp;gt;38.218514142536598&amp;lt;/Resolution&amp;gt;
            &amp;lt;/LODInfo&amp;gt;
            &amp;lt;LODInfo xsi:type=&amp;quot;typens:LODInfo&amp;quot;&amp;gt;
                &amp;lt;LevelID&amp;gt;13&amp;lt;/LevelID&amp;gt;
                &amp;lt;Scale&amp;gt;72223.819285999998&amp;lt;/Scale&amp;gt;
                &amp;lt;Resolution&amp;gt;19.109257071268299&amp;lt;/Resolution&amp;gt;
            &amp;lt;/LODInfo&amp;gt;
            &amp;lt;LODInfo xsi:type=&amp;quot;typens:LODInfo&amp;quot;&amp;gt;
                &amp;lt;LevelID&amp;gt;14&amp;lt;/LevelID&amp;gt;
                &amp;lt;Scale&amp;gt;36111.909642999999&amp;lt;/Scale&amp;gt;
                &amp;lt;Resolution&amp;gt;9.5546285356341496&amp;lt;/Resolution&amp;gt;
            &amp;lt;/LODInfo&amp;gt;
            &amp;lt;LODInfo xsi:type=&amp;quot;typens:LODInfo&amp;quot;&amp;gt;
                &amp;lt;LevelID&amp;gt;15&amp;lt;/LevelID&amp;gt;
                &amp;lt;Scale&amp;gt;18055.954822&amp;lt;/Scale&amp;gt;
                &amp;lt;Resolution&amp;gt;4.7773142679493699&amp;lt;/Resolution&amp;gt;
            &amp;lt;/LODInfo&amp;gt;
            &amp;lt;LODInfo xsi:type=&amp;quot;typens:LODInfo&amp;quot;&amp;gt;
                &amp;lt;LevelID&amp;gt;16&amp;lt;/LevelID&amp;gt;
                &amp;lt;Scale&amp;gt;9027.9774109999998&amp;lt;/Scale&amp;gt;
                &amp;lt;Resolution&amp;gt;2.38865713397468&amp;lt;/Resolution&amp;gt;
            &amp;lt;/LODInfo&amp;gt;
            &amp;lt;LODInfo xsi:type=&amp;quot;typens:LODInfo&amp;quot;&amp;gt;
                &amp;lt;LevelID&amp;gt;17&amp;lt;/LevelID&amp;gt;
                &amp;lt;Scale&amp;gt;4513.9887049999998&amp;lt;/Scale&amp;gt;
                &amp;lt;Resolution&amp;gt;1.1943285668550501&amp;lt;/Resolution&amp;gt;
            &amp;lt;/LODInfo&amp;gt;
            &amp;lt;LODInfo xsi:type=&amp;quot;typens:LODInfo&amp;quot;&amp;gt;
                &amp;lt;LevelID&amp;gt;18&amp;lt;/LevelID&amp;gt;
                &amp;lt;Scale&amp;gt;2256.994353&amp;lt;/Scale&amp;gt;
                &amp;lt;Resolution&amp;gt;0.59716428355981699&amp;lt;/Resolution&amp;gt;
            &amp;lt;/LODInfo&amp;gt;
            &amp;lt;LODInfo xsi:type=&amp;quot;typens:LODInfo&amp;quot;&amp;gt;
                &amp;lt;LevelID&amp;gt;19&amp;lt;/LevelID&amp;gt;
                &amp;lt;Scale&amp;gt;1128.4971760000001&amp;lt;/Scale&amp;gt;
                &amp;lt;Resolution&amp;gt;0.29858214164761698&amp;lt;/Resolution&amp;gt;
            &amp;lt;/LODInfo&amp;gt;
        &amp;lt;/LODInfos&amp;gt;
    &amp;lt;/TileCacheInfo&amp;gt;
    &amp;lt;TileImageInfo xsi:type=&amp;quot;typens:TileImageInfo&amp;quot;&amp;gt;
        &amp;lt;CacheTileFormat&amp;gt;PNG&amp;lt;/CacheTileFormat&amp;gt;
        &amp;lt;CompressionQuality&amp;gt;0&amp;lt;/CompressionQuality&amp;gt;
        &amp;lt;Antialiasing&amp;gt;false&amp;lt;/Antialiasing&amp;gt;
    &amp;lt;/TileImageInfo&amp;gt;
    &amp;lt;CacheStorageInfo xsi:type=&amp;quot;typens:CacheStorageInfo&amp;quot;&amp;gt;
        &amp;lt;StorageFormat&amp;gt;esriMapCacheStorageModeExploded&amp;lt;/StorageFormat&amp;gt;
        &amp;lt;PacketSize&amp;gt;0&amp;lt;/PacketSize&amp;gt;
    &amp;lt;/CacheStorageInfo&amp;gt;
&amp;lt;/CacheInfo&amp;gt;&lt;/pre&gt;
 &lt;h2&gt;参考：&lt;/h2&gt;
 &lt;ul&gt;
  &lt;li&gt;http://leafletjs.com/&lt;/li&gt;
  &lt;li&gt;http://leafletjs.com/examples/quick-start/&lt;/li&gt;
  &lt;li&gt;http://www.cnblogs.com/luxiaoxun/p/4454880.html&lt;/li&gt;
  &lt;li&gt;http://www.cnblogs.com/luxiaoxun/p/5020247.html&lt;/li&gt;
&lt;/ul&gt;
 &lt;p&gt;&lt;/p&gt;
 &lt;h3&gt;可能感兴趣的文章&lt;/h3&gt;
 &lt;ul&gt;
  &lt;li&gt;   &lt;a href="http://www.importnew.com/5270.html"&gt;Java JIT编译：不仅仅是个流行词&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;   &lt;a href="http://www.importnew.com/15285.html"&gt;读懂Java中的Socket编程&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;   &lt;a href="http://www.importnew.com/16841.html"&gt;Stackoverflow上人气最旺的10个Java问题&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;   &lt;a href="http://www.importnew.com/20850.html"&gt;Java开发者应当理解的专业术语&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;   &lt;a href="http://www.importnew.com/20933.html"&gt;java/android 设计模式学习笔记（4）：抽象工厂模式&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;   &lt;a href="http://www.importnew.com/22374.html"&gt;Java的常见误区与细节&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;   &lt;a href="http://www.importnew.com/22564.html"&gt;JavaEE – JPA（2）：EJB中的事务管理&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;   &lt;a href="http://www.importnew.com/22863.html"&gt;单点登录原理与简单实现&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;   &lt;a href="http://www.importnew.com/23186.html"&gt;JVM初探——使用堆外内存减少Full GC&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;   &lt;a href="http://www.importnew.com/26319.html"&gt;JAVA REENTRANTLOCK、SEMAPHORE 的实现与 AQS 框架&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div&gt; &lt;a href="https://itindex.net/"  title="IT 资讯"&gt;&lt;img src="https://itindex.net/images/iconWarning.gif" title="IT 资讯" border="0"/&gt; &lt;/a&gt;</description>
      <category>基础技术 GIS</category>
      <guid isPermaLink="true">https://itindex.net/detail/57564-web-gis-%E7%A6%BB%E7%BA%BF</guid>
      <pubDate>Mon, 16 Oct 2017 21:51:40 CST</pubDate>
    </item>
    <item>
      <title>Redis的11种web应用场景 - 51CTO.COM</title>
      <link>https://itindex.net/detail/57257-redis-web-%E5%BA%94%E7%94%A8</link>
      <description>&lt;div id="content"&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;【51CTO精选译文】在&lt;a href="http://database.51cto.com/art/201107/276333.htm"&gt;“怎样让Redis在你的系统中发挥作用”一文&lt;/a&gt;中，Salvatore 'antirez’ Sanfilippo告诉我们如何利用Redis独有的数据结构处理能力来解决一些常见问题。一些Redis原语命令比如LPUSH、LTRIM和LREM等等能够用来帮助开发者完成需要的任务——这些任务在传统的数据库存储中非常困难或缓慢。这是一篇非常有用并且实际的文章。那么要如何在你的框架中完成这些任务呢？&lt;/p&gt;&lt;p&gt;下面列出11种Web应用场景，在这些场景下可以充分的利用Redis的特性，大大提高效率。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;1．在主页中显示最新的项目列表。&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;Redis使用的是常驻内存的缓存，速度非常快。LPUSH用来插入一个内容ID，作为关键字存储在列表头部。LTRIM用来限制列表中的项目数最多为5000。如果用户需要的检索的数据量超越这个缓存容量，这时才需要把请求发送到数据库。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;2．删除和过滤。&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;如果一篇文章被删除，可以使用LREM从缓存中彻底清除掉。&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;3．排行榜及相关问题。&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;排行榜（leader board）按照得分进行排序。ZADD命令可以直接实现这个功能，而ZREVRANGE命令可以用来按照得分来获取前100名的用户，ZRANK可以用来获取用户排名，非常直接而且操作容易。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;4．按照用户投票和时间排序。&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;这就像Reddit的排行榜，得分会随着时间变化。LPUSH和LTRIM命令结合运用，把文章添加到一个列表中。一项后台任务用来获取列表，并重新计算列表的排序，ZADD命令用来按照新的顺序填充生成列表。列表可以实现非常快速的检索，即使是负载很重的站点。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;5．过期项目处理。&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;使用unix时间作为关键字，用来保持列表能够按时间排序。对current_time和time_to_live进行检索，完成查找过期项目的艰巨任务。另一项后台任务使用ZRANGE...WITHSCORES进行查询，删除过期的条目。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;6．计数。&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;进行各种数据统计的用途是非常广泛的，比如想知道什么时候封锁一个IP地址。INCRBY命令让这些变得很容易，通过原子递增保持计数；GETSET用来重置计数器；过期属性用来确认一个关键字什么时候应该删除。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;7．特定时间内的特定项目。&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;这是特定访问者的问题，可以通过给每次页面浏览使用SADD命令来解决。SADD不会将已经存在的成员添加到一个集合。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;8．实时分析正在发生的情况，用于数据统计与防止垃圾邮件等。&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;使用Redis原语命令，更容易实施垃圾邮件过滤系统或其他实时跟踪系统。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;9．Pub/Sub。&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;在更新中保持用户对数据的映射是系统中的一个普遍任务。Redis的pub/sub功能使用了SUBSCRIBE、UNSUBSCRIBE和PUBLISH命令，让这个变得更加容易。&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;10．队列。&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;在当前的编程中队列随处可见。除了push和pop类型的命令之外，Redis还有阻塞队列的命令，能够让一个程序在执行时被另一个程序添加到队列。你也可以做些更有趣的事情，比如一个旋转更新的RSS feed队列。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;11．缓存。&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;Redis缓存使用的方式与memcache相同。&lt;/p&gt;&lt;p&gt;网络应用不能无休止地进行模型的战争，看看这些Redis的原语命令，尽管简单但功能强大，把它们加以组合，所能完成的就更无法想象。当然，你可以专门编写代码来完成所有这些操作，但Redis实现起来显然更为轻松。&lt;/p&gt;&lt;p&gt;原文：&lt;a href="http://highscalability.com/blog/2011/7/6/11-common-web-use-cases-solved-in-redis.html"&gt;11 Common Web Use Cases Solved In Redis&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p class="blank1"&gt;&lt;/p&gt;&lt;/div&gt;&#xD;
    &lt;div&gt; &lt;a href="https://itindex.net/"  title="IT 资讯"&gt;&lt;img src="https://itindex.net/images/iconWarning.gif" title="IT 资讯" border="0"/&gt; &lt;/a&gt;</description>
      <category />
      <guid isPermaLink="true">https://itindex.net/detail/57257-redis-web-%E5%BA%94%E7%94%A8</guid>
      <pubDate>Sun, 23 Jul 2017 09:52:54 CST</pubDate>
    </item>
    <item>
      <title>Web图片资源的加载与渲染时机</title>
      <link>https://itindex.net/detail/57171-web-%E5%9B%BE%E7%89%87-%E8%B5%84%E6%BA%90</link>
      <description>&lt;div&gt;  &lt;p&gt;此文研究页面中的图片资源的加载和渲染时机，使得我们能更好的管理图片资源，避免不必要的流量和提高用户体验。&lt;/p&gt;  &lt;h2&gt;浏览器的工作流程&lt;/h2&gt;  &lt;p&gt;要研究图片资源的加载和渲染，我们先要了解浏览器的工作原理。以   &lt;strong&gt;Webkit&lt;/strong&gt;引擎的工作流程为例：&lt;/p&gt;  &lt;p&gt;   &lt;img src="http://img1.tuicool.com/36jqmiI.png!web"&gt;&lt;/img&gt;&lt;/p&gt;  &lt;p&gt;从上图可看出，浏览器加载一个HTML页面后进行如下操作：&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;    &lt;p&gt;解析HTML —&amp;gt; 构建DOM树&lt;/p&gt;&lt;/li&gt;   &lt;li&gt;    &lt;p&gt;加载样式 —&amp;gt; 解析样式 —&amp;gt; 构建样式规则树&lt;/p&gt;&lt;/li&gt;   &lt;li&gt;    &lt;p&gt;加载javascript —&amp;gt; 执行javascript代码&lt;/p&gt;&lt;/li&gt;   &lt;li&gt;    &lt;p&gt;把DOM树和样式规则树匹配构建渲染树&lt;/p&gt;&lt;/li&gt;   &lt;li&gt;    &lt;p&gt;计算元素位置进行布局&lt;/p&gt;&lt;/li&gt;   &lt;li&gt;    &lt;p&gt;绘制&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;  &lt;p&gt;从上图我们不能很直观的看出图片资源从什么时候开始加载，下图标出图片加载和渲染的时机：&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;    &lt;p&gt;解析HTML【遇到     &lt;code&gt;&amp;lt;img&amp;gt;&lt;/code&gt;标签加载图片】 —&amp;gt; 构建DOM树&lt;/p&gt;&lt;/li&gt;   &lt;li&gt;    &lt;p&gt;加载样式 —&amp;gt; 解析样式【遇到背景图片链接不加载】 —&amp;gt; 构建样式规则树&lt;/p&gt;&lt;/li&gt;   &lt;li&gt;    &lt;p&gt;加载javascript —&amp;gt; 执行javascript代码&lt;/p&gt;&lt;/li&gt;   &lt;li&gt;    &lt;p&gt;把DOM树和样式规则树匹配构建渲染树【加载渲染树上的背景图片】&lt;/p&gt;&lt;/li&gt;   &lt;li&gt;    &lt;p&gt;计算元素位置进行布局&lt;/p&gt;&lt;/li&gt;   &lt;li&gt;    &lt;p&gt;绘制【开始渲染图片】&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;  &lt;h2&gt;图片加载与渲染规则&lt;/h2&gt;  &lt;p&gt;页面中不是所有的   &lt;code&gt;&amp;lt;img&amp;gt;&lt;/code&gt;标签图片和样式表背景图片都会加载。&lt;/p&gt;  &lt;h3&gt;display:none&lt;/h3&gt;  &lt;pre&gt;&amp;lt;style&amp;gt;
.img-purple {
    background-image: url(../image/purple.png);
}
&amp;lt;/style&amp;gt;
&amp;lt;img src=&amp;quot;../image/pink.png&amp;quot; style=&amp;quot;display:none&amp;quot;&amp;gt;
&amp;lt;div class=&amp;quot;img-purple&amp;quot; style=&amp;quot;display:none&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;/pre&gt;  &lt;p&gt;图片资源请求如下：&lt;/p&gt;  &lt;p&gt;   &lt;img src="http://img1.tuicool.com/rumymiU.png!web"&gt;&lt;/img&gt;&lt;/p&gt;  &lt;p&gt;设置了   &lt;code&gt;display:none&lt;/code&gt;属性的元素，图片不会渲染出来，但会加载。&lt;/p&gt;  &lt;h4&gt;原理&lt;/h4&gt;  &lt;p&gt;把DOM树和样式规则树匹配构建渲染树时，会把可渲染元素上的所有属性（如   &lt;code&gt;display:none&lt;/code&gt;属性和   &lt;code&gt;background-image&lt;/code&gt;属性）结合一起产出到渲染树。&lt;/p&gt;  &lt;p&gt;当解析渲染树时会加载   &lt;code&gt;&amp;lt;img&amp;gt;&lt;/code&gt;标签元素上的图片，发现元素上有   &lt;code&gt;background-image&lt;/code&gt;属性时会加载背景图片。&lt;/p&gt;  &lt;p&gt;当绘制时发现元素上有   &lt;code&gt;display:none&lt;/code&gt;属性，则不计算该元素位置，也不会绘制该元素。&lt;/p&gt;  &lt;pre&gt;&amp;lt;style&amp;gt;
.img-yellow {
    background-image: url(../image/yellow.png);
}
&amp;lt;/style&amp;gt;
&amp;lt;div style=&amp;quot;display:none&amp;quot;&amp;gt;
    &amp;lt;img src=&amp;quot;../image/red.png&amp;quot;&amp;gt;
    &amp;lt;div class=&amp;quot;img-yellow&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;&lt;/pre&gt;  &lt;p&gt;图片资源请求如下：&lt;/p&gt;  &lt;p&gt;   &lt;img src="http://img1.tuicool.com/iURVram.png!web"&gt;&lt;/img&gt;&lt;/p&gt;  &lt;p&gt;设置了   &lt;code&gt;display:none&lt;/code&gt;属性元素的子元素，样式表中的背景图片不会渲染出来，也不会加载；而   &lt;code&gt;&amp;lt;img&amp;gt;&lt;/code&gt;标签的图片不会渲染出来，但会加载。&lt;/p&gt;  &lt;h4&gt;原理&lt;/h4&gt;  &lt;p&gt;正如上面所说的，构建渲染树时，只会把可渲染元素产出到渲染树，这就意味有不可渲染元素，当匹配DOM树和样式规则树时，若发现一个元素的属性上有   &lt;code&gt;display:none&lt;/code&gt;，浏览器会认为该元素的子元素是不可渲染的，因此不会把该元素的子元素产出到渲染树上。&lt;/p&gt;  &lt;p&gt;当解析渲染树时渲染树上没有设置了   &lt;code&gt;display:none&lt;/code&gt;属性元素的子元素，因此不会加载该元素中子元素的图片。&lt;/p&gt;  &lt;p&gt;当绘制时也因为渲染树上没有设置了   &lt;code&gt;display:none&lt;/code&gt;属性元素的子元素，因此该元素中子元素不会渲染出来。&lt;/p&gt;  &lt;h3&gt;重复图片&lt;/h3&gt;  &lt;pre&gt;.img-blue {
    background-image: url(../image/blue.png);
}
&amp;lt;div class=&amp;quot;img-blue&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;
&amp;lt;img src=&amp;quot;../image/blue.png&amp;quot;&amp;gt;
&amp;lt;img src=&amp;quot;../image/blue.png&amp;quot;&amp;gt;&lt;/pre&gt;  &lt;p&gt;图片资源请求如下：&lt;/p&gt;  &lt;p&gt;   &lt;img src="http://img1.tuicool.com/imuQVzm.png!web"&gt;&lt;/img&gt;&lt;/p&gt;  &lt;p&gt;页面中多个   &lt;code&gt;&amp;lt;img&amp;gt;&lt;/code&gt;标签或样式表中的背景图片图片路径是同一个，图片只加载一次。&lt;/p&gt;  &lt;h4&gt;原理&lt;/h4&gt;  &lt;p&gt;浏览器请求资源时，都会先判断是否有缓存，若有缓存且未过期则会从缓存中读取，不会再次请求。先加载的图片会存储到浏览器缓存中，后面再次请求同路径图片时会直接读取缓存中的图片。&lt;/p&gt;  &lt;h3&gt;不存在元素的背景图片&lt;/h3&gt;  &lt;pre&gt;.img-blue {
    background-image: url(../image/blue.png);
}
.img-orange{
    background-image: url(../image/orange.png);
}
&amp;lt;div class=&amp;quot;img-orange&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;/pre&gt;  &lt;p&gt;图片资源请求如下：&lt;/p&gt;  &lt;p&gt;   &lt;img src="http://img2.tuicool.com/riqquuv.png!web"&gt;&lt;/img&gt;&lt;/p&gt;  &lt;p&gt;不存在元素的背景图片不会加载。&lt;/p&gt;  &lt;h4&gt;原理&lt;/h4&gt;  &lt;p&gt;不存在的元素不会产出到DOM树上，因此渲染树上也不会有不存在的元素，当解析渲染树时无法解析不存在的元素，不存在的元素上的图片自然不会加载也不会渲染。&lt;/p&gt;  &lt;h3&gt;伪类的背景图片&lt;/h3&gt;  &lt;pre&gt;.img-green {
    background-image: url(../image/green.png);
}
.img-green:hover{
    background-image: url(../image/red.png);
}
&amp;lt;div class=&amp;quot;img-green&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;/pre&gt;  &lt;p&gt;触发hover前的图片资源请求如下：&lt;/p&gt;  &lt;p&gt;   &lt;img src="http://img0.tuicool.com/miAri2Z.png!web"&gt;&lt;/img&gt;&lt;/p&gt;  &lt;p&gt;触发hover后的图片资源请求如下：&lt;/p&gt;  &lt;p&gt;   &lt;img src="http://img1.tuicool.com/iUf2ayA.png!web"&gt;&lt;/img&gt;&lt;/p&gt;  &lt;p&gt;当触发伪类的时候，伪类样式上的背景图片才会加载。&lt;/p&gt;  &lt;h4&gt;原理&lt;/h4&gt;  &lt;p&gt;触发hover前，DOM树与样式规则树匹配的是无hover状态选择器   &lt;code&gt;.img-green&lt;/code&gt;的样式，因此渲染树上   &lt;code&gt;background-image&lt;/code&gt;属性的值是   &lt;code&gt;url(../image/green.png)&lt;/code&gt;，解析渲染树时加载的是   &lt;em&gt;green.png&lt;/em&gt;，绘制时渲染的也是   &lt;em&gt;green.png&lt;/em&gt;。&lt;/p&gt;  &lt;p&gt;触发hover后，因为   &lt;code&gt;.img-green:hover&lt;/code&gt;的优先级比较高，因此DOM树与样式规则树匹配的是有hover状态选择器   &lt;code&gt;.img-green:hover&lt;/code&gt;的样式，渲染树上   &lt;code&gt;background-image&lt;/code&gt;属性的值是   &lt;code&gt;url(../image/red.png)&lt;/code&gt;，解析渲染树时加载的是   &lt;em&gt;red.png&lt;/em&gt;，绘制时渲染的也是   &lt;em&gt;red.png&lt;/em&gt;。&lt;/p&gt;  &lt;h2&gt;应用&lt;/h2&gt;  &lt;h3&gt;占位图&lt;/h3&gt;  &lt;p&gt;当使用样式表中的背景图片作为占位符时，要把背景图片转为base64格式。这是因为背景图片加载的顺序在   &lt;code&gt;&amp;lt;img&amp;gt;&lt;/code&gt;标签后面，背景图片可能会在   &lt;code&gt;&amp;lt;img&amp;gt;&lt;/code&gt;标签图片加载完成后才开始加载，达不到想要的效果。&lt;/p&gt;  &lt;h3&gt;预加载&lt;/h3&gt;  &lt;p&gt;很多场景里图片是在改变或触发状态后才显示出来的，例如点击一个Tab后，一个设置   &lt;code&gt;display:none&lt;/code&gt;隐藏的父元素变为显示，这个父元素里的子元素图片会在父元素显示后才开始加载；又如当鼠标hover到图标后，改变图标图片，图片会在hover上去后才开始加载，导致出现闪一下这种不友好的体验。&lt;/p&gt;  &lt;p&gt;在这种场景下，我们就需要把图片预加载，预加载有很多种方式:&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;    &lt;p&gt;若是小图标，可以合并成雪碧图，在改变状态前就把所有图标都一起加载了。&lt;/p&gt;&lt;/li&gt;   &lt;li&gt;    &lt;p&gt;使用上文讲到的，设置了display:none属性的元素，图片不会渲染出来，但会加载。把要预加载的图片加到设置了     &lt;code&gt;display:none&lt;/code&gt;的元素背景图或     &lt;code&gt;&amp;lt;img&amp;gt;&lt;/code&gt;标签里。&lt;/p&gt;&lt;/li&gt;   &lt;li&gt;    &lt;p&gt;在javascript创建img对象，把图片url设置到img对象的src属性里。&lt;/p&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/div&gt;&lt;div&gt; &lt;a href="https://itindex.net/"  title="IT 资讯"&gt;&lt;img src="https://itindex.net/images/iconWarning.gif" title="IT 资讯" border="0"/&gt; &lt;/a&gt;</description>
      <category>tuicool</category>
      <guid isPermaLink="true">https://itindex.net/detail/57171-web-%E5%9B%BE%E7%89%87-%E8%B5%84%E6%BA%90</guid>
      <pubDate>Tue, 04 Jul 2017 08:00:00 CST</pubDate>
    </item>
    <item>
      <title>Mozilla：全球TOP 100万网站Web安全性大幅提升</title>
      <link>https://itindex.net/detail/57154-mozilla-%E5%85%A8%E7%90%83-top</link>
      <description>&lt;p&gt;Mozilla 一年前发布的   &lt;a href="https://observatory.mozilla.org/" target="_blank"&gt;Mozilla Observatory&lt;/a&gt; 扫描了 Alexa 排名前 100 万的网站，结果令人沮丧，大多数网站的文档和安全措施都非常糟糕，站点运营者们对内容安全（CSP）、HTTP 严格传输安全（HSTS）和子资源完整性（SRI）的重要性缺乏认知。&lt;/p&gt;
 &lt;p&gt;  &lt;strong&gt;全球 web 站点安全性快速大幅提升&lt;/strong&gt;&lt;/p&gt;
 &lt;p&gt;  &lt;img alt="" src="http://images2015.cnblogs.com/news/66372/201707/66372-20170702142007008-112524903.png"&gt;&lt;/img&gt;&lt;/p&gt;
 &lt;p&gt;数月后，Mozilla 对 Alexa 前 100 万家网站进行了重新扫描，发现全球 web 网站的安全性有了大幅改善。HSTS 和 CSP 的部署都超过了 50%，其他方面的 web 安全性也都得到不同程度的改进，统计如下：&lt;/p&gt;
 &lt;p&gt;从上表可以看出，全球 web 站点的安全性正在以出人意料的高速度提升，虽然部署 HTTPS 的站点数量只增长了 36%，但是绝对数量已经非常可观，Alexa 前 100 万网站中已经有 11.9 万家网站部署了 HTTPS（编者按：前天 Let’s Encrypt 刚刚庆祝 HTTPS 免费证书发放数突破一亿大关）。&lt;/p&gt;
 &lt;p&gt;不仅如此，已经部署 HTTPS 的网站中，多达 9.3 万家网站将 HTTPS 设置为默认访问选项，其中 1.8 万家网站甚至禁止未加密的 HTTP 访问。&lt;/p&gt;
 &lt;p&gt;内容安全策略（CSP）的普及速度也非常惊人，因为对于一个新的站点来说，部署 CSP 其实还是有些难度的，需要对 CSP 进行重构和改造来适应站点。&lt;/p&gt;
 &lt;p&gt;  &lt;strong&gt;Obervatory 安全评级：有喜有忧&lt;/strong&gt;&lt;/p&gt;
 &lt;p&gt;  &lt;img alt="" src="http://images2015.cnblogs.com/news/66372/201707/66372-20170702142006883-561835089.png"&gt;&lt;/img&gt;&lt;/p&gt;
 &lt;p&gt;虽然全球 web 站点的安全性过去几个月取得来飞速的进展，但是多数大网站依然没有部署 CSP 和 SRI，要知道这些技术如果部署得当，能够消除绝大多数的站点攻击，为用户提供更好的安全防护。以下为 Mozilla 给出的全球站点安全评级数据对照表：&lt;/p&gt;
 &lt;p&gt;其中不及格（F级）的网站数下降来 2.8%，这意味着过去八个月中 2.7 万家安全性不达标的网站进行来有效的改进。&lt;/p&gt;
 &lt;p&gt;成功扫描的 969924 家网站中，有超过 5 万家网站使用 Mozilla Observatory 来扫描网站改进安全评级，其中 2500 家网站的安全评分直接从F跳升到A或A+。&lt;/p&gt;
 &lt;p&gt;来自：IT 经理网-宋妍&lt;/p&gt; &lt;p&gt;  &lt;a href="http://news.cnblogs.com/n/572926/" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt; &lt;img alt="" height="1" src="http://news.cnblogs.com/news/rssclick.aspx?id=572926" width="1"&gt;&lt;/img&gt;&lt;div&gt; &lt;a href="https://itindex.net/"  title="IT 资讯"&gt;&lt;img src="https://itindex.net/images/iconWarning.gif" title="IT 资讯" border="0"/&gt; &lt;/a&gt;</description>
      <category />
      <guid isPermaLink="true">https://itindex.net/detail/57154-mozilla-%E5%85%A8%E7%90%83-top</guid>
      <pubDate>Sun, 02 Jul 2017 14:20:18 CST</pubDate>
    </item>
  </channel>
</rss>

