用反射去拼接sql

用反射去拼接sql

原因:公司项目使用jpa去修改数据库信息,原项目新增和修改直接调用jpq的save方法既可以,但现要求接口接收到部分实体类的参数,就只修改部分参数,故jpa的save方法达不到要求,所以要手动去组装sql,但是,实体类参数太多,判断非空太繁琐,所以想写一个方法去组装sql。
直接上代码

<T> String dtoToString(T t) {
        //获得某个类的所有声明的字段,即包括public、private和proteced
        Field[] declaredFields = t.getClass().getDeclaredFields();
        StringBuffer stringBuffer = new StringBuffer("");
        String name1 = t.getClass().getSimpleName();
        System.out.println(name1);
        // 遍历,拼接sql
        for (Field field : declaredFields) {
            String name = field.getName();
            try {
                // 获取值
                field.setAccessible(true);
                Object o = field.get(t);
                // 判断值是不是存在&& o.toString().equals("0")
                if (!Objects.isNull(o) && !isBaseDefaultValue(o)){
                    if (!stringBuffer.toString().equals("")){
                        stringBuffer.append(",");
                    }
                    stringBuffer.append(name).append("='").append(o).append("'");
                }
            } catch (IllegalAccessException e) {
                e.printStackTrace();
            }
        }
        System.out.println(stringBuffer.toString());
        return stringBuffer.toString();
    }

    /**
     * 判断是不是默认值
     * @param object
     * @return
     */
    public static boolean isBaseDefaultValue(Object object) {
        Class className = object.getClass();
        String strClassName = "" + className;
        if(className.equals(java.lang.Integer.class)) {
            return (int)object == 0;
        } else if(className.equals(java.lang.Byte.class)) {
            return (byte)object == 0;
        } else if(className.equals(java.lang.Long.class)) {
            return (long)object == 0L;
        } else if(className.equals(java.lang.Double.class)) {
            return (double)object == 0.0d;
        } else if(className.equals(java.lang.Float.class)) {
            return (float)object == 0.0f;
        } else if(className.equals(java.lang.Character.class)) {
            return (char)object == '\u0000';
        } else if(className.equals(java.lang.Short.class)) {
            return (short)object == 0;
        } else if(className.equals(java.lang.Boolean.class)) {
            return (boolean)object == false;
        }
        return false;
    }

但该代码依旧存在部分问题,譬如boolean类型传入的就是false呢,该方法无法去判断。慎用!!!

<think>好的,我现在需要向用户介绍SQL注入和XSS攻击。首先,我得确保自己准确理解这两个概念,然后再用中文清晰、有条理地解释出来。用户可能对网络安全不太熟悉,所以需要避免使用太多专业术语,或者如果用了术语,要简单解释一下。 首先,SQL注入。我记得这是通过把恶意SQL代码插入到输入字段中,来攻击数据库的行为。比如,用户登录时,输入用户名和密码,如果后台没有正确处理输入,攻击者可以输入一些特殊字符改变SQL语句的结构,从而绕过登录或者获取数据。需要举一个例子,比如 ' OR '1'='1 这样的输入,导致查询条件永远为真。然后说明危害,比如数据泄露、篡改、删除,甚至获取管理员权限。防御方法的话,应该提到参数化查询、输入验证、最小权限原则等等。 接下来是XSS攻击,跨站脚本攻击。这应该是在网页中注入恶意脚本,当其他用户访问时,脚本执行,窃取信息或者会话cookie。比如,在评论框里输入<script>alert('xss')</script>,如果没有过滤,其他用户加载这个页面就会执行这个脚本。要分类型,存储型、反射型、DOM型。危害包括窃取用户会话、钓鱼攻击、篡改页面内容。防御方法包括转义用户输入、使用CSP(内容安全策略)、设置HttpOnly属性等。 需要比较两者的区别,SQL注入主要针对数据库,而XSS针对用户浏览器。攻击目标不同,手段也不同。最后总结防御的重要性,提醒用户注意安全措施。 现在要组织语言,确保结构清晰,分点说明。可能需要分两部分,分别介绍SQL注入和XSS,然后比较异同,再讲防御措施。过程中要注意使用例子帮助理解,避免过于技术化,让新手也能明白。同时检查是否有错误,比如参数化查询和预编译语句是否正确,XSS的类型是否描述准确。 可能还需要验证一些细节,比如SQL注入的例子是否正确,XSS的三种类型是否名称正确,防御措施是否有遗漏。比如,参数化查询是否属于预编译语句的一部分,输入验证应该包括白名单过滤和转义特殊字符。对于XSS,转义HTML标签,使用CSP防止执行外部脚本,HttpOnly防止cookie被窃取。 最后确保用中文表达,口语化,但保持专业准确。分段落,每个部分有小标题或者重点标记,但用户要求使用中文,可能用序号或者加粗。不过用户要求不要用markdown,所以用自然分段即可。检查是否有使用$...$和$$...$$的情况,这里应该不需要,因为是中文解释概念,不是数学公式。 总结思考过程,确保覆盖定义、原理、例子、危害、防御,以及两者的区别,这样用户就能全面了解SQL注入和XSS攻击了。</think>以下是关于SQL注入和XSS攻击的通俗解释: --- ### 一、SQL注入攻击 **定义** 通过构造恶意SQL语句,非法操作数据库的攻击方式。主要针对Web应用与数据库的交互环节。 **攻击原理** 当用户输入的数据被直接拼接SQL查询语句中时,攻击者可通过输入特殊字符改变原SQL逻辑。 例如登录场景: 原始SQL:`SELECT * FROM users WHERE username='[输入1]' AND password='[输入2]'` 攻击者输入: - 用户名:`admin' --` - 密码:任意值 最终SQL变为: `SELECT * FROM users WHERE username='admin' --' AND password='123'` (`--`在SQL中表示注释,直接绕过密码验证) **经典攻击载荷** `' OR 1=1 --` 可使查询条件永真,直接登录成功 **危害等级** - 数据泄露(如用户信息、交易记录) - 数据篡改(修改商品价格) - 数据删除(清空数据库表) - 服务器控制(通过数据库提权) **防御方案** 1. 参数化查询(预编译语句):`PreparedStatement` 2. 输入过滤:过滤`'`、`"`、`--`等特殊符号 3. 最小权限原则:数据库账户禁止使用管理员权限 4. 错误信息隐藏:不返回详细SQL报错信息 --- ### 二、XSS攻击(跨站脚本攻击) **定义** 通过注入恶意脚本代码,在受害者浏览器中执行的攻击方式。主要针对网页内容展示环节。 **攻击原理** 当网站未对用户输入内容进行过滤时,攻击者可将JavaScript代码嵌入到网页中。其他用户加载该页面时,恶意脚本自动执行。 **常见场景** 1. 评论区输入:`<script>alert('你的Cookie是:'+document.cookie)</script>` 2. 商品详情页:注入虚假支付表单 3. 用户昵称设置:存储型XSS持续影响所有访问者 **三大类型** - **存储型XSS**:恶意脚本永久存储在服务器(如论坛发帖) - **反射型XSS**:通过URL参数临时反射给受害者(如钓鱼链接) - **DOM型XSS**:通过修改页面DOM树触发(不经过服务器) **危害表现** - 窃取用户Cookie实现会话劫持 - 伪造钓鱼页面诱导输入敏感信息 - 网页挂马(自动下载木马程序) - 篡改页面内容(如插入虚假公告) **防御方案** 1. 输入输出过滤:转义`<`、`>`等HTML特殊字符 2. 内容安全策略(CSP):限制脚本来源 3. HttpOnly属性:防止JavaScript读取Cookie 4. 前端渲染框架:Vue/React自动转义模板内容 --- ### 三、核心区别对比 | | SQL注入 | XSS攻击 | |----------|----------------------------------|-------------------------------| | 攻击目标 | 数据库 | 浏览器中的其他用户 | | 攻击载体 | SQL查询语句 | HTML/JavaScript代码 | | 利用场景 | 登录、搜索等数据库交互环节 | 内容展示页面(评论区、个人资料)| | 直接危害 | 数据泄露/篡改 | 用户会话劫持/前端钓鱼 | --- ### 四、防御重要性 根据《2023年网络安全报告》: - 约34%的Web漏洞与注入攻击相关 - 单个数据泄露事件平均损失达$4.45百万美元 - 90%的XSS攻击可通过基础防护手段避免 建议开发者: 1. 对所有用户输入视为不可信数据 2. 使用成熟的安全框架(如Spring Security) 3. 定期进行渗透测试与代码审计 理解这些攻击原理,是构建安全系统的第一步。无论是开发网站还是日常上网,保持安全意识都至关重要。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值