1.SQL注入是什么
一、什么是SQL注入? SQL注入是比较常见的网络攻击方式之一,它不是利用操作系统的BUG来实现攻击,而是针对程序员编程时的疏忽,通过SQL语句,实现无帐号登录,甚至篡改数据库。
二、SQL注入总体思路 1、寻找到SQL注入的位置 2、判断服务器类型和后台数据库类型 3、针对不通的服务器和数据库特点进行SQL注入攻击
三、以登录为案例,数据库为MySQL,要求输入用户名和密码 点击登陆,如果没有做特殊处理,那么这个非法用户就很得意的登陆进去了。(当然现在的有些语言的数据库API已经处理了这些问题)
从理论上说,后台认证程序中会有如下的SQL语句:
String sql="select * from table where username='"+userName+"’and password='"+password+” '”;
当输入了下面的用户名和密码,上面的SQL语句变成:
SELECT * FROM table WHERE username='1’or 1=1 # and password=''
条件后面username=‘1’ or 1=1 然后后面加#将后面的语句注释,让他们不起作用,这样语句就是恒真了,用户能轻易骗过系统,获取合法身份。SQL注入还可以用来删除、添加、修改数据库中的记录等等…
四、怎么防止sql注入?
1、不要图一时方便使用SQL语句直接拼接。
2、如果用SQL语句,那就使用参数化,添加Param。
3、尽可能的使用存储过程,安全性能高而且处理速度也快。
4、屏蔽SQL注入。
2. mybatis里面 # 和 $ 的区别
"#" :这种方式是使用预编译语句,会将参数按照 JDBC 类型进行处理,可以防止 SQL 注入攻击。在执行 SQL 前,#{}会使用 PreparedStatement 的参数设置,通过 JDBC 接口传递值,可以很大程度上防止 SQL 注入。
"$" :这种方式是直接拼接 SQL 语句,参数的值会直接按照传入的形式进行拼接,存在 SQL 注入的风险。在执行 SQL 时,MyBatis 会将 ${} 替换为实际的变量值,并将该 SQL 语句发送到数据库执行。
因此,一般情况下推荐使用 "#" 的方式进行参数绑定,以提高安全性并防止 SQL 注入攻击。
3.resultType和resultMap的区别
在MyBatis框架中,resultType和resultMap是用来映射查询结果的两种方式。
-
resultType:
-
resultType用于指定单一结果对象的类型,通常用于简单的查询,返回的结果可以直接映射到一个JavaBean或基本数据类型。
-
例如,你可以使用resultType来指定一个简单的POJO类,用于映射查询结果的列到该类的属性。
-
-
resultMap:
-
resultMap用于定义复杂的结果映射关系,允许你在查询结果和Java对象之间建立更加灵活的映射关系,包括字段名的映射、嵌套查询、关联对象等。
-
通过resultMap,你可以自定义查询结果的映射逻辑,以适应各种复杂的数据结构。
-
4.数据库的命名规范以及设计的逻辑,设计表需要考虑的问题
-
数据库的表名字规范,与项目的名字匹配,比如可以使用 项目名_模块名_表名
-
数据库字段的设计应该符合数据规范性、业务要求和查询优化的原则, 数据库字段的名字规范,要符合实际的要求,要见名知意
-
考虑数据类型的选取 大小的区别 和默认值问题 比如对时间的精度要求比较高就要选择TimeStamp类型,对精度无要求可以使用date类型数据, 大小的选择一般为2的幂次方,然后根据数据的范围来设置上限, 默认值的设置要符合逻辑,例如逻辑删除字段可以设置默认值为未删除
-
考虑是这个字段否为可以为空值 根据字段的作用和实际情况来判断
-
主键的确定 主键可以设置为 (表名_ID) 的形式
-
每一个字段都要加注释
-
索引的选取,考虑使用普通索索引.唯一索引.联合索引,保证索引的可用性
5.索引的各种用法,联合索引,唯一索引,普通索引
索引是数据库中用于提高查询效率的重要工具,它可以加速数据的检索速度。在数据库中,常见的索引包括普通索引、唯一索引和联合索引。
-
普通索引(Non-Unique Index): 普通索引是最基本的索引类型,它能够加快数据的检索速度,但允许索引列中存在重复的数值。普通索引可以用来加速 WHERE 子句中涉及索引列的查询,提升相应查询的性能。
-
唯一索引(Unique Index): 唯一索引与普通索引类似,不同之处在于唯一索引要求索引列中的数值必须是唯一的,不允许重复。唯一索引通常用于确保表中某一列的数值是唯一的,比如身份证号、用户名等。
-
联合索引(Composite Index): 联合索引是指针对表中多个列创建的索引,通过将多个列组合在一起建立索引,可以加速涉及这些列的查询。联合索引的选择性取决于涉及的列的选择性,选择性越高的列放在联合索引的前面,可以提高索引的效率。
索引的各种用法包括:
提高查询性能:索引可以加速 WHERE 子句中涉及索引列的查询,降低查询的时间复杂度。
约束数据完整性:唯一索引可以保证索引列中的数值唯一,确保数据的完整性。
加速连接操作:对连接操作涉及的列创建联合索引可以提升连接查询的性能。
在使用索引时需要注意以下事项:
不要滥用索引:过多的索引会增加数据库的存储空间和维护成本,同时在插入、删除和更新数据时也会影响性能。
根据实际需求选择合适的索引类型:根据业务需求和查询模式选择合适的索引类型,避免不必要的索引。
定期维护索引:对于频繁更新的表,需要定期对索引进行优化和重建,以保持索引的高效性。
6.返回值用int还是Integer类型
java的int和Integer的区别_接口返回的结果用int还是integer_Micrle_007的博客-CSDN博客
要用包装类型,比如Integer,因为int有默认值0,而Integer的默认值是null,可以表示返回值为空的情况
7.@Param注解的用法
1、概述 首先明确这个注解是为SQL语句中参数赋值而服务的。
@Param的作用就是给参数命名,比如在mapper里面某方法A(int id),当添加注解后A(@Param("userId") int id),也就是说外部想要取出传入的id值,只需要取它的参数名userId就可以了。将参数值传如SQL语句中,通过#{userId}进行取值给SQL的参数赋值。
2、实例: 实例一:@Param注解基本类型的参数
mapper中的方法:public User selectUser(@Param("userName") String name,@Param("password") String pwd);
映射到xml中的<select>标签
<select id="selectUser" resultMap="User">
select * from user where user_name = #{userName} and user_password=#{password} </select>
其中where user_name = #{userName} and user_password = #{password}中的userName和password都是从注解@Param()里面取出来的,取出来的值就是方法中形式参数 String name 和 String pwd的值。
实例二:@Param注解JavaBean对象
SQL语句通过@Param注解中的别名把对象中的属性取出来然后复制,这里命名就按照@param中的为标准
mapper中的方法: public List<User> getAllUser(@Param("user") User u);
映射到xml中的<select>标签
<select id="getAllUser" parameterType="com.vo.User" resultMap="userMapper">
select
from user t where 1=1
and t.user_name = #{user.userName}
and t.user_age = #{user.userAge}
</select>
3、注意点 当使用了@Param注解来声明参数的时候,SQL语句取值使用#{},${}取值都可以。
当不使用@Param注解声明参数的时候,必须使用的是#{}来取参数。使用${}方式取值会报错。
不使用@Param注解时,参数只能有一个,并且是Javabean。在SQL语句里可以引用JavaBean的属性,而且只能引用JavaBean的属性。