Web应用安全测试-综合利用(一)

Web应用安全测试-综合利用(一)

文章目录

  • Web应用安全测试-综合利用(一)
    • 1.跨站脚本攻击(XSS)
      • 漏洞描述
      • 测试方法
        • GET方式跨站脚本
        • Post方式跨站脚本
      • 风险分析
      • 风险等级
      • 修复方案
        • 总体修复方式
        • 对于java进行的web业务开发的过滤器
        • 对于PHP语言所编写的网站系统的XSS过滤器
        • asp程序网站出现SQL注入
      • 注意事项
    • 2、FLASH跨站脚本攻击
      • 漏洞描述
      • 测试方法
      • 风险分析
      • 风险等级
      • 修复方案
      • 注意事项
    • 3、HTTP响应分割
      • 漏洞描述
      • 测试方法
      • 风险分析
      • 风险等级
      • 修复方案
      • 注意事项
    • 4、HTTP参数污染
      • 漏洞描述
      • 测试方法
      • 风险分析
      • 风险等级
      • 修复方案
      • 注意事项

1.跨站脚本攻击(XSS)

在这里插入图片描述

漏洞描述

跨站脚本攻击的英文全称是Cross Site Script,为了和样式表区分,缩写为XSS。发生的原因是网站将用户输入的内容输出到页面上,在这个过程中可能有恶意代码被浏览器执行。跨站脚本攻击,它指的是恶意攻击者往Web页面里插入恶意html代码,当用户浏览该页之时,嵌入其中Web里面的html代码会被执行,从而达到恶意用户的特殊目的。

已知的跨站脚本攻击漏洞有三种:1)存储式;2)反射式;3)基于DOM。

1、 存储型跨站脚本攻击涉及的功能点:用户输入的文本信息保存到数据库中,并能够在页面展示的功能点,例如用户留言、发送站内消息、个人信息修改等功能点。

2、 反射型跨站脚本攻击涉及的功能点:URL参数需要在页面显示的功能点都可能存在反射型跨站脚本攻击,例如站内搜索、查询功能点。

3、 基于DOM跨站脚本攻击涉及的功能点:涉及DOM对象的页面程序,包括(不限这些):

  document.URL  
  document.URLUnencoded  
  document.location  
  document.referrer  
  window.location 

测试方法

GET方式跨站脚本
  1. 在输入的参数后逐条添加以下语句,以第一条为例,输入http://www.exmaple.com/page.xxx?name=<script>alert(123456)</script>只要其中一条弹出显示123456的告警框,就说明存在跨站漏洞,记录漏洞,停止测试。

  2. 如果没有弹出显示123456的告警框,则在返回的页面上单击鼠标右键,选择“查看源文件”。

  3. 查找网页源文件中是否包含完整的字符串<script>alert(123456)</script>,则不管有没有弹出显示123456的告警框,都表明存在跨站脚本漏洞。

  4. 由于有些HTML元素(比如<textarea>或”)会影响脚本的执行,所以不一定能够正确弹出123456告警框,需要根据返回网页源文件的内容,构造value的值,比如

多行文本输入框:

</textarea><script>alert(123456)</script>  

文本输入框:

</td><script>alert(123456)</script>   
'><script>alert(123456)</script>  
"><script>alert(123456)</script>  
</title><script>alert(123456)</script>  
--><script>alert(123456)</script>  
[img]javascript:alert(123456)[/img]  
<scrip<script>t>alert(123456)</scrip</script>t>  
</div><Script>alert(123456)</script>  

需要对页面上所有可以提交参数的地方进行测试。具体跨站脚本的测试语句根据实际情况的不同而不同,可自行构造,以及触发事件等切换,这里只列出了一些最常见构造语句。

Post方式跨站脚本
  1. 在POST表单中逐条输入以下语句,只要其中一条弹出显示123456的对话框,就说明存在跨站漏洞,记录漏洞,停止测试。

  2. <script>alert(123456)</script>

  3. [img]javascript:alert(123456);[/img]

  4. 如果没有弹出显示123456的告警框,则在返回的页面上单击鼠标右键,选择“查看源文件”

  5. 查找网页源文件中是否包含完整的字符串<script>alert(123456)</script>,则不管有没有弹出显示123456的告警框,都表明存在跨站脚本漏洞。

  6. 由于有些HTML元素(比如<textarea>或”)会影响脚本的执行,所以不一定能够正确弹出123456告警框,需要根据返回网页源文件的内容,构造value的值,比如

多行文本输入框:

</textarea><script>alert(123456)</script>  

文本输入框:

</td><script>alert(123456)</script>   
'><script>alert(123456)</script>  
"><script>alert(123456)</script>  
</title><script>alert(123456)</script>  
--><script>alert(123456)</script>  
[img]javascript:alert(123456)[/img]  
<scrip<script>t>alert(123456)</scrip</script>t>  
</div><Script>alert(123456)</script>  

需要对页面上所有可以提交参数的地方进行测试。具体跨站脚本的测试语句根据实际情况的不同而不同,可自行构造,以及触发事件等切换,这里只列出了一些最常见构造语句。

风险分析

常见的反射型跨站脚本攻击步骤如下:

  1. 攻击者创建并测试恶意URL;

  2. 攻击者确信受害者在浏览器中加载了恶意URL;

  3. 攻击者采用反射型跨站脚本攻击方式安装键盘记录器、窃取受害者的cookie 、窃取剪贴板内容、改变网页内容(例如下载链接)。

存储型跨站脚本攻击最为常见的场景是将跨站脚本写入文本输入域中,如留言板、博客或新闻发布系统的评论框。当用户浏览留言和评论时,浏览器执行跨站脚本代码。

风险等级

高危】:应用中存在存储型跨站

中危】:应用中存在反射型跨站

修复方案

对于XSS跨站漏洞,可以采用以下修复方式:

总体修复方式

验证所有输入数据,有效检测攻击;对所有输出数据进行适当的编码,以防止任何已成功注入的脚本在浏览器端运行。具体如下:

  1. 输入验证:某个数据被接受为可被显示或存储之前,使用标准输入验证机制,验证所有输入数据的长度、类型、语法以及业务规则。

  2. 输出编码:数据输出前,确保用户提交的数据已被正确进行entity编码,建议对所有字符进行编码而不仅局限于某个子集。

  3. 明确指定输出的编码方式:不要允许攻击者为你的用户选择编码方式(如ISO 8859-1或 UTF 8)。

  4. 注意黑名单验证方式的局限性:仅仅查找或替换一些字符(如"<" ">"或类似"script"的关键字),很容易被XSS变种攻击绕过验证机制。

  5. 警惕规范化错误:验证输入之前,必须进行解码及规范化以符合应用程序当前的内部表示方法。
    请确定应用程序对同一输入不做两次解码。

 对客户端提交的数据进行过滤,一般建议过滤掉双引号(”)、尖括号(<、>)等特殊字符,或者对客户端提交的数据中包含的特殊字符进行实体转换,比如将双引号(”)转换成其实体形式&quot;,<对应的实体形式是&lt;,<对应的实体形式是~&gt;

1、需过滤的常见字符:

  [1] |(竖线符号)
  [2] & (& 符号)
  [3];(分号)
  [4] $(美元符号)
  [5] %(百分比符号)
  [6] @(at 符号)
  [7] '(单引号)
  [8] "(引号)
  [9] \'(反斜杠转义单引号)
  [10] \"(反斜杠转义引号)
  [11] <>(尖括号)
  [12] ()(括号)
  [13] +(加号)
  [14] CR(回车符,ASCII 0x0d)
  [15] LF(换行,ASCII 0x0a)
  [16] ,(逗号)
  [17] \(反斜杠)

2、在请求返回页面关键字符进行转义;

   [1] “(双引号):&quot
   [2] ’ (单引号):&apos
   [3] &(&符号):&amp
   [4] <(左尖括号):&lt
   [5] >(右尖括号):&gt

在不影响应用的前提下,建议将cookie标记为httpOnly,同时禁用TRACE方法。

对于java进行的web业务开发的过滤器

在用java进行web业务开发的时候,对于页面上接收到的参数,除了极少数是步可预知的内容外,大量的参数名和参数值都是不会出现触发Xss漏洞的字符。而通常为了避免Xss漏洞,都是开发人员各自在页面输出和数据入库等地方加上各种各样的encode方法来避免Xss问题。而由于开发人员的水平不一,加上在编写代码的过程中安全意识的差异,可能会粗心漏掉对用户输入内容进行encode处理。针对这种大量参数是不可能出现引起Xss和SQL注入漏洞的业务场景下,因此可以使用一个适用大多数业务场景的通用处理方法,牺牲少量用户体验,来避免Xss漏洞和SQL注入。

利用Servlet的过滤器机制,编写定制的XssFilter,将request请求代理,覆盖getParameter和getHeader方法将参数名和参数值里的指定半角字符,强制替换成全角字符。使得在业务层的处理时不用担心会有异常输入内容。

XssFilter.java

package filter;
import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;

public class XssFilter implements Filter {
public void init(FilterConfig config) throws ServletException {
}
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException 
{
XssHttpServletRequestWrapper xssRequest = new XssHttpServletRequestWrapper(
(HttpServletRequest) request);
chain.doFilter(xssRequest, response);
}
public void destroy() {
}
XssHttpServletRequestWrapper.java
package filter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;

public class XssHttpServletRequestWrapper extends HttpServletRequestWrapper {
HttpServletRequest orgRequest = null;
public XssHttpServletRequestWrapper(HttpServletRequest request) {
super(request);
orgRequest = request;
}
/**
* 覆盖getParameter方法,将参数名和参数值都做xss过滤。<br/>
* 如果需要获得原始的值,则通过super.getParameterValues(name)来获取<br/>
* getParameterNames,getParameterValues和getParameterMap也可能需要覆盖
*/
@Override
public String getParameter(String name) {
String value = super.getParameter(xssEncode(name));
if (value != null) {
value = xssEncode(value);
}
return value;
}
/**
* 覆盖getHeader方法,将参数名和参数值都做xss过滤。<br/>
* 如果需要获得原始的值,则通过super.getHeaders(name)来获取<br/>
* getHeaderNames 也可能需要覆盖
*/
@Override
public String getHeader(String name) {

String value = super.getHeader(xssEncode(name));
if (value != null) {
value = xssEncode(value);
}
return value;
}
/**
* 将容易引起xss漏洞的半角字符直接替换成全角字符
*
* @param s
* @return
*/
private static String xssEncode(String s) {
if (s == null || s.isEmpty()) {
return s;
}
StringBuilder sb = new StringBuilder(s.length() + 16);
for (int i = 0; i < s.length(); i++) {
char c = s.charAt(i);
switch (c) {
case '>':
sb.append('>');//全角大于号
break;
case '<':
sb.append('<');//全角小于号
break;
case '\'':
sb.append('‘');//全角单引号
break;
case '\"':
sb.append('“');//全角双引号
break;
case '&':
sb.append('&');//全角
break;
case '\\':
sb.append('\');//全角斜线
break;
case '#':
sb.append('#');//全角井号
break;
default:
sb.append(c);
break;
}
}
return sb.toString();
}

/**
* 获取最原始的request
*
* @return
*/
public HttpServletRequest getOrgRequest() {
return orgRequest;
}
/**
* 获取最原始的request的静态方法
*
* @return
*/
public static HttpServletRequest getOrgRequest(HttpServletRequest req) {
if(req instanceof XssHttpServletRequestWrapper){
return ((XssHttpServletRequestWrapper)req).getOrgRequest();
}

return req;
}

在web.xml中添加

 <filter>
<filter-name>xssFilter</filter-name>
<filter-class>filter.XssFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>xssFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>

对于PHP语言所编写的网站系统的XSS过滤器
<?php  
/**
* @去除XSS(跨站脚本攻击)的函数
* @par $val 字符串参数,可能包含恶意的脚本代码如<script language="javascript">alert("hello world");</script>
* @return  处理后的字符串
* @Recoded By Androidyue
**/
function RemoveXSS($val) {  
   // remove all non-printable characters. CR(0a) and LF(0b) and TAB(9) are allowed  
   // this prevents some character re-spacing such as <java\0script>  
   // note that you have to handle splits with \n, \r, and \t later since they *are* allowed in some inputs  
   $val = preg_replace('/([\x00-\x08,\x0b-\x0c,\x0e-\x19])/', '', $val);  
 
   // straight replacements, the user should never need these since they're normal characters  
   // this prevents like <IMG SRC=@avascript:alert('XSS')>  
   $search = 'abcdefghijklmnopqrstuvwxyz'; 
   $search .= 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';  
   $search .= '1234567890!@#$%^&*()'; 
   $search .= '~`";:?+/={}[]-_|\'\\'; 
   for ($i = 0; $i < strlen($search); $i++) { 
      // ;? matches the ;, which is optional 
      // 0{0,7} matches any padded zeros, which are optional and go up to 8 chars 
 
      // @ @ search for the hex values 
      $val = preg_replace('/(&#[xX]0{0,8}'.dechex(ord($search[$i])).';?)/i', $search[$i], $val); // with a ; 
      // @ @ 0{0,7} matches '0' zero to seven times  
      $val = preg_replace('/(&#0{0,8}'.ord($search[$i]).';?)/', $search[$i], $val); // with a ; 
   } 
 
   // now the only remaining whitespace attacks are \t, \n, and \r 
   $ra1 = Array('javascript', 'vbscript', 'expression', 'applet', 'meta', 'xml', 'blink', 'link', 'style', 'script', 'embed', 'object', 'iframe', 'frame', 'frameset', 'ilayer', 'layer', 'bgsound', 'title', 'base'); 
   $ra2 = Array('onabort', 'onactivate', 'onafterprint', 'onafterupdate', 'onbeforeactivate', 'onbeforecopy', 'onbeforecut', 'onbeforedeactivate', 'onbeforeeditfocus', 'onbeforepaste', 'onbeforeprint', 'onbeforeunload', 'onbeforeupdate', 'onblur', 'onbounce', 'oncellchange', 'onchange', 'onclick', 'oncontextmenu', 'oncontrolselect', 'oncopy', 'oncut', 'ondataavailable', 'ondatasetchanged', 'ondatasetcomplete', 'ondblclick', 'ondeactivate', 'ondrag', 'ondragend', 'ondragenter', 'ondragleave', 'ondragover', 'ondragstart', 'ondrop', 'onerror', 'onerrorupdate', 'onfilterchange', 'onfinish', 'onfocus', 'onfocusin', 'onfocusout', 'onhelp', 'onkeydown', 'onkeypress', 'onkeyup', 'onlayoutcomplete', 'onload', 'onlosecapture', 'onmousedown', 'onmouseenter', 'onmouseleave', 'onmousemove', 'onmouseout', 'onmouseover', 'onmouseup', 'onmousewheel', 'onmove', 'onmoveend', 'onmovestart', 'onpaste', 'onpropertychange', 'onreadystatechange', 'onreset', 'onresize', 'onresizeend', 'onresizestart', 'onrowenter', 'onrowexit', 'onrowsdelete', 'onrowsinserted', 'onscroll', 'onselect', 'onselectionchange', 'onselectstart', 'onstart', 'onstop', 'onsubmit', 'onunload'); 
   $ra = array_merge($ra1, $ra2); 
   $found = true; // keep replacing as long as the previous round replaced something 
   while ($found == true) { 
      $val_before = $val; 
      for ($i = 0; $i < sizeof($ra); $i++) { 
         $pattern = '/'; 
         for ($j = 0; $j < strlen($ra[$i]); $j++) { 
            if ($j > 0) { 
               $pattern .= '(';  
               $pattern .= '(&#[xX]0{0,8}([9ab]);)'; 
               $pattern .= '|';  
               $pattern .= '|(&#0{0,8}([9|10|13]);)'; 
               $pattern .= ')*'; 
            } 
            $pattern .= $ra[$i][$j]; 
         } 
         $pattern .= '/i';  
         $replacement = substr($ra[$i], 0, 2).'<x>'.substr($ra[$i], 2); // add in <> to nerf the tag  
         $val = preg_replace($pattern, $replacement, $val); // filter out the hex tags  
         if ($val_before == $val) {  
            // no replacements were made, so exit the loop  
            $found = false;  
         }  
      }  
   }  
   return $val;  
}
//测试一下效果
//echo RemoveXSS("<script language='javascript'>alert('hello world');</script>") ;
?>

asp程序网站出现SQL注入

漏洞的时候可以使用

源码如下:url=trim(request("url"))
修改如下:url=Server.HTMLEncode(trim(request("url")))
使用Server.HTMLEncode它来解决脚本跨站攻击漏洞
或者:
对用户输入区域只允许适应应用功能所必需的规定字符输入,,对于合法的“>”、“<”“&”这三个符号进行替换:
replace(str,"<","&#x3C;")
replace(str,">","&#x3E;")
replace(str,"&","&#x26;")

注意事项

暂无

2、FLASH跨站脚本攻击

漏洞描述

在Flash中可以嵌入ActionScript,ActionScript是一种非常强大和灵活的脚本,通过构造恶意的ActionScript脚本,可获取用户的敏感信息或者诱骗用户打开具有网页木马的URL页面。

测试方法

  1. 构造含有xss代码的flash文件,如一个常见的flash xss可以这样写:

getURL(“javascript:alert(document.cookie)”)

  1. 将flash文件插入到HTML页面中,如:<embed src="helloworld.swf" />

  2. 使用SWFIntruder工具检测产生在flash中的xss。

风险分析

攻击者利用该漏洞可实施窃取用户信息、钓鱼等攻击。

风险等级

高危】:手工测试浏览器弹窗

修复方案

  1. 尽可能地禁止用户能够上传或加载自定义的flash文件;

  2. 通过定义allowScriptAccess参数限制flash动态脚本与HTML页面的通信,该参数有三个可选值,建议设置为never:

always,对与HTML的通信也就是执行javascript不做任何限制;
sameDomain,只允许来自于本域的Flash与Html通信,这是默认值;如果使用默认值的话,应确保flash文件不是用户上传来的;
never,绝对禁止flash与页面通信。
  1. 通过定义allowNetworking参数限制flash与外部网络进行通信,该参数有三个可选值,建议设置为none或internal:
all,允许使用所有的网络通信,也是默认值;
internal,flash不能与浏览器通信如navigateToURL,但是可以调用其他的API;
none,禁止任何的网络通信。

注意事项

暂无

3、HTTP响应分割

漏洞描述

HTTP响应头拆分攻击是一种新型的Web攻击方式,它产生了很多安全漏洞,如Web缓存感染、用户信息涂改、窃取敏感用户页面、跨站脚本漏洞等。这种攻击方式与其衍生的一系列技术的产生,是由于Web应用程序未对用户提交的数据进行严格过滤和检查,导致攻击者可以提交一些恶意字符,如对用户输入的CR 和LF字符没有进行严格的过滤。

测试方法

CR和LF两个字符的编码如下:

CR = %0d = \r

LF = %0a = \n

下面以java为例分析HTTP响应头拆分攻击的原理,如jsp页面(/test.jsp),内容如下:

<%
response.sendRedirect("index.jsp?lang="+request.getParameter("lang"));
%>

定义lang=en,访问test.jsp,服务器返回302,重定向到另一个地址,HTTP响应内容如下:

HTTP/1.1 302 Moved Temporarily\r\n
Date: Wed, 1 Mar 2005 12:53:28 GMT\r\n
Location: http://192.168.0.1/index.jsp?lang=en\r\n
Content-Type: text/html\r\n
Connection: Close\r\n
<html><head><title>302 Moved Temporarily</title></head>\r\n
<body>\r\n
<p>This document you requested has moved temporarily.</p>\r\n
</body></html>\r\n

lang所赋的值被嵌入在Location响应头中。如果服务器未限制lang参数或者校验,攻击者可以修改en参数来迫使服务器返回两个响应,将lang赋值成以下内容:

en%0d%0aContent-Length:%200%0d%0a%0d%0aHTTP/1.1%20200%20OK%0d%0aContent-Type:%20text/html%0d%0aContent-Length:%2024%0d%0a%0d%0a<html>Test page</html>

再次访问test.jsp页面时,HTTP响应内容如下:

HTTP/1.1 302 Moved Temporarily\r\n
Date: Wed, 1 Mar 2005 15:26:41 GMT\r\n
Location: http://192.168.0.1/index.jsp?lang=en\r\n
Content-Length: 0\r\n

HTTP/1.1 200 OK\r\n
Content-Type: text/html\r\n
Content-Length: 24\r\n

<html>Test page</html>\r\n
Content-Type: text/html\r\n
Connection: Close\r\n
<html><head><title>302 Moved Temporarily</title></head>\r\n
<body bgcolor="#FFFFFF">\r\n
<p>This document you requested has moved temporarily.</p>\r\n
</body></html>\r\n

标红部分是lang参数的值,从上述HTTP响应中可以看出,该响应包含了两条HTTP响应,一个是302,一个是200,请求test.jsp页面,浏览器匹配HTTP/1.1 302响应。

浏览器接收到HTTP响应后解析到Content-Length: 0,认为响应内容已经结束,然后请求重定向URL地址http://192.168.0.1/index.jsp?lang=en,HTTP请求内容如下:

GET http://192.168.0.1/index.jsp?lang=en HTTP/1.1
Host: 192.168.0.1
User-Agent: Mozilla/5.0 (Windows NT 6.2; rv:20.0) Gecko/20100101 Firefox/20.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: zh-cn,zh;q=0.8,en-us;q=0.5,en;q=0.3
Accept-Encoding: gzip, deflate
Referer: http://192.168.0.1/index.jsp
Connection: keep-alive

针对上述的HTTP请求,浏览器会自动匹配之前收到的第二个响应HTTP/1.1 200,攻击者利用此漏洞可控制第二条响应的内容,从而达到欺骗用户的目的。

风险分析

HTTP响应头拆分攻击本质是:攻击者可以发送一个或几个HTTP指令使服务器产生攻击者想得到的输出。攻击者构造的HTTP指令使服务器误把几条HTTP请求看成一条完整的HTTP请求来解释。如果攻击者可以控制第一条请求的部分内容,而且完全控制着第二条及后面的HTTP请求,即从HTTP状态行一直到HTTP请求的尾部,攻击者会发送多个HTTP请求指令到目标系统,例如第一条请求指令使得服务器完全接受两个HTTP请求,第二条请求通常是在服务器上请求一些非法资源,而服务器将会自动匹配到第二条请求的响应,并输出攻击者想要请求的资源,从而达到攻击目的。

风险等级

中危】:可成功实现 XSS,会话固定

修复方案

  1. 限制用户输入的CR和LF,对CR和LF字符正确编码后再输出,以防止攻击者注入自定义的HTTP头;

  2. 限制输入URL的长度。

注意事项

暂无

4、HTTP参数污染

漏洞描述

使用同名参数对原参数进行污染,应用在检测时只检测第一个参数是否符号要求,因此可利用同名参数构造攻击脚本,参数污染通常用于sql注入绕过WAF检测。

测试方法

在请求中添加同名参数,并在添加的参数中输入恶意构造的语句。例如:http://www.xx.com/index.php?id=1&id=2%20union%20select%201,2,3,current_user,利用该漏洞进行sql注入绕过可参考80sec发布的《浅谈绕过waf的数种方法》。

风险分析

不同Web服务器对同名参数的处理方式如下图所示:

在这里插入图片描述

攻击者可根据其特性对参数进行覆盖,绕过应用检测。

风险等级

高危】:同名参数绕过 filter 或其他规则

修复方案

应用程序应正确过滤用户输入(过滤所有参数),以防止此漏洞。

注意事项

暂无

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Pycharm怎么默认终端连接远程服务器

因为经常需要从宿舍到学校内通勤&#xff0c;期间所有连接都会中断&#xff0c;所以每次开SSH特别麻烦&#xff0c;每次终端自动切换到本地&#xff1a; 每次都得点一下Start SSH Session 想要默认终端连接远程服务器&#xff0c;需要点File->Setting->Tools->SSH T…

详细描述拍立淘接口的实现过程,包括接口设计、开发、测试、部署等关键步骤

拍立淘接口的实现过程可以详细分为以下几个步骤&#xff1a; 注册与权限获取&#xff1a; 注册成为阿里巴巴开放平台开发者&#xff0c;并创建应用。获取API的调用权限和密钥&#xff08;如AppKey和AppSecret&#xff09;&#xff0c;这些密钥将用于后续的身份验证和请求签名。…

SmartEDA体验记:探索电路设计新纪元,乐趣无限!

在科技日新月异的今天&#xff0c;电路设计早已不再是专业人士的专属领域。随着智能化工具的不断发展&#xff0c;普通人也能轻松体验到电路设计的乐趣。今天&#xff0c;就让我带大家走进SmartEDA的世界&#xff0c;一起感受前所未有的电路设计之旅。 SmartEDA&#xff0c;作为…

Ubuntu如何添加用户环境变量

一&#xff0c;简介 在工作中&#xff0c;需要将某个环境变量添加到用户环境变量中&#xff0c;方便使用。 要将 SOF_WORKSPACE~/work/sof 添加到用户的环境变量中&#xff0c;需要将该设置添加到用户的 shell 配置文件中&#xff0c;例如 ~/.bashrc&#xff08;对于 Bash 用…

IEPL专线和IPLC专线有什么区别?

IEPL和IPLC是两种广泛用于国际通信的专线服务&#xff0c;IEPL是一种以太网专线服务&#xff0c;IPLC是一种传统的专线服务&#xff0c;它们在某些方面有相似之处&#xff0c;但也存在一些关键的区别。下面是IEPL和IPLC的主要区别: 1.技术和定义: IEPL: 技术: IEPL是一种以太…

推广结算统计,Xinstall助您轻松掌握每一分投入与回报!

在移动互联网时代&#xff0c;App的推广与运营离不开精准的数据支持和高效的结算系统。然而&#xff0c;面对众多的推广渠道和复杂的结算流程&#xff0c;如何确保每一分投入都能得到合理的回报&#xff0c;成为了众多企业和开发者关注的焦点。今天&#xff0c;我们就来聊聊如何…

猫:“喵不知道不喝水要打针”,主食冻干、主食罐头骗水远离缺水

猫咪如果长期不喝水&#xff0c;一直处于缺水状态&#xff0c;会对健康产生很大的影响。可能会导致便秘、上火、尿黄、尿少等。在高温的夏季&#xff0c;猫还可能会因为脱水而出现中暑的情况&#xff0c;严重时甚至会导致死亡。此外&#xff0c;长期饮水不足的猫咪也容易患上泌…

SaaS案例分享:成功构建销售渠道的实战经验

面对SaaS产品推广的难题&#xff0c;你是否曾感到迷茫&#xff0c;不知如何选择有效的销售渠道&#xff1f;Shopify独立站联盟营销或许能为你提供新的思路。Shopify作为领先的电商解决方案提供商&#xff0c;其独立站功能为众多商家提供了强大的在线销售平台。而联盟营销&#…

【SpringBoot整合系列】SpringBoot整合kinfe4j

目录 kinfe4j与Swagger的区别 SpringBoot2.x整合kinfe4j1.添加依赖2.启动类注解3.创建Knife4J配置类4.实体类5.接口admin访问 api访问 常用注解汇总SpringBoot3.x整合Kinfe4j启动报错解决1.更换依赖2.启动类3.配置4.配置类5.参数实体类6.接口admin访问 api访问 各版本注解参照 …

SQL综合查询-学校教务管理系统数据库

一、一个完整的数据查询语句的格式 SELECT 【ALL|DISTINCT】<目标列表达式>【&#xff0c;<目标列表达式2>&#xff0c;...】 FROM <表名或视图名1>【&#xff0c;<表名或视图名2>&#xff0c;...】 【WHERE <元组选择条件表达式>】 【GROUP…

AI大模型浪潮席卷而来,你准备好乘风破浪成为行业翘楚了吗?

揭秘AI大模型浪潮&#xff1a;你准备好乘风破浪了吗&#xff1f; 在繁华的都市中&#xff0c;程序员小李一直默默耕耘在代码的海洋中。然而&#xff0c;随着AI大模型技术的迅猛发展&#xff0c;他发现自己仿佛置身于一场没有硝烟的战争中。身边的同事纷纷掌握了新技术&#xf…

Python基础教程(二十四):日期和时间

&#x1f49d;&#x1f49d;&#x1f49d;首先&#xff0c;欢迎各位来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里不仅可以有所收获&#xff0c;同时也能感受到一份轻松欢乐的氛围&#xff0c;祝你生活愉快&#xff01; &#x1f49d;&#x1f49…

bit band

位带(bit band) 简介: 在嵌入式系统和微控制器中,位带是一种特殊的内存映射技术. 它允许程序员像访问普通内存一样直接访问和修改特定寄存器的单个位. 使用bit band技术,可以通过内存映射的方式,将特定的位操作转换位对整个字的操作,从而实现对单个位的读写. 作用: 提高位操…

oracle发送http请求

UTL_HTTP包让SQL和PLSQL能够调用超文本传输协议&#xff08;HTTP&#xff09;&#xff0c;也就是说可以使用它在Internet上访问数据。 当包用HTTPS从Web site获取数据时&#xff0c;要使用Oracle Wallet&#xff0c;它是由Oracle Wallet Manager或者orapki utility创建。非HTT…

Elixir学习笔记——调试

在 Elixir 中&#xff0c;有多种调试代码的方法。在本章中&#xff0c;我们将介绍一些较常见的方法。 IO.inspect/2 O.inspect(item, opts \\ []) 在调试中真正有用的原因是它返回传递给它的 item 参数而不影响原始代码的行为。让我们看一个例子。 打印&#xff1a; 如您所见…

web3.0链游农民世界开发搭建0撸狼人杀玩法模式定制开发

随着区块链技术的飞速发展&#xff0c;Web3.0时代的链游已成为游戏行业的新宠。本文将介绍一款基于Web3.0的链游——农民世界&#xff0c;如何定制开发0撸狼人杀玩法模式&#xff0c;以及该模式的专业性、深度思考和逻辑性。 一、背景介绍 农民世界是一款以农业为主题的链游…

5G消息 x 融媒 | 媒体融合新入口

5G消息 x 融媒 | 媒体融合新入口 5G 消息是 5G 时代三大运营商联合手机厂商推出的平台型应用&#xff0c;5G 消息以短信为入口&#xff0c;以富媒体消息为媒介&#xff0c;具有权威真实、全面覆盖、精准投放、内容汇聚、开放共享等特点。这些特点符合当下融媒体发展的需求&…

最新下载:Hype 4 mac版【软件附加安装教程】

Hype是一款强大的Mac OS平台 HTML5 创作工具&#xff0c;它可以在网页上做出赏心悦目的动画效果&#xff0c;创建丰富的网页交互动画&#xff0c;支持层、时间轴等编辑方式&#xff0c;并能很好的导出HTML5/CSS3/JavaScript&#xff0c;在台式机&#xff0c;智能手机和iPad上流…

C++类对象模型、类对象的存储方式、this指针、this指针的引出、this指针的特性、C语言和C++实现Stack的对比等的介绍。

文章目录 前言一、C类对象模型1. 类对象的存储方式2. 结构体内存对齐规则 二、this指针1. this指针的引出2. this指针的特性3. C语言和C实现Stack的对比 总结 前言 C类对象模型、类对象的存储方式、this指针、this指针的引出、this指针的特性、C语言和C实现Stack的对比等的介绍…

【论文阅读笔记】PA-SAM: Prompt Adapter SAM for High-Quality Image Segmentation

1.论文介绍 PA-SAM: Prompt Adapter SAM for High-Quality Image Segmentation PA-SAM&#xff1a;用于高质量图像分割的提示适配器SAM 2024年 ICME Paper Code 2.摘要 Segment Anything Model&#xff0c;SAM在各种图像分割任务中表现出了优异的性能。尽管SAM接受了超过10亿…