質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

セキュリティー

このタグは、コンピューターシステムの安全性やデータの機密性に関連したトピックの為に使われます。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

2回答

4430閲覧

PHP SQLインジェクション対策について

K_T_T_K

総合スコア231

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

セキュリティー

このタグは、コンピューターシステムの安全性やデータの機密性に関連したトピックの為に使われます。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

0グッド

2クリップ

投稿2014/10/25 12:48

PHP・Mysqlを使用してSQLインジェクションについての質問です。

SQLインジェクション対策について皆様はどのようなコードを書いておられるでしょうか?

SQLインジェクションはエスケープをして対策をするかと思いますが、どの関数などを使い
どんなコードを書いていますでしょうか?

たとえば、以下を使うのが良いでしょうか?
http://php.net/manual/ja/pdo.quote.php

皆様のSQLインジェクションの対策を教えてください。

宜しくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

初めまして、K_T_T_Kさん。
解答失礼いたします。

SQLインジェクション対策のコードをどのようにしているかとのことですが、
私もTaMaMhyuさんと同じでPDOとbindParamを主に利用していますね。

bindParamでは少しコードが冗長になってしまいますので
値の数が少ない場合は配列で直接渡してしまう事もあります。

プリペアドステートメントを使い、プレースホルダーで値をセットする場合は
PHP側で自動的にエスケープ処理をしてくれますので、便利ですね。

bindParamを用いない場合

lang

1<?php 2 // 例:ユーザーが他のユーザーのIDを入力してデータを取得するプログラム 3 $pdo = new PDO(DSN, DB_USER, DB_PASSWORD); 4 5 $user_id = $_POST["user_id"]; 6 7 $sql = "SELECT * FROM users WHERE `user_id` = :user_id"; 8 $stmt = $pdo->prepare($sql); 9 $params = array(":user_id",$user_id); 10 11 $stmt->execute($params); 12?>

bindParamを用いる場合

lang

1<?php 2 // 例:ユーザーが他のユーザーのIDを入力してデータを取得するプログラム 3 $pdo = new PDO(DSN, DB_USER, DB_PASSWORD); 4 5 $user_id = $_POST["user_id"]; 6 7 $sql = "SELECT * FROM users WHERE `user_id` = :user_id"; 8 $stmt = $pdo->prepare($sql); 9 $stmt->bindParam(":user_id",$user_id); 10 11 $stmt->execute(); 12?>

bindParamを使う上での注意点(LIMIT句)

lang

1<?php 2 // 例:新規登録したユーザーを入力された数値分、表示するプログラム 3 $pdo = new PDO(DSN, DB_USER, DB_PASSWORD); 4 5 $limit = $_POST["limit"]; 6 7 $sql = "SELECT * FROM users ORDER BY created DESC LIMIT 0, :limit"; 8 $stmt = $pdo->prepare($sql); 9 $stmt->bindParam(":limit",$limit,PDO::PARAM_INT); 10 11 $stmt->execute(); 12?>

投稿2014/10/27 06:28

rui3718

総合スコア113

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

K_T_T_K

2014/10/27 10:35

はじめまして、rui3718様。 詳しい回答ありがとうございます! サンプルコードありがとうございます! >プリペアドステートメントを使い、プレースホルダーで値をセットする場合は PHP側で自動的にエスケープ処理をしてくれますので、便利ですね なるほど! 参考になります!
rui3718

2014/10/27 13:38

K_T_T_Kさん、ありがとうございます。 サンプルコードのところに、bindParamを使った場合の サンプルコードを足しておきました。 それとSQLインジェクションとは直接的関係はありませんし、 蛇足もしれませんが、bindParamを使う上での 注意しなければいけない点がありますので、そちらも追記しておきました。 bindParamで変数とパラメータを紐つける際に、明示的に変数の型を指定してあげないと、予期せぬエラーを起こしてしまう場合があります。 その中で代表的な例がMySQLのLIMIT句への紐付けで、数値として明示的に指定してあげないと、エラーを起こして、そもそもSQL文が実行できなかったりしてしまいます。 もし、SQL文にもエラーは見当たらないし、変数とパラメータの名前があっている場合は、変数とパラメータの方を疑ってみると解決するかもしれません。
guest

0

PDOであればbindValueを使っています。
LIKE句には別の対応も必要だったと思いますが…
フレームワークを使う場合はフレームワークがだいたいやってくれるのであまり気にしていません。

投稿2014/10/25 12:58

TaMaMhyu

総合スコア1356

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

TaMaMhyu

2014/10/25 13:59

LIKE句については趣旨がずれる話(SQLインジェクション以前の問題)なのですが、何もしないと、検索機能として機能不全(特定の文字列が検索できない)になってしまう問題があります。 この辺の情報が参考になるでしょうか。 http://qiita.com/mpyw/items/b00b72c5c95aac573b71#2-5
K_T_T_K

2014/10/25 23:32

TaMaMhyu様 >何もしないと、検索機能として機能不全(特定の文字列が検索できない)になってしまう問題があります。 なるほど。 そういう事でしたか。 参考になる記事の紹介ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問