安全な Golang データベース インタラクション: SQL インジェクションの防止
今日の開発環(huán)境では、安全なコーディングの実踐が最も重要です。 この記事では、データベースと対話する際の一般的な脅威である SQL インジェクションの脆弱性から Golang アプリケーションを保護(hù)することに焦點を當(dāng)てています。生の SQL とオブジェクト リレーショナル マッピング (ORM) フレームワークの両方を使用した防止手法を検討します。
SQL インジェクションについて
SQL インジェクション (SQLi) は、Web セキュリティの重大な欠陥です。 攻撃者は、悪意のある SQL コードをデータベース クエリに挿入することでこれを悪用し、データの整合性とアプリケーションのセキュリティを侵害する可能性があります。
脆弱なクエリの例:
query := "SELECT * FROM users WHERE username='" + username + "' AND password='" + password + "'" rows, err := db.Query(query)
username
または password
への悪意のある入力により、クエリのロジックが変更される可能性があります。
SQL インジェクションについてさらに詳しく理解するには、この他の投稿を參照してください。
生の SQL クエリの保護(hù)
SQL を直接操作する場合は、次のセキュリティ対策を優(yōu)先してください:
1.プリペアド ステートメント: Go の database/sql
パッケージは、SQLi に対する重要な防御手段であるプリペアド ステートメントを提供します。
脆弱な例:
query := "SELECT * FROM users WHERE username='" + username + "' AND password='" + password + "'" rows, err := db.Query(query) // Vulnerable to SQL injection
安全なバージョン (準(zhǔn)備されたステートメント):
query := "SELECT * FROM users WHERE username = ? AND password = ?" rows, err := db.Query(query, username, password) if err != nil { log.Fatal(err) }
準(zhǔn)備されたステートメントはユーザー入力を自動的にエスケープし、インジェクションを防ぎます。
2.パラメーター化されたクエリ: パラメーター化されたクエリのプレースホルダーには db.Query
または db.Exec
を使用します:
query := "INSERT INTO products (name, price) VALUES (?, ?)" _, err := db.Exec(query, productName, productPrice) if err != nil { log.Fatal(err) }
動的クエリの場合は文字列の連結(jié)または fmt.Sprintf
を避けてください。
3. QueryRow
単一レコードの場合: 単一行の取得の場合、QueryRow
によりリスクが最小限に抑えられます:
query := "SELECT id, name FROM users WHERE email = ?" var id int var name string err := db.QueryRow(query, email).Scan(&id, &name) if err != nil { log.Fatal(err) }
4.入力の検証とサニタイズ: 準(zhǔn)備されたステートメントを使用する場合でも、入力を検証してサニタイズします:
- サニタイズ: 不要な文字を削除します。
- 検証: 入力形式、タイプ、長さをチェックします。
入力検証の例:
func isValidUsername(username string) bool { re := regexp.MustCompile(`^[a-zA-Z0-9_]+$`) return re.MatchString(username) } if len(username) > 50 || !isValidUsername(username) { log.Fatal("Invalid input") }
5.ストアド プロシージャ: データベース ストアド プロシージャ內(nèi)にクエリ ロジックをカプセル化します:
CREATE PROCEDURE AuthenticateUser(IN username VARCHAR(50), IN password VARCHAR(50)) BEGIN SELECT * FROM users WHERE username = username AND password = password; END;
Go からの呼び出し:
_, err := db.Exec("CALL AuthenticateUser(?, ?)", username, password) if err != nil { log.Fatal(err) }
ORM による SQL インジェクションの防止
GORM や XORM などの ORM はデータベースのやり取りを簡素化しますが、安全な方法が依然として重要です。
1.ゴーム:
脆弱な例 (動的クエリ):
db.Raw("SELECT * FROM users WHERE name = '" + userName + "'").Scan(&user)
安全な例 (パラメータ化されたクエリ):
db.Raw("SELECT * FROM users WHERE name = ? AND email = ?", userName, email).Scan(&user)
GORM の Raw
メソッドはプレースホルダーをサポートしています。 Where
:
query := "SELECT * FROM users WHERE username='" + username + "' AND password='" + password + "'" rows, err := db.Query(query)
2.複雑なクエリでは生の SQL を避ける: 複雑な生のクエリでもプレースホルダーを使用します。
3.安全なマッピングのための構(gòu)造體タグ: 安全な ORM マッピングのための構(gòu)造體タグを使用します:
query := "SELECT * FROM users WHERE username='" + username + "' AND password='" + password + "'" rows, err := db.Query(query) // Vulnerable to SQL injection
避けるべきよくある間違い:
- クエリでは文字列の連結(jié)を避けてください。
- 安全性チェックをバイパスする ORM 機能を回避します。
- 検証なしのユーザー入力を決して信頼しないでください。
結(jié)論
Golang は、安全なデータベース対話のための強力なツールを提供します。 準(zhǔn)備されたステートメント、パラメーター化されたクエリ、ORM を正しく使用し、ユーザー入力を入念に検証してサニタイズすることで、SQL インジェクションの脆弱性のリスクを大幅に軽減できます。
次の方法で私と連絡(luò)を取ってください:
- リンクトイン
- GitHub
- ツイッター/X
以上がGolang での生の SQL と ORM による SQL インジェクションの防止の詳細(xì)內(nèi)容です。詳細(xì)については、PHP 中國語 Web サイトの他の関連記事を參照してください。

ホットAIツール

Undress AI Tool
脫衣畫像を無料で

Undresser.AI Undress
リアルなヌード寫真を作成する AI 搭載アプリ

AI Clothes Remover
寫真から衣服を削除するオンライン AI ツール。

Clothoff.io
AI衣類リムーバー

Video Face Swap
完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中國語版
中國語版、とても使いやすい

ゼンドスタジオ 13.0.1
強力な PHP 統(tǒng)合開発環(huán)境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

ホットトピック

Golangofferssuperiorporformance、nativeconconcurrencyviagoroutines、および効率的なresourceusage、makingitidealforhigh-raffic、low-latencyapis;

Golangは主にバックエンド開発に使用されますが、フロントエンドフィールドで間接的な役割を果たすこともできます。その設(shè)計目標(biāo)は、高性能、同時処理、システムレベルのプログラミングに焦點を當(dāng)てており、APIサーバー、マイクロサービス、分散システム、データベース操作、CLIツールなどのバックエンドアプリケーションの構(gòu)築に適しています。 GolangはWebフロントエンドの主流言語ではありませんが、Gopherjsを介してJavaScriptにコンパイルしたり、Tinygoを介してWebAssemblyで実行したり、テンプレートエンジンを備えたHTMLページを生成してフロントエンド開発に參加できます。ただし、最新のフロントエンド開発は、JavaScript/TypeScriptとそのエコシステムに依存する必要があります。したがって、Golangは、コアとして高性能バックエンドを備えたテクノロジースタック選択により適しています。

GOでGraphQlapiを構(gòu)築するには、GQLGenライブラリを使用して開発効率を向上させることをお勧めします。 1.最初に、スキーマに基づいた自動コード生成をサポートするGQLGENなどの適切なライブラリを選択します。 2。次に、graphqlschemaを定義し、投稿の種類やクエリメソッドの定義など、API構(gòu)造とクエリポータルを説明します。 3。次に、プロジェクトを初期化し、基本コードを生成して、リゾルバにビジネスロジックを?qū)g裝します。 4.最後に、graphqlhandlerをhttpserverに接続し、組み込みの遊び場を介してAPIをテストします。メモには、プロジェクトのメンテナンスを確保するためのフィールドネーミング仕様、エラー処理、パフォーマンスの最適化、セキュリティ設(shè)定が含まれます

GOをインストールするための鍵は、正しいバージョンを選択し、環(huán)境変數(shù)を構(gòu)成し、インストールを検証することです。 1.公式Webサイトにアクセスして、対応するシステムのインストールパッケージをダウンロードします。 Windowsは.msiファイルを使用し、macosは.pkgファイルを使用し、Linuxは.tar.gzファイルを使用し、 /usr /localディレクトリに解凍します。 2.環(huán)境変數(shù)を構(gòu)成し、linux/macOSで?/.bashrcまたは?/.zshrcを編集してパスとgopathを追加し、Windowsがシステムプロパティに移動するパスを設(shè)定します。 3.政府コマンドを使用してインストールを確認(rèn)し、テストプログラムを?qū)g行してhello.goを?qū)g行して、編集と実行が正常であることを確認(rèn)します。プロセス全體のパス設(shè)定とループ

Golangは通常、Webサービスを構(gòu)築するときにPythonよりもCPUとメモリを消費します。 1. GolangのGoroutineモデルは、スケジューリングに効率的であり、強力なリクエスト処理機能を備えており、CPUの使用量が少ない。 2。GOはネイティブコードにコンパイルされ、ランタイム中に仮想マシンに依存せず、メモリの使用量が小さくなります。 3. Pythonは、GILと解釈実行メカニズムのために、同時シナリオでより大きなCPUとメモリオーバーヘッドを持っています。 4. Pythonには高い開発効率と豊富なエコシステムがありますが、低リソースを消費します。これは、並行性要件が低いシナリオに適しています。

sync.waitgroupは、ゴルチンのグループがタスクを完了するのを待つために使用されます。そのコアは、3つの方法で協(xié)力することです。追加、完了、待機です。 1.ADD(n)待機するゴルチンの數(shù)を設(shè)定します。 2.done()は各ゴルチンの端で呼び出され、カウントは1つ減少します。 3.wait()すべてのタスクが完了するまでメインコルーチンをブロックします。使用する場合は、注意してください。Goroutineの外部で追加する必要があります。重複を避け、Donが呼び出されていることを確認(rèn)してください。 Deferで使用することをお勧めします。これは、Webページの同時クロール、バッチデータ処理、その他のシナリオで一般的であり、並行性プロセスを効果的に制御できます。

Goの埋め込みパッケージを使用すると、靜的リソースをバイナリに簡単に埋め込み、Webサービスに適しており、HTML、CSS、寫真、その他のファイルをパッケージ化できます。 1。追加する埋め込みリソースを宣言します// go:embed comment hello.txtを埋め込むなど、変數(shù)の前に埋め込みます。 2。static/*などのディレクトリ全體に埋め込み、embed.fsを介してマルチファイルパッケージを?qū)g現(xiàn)できます。 3.効率を改善するために、ビルドタグまたは環(huán)境変數(shù)を介してディスクロードモードを切り替えることをお勧めします。 4.パスの精度、ファイルサイズの制限、埋め込みリソースの読み取り専用特性に注意してください。埋め込みの合理的な使用は、展開を簡素化し、プロジェクト構(gòu)造を最適化することができます。

COOSIONGOOSIONGOOSIONGOOSIONGOOSIONGOOSIONGONDPYTHONFORCODEREADANIVERATIONALIGHT、theSecisionHingSonteampriolities.1.GolangOfferStrictStrictConsinceWithMinimal、意見を述べたsyntaxandaxandaxandaxandisinglikelikelikegofmt、enuringuniformcodestylecection.2.pythertection.2
