JavaEE Online Employment Class 2.0 [最新のアップグレードバージョン]

ダウンロード:JavaEE Online Employment Class 2.0 [最新のアップグレードバージョン]

SQLインジェクション

SQLインジェクションは、サーバーがクライアントから送信されたデータを厳密に検証せず、サーバーのSQLステートメントが悪意を持って修正されて正常に実行される動作です。

エッセンス:ユーザーが入力したデータはコードとして実行されます。データベースと相互作用するどのセンターにも注入がある可能性があります。

SQLインジェクションタイプの
データ送信:GET POST COOKIE

データ型:整数文字型

インジェクションフォーム:クエリエラー、ブールブラインドインジェクション時間、ブラインドインジェクションプッシュクエリと組み合わせる

SQLインジェクションの一般的な手順は、ページの結果に影響を与える
インジェクション
制御可能なパラメーターに変更があるかどうか判別することです。
入力SQLステートメントがエラーを報告できるかどうか。---->データベースがエラーを報告した後、データベースのステートメントトレースを確認できます。
入力SQLステートメントでエラーを報告できませんか?---->ステートメントを正常に閉じることができます。
インジェクションタイプ
ステートメントが悪意によって修正できる
かどうか
、必要なデータを取得するために実行できるかどうか
、SQLインジェクションの基本知識、
データベース構築
データベース---->テーブル---->フィールド- ->値

SQL5.0バージョンの後、MySQLはデータベースに「information_schema」データベースを登録することに同意します。このデータベースには、3つの重要なテーブル名スキーム、テーブル、および列があります。

schemataテーブルには、ユーザーが作成したすべてのデータベースのライブラリ名が格納され、フィールド名はschema_nameです。

テーブルテーブルには、ユーザーが作成したすべてのデータベースのデータベース名とテーブル名が格納されます。データベースデータベース名とテーブル名のフィールドは、それぞれtable_schemaとtable_nameです。

列テーブルには、すべてのライブラリ名、テーブル名、およびフィールド名が格納されます。それらのフィールド名は、それぞれtable_schema、table_name、およびcolumn_nameです。

クエリ文の
選択フィールド名はライブラリ名から照会されるテーブル名
を選択し、フィールド名はライブラリ名から照会する。知られている状態のフィールド名が=「知られている状態の値」テーブル名
を選択し、フィールド名はライブラリ名.Tableから照会されます既知の条件フィールド名1 = '既知の条件値1'および既知の条件2フィールド名= '既知の条件2値'
制限使用
制限m、n
mはレコードの先頭の位置を示し、0から始まると最初の名前を意味します。レコード; nはnレコードを指します。

重要な関数
database()現在のWebサイトで使用されているデータベース。
version()現在のMySQLバージョン。
user()現在のMySQLユーザー。
@@ datadirデータベースパス。
@@ version_compile_os Caozuoxitongバージョン
concat(str1、str2、...)アダプター区切り文字列
なしconcat_ws(separator、str1、str2、 ...)区切り文字文字列を含むadapter
group_concat(str1、str2、..。)すべてを連結するグループ内の文字列、および各データをコンマで区切ります

一般的なコメント式は次のとおりです。#-space / ** /
url内:%23- +

条件フィールドで関数操作を実行してインデックスにアクセスすることはできません。

select * from t1wheredate©= '2019-05-21';
最適化:範囲クエリに変更

select * from t1 where c> = '2019-05-21 00:00:00' and c <= '2019-05-21 23:59:59';
暗黙の変換
演算子はさまざまなタイプの操作オブジェクトで使用されますそのとき、操作を互換性のあるものにするために型変換が行われます。

user_infoからuser_name、tele_phoneを選択します。ここで、tele_phone = 11111111111; / tele_phone varchar /
は、実際には関数操作を実行します。

select user_name、tele_phone from user_info where cast(tele_phone as singed int)= 11111111111;
最適化:統合タイプ

user_infoからuser_name、tele_phoneを選択します。ここでtele_phone = '11111111111';前に
あいまいなクエリ
ワイルドカード

select * from t1 where like '%1111%';
最適化:あいまいなクエリには条件フィールドの前に値を含める必要があります

select * from t1 where like '1111%';
Range query
range query data volumeが多すぎるため、テーブルに戻る必要があるため、インデックスはありません。

select * from t1 where b> = 1 and b <= 2000;
最適化:単一のクエリの範囲を縮小し、クエリを複数のクエリに分割します。(練習は速すぎないかもしれません、インデックスを取ることをお勧めします)

b> = 1およびb <= 1000であるt1から選択します。
プロファイルを表示します。
±---------±-----------±--------------------------- -------------- +
| Query_ID | デュレーション| クエリ|
±---------±-----------±--------------------------- -------------- +
| 1 | 0.00534775 | t1から選択します。ここでb> = 1およびb <= 1000 |
| 2 | 0.00605625 | select * from t1 where b> = 1 and b <= 2000 |
±---------±-----------±--------------------------- -------------- +
2行セット、1警告(0.00秒)
計算計算
即是简單的計算

説明select * from t1 where b-1 = 1000;
最適化:計算操作を等号の後に置きます

select * fromt1を説明します。ここでb = 1000 + 1;

MongoDBでは、OjbectIdタイプのJsonのシリアル化と逆シリアル化が失敗します。これは、次の2つの方法で解決できます。

1.最も簡単で失礼な方法は、キーなどのビジネス主キーをリセットすることです。この場合、前の_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.無視することで、非常に巧みな書き方

[JsonIgnore]
public override ObjectId _Id {get; セットする; }

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

おすすめ

転載: blog.51cto.com/15134651/2675776