カテゴリ: Go言語 更新日: 2026/04/04

Go言語のSQLインジェクション対策!安全なDB操作例とセキュアなデータベース処理を初心者向けに解説

Go言語のSQLインジェクション対策!安全なDB操作例
Go言語のSQLインジェクション対策!安全なDB操作例

先生と生徒の会話形式で理解しよう

生徒

「Go言語でデータベースを使うときに、SQLインジェクションってよく聞くんですが、何が危険なんですか?」

先生

「SQLインジェクションは、悪意のある入力を利用してデータベースを不正操作する攻撃のことです。例えばログインフォームなどから不正なSQLを送り込むことで、データの閲覧や削除ができてしまう場合があります。」

生徒

「そんなことができてしまうんですか?Go言語でも気をつけないといけませんね。」

先生

「その通りです。Go言語は安全な設計がされていますが、データベース操作の書き方を間違えるとSQLインジェクションの原因になります。今回は初心者でも分かるように、安全なDB操作方法を学んでいきましょう。」

生徒

「Go言語の安全なSQLの書き方を知りたいです。」

先生

「では、SQLインジェクションの仕組みとGo言語での対策を順番に解説していきます。」

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

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

SQLインジェクションとは、Webアプリケーションやシステムに入力された文字列を利用して、不正なSQL文をデータベースに実行させる攻撃です。

SQLとは、データベースを操作するための言語です。例えばユーザー情報を検索する場合、次のようなSQL文が使われます。

SELECT * FROM users WHERE name = 'taro';

しかし、ユーザー入力をそのままSQL文に組み込むと、攻撃者が特殊な文字列を入力することで、データベースの動作を変えることができます。

例えば、ログインフォームに次のような入力が送られたとします。

' OR '1'='1

この文字列がSQL文にそのまま入ると、条件が常に成立してしまい、本来ログインできないユーザーでもログインできてしまうことがあります。

このような攻撃がSQLインジェクションです。Webセキュリティの基本として、必ず対策が必要になります。

2. Go言語でSQLインジェクションが起きる危険な書き方

2. Go言語でSQLインジェクションが起きる危険な書き方
2. Go言語でSQLインジェクションが起きる危険な書き方

まずは初心者がやりがちな危険なSQLの書き方を見てみましょう。これは文字列を結合してSQL文を作っている例です。


query := "SELECT * FROM users WHERE name = '" + username + "'"

rows, err := db.Query(query)
if err != nil {
    panic(err)
}

このコードでは、usernameというユーザー入力をそのままSQL文に結合しています。

もし攻撃者が次のような入力をするとどうなるでしょうか。


' OR '1'='1

するとSQL文は次のようになります。

SELECT * FROM users WHERE name = '' OR '1'='1'

この条件は必ず成立するため、すべてのユーザー情報が取得されてしまいます。これがSQLインジェクションの典型例です。

つまり、ユーザー入力を文字列結合でSQLに入れるのは非常に危険です。

3. Go言語の安全なSQL実行方法 プレースホルダを使う

3. Go言語の安全なSQL実行方法 プレースホルダを使う
3. Go言語の安全なSQL実行方法 プレースホルダを使う

Go言語ではSQLインジェクションを防ぐために、プレースホルダという仕組みを使います。

プレースホルダとは、SQL文の中に値の代わりとして置いておく記号のことです。実際の値は後から安全に埋め込まれます。

Go言語のdatabase/sqlパッケージでは、次のように書くことで安全にSQLを実行できます。


query := "SELECT * FROM users WHERE name = ?"

rows, err := db.Query(query, username)
if err != nil {
    panic(err)
}

この書き方では、usernameの値はSQL文としてではなく、単なるデータとして扱われます。

つまり、もしユーザーが特殊な文字列を入力しても、SQLの構造を壊すことができません。

これがSQLインジェクション対策の基本であり、Go言語のデータベース操作では必ず覚えておきたい重要なポイントです。

4. Go言語で安全にデータを取得する例

4. Go言語で安全にデータを取得する例
4. Go言語で安全にデータを取得する例

次は、データベースからユーザー情報を取得する安全なサンプルプログラムを見てみましょう。


var name string
var age int

query := "SELECT name, age FROM users WHERE id = ?"

err := db.QueryRow(query, 1).Scan(&name, &age)
if err != nil {
    panic(err)
}

fmt.Println(name, age)

QueryRowは1件のデータを取得するためのメソッドです。Scanは取得したデータを変数に代入します。

ここでもSQL文にはプレースホルダが使われているため、SQLインジェクションの危険はありません。

このようにGo言語では、SQLとデータを分離して処理することで安全なデータベース操作が実現できます。

5. INSERT文でもSQLインジェクション対策をする

5. INSERT文でもSQLインジェクション対策をする
5. INSERT文でもSQLインジェクション対策をする

SQLインジェクションは検索だけではなく、データ登録でも発生する可能性があります。

例えばユーザー登録フォームの入力をそのままSQLに入れてしまうと、不正なSQLが実行される可能性があります。

安全な書き方は次の通りです。


query := "INSERT INTO users(name, age) VALUES(?, ?)"

_, err := db.Exec(query, "taro", 20)
if err != nil {
    panic(err)
}

fmt.Println("ユーザー登録が完了しました")

ExecはINSERTやUPDATEなど、結果の行データが必要ないSQLを実行するときに使います。

プレースホルダを使っているため、ユーザー入力が安全に処理されます。

6. PreparedStatementを使ったより安全な方法

6. PreparedStatementを使ったより安全な方法
6. PreparedStatementを使ったより安全な方法

Go言語ではPreparedStatementという仕組みも使えます。

PreparedStatementとは、あらかじめSQL文の構造を準備しておき、後から値だけを安全に渡す方法です。大量のSQL実行でも効率が良く、セキュリティ面でも安全です。


stmt, err := db.Prepare("SELECT name FROM users WHERE id = ?")
if err != nil {
    panic(err)
}

defer stmt.Close()

var name string

err = stmt.QueryRow(1).Scan(&name)
if err != nil {
    panic(err)
}

fmt.Println(name)

PrepareでSQL文を準備し、QueryRowで値を渡しています。

この方法でもユーザー入力はSQLとして解釈されないため、安全なデータベース操作が可能になります。

7. SQLインジェクション対策の重要ポイント

7. SQLインジェクション対策の重要ポイント
7. SQLインジェクション対策の重要ポイント

Go言語で安全なデータベース操作を行うためには、いくつかの基本ルールがあります。

一つ目は、ユーザー入力をSQL文に直接連結しないことです。文字列結合によるSQL生成は、SQLインジェクションの最大の原因です。

二つ目は、必ずプレースホルダを使用することです。database/sqlパッケージはこの仕組みによってSQLとデータを分離し、安全な実行を行います。

三つ目は、PreparedStatementを活用することです。これはセキュリティとパフォーマンスの両方を向上させる方法です。

SQLインジェクションはWebアプリケーションの代表的な脆弱性の一つです。しかしGo言語の正しいDB操作方法を理解していれば、簡単に防ぐことができます。

安全なプログラムを書くためには、入力値を信用しないという考え方がとても重要です。ユーザー入力は必ず検証し、安全なSQL実行方法を使うことが、セキュリティ対策の基本になります。

Go言語を基礎からスッキリ学びたい人や、 文法だけでなく「実用的な使い方」まで押さえたい人には、 定番の入門書がこちらです。

基礎からわかるGo言語をAmazonで見る

※ Amazon広告リンク

まとめ

まとめ
まとめ

Go言語で安全なデータベース操作を行うための基本理解

ここまで、Go言語におけるSQLインジェクション対策と安全なデータベース操作について解説してきました。Webアプリケーション開発やシステム開発において、データベース操作は非常に重要な処理の一つです。しかし、ユーザー入力をそのままSQL文に組み込むような実装を行ってしまうと、SQLインジェクションという重大なセキュリティ問題を引き起こす可能性があります。

SQLインジェクションとは、悪意のあるユーザーが入力フォームやAPIのパラメータなどに不正な文字列を入力し、それを利用してデータベースを不正に操作する攻撃手法です。例えばユーザー認証機能、ログイン機能、検索機能、ユーザー登録機能など、多くのWebアプリケーションではユーザー入力を使ってSQL文を生成する場面があります。このとき文字列連結でSQLを作成すると、SQL構文が改ざんされる危険があります。

Go言語ではdatabase sqlパッケージを利用することで、安全なデータベースアクセスを実装することができます。特に重要なのがプレースホルダの利用です。プレースホルダを使うことで、SQL文の構造とユーザー入力データを完全に分離して処理できます。これにより、ユーザーがどのような文字列を入力しても、それがSQL構文として解釈されることはなく、安全に処理されます。

また、QueryRowやQuery、Execなどのメソッドを適切に使い分けることも重要です。データを取得する場合はQueryまたはQueryRowを使用し、データ登録や更新などの処理ではExecを使用します。さらに、大量のSQL処理を行う場合やパフォーマンスを意識する場合にはPreparedStatementを利用することで、安全性と処理効率の両方を高めることができます。

SQLインジェクションを防ぐための重要ポイント

Go言語のWebアプリケーション開発において、SQLインジェクション対策として覚えておくべきポイントはいくつかあります。まず第一に、ユーザー入力をSQL文に直接連結してはいけません。文字列結合によるSQL生成は、セキュリティの観点から非常に危険な実装です。開発初期の段階から安全な書き方を習慣化することが重要です。

次に、必ずプレースホルダを使用してSQL文を記述することです。Go言語では疑問符を使用してプレースホルダを定義し、QueryやExecの引数として値を渡すことで安全なSQL実行が可能になります。この方法はGo言語のデータベースプログラミングの基本となるため、初心者のうちから確実に理解しておく必要があります。

さらに、PreparedStatementを利用することで、SQL文をあらかじめ準備し、値だけを後から渡すという安全な実行方法を実現できます。これはセキュリティ対策だけでなく、パフォーマンス改善にもつながるため、実務開発でも広く利用されている手法です。

また、入力値検証やデータバリデーションを組み合わせることで、より強固なセキュリティ対策を実現できます。例えばユーザー名の文字数制限、数値データの範囲チェック、メールアドレスの形式チェックなどを行うことで、アプリケーション全体の安全性が向上します。

Go言語の安全なDB操作サンプル

最後に、Go言語で安全なSQL実行を行う簡単なサンプルコードを確認しておきましょう。プレースホルダを使用した安全なユーザー検索処理の例です。


package main

import (
    "database/sql"
    "fmt"
)

func findUser(db *sql.DB, username string) {
    query := "SELECT name, age FROM users WHERE name = ?"

    var name string
    var age int

    err := db.QueryRow(query, username).Scan(&name, &age)
    if err != nil {
        panic(err)
    }

    fmt.Println(name, age)
}

このプログラムではユーザー名を検索条件としてデータベースからユーザー情報を取得しています。SQL文の中にはプレースホルダが使用されているため、ユーザーがどのような文字列を入力したとしてもSQLインジェクションは発生しません。

Go言語のdatabase sqlパッケージを正しく理解し、安全なSQL実行方法を習慣化することで、Webアプリケーションのセキュリティレベルを大きく向上させることができます。Go言語によるバックエンド開発、APIサーバー開発、Webサービス開発では、今回紹介したSQLインジェクション対策を必ず実装するようにしましょう。

先生と生徒の振り返り会話

生徒

今日の内容を振り返ると、SQLインジェクションはユーザー入力をそのままSQL文に入れてしまうことで発生する危険な攻撃だということが分かりました。Go言語でも安全な書き方をしないと、データベースが不正に操作される可能性があるんですね。

先生

その通りです。Webアプリケーション開発ではデータベース操作が必ず登場します。そしてSQLインジェクションは最も有名なセキュリティ脆弱性の一つです。Go言語ではdatabase sqlパッケージを使い、プレースホルダを利用することで安全なSQL実行ができます。

生徒

文字列結合でSQLを書くのは危険で、必ずプレースホルダを使うことが重要なんですね。QueryRowやExecの使い方も理解できました。

先生

さらにPreparedStatementを使うことで、安全性とパフォーマンスを両立できます。Go言語のデータベースプログラミングでは、SQL構造と入力データを分離するという考え方がとても重要です。

生徒

なるほど。ユーザー入力は信頼せず、必ず安全な方法でデータベース操作を行うことが大切なんですね。Go言語でWebアプリケーションを作るときは、今回学んだSQLインジェクション対策を必ず使うようにします。

先生

とても良い理解です。安全なSQL実行、入力値検証、セキュリティを意識したコーディングを習慣化することで、信頼性の高いGo言語アプリケーションを作ることができます。これからも安全なプログラミングを意識して開発を続けていきましょう。

関連セミナーのご案内

【超入門】ゼロから始めるGo言語プログラミング:最速で「動くアプリ」を作るマンツーマン指導

「プログラミングの仕組み」が根本からわかる。Go言語でバックエンド開発の第一歩を。

本講座を受講することで、単なる文法の暗記ではなく、「プログラムがコンピュータの中でどう動いているか」という本質的な理解につながります。シンプルながら強力なGo言語(Golang)を通じて、現代のバックエンドエンジニアに求められる基礎体力を最短距離で身につけます。

具体的な開発内容と環境

【つくるもの】
ターミナル(黒い画面)上で動作する「対話型計算プログラム」や、データを整理して表示する「ミニ・ツール」をゼロから作成します。自分の書いたコードが形になる感動を体験してください。

【開発環境】
プロの現場でシェアNo.1のVisual Studio Code (VS Code)を使用します。インストールから日本語化、Go言語用の拡張機能設定まで、現場基準の環境を一緒に構築します。

この60分で得られる3つの理解

1. 環境構築の完全な理解

「なぜ動くのか」という設定の仕組みを理解し、今後の独学で詰まらない土台を作ります。

2. Go言語の基本構造(変数・型)

データの種類やメモリの概念など、他言語にも通じるプログラミングの本質を学びます。

3. 読みやすいコードの書き方

ただ動くだけでなく、誰が見ても分かりやすい「綺麗なコード」を書くための考え方を伝授します。

※本講座は、将来的にバックエンドエンジニアクラウドインフラに興味がある未経験者のためのエントリー講座です。マンツーマン形式により、あなたの理解度に合わせて進行します。

セミナー画像

初めてのGo言語を一緒に学びましょう!

カテゴリの一覧へ
新着記事
New1
Kotlin
Kotlinでリストやマップを簡単にループ処理する方法!初心者でもわかる繰り返しの基本
New2
Go言語
Go言語のSQLインジェクション対策!安全なDB操作例とセキュアなデータベース処理を初心者向けに解説
New3
Go言語
Go言語の構造体リテラルの書き方と便利な使い方
New4
Swift
Swiftの配列(Array)入門|初期化・追加・削除・検索の基本をやさしく解説!
人気記事
No.1
Java&Spring記事人気No1
Kotlin
Android Studioのインストール手順と初期設定を初心者向けに完全解説!
No.2
Java&Spring記事人気No2
Swift
Swift Playgroundの使い方を完全解説!初心者に最適な学習環境の始め方
No.3
Java&Spring記事人気No3
Kotlin
Gradleファイル(build.gradle.kts)の書き方と役割をやさしく解説!Kotlin初心者向け完全ガイド
No.4
Java&Spring記事人気No4
Swift
Swift開発環境の構築方法を徹底解説!Xcode・Windows・Linux対応
No.5
Java&Spring記事人気No5
Kotlin
Kotlinで画面を作る!レイアウトXMLとビューの基本操作をやさしく解説
No.6
Java&Spring記事人気No6
Kotlin
Kotlinのデータクラス(data class)とは?便利な特徴と使い方を初心者向けにやさしく解説!
No.7
Java&Spring記事人気No7
Go言語
Go言語の構造体タグ(jsonタグなど)の使い方と活用例を初心者向けにやさしく解説
No.8
Java&Spring記事人気No8
Kotlin
KotlinのAPI通信でPOSTリクエストを送る方法!初心者向け徹底ガイド