AI智能
改变未来

JavaEE在线就业班2.0【最新升级版】


download:JavaEE在线就业班2.0【最新升级版】

SQL注入

SQL注入是效勞器端未嚴厲校驗客戶端發送的數據,而招致效勞端SQL语句被歹意修正並勝利執行的行爲。

實質:把用戶輸入的數據當作代码執行。任何和數據庫產生交互的中央便有可能存在注入.

SQL注入類型
數據傳輸: GET POST COOKIE

數據類型: 整型 字符型

注入形式: 結合查询 報錯 佈爾盲注 時間盲注 推查询

SQL注入的普通步骤
判別能否有注入
可控參數的改動能否影響頁面的結果。
輸入的SQL语句能否能報錯.—->經過數據庫報錯,看到數據庫的语句痕跡。
輸入的SQL语句能否不報錯.—->语句可以勝利閉合。
判別注入類型
语句能否可以被歹意修正
能否可以執行
獲取我們想要的數據
SQL注入的根底學問
數據庫構造
數據庫—->表—->字段—->值

SQL5.0版本之後MySQL默許在數據庫中寄存一個“information_schema”的數據庫,在該庫中有三個重要的表名schemata,tables,columns。

schemata表存儲該用戶創立的一切數據庫的庫名,字段名爲schema_name。

tables表存儲該用戶創立的一切數據庫的庫名和表名,數據庫庫名和表名字段分別爲table_schema,table_name。

columns表存儲一切的庫名,表名,字段名,它們的字段名分別爲table_schema,table_name,column_name。

查询语句
select 要查询的字段名 from 庫名.表名
select 要查询的字段名 from 庫名.表名 where 已知條件的字段名 = \’已知條件的值\’
select 要查询的字段名 from 庫名.表名 where 已知的條件字段名1 = \’已知條件的值1\’ and 已知條件2的字段名 = \’已知條件2的值\’
limit用法
limit m,n
m表示記载開端的位置,從0開端表示第一條記载;n指取n條記载。

重要的函數
database() 當前網站運用的數據庫。
version() 當前的MySQL版本。
user() 當前MySQL的用戶。
@@datadir 數據庫途径。
@@version_compile_os 操作係統版本
concat(str1,str2,…) 沒有分隔符地衔接字符串
concat_ws(separator,str1,str2,…) 含有分隔符地衔接字符串
group_concat(str1,str2,…) 衔接一個組的一切字符串,並以逗號分隔每一條數據
注释符
常見的注释表達方式爲:# –空格 /**/
在url中表示爲: %23 –+

對條件字段做函數操作走不了索引。

select * from t1 where date© =‘2019-05-21’;
優化:改成範圍查询

select * from t1 where c>=‘2019-05-21 00:00:00’ and c<=‘2019-05-21 23:59:59’;
隱式轉換
操作符與不同類型的操作對象一同運用時,就會發作類型轉換以使操作兼容。

select user_name,tele_phone from user_info where tele_phone =11111111111; / tele_phone varchar /
實践會做函數操作:

select user_name,tele_phone from user_info where cast(tele_phone as singed int) =11111111111;
優化:類型統一

select user_name,tele_phone from user_info where tele_phone =‘11111111111’;
含糊查询
通配符在前面

select * from t1 where a like ‘%1111%’;
優化:含糊查询必需包含條件字段前面的值

select * from t1 where a like ‘1111%’;
範圍查询
範圍查询數據量太多,需求回表,因而不走索引。

select * from t1 where b>=1 and b <=2000;
優化:降低單次查询範圍,分屢次查询。(實践可能速度沒得快太多,倡議走索引)

select from t1 where b>=1 and b <=1000;
show profiles;
±———±———–±—————————————–+
| Query_ID | Duration | Query |
±———±———–±—————————————–+
| 1 | 0.00534775 | select from t1 where b>=1 and b <=1000 |
| 2 | 0.00605625 | select * from t1 where b>=1 and b <=2000 |
±———±———–±—————————————–+
2 rows in set, 1 warning (0.00 sec)
計算操作
即便是简單的計算

explain select * from t1 where b-1 =1000;
優化:將計算操作放在等號後面

explain select * from t1 where b =1000 + 1;

在MongoDB中OjbectId 类型Json序列化反序列化会出错,可以通过以下两种方式解决

1、最简单粗暴的方法,从新定一个一个业务主键比如key,这样的话等于之前的_id不起作用了

2、使用JsonConverter

public class ObjectIdConverter : JsonConverter
{
public override bool CanConvert(Type objectType)
{
return objectType == typeof(ObjectId);
}

public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer){if (reader.TokenType != JsonToken.String){throw new Exception(String.Format(&quot;Unexpected token parsing ObjectId. Expected String, got {0}.&quot;,reader.TokenType));}var value = (string)reader.Value;return String.IsNullOrEmpty(value) ? ObjectId.Empty : new ObjectId(value);}public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer){if (value is ObjectId){var objectId = (ObjectId)value;writer.WriteValue(objectId != ObjectId.Empty ? objectId.ToString() : String.Empty);}else{throw new Exception(&quot;Expected ObjectId value.&quot;);}}}

在ObjectId字段上加一行代码即可

[JsonConverter(typeof(ObjectIdConverter))]
public string _id { get; set; }
如果使用Newtonsoft的JsonConvert的话,还需要额外加上参数

JsonConvert.DeserializeObject<xxxx>(json,new ObjectIdConverter());

3、通过Ignore,一种很有技巧性的写法

[JsonIgnore]
public override ObjectId _Id { get; set; }

[BsonIgnore]
public string _IdStr
{
get
{
return Id.ToString();
}
set
{
ObjectId id;
ObjectId.TryParse(value, out id);
Id = id;
}
}

赞(0) 打赏
未经允许不得转载:爱站程序员基地 » JavaEE在线就业班2.0【最新升级版】