zoukankan      html  css  js  c++  java
  • 网站安全与攻击

    网站安全

    包括常见的xss攻击、CSRF攻击等等
    1 sql注入:窃取数据库内容
    2 XSS攻击:窃取前端的cookie内容
    3 密码加密:保障用户信息安全

    前端安全系列(一):如何防止XSS攻击?

    前端安全系列(二):如何防止CSRF攻击?

    1 sql注入攻击:

    比如登陆接口,执行的命令是:

    select username,realname from users where username='zhangsan' and password=123

    sql注入攻击,在username中输入了注释的命令

    select username,realname from users where username='zhangsan' -- ' and password=123

    所以后面的密码部分就被注释掉了

    使用mysql的 escape 提供的转义:会在输入的内容中对引号增加/转义
    select username,realname from users where username='zhangsan/' -- ' and password=123

    网站如:
    root ' -- '

    具体步骤:
    1 db/mysql.js

    module.exports = {
        exec,
        escape: mysql.escape
    }
    
    const { exec,escape } = require('../db/mysql');
    
    //登陆
    const confirmLogin = async(username,blogpassword)=>{
        username = escape(username); //增加这里
        blogpassword = escape(blogpassword); //增加这里
        try{
            let sql = `select * from users where userName=${username} and blogpassword=${blogpassword}`; //这里删除单引号
            let data = await exec(sql);
            if(data.length>0){
                return data[0];
            }else{
                return false;
            }
        }catch(err){
            return false;
        } 
    }
    
    

    XSS攻击

    根据攻击的来源,XSS 攻击可分为存储型、反射型和 DOM 型三种。

    1. 存储型 XSS
      在一些输入区域,提交恶意代码,如论坛发帖、评论等区域,提交后保存到数据库中;
      服务端从数据库中取数据后,拼接到html中返回给浏览器;
      浏览器执行恶意代码;

    2. 反射型 XSS

    反射型 XSS 跟存储型 XSS 的区别是:存储型 XSS 的恶意代码存在数据库里,反射型 XSS 的恶意代码存在 URL 里。

    • 示例1:
      请求url:http://xxx/search?keyword="><script>alert('XSS');</script>
      如果代码中会把url后的keyword放在页面中渲染,则会执行 <script>alert('XSS');</script>

    解决办法:
    使用转义字符:

    • 示例2:
      http://xxx/?redirect_to=javascript:alert('XSS')
      如果代码中有用到 redirect_to 来渲染跳转链接:
      <a href="<%= escapeHTML(getParameter("redirect_to")) %>">跳转...</a>
      则会变成:
      <a href="javascript:alert(&#x27;XSS&#x27;)">跳转...</a>
      在点击跳转链接的时候,执行恶意代码。
    // 根据项目情况进行过滤,禁止掉 "javascript:" 链接、非法 scheme 等
    // 也就是说,url必须是以http协议头开始,这样才能是链接进行跳转,避免了是恶意代码。
    allowSchemes = ["http", "https"];
    valid = isValid(getParameter("redirect_to"), allowSchemes);
    

    做了 HTML 转义,并不等于高枕无忧。
    对于链接跳转,如 <a href="xxx" 或 location.href="xxx",要检验其内容,禁止以 javascript: 开头的链接,和其他非法的 scheme

    1. DOM型 XSS

    DOM 型 XSS 跟前两种 XSS 的区别:DOM 型 XSS 攻击中,取出和执行恶意代码由浏览器端完成,属于前端 JavaScript 自身的安全漏洞,而其他两种 XSS 都属于服务端的安全漏洞。

    解决方法:

    安装专业的转义库
    npm i xss -S

    const xss = require('xss');
    //...
    const title = xss(blogData.title)
    

    这样 <script>alert(1)</script> 转成 &lt;script&gt;alert(1)&lt;/script&gt;

    "内容安全策略"(Content Security Policy,缩写 CSP):https://www.cnblogs.com/xiaozhumaopao/p/12264635.html

    CSRF攻击

    CSRF(Cross-site request forgery)跨站请求伪造:攻击者诱导受害者进入第三方网站,在第三方网站中,向被攻击网站发送跨站请求。利用受害者在被攻击网站已经获取的注册凭证,绕过后台的用户验证,达到冒充用户对被攻击的网站执行某项操作的目的。

    CSRF 主要的两个特点:

    • CSRF(通常)发生在第三方域名。
    • CSRF攻击者不能获取到Cookie等信息,只是使用。

    预防方法:
    同源验证是一个相对简单的防范方法,能够防范绝大多数的CSRF攻击。
    Origin Header
    Referer Header

    CSRF Token
    前面讲到CSRF的另一个特征是,攻击者无法直接窃取到用户的信息(Cookie,Header,网站内容等),仅仅是冒用Cookie中的信息。

    而CSRF攻击之所以能够成功,是因为服务器误把攻击者发送的请求当成了用户自己的请求。那么我们可以要求所有的用户请求都携带一个CSRF攻击者无法获取到的Token。服务器通过校验请求是否携带正确的Token,来把正常的请求和攻击的请求区分开,也可以防范CSRF的攻击。

    1. 将CSRF Token输出到页面中
    2. 页面提交的请求携带这个Token
    3. 服务器验证Token是否正确
  • 相关阅读:
    一次http请求的过程
    log4j每天生成一个文件配置
    解决eclipse中maven多模块项目显示不全的问题
    docker上启动nginx,并配置修改nginx的配置文件
    springboot项目打成jar包后台运行在linux上
    《写给大家看的设计书》粗读整理
    一些需要改进的点
    b端产品的疑问
    产品经理小白初起步
    用visualvm观察远程服务器java项目的两种办法
  • 原文地址:https://www.cnblogs.com/xiaozhumaopao/p/12813214.html
Copyright © 2011-2022 走看看