SQL インジェクション、外部キーの使用、ER モデルとテーブル間の関係、3 つのパラダイム

SQLインジェクション

学習目標

  • SQL インジェクションの問題を回避する方法を理解できる

1. SQLインジェクションとは

  • SQLインジェクション:

簡単に言えば、SQL インジェクションはデータベース内のデータを漏洩する方法であり、悪意のある人がいる場合、SQL インジェクションを使用してデータを盗む可能性があります。

  • 原因:

バックグラウンドでは、ユーザーと SQL によって送信された悪意のあるデータが文字列形式で結合され、SQL ステートメントのセマンティクスに影響を与え、最終的にはデータ漏洩につながります。

簡単に言うと、さまざまな方法でデータをプログラムに送信し、そのデータを SQL ステートメントと組み合わせることで、新しく生成された SQL ステートメントが以前の元の SQL ステートメントとは異なる意味を持つようになり、新しく生成された SQL ステートメントを使用して目的のデータを取得できるようになります。

  • SQLインジェクションを防ぐ

SQL ステートメントのパラメーター化により、SQL インジェクションの発生を防ぐことができます。SQL ステートメントのすべてのデータ パラメーターはリストに格納され、実行のために実行関数の 2 番目のパラメーター (SQL ステートメントのパラメーター化) に渡されます。

python # SQL ステートメントに必要なパラメータをリストに入れます my_list = [xxx,xxx,xxx] # リストを実行メソッドの 2 番目のパラメータとして渡しますcursor.execute(sql,my_list)

2. 安全でない SQL ステートメント

 
 
 
 

from pymysql import connect

# 接続を作成します connection conn = connect(host='localhost', port=3306, user='root',password='mysql',database='jing_dong', charset='utf8') # Cursor オブジェクトを取得します cur = conn.cursor() # ユーザーがクエリしたい項目名を取得しますfind_name
= input("Please enter the item name:" ) # 安全でない SQL ステートメントsql = 'select * from Goods where name="%s"' % find_name # SQL ステートメントを実行 count = cur.execute(sql) # クエリの結果を取得 result = cur.fetchall() # クエリの結果を出力 print(result) #

Cursorオブジェクト
閉じるcur.close ( ) # Connection

オブジェクト閉じるconn.close ( )


















知らせ:

商品名を入力する場合は、

 
 
 
 

# 二重引用符も入力する必要があります
" or 1=1 or "

これで簡単な SQL インジェクションが完了しました

 
 
 
 

# 元の SQL ステートメント
sql = 'select * from Goods where name="%s"' % find_name #
" or 1=1 or " の後に SQL ステートメントを入力
sql = 'select * from Goods where name="" or 1=1 or ""'

ここで、name= "" または 1=1 または "" は、成立しなければならない条件です。or は、1 つの条件が成立する限り複数の条件が成立し、1=1 が成立する必要があることを意味するため、この SQL 文の意味が変わります。

3. セーフ モードでの SQL ステートメント

 
 
 
 

fetchall() # クエリの結果を出力します





























print(result)

# Cursor オブジェクトを閉じる
cur.close()

# Connection オブジェクトを閉じる
conn.close()

SQL インジェクションの防止は、パラメーター化されたリストを使用して実行できます。

要約する

SQLインジェクションの問題

  • リスト内の SQL ステートメントのすべてのデータ パラメーターを実行関数の 2 番目のパラメーターに渡します。

外部キーの使用法

学習目標:

  • データベーステーブルの外部キー制約の役割を理解する

  • 既存のテーブルに外部キー制約を追加する機能

  • テーブル作成時に外部キー制約を追加する機能

1. 外部キー

写真

外部キーの役割を確認してみましょう

  • Goods_cates テーブルと Goods_brands テーブルにそれぞれレコードを挿入します。

 
 
 
 

Goods_cates(名前) の値に挿入 ('ルーター'),('スイッチ'),('ネットワークカード');
商品ブランド(名前) の値に挿入 ('ハイアール'),('清華通芳'),('神州');

  • 商品データテーブルに任意のレコードを書き込みます

写真

 
 
 
 

商品 (name,cate_id,brand_id,price) に挿入
value('LaserJet Pro P1606dn 白黒レーザー プリンター', 12, 4,'1849');

質問: SQL ステートメントの 12 は何を意味しますか? はい、cate_id です すみません: Goods_cates テーブルに id=12 のレコードはありますか? 明らかに違います

写真

  • 全商品の詳細情報を問い合わせる(左表に表示されていないデータを左結合で最終結果に追加)

 
 
 
 

select * from Goods left 結合 Goods_Cates on Goods.cate_id = Goods_kates.id;

問題が見つかりました: cate_id = 12 の SQL ステートメント名によって挿入されたデータに問題があります。

写真

無効な情報の挿入を防ぐには、挿入する前に型名やブランド名が存在するかどうかを判断することはできますか? 前述の外部キーを使用することで解決できます

  • 外部キー制約: 更新および挿入時に、外部キー フィールドの値が参照テーブルのフィールド データと比較されます。

  • キーワード: 外部キー、innodb データベース エンジンのみが外部キー制約をサポートします

2. 既存のフィールドに外部キー制約を追加する

 
 
 
 

-- brand_id 外部
キー (brand_id) 参照を追加し、goods_brands の id を構築します。
-- cate_id 外部
キー (cate_id) 参照を追加し、goods_cates の id を構築します。

-- エラー 1452 (23000): 子行を追加または更新できません: 外部キー制約が失敗しました (`jing_dong`.`#sql-403_5`, CONSTRAINT `#sql-403_5_ibfk_2` FOREIGN KEY (`cate_id`) REFERENCES `goods_cates` (`id`)) -- 给cate_id 追加欠落 -- 発生 1452 問題 -- 問題の原因: 存在しない cate_id 12 が追加されたため、cate_id = 12 の商品から先に削除する必要


あり
ます


テーブル商品を変更する 外部キー (cate_id) 参照を追加します Goods_cates(id);

写真

  • このとき、存在しないブランド(cate_id=12)の商品を再度挿入するとエラーが報告されます。

 
 
 
 

insert into Goods (name,cate_id,brand_id,price)values('LaserJet Pro P1606dn black andwhite laser printer', 12, 4,'1849'); 挿入は失敗し、次のようなエラーが表示されます: エラー 1452 (23000): 子行を追加または更新できません: 外部キー制約が失敗しました (`jing _dong`.`goods`, CONSTRAINT `goods_) ibfk_2` 外部キー (`cate_id`) 参照 `goods_cates` (`id`

)
)

写真

3. データテーブル作成時に外部キー制約を設定する

  • 注: Goods の cate_id のタイプは、goods_cates テーブルの ID のタイプと一致している必要があります。

 
 
 
 

create table Goods(
id int プライマリキー auto_increment not null,
name varchar(40)default '',
Price Decimal(5,2),
cate_id int unsigned,
brand_id int unsigned,
is_show ビットデフォルト 1,
is_saleoff ビットデフォルト 0,
外部キー(cate_id) 参照 Goods_cates(id),
外部キー(brand_id) 参照 Goods_brands(id)
);

4. 外部キー制約を削除する

 
 
 
 


-- 最初に外部キー制約の名前を取得する必要があります。名前はシステムによって自動的に生成されます。テーブル作成ステートメント show create table Goodsを参照して名前を取得できます。 -- 名前を取得した後、名前に従って外部キー制約を削除できます。 alter table Goodsdrop 外部キー外部キー


;

  • 外部キー制約を使用すると、テーブル更新の効率が大幅に低下するため、読み取りおよび書き込みの効率が優先されるシナリオでは、通常、外部キーが使用されることはほとんどありません。

要約する

  • クエリされたデータをテーブルに直接挿入します。  

 
 
 
 

insert into xxx (フィールド名) select ステートメント
select ステートメントの結果セットをテーブルに挿入します。

  • リンクテーブルの更新

 
 
 
 

テーブル1を更新 テーブル2を接続条件で結合
テーブルを設定 フィールド = 値

  • 外部キー制約    

サブテーブルの外部キー フィールドに新しい値を挿入して更新する場合、新しい値がメイン テーブルの対応するフィールドに表示されている必要があります。

ER モデルとテーブル間の関係

学習目標

  • ER モデルのコンポーネントを理解する

  • 生活における1対1、1対多対多の関係の例を挙げることができる

1.ERモデル

  • ER モデルの概要

ERモデルとはER図のことです。

ER 図はエンティティ関係図 (Entity Relationship Diagram) であり、エンティティの種類、属性、接続を表現する方法を提供し、現実世界の概念モデルを記述するために使用されます。中国系アメリカ人のコンピューター科学者ピーター・チェンによって発明されました。

  • ER モデルの使用シナリオ

  • リレーショナル データベースのリレーショナル モデルに基づいて、プロダクト マネージャーの設計計画に従ってモデルと関係を抽出し、テーブル構造を定式化する必要があります。これがプロジェクトの最初のステップです。

  • 設計段階では、通常、ER モデルがモデリングに使用されます。パワーデザイナー、データベースデザイナーなど、データベースを設計するためのソフトウェアは数多くあります。これらのソフトウェアは、エンティティとエンティティの関係を視覚的に確認できます。

  • データベースの設計は、専任のデータベース設計者が行う場合もあれば、開発チームのメンバーが行う場合もあり、通常はプロジェクト マネージャーがチームを率いて完成させます。

  • 設計が完了したら、ER モデルはリレーショナル モデルに変換されます。

写真

  • ER モデルのコンポーネント

写真

ER 図は、エンティティ、接続、属性の 3 つの概念を使用して実際の問題を記述しており、次の 3 つの要素があります。

  • エンティティ: 同じ属性を持つエンティティは、同じ特性とプロパティを持ちます。エンティティ名とその属性名のコレクションは、同様のエンティティを抽象化して説明するために使用されます。エンティティは ER 図では四角形で表され、エンティティ名は四角形のボックス内に書き込まれます。たとえば、電子商取引ショッピング システムのユーザー、ショッピング カート、注文などはすべてエンティティです。

  • 属性: エンティティの特定の特性。エンティティは、いくつかの属性によって特徴付けることができます。ER図では楕円で表現され、対応するエンティティと無向辺で結ばれており、例えばユーザーのID、ユーザー名、パスワード、ニックネーム、ID番号などはすべて属性となります。

  • 関係: エンティティが互いに接続される方法は関係と呼ばれ、リレーションシップとも呼ばれます。

 
 
 
 

エンティティ: 長方形で表され、エンティティ名でマークされます。

属性: 楕円で表され、属性の名前でマークされます。 関係

: ひし形で表され、関係の名前でマークされます。

連絡先は、1 対 1、1 対多、多対多の 3 つのタイプに分類できます。

  • リレーションシップもデータの一種であり、フィールドを通じてテーブルに保存する必要があります。

  • エンティティ A とエンティティ B は 1 対 1 であり、テーブル A またはテーブル B にフィールドを作成して、他のテーブルの主キー値を格納します。

写真

  • エンティティ A はエンティティ B に対して 1 対多です。テーブル A の主キー値を格納するフィールドをテーブル B に作成します。

写真

  • エンティティ A はエンティティ B に対して多対多です。新しいテーブル C を作成します。このテーブルにはフィールドが 2 つだけあり、1 つは A の主キー値の格納に使用され、もう 1 つは B の主キー値の格納に使用されます。

写真

要約する

  • パラダイムは、データベースを設計するための一般的な仕様です。

  • ER 図はエンティティ、属性、エンティティ間の接続で構成され、主にデータベース内のテーブル構造を記述するために使用されます。

おすすめ

転載: blog.csdn.net/Blue92120/article/details/131822129