精华内容
下载资源
问答
  • select SUM(enterprise_total),SUM(enterprise_personnelnumber),SUM(enterprise_taxe),SUM(enterprise_researchexperiment), SUM(enterprise_universitytechnology),SUM(enterprise_employment),SUM(enterprise_...
  • C#怎样写API接口

    2017-07-13 13:42:07
    上传文件到服务器、用C#成API接口、android那边只要调用接口就行、不知道从哪下手、代码会、上传文件的功能都会、只是不知道要建什么项目、完代码后怎么办、怎样才能让android那边调用、主管给了一个ASPMVC4...
  • 本文你将了解到 1、接口测试基本概念,包含什么是接口,什么是接口测试,为什么要做接口测试 2、接口测试用例设计 ...3、因某种原因(比如公司没有专职测试人员),需要自己写接口测试脚本的开发人员(强烈推荐)

    本文你将了解到


    • 1、接口测试基本概念,包含什么是接口,什么是接口测试,为什么要做接口测试
    • 2、接口测试用例设计
    • 3、怎样不用写代码,也能快速的根据开发的API文档完成接口自动化测试脚本

    注:如果你对接口基本概念和接口测试用例已熟悉,可以直接跳过,其实看一遍也无防,就当作 温故知新了。

    适合本文人群


    • 1、之前学习接口测试从入门到放弃的初级测试工程师
    • 2、想快速完成 接口测试脚本编写的测试工程师(强烈推荐)
    • 3、因某种原因(比如公司没有专职测试人员),需要自己写接口测试脚本的开发人员(强烈推荐)

    一、接口测试基本概念


    首先了解被 测试对象:接口

    接口是指外部系统与系统之间以及内部各子系统之间的交互点。

    包括外部接口、内部接口,内部接口又包括:上层服务与下层服务接口(比如serivce层调用DAO层接口)、同级接口(比如用户注册,会先调用查询用户信息的接口,查看该用户是否已经注册)。

    不管是内部接口还是外部接口,一般是以API形式出现,通常在规范的API接口文档中,应该包含:接口描述、接口URL、请求方式、请求参数、参数类型、参数含义说明、取值限制、是否必填、返回参数、成功与失败示例等。


    然后了解对接口进行的测试活动:接口测试

    广义的理解 接口测试就是,对模块或系统间接口进行测试;

    狭义的理解接口测试就是,对接口的入参、接口处理逻辑、设计的返回内容进行测试。

    接口测试形式:单个接口测试(包含性能测试)和通过接口调用进行场景测试。

    接口测试原理:通过工具或自己撸代码,模拟客户端(根据测试用例定义请求参数)向服务器端请求访问接口,检查服务器端返回内容是否与预期值一致。

    接口测试流程(仅指迭代中的流程):需求评审 -> 接口定义 -> 用例设计 -> 脚本编写 -> 执行脚本 -> 结果分析


    最后了解做接口测试的意义,即:为什么要做接口测试

    简单来说就是,降低测试成本,提高开发效率。

    充分来说就是:

    1、接口测试相对容易实现自动化持续集成。
    2、接口测试能让测试提早介入,发现潜在问题;保证接口质量,提高前后端联调开发效率。
    3、接口测试进行安全验证比较容易:前后端是否统一校验和敏感信息打印(接口返回内容中的敏感信息)是否加密过。

    二、接口测试 用例设计


    这里只说单个接口测试用例设计,场景接口测试用例设计和UI功能的场景测试用例一样,只是通过调用接口来实现而已。

    设计接口测试用例,主要从接口入参、接口处理逻辑、接口返回参数等3个方面入手:

    1、设计接口入参测试用例,常见参数类型有:数值、字符串、数组或链表、结构体

    针对这些类型入参,通常我们通过等价类方法和边界值方法 去设计测试用例

    等价类方法:关注取值为范围内、取值为范围外的情况;通常会出现 取值在范围外时,接口没有正确返回错误信息的问题。

    边界值方法:关注取值范围的边界值、入参的数据类型边界值;通常会出现数据类型边界值溢出问题,比如int类型数据的最大值和最小值时。

    为了补充用例,还要考虑特殊值的情况,比如0、空、null、负数、非特定类型值和重复值等;通常会出现接口没有正确处理逻辑导致异常退出的问题。


    2、设计接口处理逻辑测试用例,主要是验证前后端是否统一校验

    针对接口处理逻辑,通过从以角度分析:

    约束条件分析,常见的约束条件:数值限制、状态限制(登陆状态)、关系限制(绑定了某种关系)、权限限制(会员、非会员等)。

    操作对象分析,比如项目ID为PJ000属于用户A的,访问这个项目的接口,需要传项目ID,用户B传参时,使用PJ000这的ID时,检查是否应该不能访问这个项目。

    状态转换分析,比如优惠券已使用,是否通过接口仍能使用等情况。

    时序分析,比如不按流程顺序执行,是否出现数据异常情况。


    3、设计接口返回参数测试用例

    针对接口处理逻辑,通过从以下角度分析:

    返回结果分析,覆盖所有返回码。

    接口超时分析,接口超时通常会出现,未进行超时处理,导致流程阻塞或超时后,又收到接口返回,导致逻辑出错。


    、不用写代码,也能做好接口测试:No Code, Still API Test

    不用写代码,也能做好接口测试,当然需要借助神器,才能完成这项工作,这个神器叫做:eolinker,官网 https://www.eolinker.com

    在用eolinker之前,我是用jmeter做接口测试的,用jmeter之前是用python requests,觉得jmeter效率更高,效率高体现在:

    • 1、测试不需要写代码,大家知道测试用代码写测试脚本跟开发写产品代码一样,需要编写-调试-测试-维护,对于测试来讲,需要消耗太多时间和精力,除非公司有专人做测试开发。
    • 2、UI模式,填空就可以,很简单,最多就是用Beanshell写少量的函数调用或断言

    做接口测试只是用到eolinker的自动化测试功能模块,其他功能去官网注册账号后,自行了解,这里只说下eoLinker 自动化测试功能模块的特点,也是我选用的理由:

    • 1、开发的API文档编写和测试的接口测试脚本编写,可以都在eolinker上进行,所以写测试脚本时,可以直接从eolinker的API文档功能模块中,导入API接口,写测试脚本只需添加断言,和要传的参数即可。
    • 2、支持UI和Code两个编写模式,就是说可以通过UI填空方式完成测试脚本设计,也可以通过写JS代码,完成测试脚本设计,官方有教程。
    • 3、调用之前接口的返回参数内容,作当前接口的请求参数,eolinker提供了 关联功能,只要点点点就可以完成,比Jmeter还要便捷。
    • 4.还提供比较高级的代码注入功能,可以在请求接口前,做一些前置处理,比如请求参数值加密等,也可以把返回内容进行后置处理,比如把接口的返回内容中某个字段值,设成全局变量
    • 5、测试结果断言提供4种方式:Json校验、XML校验、完全匹配、正则匹配,用的最多是Json校验,如果想校验某个字段内容,不需写正则,只要直接要校验的字段名就可以了。
    • 6、可以定时执行测试用例,执行完后,发送测试报告到指定人员邮箱中。

    编写接口测试用例脚本 工作流程:开发编写API接口文档 -> 导入开发的API接口,测试根据编写好的测试用例,编写测试用例

    拿eolinker的一个“添加接口项目接口”测试为例,做以下工作:

    1、编写添加名为“添加接口项目”和“查询项目列表”API接口文档
    2、导入API接口,编写“添加项目成功”测试用例:

    • a. 添加项目,校验返回码。
    • b.
      调用“查询项目列表接口”,检查项目是否成功添加。(像这种新增接口,我以前校验,用过连接数据库,然后查表内容,发现执行脚本的时候,速度有点慢,后来改用调用查询列表接口的方法校验)

    3、执行测试脚本,查看测试报告。

    Pre 准备


    接口1:添加接口项目接口
    在这里插入图片描述

    添加接口项目接口的请求头

    在这里插入图片描述

    添加接口项目接口的返回内容

    接口2:查询项目列表接口

    在这里插入图片描述

    查询项目列表接口的请求头

    在这里插入图片描述

    查询项目列表接口的返回内容


    从上面得到2个接口API文档信息:

    注:实际项目中是有一份开发写好的API文档,可能是Word上,可能是RAP上,也有可能是在eolinker上,我在这里只是为了举例,通过F12取了2个接口的信息(如下面),写了2个不完整的API文档作为本文的操作示例。

    接口1:添加接口项目接口

    接口URL:https://www.eolinker.com/apiM…
    请求方法:POST
    请求参数:

    companyHashKey
    projectName
    projectVersion:1.0
    projectType:0

    返回内容:

    {“type”:“project”,“statusCode”:“000000”,“projectHashKey”:“Nr2PNlf82c6a7995d30286e041944fd40e4c01d58b3edeb”}

    接口2:查询项目列表接口

    接口URL:https://www.eolinker.com/apiM…
    请求方法:POST
    请求参数:companyHashKey

    返回内容:

    {“type”:“project”,“itemNum”:4,“statusCode”:“000000”,“projectList”:[{“projectHashKey”:“83uUHhud0519435001f268f0871eee88090cc68dc00cac7”,“projectName”:“demo_project”,“projectType”:0,“projectDesc”:"",“projectUpdateTime”:“2018-10-08 18:26:57”,“projectVersion”:“1.0”,“userType”:0,“permission”:{“userType”:0,“endTime”:“2099-01-01”,“isExpire”:0}}]}

    Step 1 编写添加名为“添加API接口管理项目”和“查询项目列表”API接口文档
    在这里插入图片描述

    1、 添加API接口管理项目接口 API文档

    在这里插入图片描述

    2、 查询项目列表接口 API文档


    Step 2 导入API接口,编写“添加项目成功”测试用例

    注:这里访问接口需要登录,这次就不说接口授权的内容了,后面会做个专题,这里我直接用cookie模拟登录状态

    导入API接口,添加项目,校验返回码

    注:这里用到了正则,因为返回的projectList是数组,JSON校验中,目前不支持数组校验

    将导入的API接口编辑成测试用例脚本


    Step 3 执行测试脚本查看测试报告


    执行测试脚本,查看测试报告

    如此,就很快速地完成了一个测试用例脚本的编写啦!(点下 全部测试,去泡杯茶,回来看测试报告的日子,指日可待!!)

    补充:

    • 1、关于登录,获取接口授权的处理,可以写到前置用例中(也有后置用例),如同python
      unittest的setUp与tearDown作用。
    • 2、有单独的环境管理模块,包含设置默认的hostname、请求头部信息、全局变量和额外参数等,上个图看下

    在这里插入图片描述

    环境管理界面

    最后总结:


    本文向接口测试学习者描述了接口、接口测试为何物,通过对接口测试的基本概念了解,再掌握接口测试用例的设计方法及思路,最后借助优秀的工具,达到简易、快速的工作效果;

    个人看法,不喜勿喷:有些测试可能为了表现自己也是个开发人员,会写代码,便使用大量的代码去写自动化测试脚本,文中我也提到测试写代码是有很大成本的,当然不是说不建议测试会开发,

    我们可以去开发一些测试工具来协助自己的测试工作,一来锻炼开发能力,二来了解软件运作原理,方便测试过程中,更清楚软件内部结构;

    项目通常给我们测试的时间不多,为了保障项目按质按量按时的完成,简易、快速的工作状态是我们所迫切的,所以我们可以借助一些优秀的工具去达到我们的目的。

    END…

    展开全文
  • 接口文档书写 1. 前置描述 产品文档,简单说明背景,接口用来干嘛的 技术文档,说一说各方的具体实现,复杂的可以说下具体的设计思路,n个方案对比,贴上sql,ddl,dml设计,具体代码等具体能看的东西 2. 方法概览...

    接口文档书写

    1. 前置描述

    • 产品文档,简单说明背景,接口用来干嘛的
    • 技术文档,说一说各方的具体实现,复杂的可以说下具体的设计思路,n个方案对比,贴上sql,ddl,dml设计,具体代码等具体能看的东西

    2. 方法概览

    • 方法路径,命名统一
    • 方法名称,命名统一
    • 方法类型 get/post…

    3. 参数定义

    • 参数命名统一,下划线,驼峰…
    • 类型定义明确,整形,长整型,浮点,对象,指针
    • 是否需要枚举 required Enuma a
    • 是否必填 optional int a //非必填
    • 必要备注,说明这个字段是干啥的 required int a //不能叫a
    • 是否需要默认值 required int a =0
    • 如果是比较难懂的字段,贴上相关说明链接 required int a //字段说明http:heheda.com
    • 如果是部分有特殊意义的string或者数组,举例子说明含义,比如 yyyy-mm-dd类型的string
    • 需要提供idl文件的或者webservice,注意格式化
    • http请求可以给到示范的请求返回
    • 如果是接口变更,用特殊标记表示,比如字体加红
    展开全文
  • 请问网上的那些API开发平台,在DELPHI上是怎样实现的,有没有相关教程?谢谢
  • (2) 项目漏洞攻击: 公司在开发项目的时候,公司另外一个团队的项目开发临近尾声,客户要求要看一下项目的进度,提前试用一下,公司直接把内网的测试服务器通过一条公网宽带给挂了出去,虽然做了一些保护,但是在...

    1. 引言:

    本文主要聊一些web项目的安全问题,由于编程语言的差异性,本文更多的会讲一些思路性的上的问题和解决方法,另外提供一些spring方面的一些安全控件。

    2. 事例及解决方法:

    自我工作以来发生在我身上的项目安全问题一共有2起:
    (1) 数据库攻击:
    当时公司要求在公网上部署一套测试用的环境,我就把我当时的项目直接部署在了一个没有进行安全加固的服务器上,还没有改mysql的端口号,用的密码口令较弱,在部署好的第二天上班的时候发现都访问不了了,看了项目报错是mysql连接失败,在排查的时候发现数据被删除了,只留下一个勒索的数据库,由于是测试环境,所以当时也就解决比较轻松。
    (2) 项目漏洞攻击:
    公司在开发项目的时候,公司另外一个团队写的项目开发临近尾声,客户要求要看一下项目的进度,提前试用一下,公司直接把内网的测试服务器通过一条公网宽带给挂了出去,虽然做了一些保护,但是在用了一段时间后,客户要求进行一次安全测试,然后请合作公司进行了一次安全测试,然后给了一份测试报告,第二天公司服务器就被攻击了,经排查是远程文件通过目录穿透进行下载,将服务器的用户配置文件下载,从而进行连接服务器,造成了数据库被删的局面。
    由于此项目是另外一个团队主导的,我也没有进行过多的干预,提交了漏洞报告,另外一个团队的负责人也没有在意,至此以后服务器隔几天就被工具一次,后来本人为了保护测试环境的数据库,给数据库做了主从,只要检测到主数据库有非正常操作被删除的情况就通过定时检测脚本将备数据库关掉,后来我也就离职了。

    针对这两个问题,我们确实该重视,在我们部署的时候一定要注意数据库的密码的复杂程度,必要的时候我们可以关闭root用户的远程权限,用普通用户进行操作,给普通用户添加一些安全规则,如果有安全人员提供的专业的安全测试报告,一定要引起注意,及时复现并修复,网络攻击离我们很近,我们程序员要提高警惕。

    3. 安全问题:

    从大的方面来看项目安全从大的方面分为4大类,每一类出现问题都可能造成很严重的事故:操作系统安全性、容器安全性、项目安全性、中间件安全性、等。。。

    今天我们着重聊项目安全问题(攻击原理)及解决方式,防护只能增加项目的安全等级,不能说绝对安全

    我们常见的漏洞:
    (1) 代码质量问题
    项目建立较为完善的用户、角色、权限体系,大部分接口请求时一定要加token,增加安全等级
    推荐使用:shiro框架和spring security+spring oauth2框架

    Springbok+shiro框架:https://blog.csdn.net/qq_41015193/article/details/115072278

    (2) 弱口令攻击:
    攻击者会通过一些常用的密码,使用暴力破解工具,进行大规模尝试,直到找到正确的为止

    解决:

    1. 前端再给后台发送的密码可以进行简单混淆(MD5加盐)
    2. 添加用户时,后台要将前端提供的密码进行二次混淆添加到数据库
    3. 给登录的接口添加验证码,降低被破解的可能性
      验证码种类:
      1.数字验证码(安全效率低)
      2.滑块验证(建议使用)
      3.手机验证码(需要短信服务器)
    4. 添加同一用户验证错误超过N次,将用户锁定N分钟等安全规则
      可以通过redis实现,将错误的用户信息保存到redis,再给reids添加过期时间
    5. 添加登录IP规则限制,某个ip错误登录几次,禁用一段时间

    说明:

    4,5有利有弊,根据实际情况慎重使用,正常用户也有可能误操作被禁用

    (3) 明文传输攻击
    攻击者通过拦截我们的请求包,篡改请求包中的内容,进行二次转发进行攻击
    解决:

    1. 一般的解决方式就是采用https协议进行加密保护传输数据

    Springboot配置https:https://blog.csdn.net/qq_41015193/article/details/114674278

    (4) 信息泄露

    1. 我们上传到git公开的代码一定要注意配置文件中的内容,避免泄露重要的信息
    2. 我们常用的接口调试框架swagger,在生产环境一定要将其关闭

    swagger详细配置关注:https://blog.csdn.net/qq_41015193/article/details/115914819

    (5) CSRF攻击
    攻击者盗用了你的身份,以你的名义发送恶意请求。
    解决:

    1. Spring+security’框架中提供了防止crlf攻击的配置
    2. 重要的请求接口添加token

    (6) 跨脚本攻击(xss攻击)
    可通过滥用网站内的动态内容以执行外部代码实现,常见的可以在web端添加js语句进行执行
    解决:

    1. 添加xss补丁(过滤请求中的特殊字符)

    Java解决:通过拦截器进行过滤
    添加依赖

    		<dependency>
                <groupId>org.jsoup</groupId>
                <artifactId>jsoup</artifactId>
                <version>1.9.2</version>
            </dependency>
    

    XssConfig

    package com.byyj.exorcist.config;
    
    import com.byyj.exorcist.xssFile.XssFilter;
    import org.springframework.boot.web.servlet.FilterRegistrationBean;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    
    import java.util.HashMap;
    import java.util.Map;
    
    /**
     * @ClassName: XssConfig
     * @Auther: wh
     * @Date: 2019/8/19 09:15
     * @Description:
     */
    @Configuration
    public class XssConfig {
        @Bean
        public FilterRegistrationBean xssFilterRegistrationBean() {
            FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean();
            filterRegistrationBean.setFilter(new XssFilter());
            filterRegistrationBean.setOrder(1);
            filterRegistrationBean.setEnabled(true);
            filterRegistrationBean.addUrlPatterns("/*");
            Map<String, String> initParameters = new HashMap();
            initParameters.put("excludes", "/favicon.ico,/img/*,/js/*,/css/*");
            initParameters.put("isIncludeRichText", "true");
            filterRegistrationBean.setInitParameters(initParameters);
            return filterRegistrationBean;
        }
    }
    

    XssFilter

    package com.byyj.exorcist.xssFile;
    
    
    import org.apache.commons.lang.BooleanUtils;
    import org.apache.commons.lang.StringUtils;
    
    import javax.servlet.*;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import java.io.IOException;
    import java.util.ArrayList;
    import java.util.List;
    import java.util.regex.Matcher;
    import java.util.regex.Pattern;
    
    /**
     * @ClassName: XssFilter
     * @Auther: wh
     * @Date: 2019/8/19 09:21
     * @Description:
     */
    public class XssFilter implements Filter {
        private static boolean IS_INCLUDE_RICH_TEXT = false;
        private List<String> excludes = new ArrayList<String>();
        private String[] excludedUris;//不需要过滤的路径
    
        @Override
        public void init(FilterConfig filterConfig) throws ServletException {
            String isIncludeRichText = filterConfig.getInitParameter("isIncludeRichText");
            if (StringUtils.isNotBlank(isIncludeRichText)) {
                IS_INCLUDE_RICH_TEXT = BooleanUtils.toBoolean(isIncludeRichText);
            }
            String temp = filterConfig.getInitParameter("excludes");
            if (null != temp) {
                String[] url = temp.split(",");
                for (int i = 0; url != null && i < url.length; i++) {
                    excludes.add(url[i]);
                }
            }
        }
    
        @Override
        public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
            HttpServletRequest request = (HttpServletRequest) servletRequest;
            HttpServletResponse response = (HttpServletResponse) servletResponse;
            if (handleExcludeURL(request, response)) {
                filterChain.doFilter(request, response);
                return;
            }
            XssHttpServletRequestWrapper xssRequest = new XssHttpServletRequestWrapper((HttpServletRequest) request, IS_INCLUDE_RICH_TEXT);
            String url = xssRequest.getServletPath();
            if (isExcludedUri(url)) {
                filterChain.doFilter(request, response);
            } else {
                filterChain.doFilter(xssRequest, response);
            }
        }
    
    
        private boolean isExcludedUri(String uri) {
            if (excludedUris == null || excludedUris.length <= 0) {
                return false;
            }
            for (String ex : excludedUris) {
                uri = uri.trim();
                ex = ex.trim();
                if (uri.toLowerCase().matches(ex.toLowerCase().replace("*", ".*"))) {
                    return true;
                }
            }
            return false;
        }
    
        private boolean handleExcludeURL(HttpServletRequest request, HttpServletResponse response) {
            if (excludes == null || excludes.isEmpty()) {
                return false;
            }
    
            String url = request.getServletPath();
            for (String pattern : excludes) {
                Pattern p = Pattern.compile("^" + pattern);
                Matcher m = p.matcher(url);
                if (m.find()) {
                    return true;
                }
            }
    
            return false;
        }
    
        @Override
        public void destroy() {
    
        }
    }
    

    XssHttpServletRequestWrapper

    package com.byyj.exorcist.xssFile;
    
    import com.byyj.exorcist.util.JsoupUtil;
    import org.apache.commons.lang.StringUtils;
    
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletRequestWrapper;
    
    /**
     * @ClassName: XssHttpServletRequestWrapper
     * @Auther: wh
     * @Date: 2019/8/19 09:21
     * @Description:
     */
    public class XssHttpServletRequestWrapper extends HttpServletRequestWrapper {
        HttpServletRequest orgRequest = null;
        private boolean isIncludeRichText = false;
    
        public XssHttpServletRequestWrapper(HttpServletRequest request, boolean isIncludeRichText) {
            super(request);
            orgRequest = request;
            this.isIncludeRichText = isIncludeRichText;
        }
    
        @Override
        public String getParameter(String name) {
            boolean flag = ("content".equals(name) || name.equals("WithHtml"));
            if (flag && !isIncludeRichText) {
                return super.getParameter(name);
            }
            name = JsoupUtil.clean(name);
            String value = super.getParameter(name);
            if (StringUtils.isNotBlank(value)) {
                value = JsoupUtil.clean(value);
            }
            return value;
        }
    
        @Override
        public String[] getParameterValues(String name) {
            String[] arr = super.getParameterValues(name);
            if (arr != null) {
                for (int i = 0; i < arr.length; i++) {
                    arr[i] = JsoupUtil.clean(arr[i]);
                }
            }
            return arr;
        }
    
        @Override
        public String getHeader(String name) {
            name = JsoupUtil.clean(name);
            String value = super.getHeader(name);
            if (StringUtils.isNotBlank(value)) {
                JsoupUtil.clean(value);
            }
            return value;
        }
    
        public HttpServletRequest getOrgRequest() {
            return orgRequest;
        }
    
        public static HttpServletRequest getOrgRequest(HttpServletRequest request) {
            if (request instanceof XssHttpServletRequestWrapper) {
                return ((XssHttpServletRequestWrapper) request).getOrgRequest();
            }
            return request;
        }
    }
    

    JsoupUtil

    package com.byyj.exorcist.util;
    
    import org.apache.commons.lang.StringUtils;
    import org.jsoup.Jsoup;
    import org.jsoup.nodes.Document;
    import org.jsoup.safety.Whitelist;
    
    /**
     * @ClassName: JsoupUtil
     * @Auther: wh
     * @Date: 2019/8/19 09:36
     * @Description:
     */
    public class JsoupUtil {
        private static final Whitelist whitelist = Whitelist.basicWithImages();
        private static final Document.OutputSettings outputSettings = new Document.OutputSettings().prettyPrint(false);
    
        static {
            whitelist.addAttributes(":all", "style");
        }
    
        public static String clean(String content) {
            if (StringUtils.isNotBlank(content)) {
                content = content.trim();
            }
            return Jsoup.clean(content, "", whitelist, outputSettings);
        }
    }
    

    (7) SQL注入攻击(比较常见)
    sql注入只对sql语句的准备(编译)过程有破坏作用
    解决:

    1. 多检查自己的代码,提高可阅读性和安全性(不懂得可以先看看mybait ${}和#{}的区别)

    (8) 目录穿透攻击(文件下载漏洞):
    攻击者可以对服务请求从而通过…/进行穿透目录,访问服务器上的文件,从而进行下载
    解决:

    1. 将项目放到容器中进行执行
    2. 添加文件访问路径判断

    (9) Shell反弹:
    反弹shell(reverse shell),就是控制端监听在某TCP/UDP端口,被控端发起请求到该端口,并将其命令行的输入输出转到控制端
    解决:

    1. 正确配置服务器的防火墙策略,如果是云服务器可以先将服务器进行简单的安全加固,然后配置相应的安全策略组,制定出入站规则

    (10) webshell漏洞(文件上传漏洞):
    攻击者通过上传一些脚本文件进行攻击
    解决:

    1. 对上传的文件进行后缀名判断
    2. 对上传的文件进行魔数判断(速度慢,安全等级高)

    还有很多攻击漏洞的方式,就不一一介绍的,上面的顺序没有轻重,希望大家都能写出健康高效的代码

    4. 建议

    建议大家关注一些网络安全知识的论坛,关注一些框架和中间件的安全漏洞,使用时避开有安全风险的版本,从而提高项目的安全等级

    Nessus:系统漏洞扫描与分析软件
    Nmap:黑客会利用nmap来搜集目标电脑的网络设定,从而计划攻击的方法。
    SqlMap:sql注入攻击工具
    AWVS:web安全漏洞扫描工具

    以上的工具大家有兴趣的可以自行安装研究(建议kali系统安装,比较简单),有什么问题可以私信我,交流学习

    展开全文
  • Django怎么写接口?系列整理

    千次阅读 2019-08-20 17:39:05
    在django中一讲到接口,估计大家都会想起restframework,当然,这更多的讲究的是一种风格,而非规则,接口的编写也没有“非这样不可的说法”,在实际中,接口的编写更多与我们的实际业务相结合,怎样写接口于我们的...

    接口是什么?
    大部分刚入门的人估计都比较难以理解
    其实说的不严谨一些,
    我们编写的视图,其实就是一种接口

    在django中一讲到接口,估计大家都会想起restframework,当然,这更多的讲究的是一种风格,而非规则,接口的编写也没有“非这样不可的说法”,在实际中,接口的编写更多与我们的实际业务相结合,怎样写接口于我们的业务更贴切,我们就怎么去写

    给个例子:

    class CountDataApi(View):
        def get(self,request):
            art_count = Article.objects.all().count()
            photo_count = PhotoDetailModel.objects.all().count()
            write_count = UserWrite.objects.all().count()
            note_count = CommentModel.objects.filter(note_id=1).count()
            comment_count = CommentModel.objects.exclude(note_id=1).count()
            goods_count = Goods.objects.all().count()
            data = {
                'msg':'请求成功',
                'code':200,
                'data':{
                    'art_count':art_count,
                    'photo_count': photo_count,
                    'write_count': write_count,
                    'note_count': note_count,
                    'comment_count': comment_count,
                    'goods_count': goods_count,
                }
            }
            return JsonResponse(data)
    

    上面的代码也就是一种接口
    返回序列化的数据的接口,更符合现在前后端分离的潮流

    先说到这里,下次再写

    展开全文
  • C#怎样接口可以通过http method=patch方式调用最近同事在与某保险公司进行接口对接,需要为对方提供一个支付回调接口,作用是我们调用对方支付接口后,对方向我们返回支付结果数据。这本来是一个很简单的接口...
  • 在java项目中,写web端接口时,怎样写测试接口的测试方法,并怎样运行该测试类方法呢?请大神指导
  • <div class="col-md-3 chackall check-btn"> 全选 <span><b>删除 ...
  • 就是在用手机登陆一个网站后,有一个活动报名,点击后有两个文本框,一个姓名,一个手机号,点击活动,让手机号直接显示,不必每次输入,在action中怎样写
  • 用jsp或者asp应该怎样写接口 具体功能是可以访问数据库,将查询的数据转换成json数据, 然后可以用ajax 对该json数据与客户端可以进行交互, 我现在用asp可以连接了数据库,可以查询,但是不知道怎样将数据转换成json...
  • ![图片]...这里用了@ResponseBody return map 应该前台会接收到一个json 但是我上次这么前段说他能看到解析不了? 所以我想问大家 后台接口到底要怎么?我现在要一个restd
  • 在主机端,通过C++编程去实现对USB接口设备的数据读写
  • 用java serverlet的一套接口程序,怎样才能知道我的接口程序的并发能力,以及每个接过来的商户的并发控制,这个如何实现。
  • 如果喜欢这里的内容,你能够给我最大的帮助就是转发,告诉你的朋友,鼓励他们一起来学习。If you like the content here, you can give me the greatest help is forwarding, tell your friends, encourage them to ...
  • Qiniu 七牛问题解答七牛的管理接口举例,有兴趣的可以自己来下七牛的管理demao问题解决方案delete接口的java代码如下://ak,sk需要去七牛后台的秘钥中去拿。 public string delete(string encodeUrl) { string ...
  • 前端PHP抛过来几个请求字段,要我用Python+tornado一个检查这些字段有没有在数据库中。 1.先要在数据库中建个表 2.要检查其中一字段有没有在数据库中,没有就下一步,有就抛个错误出来结束。 3.再检查上一字段+...
  • 华为eNSP怎样调出右侧接口列表

    千次阅读 2019-06-07 16:57:05
    打开eNSP,发现是这样,右侧并没有接口列表。 网上搜索之后并没有找到解决办法,特此这篇文章记录。 其实很简单,按照下图操作即可。 选择上右工具栏即可。 ...
  • RAP接口管理工具,如果调用创建好的接口时,是一个Java文件,而不是一个页面,怎样引入插件呢? 在教程里看到引入script时,是在一个页面代码里引入的。 如果是一个Java文件呢,怎样引入,在哪里? ![图片说明]...
  • 我今天浅显的一下。 首先要获取你访问链接的App Key 和 App Secret 那么什么是App Key 和 App Secret ,又有什么用呢? App key简称API接口验证序号,是用于验证API接入合法性的。接入哪个网站的API...
  • 笔者做的是测试,在群里经常有人讨论,怎么和开发对接怎么难,怎么测接口比较难,开发不愿因文档等等,是啊,我感觉也是这样,沟通,还有我们应该怎样去学习,去扩充自己,让自己不再受开发所左右, 笔者就像...
  •  但是懂的人觉得的是这么回事,不懂的人完全就懵逼了,这是什么,和没说一样嘛。现在行业中所说的接口测试,基本都是基于HTTP协议的,因为用的最多最广泛,谁让浏览器只支持HTTP呢,别的都跟着...
  • web apiapi接口时默认返回的是把你的对象序列化后以XML形式返回,那么怎样才能让其返回为json呢,下面为大家介绍几种不错的方法 web apiapi接口时默认返回的是把你的对象序列化后以XML形式返回,...
  • 不用写代码,也能做好接口测试 本文你将了解到 1、接口测试基本概念,包含什么是接口,什么是接口测试,为什么要做接口测试 ...3、因某种原因(比如公司没有专职测试人员),需要自己写接口测试脚本的开发人
  • 发送缓冲为空 (Transmit buffer empty) ,为空则可发送数据RXNE:接收缓冲非空 (Receive buffer not empty)为非空则可读取数据BSY:忙标志 (Busy flag)STM32 SPI读写时序这里以W25Q64为例介绍SPI接口的NOR ...
  • web apiapi接口时返回

    2016-03-29 11:29:00
    web apiapi接口时默认返回的是把你的对象序列化后以XML形式返回,那么怎样才能让其返回为json呢,下面就介绍两种方法: 方法一:(改配置法) 找到Global.asax文件,在Application_Start()方法中添加一句: ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,189
精华内容 475
关键字:

怎样写接口