首页 > 其他分享 >防御跨站点请求伪造等功能实现

防御跨站点请求伪造等功能实现

时间:2023-12-17 17:34:06浏览次数:28  
标签:请求 验证 示例 用户 站点 Host Cookie 伪造

1. 防御跨站脚本攻击(XSS)

理论设计

跨站脚本攻击(XSS)是一种利用恶意脚本嵌入到Web应用程序中,然后被用户浏览器执行的攻击方式。为防范XSS,我们需要:

  • 输入验证:对用户输入进行严格验证,确保只接受合法的数据。
  • 输出转义:在将用户输入嵌入到页面之前,对其进行转义,防止浏览器误解其中的脚本。

实现原理

输入验证

在用户输入被接受之前,验证其合法性。这可以通过使用正则表达式、白名单过滤或专门的输入验证库来实现。

// JavaScript 示例
function validateInput(input) {
  // 只允许字母和数字
  return /^[a-zA-Z0-9]+$/.test(input);
}

输出转义

在将用户输入嵌入到HTML页面之前,使用合适的转义函数确保其中的特殊字符不被执行。

// JavaScript 示例
function escapeHTML(input) {
  // 使用框架或库进行输出转义
  return yourEscapeFunction(input);
}

// 在页面中使用
document.getElementById('output').innerHTML = escapeHTML(userInput);

2. 防御跨站点请求伪造(CSRF)

理论设计

跨站点请求伪造(CSRF)是一种攻击方式,攻击者通过伪造用户在其他站点的身份,执行未经用户许可的操作。为防范CSRF,我们需要:

  • CSRF令牌:为每个用户生成唯一的令牌,嵌入到表单或请求中,以验证请求的合法性。
  • 同源检查:验证请求的来源是否与预期一致,通过检查Referer头或Origin头来实现。
  • SameSite属性:设置Cookie的SameSite属性,限制第三方站点对Cookie的访问。

实现原理

CSRF令牌

为每个用户生成唯一的CSRF令牌,并在表单或请求中嵌入。

<!-- HTML 表单中的CSRF令牌 -->
<form action="/process" method="post">
  <input type="hidden" name="csrf_token" value="<%= generateCSRFToken() %>">
  <!-- 其他表单字段 -->
  <button type="submit">提交</button>
</form>

同源检查

在服务器端验证请求的来源是否合法。

// PHP 示例
$referer = $_SERVER['HTTP_REFERER'];
if (parse_url($referer, PHP_URL_HOST) === 'trusted-site.com') {
  // 处理请求
} else {
  // 拒绝请求
}

SameSite属性

设置Cookie的SameSite属性,限制第三方站点对Cookie的访问。

<!-- 设置Cookie的SameSite属性 -->
Set-Cookie: session=abc123; SameSite=Strict;

3. 防御SQL注入

理论设计

SQL注入是一种通过在用户输入中注入SQL代码来执行恶意数据库操作的攻击方式。为防范SQL注入,我们需要:

  • 参数化查询:使用预定义的参数来执行数据库查询,而不是直接拼接用户输入到SQL语句中。
  • 预处理语句:使用数据库支持的预处理语句,将SQL查询和用户输入分开。

实现原理

参数化查询

使用参数化查询以防范SQL注入。

# Python 示例
import sqlite3

def get_user_by_id(user_id):
    connection = sqlite3.connect("database.db")
    cursor = connection.cursor()

    # 使用参数化查询
    cursor.execute("SELECT * FROM users WHERE id=?", (user_id,))
    user = cursor.fetchone()

    connection.close()

    return user

4. 防御访问劫持

理论设计

访问劫持是一种攻击方式,攻击者通过劫持用户的会话或重定向流量来获取用户敏感信息。为防范访问劫持,我们需要:

  • HTTPS:使用加密协议保护通信,防止中间人攻击。
  • 安全Cookie标记:设置Secure和HttpOnly标记,限制Cookie的传输和访问方式。
  • 验证重定向URL:在重定向前验证目标URL的合法性,防止被劫持到恶意站点。

实现原理

HTTPS

使用加密协议保护通信。

# 通过Certbot配置SSL证书(示例)
sudo certbot --nginx -d yourdomain.com

安全Cookie标记

设置Cookie的Secure和HttpOnly标记。

<!-- 设置安全Cookie标记 -->
Set-Cookie: session=abc123; Secure; HttpOnly;

验证重定向URL

在服务器端验证重定向URL的合法性。

// PHP 示例
$redirect_url = $_GET['redirect_url'];
$allowed_domains = ['trusted-site.com', 'another-trusted-site.com'];

if (in_array(parse_url($redirect_url, PHP_URL_HOST), $allowed_domains)) {
  header("Location: " . $redirect_url);
} else {
  // 拒绝重定向
}

5. SSL/HTTPS

理论设计

SSL/HTTPS通过加密通信数据,确保数据在传输过程中不被窃取或篡改。

实现原理

  • SSL证书:获取并配置SSL证书,用于加密通信。
  • HTTPS:将Web应用程序配置为使用HTTPS,通过将敏感信息

加密传输。

实现代码

# 使用Certbot配置SSL证书(示例)
sudo certbot --nginx -d yourdomain.com

6. Host头部验证

理论设计

Host头部验证用于确保请求的Host头部与预期的一致,防止Host头部欺骗攻击。

实现原理

  • 验证Host头部:在处理请求时,验证请求的Host头部是否与预期的一致。

实现代码

# Flask 框架的Host头部验证(Python 示例)
from flask import Flask, request

app = Flask(__name__)

@app.before_request
def check_host():
    expected_host = 'trusted-site.com'
    if request.host != expected_host:
        abort(403)  # 拒绝请求

# 其他路由和处理逻辑

7. Referrer策略

理论设计

Referrer策略用于限制页面的Referer头,防止敏感信息泄漏。

实现原理

  • Referrer策略:通过设置HTTP头部中的Referrer策略,限制Referer头的发送。

实现代码

<!-- Referrer策略 -->
<meta name="referrer" content="no-referrer">

结语

通过理论设计和实现原理的详细介绍,我们强调了每种Web攻击的防范原则和具体的实现方式。这种深入的理解和细致的实践是构建安全Web应用程序的关键。在实际开发中,不仅要采用这些防御措施,还要保持对新的安全威胁的关注,并随时更新和加固安全策略,以确保Web应用程序的稳健性和用户数据的安全。

标签:请求,验证,示例,用户,站点,Host,Cookie,伪造
From: https://www.cnblogs.com/Garden-of-Avalon/p/17909428.html

相关文章

  • Servlet中访问路径配置为/*时,使用请求转发造成内存溢出
    一、问题由来最近在测试Servlet的请求转发功能,准备抽取一个公共的PageJumpTestServlet,用来做页面跳转功能。这样不用每次在测试的时候,都单独写一个Servlet用来做页面跳转。自己最初的设想时,在路径配置的时候使用/toPage/*,访问地址示例http://localhost:8080/javaWeb/toPage......
  • 前端歌谣-第伍拾九课-路由获取请求参数
    前言我是歌谣微信公众号关注前端小歌谣一起学习前端知识今天继续给大家讲解获取请求参数的讲解案例1api.jsfunctionrender(res,data,type=""){res.writeHead(200,{"content-Type":`${type?type:"application/json"};charset=utf-8`})res.write(data)res.en......
  • 前端歌谣-第伍拾九课-路由获取请求参数
    前言我是歌谣微信公众号关注前端小歌谣一起学习前端知识今天继续给大家讲解获取请求参数的讲解案例1api.jsfunctionrender(res,data,type=""){res.writeHead(200,{"content-Type":`${type?type:"application/json"};charset=utf-8`})res.write(data)res.en......
  • HTTP 错误 403.14 - Forbidden Web 服务器被配置为不列出此目录的内容。没有为请求的
    HTTP错误403.14-ForbiddenWeb服务器被配置为不列出此目录的内容。出现以上这个错误可能有如下解决方法:1.将应用程序池设置成V4.02.在配置文件中加上以下几句代码:<system.webServer><modulesrunAllManagedModulesForAllRequests=“true”/><directoryBrowseenabled=“......
  • 宝藏知识!一篇文讲透关于站点SEO的事
    在当今数字化时代,拥有一个强大的网站对于企业和个人而言至关重要。然而,仅仅拥有一个漂亮的网站还不够,它还需要被搜索引擎充分认可和展示。这就是为什么站点SEO(搜索引擎优化)变得如此重要的原因。站点SEO是一系列技术和策略,旨在提升一个网站在搜索引擎结果页面(SERPs)中的排名。通过优......
  • 解析HTTP请求header错误
    运行tomcat时,本以为成功了,结果,突然出现这两个错误 org.apache.coyote.http11.Http11Processor.service解析HTTP请求header错误注意:HTTP请求解析错误的进一步发生将记录在DEBUG级别。  java.lang.IllegalArgumentException:在方法名称中发现无效的字符串,HTTP方法名......
  • [THM]跨站点脚本(xss)
    XSS有效负载什么是有效载荷?在 XSS 中,有效负载是我们希望在目标计算机上执行的JavaScript代码。有效载荷分为两部分,意图和修改。目的是你希望JavaScript实际做什么(我们将在下面通过一些示例进行介绍),修改是我们需要对代码进行更改,以使其执行,因为每个场景都是不同的(在完善......
  • 【THM】SSRF伪造
    SSRF示例 直接拼接用户输入的url。 服务器指定url后用户可以拼接一些其他 用户可以控制子域名 指明接口服务器,去做验证。 查找SSRF可以通过许多不同的方式在Web应用程序中发现潜在的 SSRF 漏洞。以下是四个常见位置的示例:在地址栏中的参数中使用完整URL时......
  • gitlab如何配置webhook post请求
    需求:1.如果提交了仓库代码,想立即自动构建一个job,拉去仓库代码并且更新代码,2.如果提交了仓库代码,想自动触发一个事务 对于问题1有2种解决方法:1)在gitlab中构建一个webhook。这里需要你提前写好一个post接口,接口做的事情是:构建某一个jenkinsjob,仅此而已。配置webhook步骤:进......
  • nginx配置多个站点共用80端口,不算端口冲突吗?
    在使用Nginx配置多个站点时,可以将它们共享一个端口(例如80端口)。这是因为Nginx使用虚拟主机(VirtualHost)的概念,通过对访问请求进行区分,将请求发送到不同的站点。Nginx的配置文件中,可以通过server块来定义不同的虚拟主机。每个server块中可以指定不同的域名或IP地址,并设置对应的站点......