偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

什么是 SQL 注入,這些坑得避開(kāi)

運(yùn)維 數(shù)據(jù)庫(kù)運(yùn)維
sql 注入就是用戶通過(guò)輸入的參數(shù),拼接到原先的 sql 中,成為 sql 的一部分,從而影響 sql 的功能和執(zhí)行結(jié)果

 [[425032]]

1、sql 注入是什么

sql 注入就是用戶通過(guò)輸入的參數(shù),拼接到原先的 sql 中,成為 sql 的一部分,從而影響 sql 的功能和執(zhí)行結(jié)果

2、sql 注入破壞力

-小兵破壞力

比如原先 sql 如下

  1. select * from user where name='用戶名' and password='密碼'

用戶輸入

  1. name:臻大蝦'-- '注釋 
  2. password:密碼 

那最終的結(jié)果猜猜是什么?

  1. select * from user where name='臻大蝦'-- '注釋' and password='密碼'

兩個(gè)-- 代表注釋,所以這條 sql 只需要輸入用戶名,就可以獲取用戶信息,跳過(guò)了密碼的校驗(yàn)

-boss 破壞力

來(lái)個(gè)厲害的,比如用戶輸入以下參數(shù)

  1. name:臻大蝦 
  2. password:'; drop table user;-- '注釋 

最終的 sql:

  1. select * from user where name='臻大蝦' and password=''; drop table user;-- '注釋'

user 表居然被刪除了,看到這,此時(shí)的你可能想原地爆炸。

3、對(duì)策

3.1、PreparedStatement 預(yù)編譯

使用預(yù)編譯,這樣傳入的參數(shù),會(huì)被當(dāng)作字符串,也就是被引號(hào)包起來(lái)

拿剛才的例子,用戶輸入

  1. name:臻大蝦'-- '注釋 
  2. password:密碼 

如果使用了預(yù)編譯,那最終的 sql

  1. select * from user where name='臻大蝦\'-- \'注釋' and password='密碼'

參數(shù)中的引號(hào)被轉(zhuǎn)義,從而避免成為 sql 的一部分。

3.2、有些語(yǔ)句不能預(yù)編譯

預(yù)編譯獲取參數(shù)是根據(jù)#,而$ 是拼接的意思

#{}:解析為預(yù)編譯語(yǔ)句的一個(gè)參數(shù)占位符

${}:僅僅作為一個(gè)字符串,在動(dòng)態(tài) sql 中直接替換變量,傳入什么值,就是什么值

比如傳入:'臻大蝦' or 1=1

  1. 1、SELECT * FROM user WHERE name=#{name} //SELECT * FROM user WHERE name='\'臻大蝦\' or 1=1' 
  2. 2、SELECT * FROM user WHERE name=${name} //SELECT * FROM user WHERE name='臻大蝦' or 1=1 

但是有些情況使用#會(huì)報(bào)錯(cuò),比如 like、in 如果使用#會(huì)報(bào)錯(cuò),而使用

還有 order by,根據(jù)傳入的參數(shù)排序,這些情況就會(huì)有 sql 注入的危險(xiǎn),那怎么辦呢?

  • like

  1. select * from user where name like '%#{name}%' //會(huì)報(bào)錯(cuò) 
  2. select * from user where name like '%${name}%' //正常 

正確寫(xiě)法

使用 mysql 的字符串拼接函數(shù) concat

  1. select * from user where name like concat('%',#{name},'%'
  • in

正確寫(xiě)法,使用 foreach

  1. @Select("<script>" + 
  2.         "select * from user where id in "
  3.         "<foreach item='item' index='index' collection='userIds' open='(' separator=',' close=')'> " + 
  4.         "#{item}" + 
  5.         "</foreach>"
  6.         "</script>"
  7. List<User> getByIds(@Param("userIds") List<Long> userIds); 
  • order by

有時(shí)需要根據(jù)前端傳入的參數(shù)來(lái)排序,此時(shí)就會(huì)有 sql 注入的危險(xiǎn),此時(shí)可以使用白名單

比如

  1. List<String> allowSortColumnList= Lists.newArrayList("age","score"); 
  2. if(!allowSortColumnList.contains(sortParam)){ 
  3.     throw new RuntimeException("can not sort by "+sortParam); 

 

 

責(zé)任編輯:張燕妮 來(lái)源: 臻大蝦
相關(guān)推薦

2022-11-04 08:38:57

索引數(shù)據(jù)分庫(kù)

2024-05-30 19:01:53

AI技術(shù)大會(huì)

2018-09-11 08:05:44

千兆路由器廠商

2018-07-05 06:02:38

綜合布線弱電動(dòng)力線

2021-09-07 14:35:48

DevSecOps開(kāi)源項(xiàng)目

2021-05-18 08:02:40

面試面試問(wèn)題職業(yè)規(guī)劃

2017-01-23 08:41:43

云計(jì)算

2024-08-26 15:31:55

2020-07-14 14:59:00

控制反轉(zhuǎn)依賴注入容器

2022-11-10 10:19:06

業(yè)務(wù)項(xiàng)目工具代碼

2018-10-31 11:30:28

Redis數(shù)據(jù)分布式鎖

2019-02-25 23:02:16

數(shù)據(jù)科學(xué)職業(yè)數(shù)據(jù)科學(xué)家

2010-12-20 16:04:30

2017-02-23 08:08:58

2021-08-19 07:34:55

RabbitMQLinuxWindows

2013-05-14 13:59:13

開(kāi)發(fā)者廣告商廣告平臺(tái)

2023-06-12 07:00:40

Rust進(jìn)度任務(wù)

2021-01-26 00:46:40

微服務(wù)架構(gòu)微服務(wù)應(yīng)用

2025-03-24 07:10:00

嚴(yán)格模式JavaScript代碼

2011-05-12 13:07:28

SQL Server復(fù)制漏洞
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)