[Security]「SQLインジェクション対策」を理解するときに読むべきサイト

『よくわかるPHPの教科書』の著者 徳丸浩氏のブログを参考にして、「SQLインジェクション対策」を理解するときに読むべき記事を自分用にまとめました。

・参考:「SQLインジェクション対策」でGoogle検索して上位15記事を検証した – ockeghem(徳丸浩)の日記 はてなブックマーク - 「SQLインジェクション対策」でGoogle検索して上位15記事を検証した - ockeghem(徳丸浩)の日記

まず、上記記事のまとめ部分から抜粋。

  • SQLを動的に組み立てない
  • SQLのパラメータ指定には静的プレースホルダを用いる

この2つを守っている限り、アプリケーションやSQL呼び出しライブラリなどにバグがあっても、原理的にSQLインジェクション脆弱性は発生しません。

SQLインジェクションについて書くときに以下のメッセージを必ず含めて欲しいです。

  • 単にプリペアドステートメントを使え
  • 絶対に文字列結合でSQLを構築しようとしてはいけない
  • IPAの「安全なSQLの呼び出し方」を読むこと

引用元:[SQLインジェクション対策]Webアプリケーションとかの入門本みたいのを書く人への心からのお願い。 – *「ふっかつのじゅもんがちがいます。」withぬこ

プリペアドステートメントって何?って方はココら辺に分かりやすく書いてあるのでおすすめ。

プリペアドステートメント – データベース接続(PEAR::DB) – PEAR入門 はてなブックマーク - プリペアドステートメント - データベース接続(PEAR::DB) - PEAR入門

PHP: プリペアドステートメントおよびストアドプロシージャ – Manual はてなブックマーク - PHP: プリペアドステートメントおよびストアドプロシージャ - Manual
 

以下、「SQLインジェクション対策」を理解するときに読みたい記事たち。

・初心者向け:[SQLインジェクション対策]Webアプリケーションとかの入門本みたいのを書く人への心からのお願い。 – *「ふっかつのじゅもんがちがいます。」withぬこ はてなブックマーク - [SQLインジェクション対策]Webアプリケーションとかの入門本みたいのを書く人への心からのお願い。 - *「ふっかつのじゅもんがちがいます。」withぬこ

・中級者向け:PHPでのSQLインジェクション対策 – エスケープ・クォート編 — Let’s Postgres はてなブックマーク - PHPでのSQLインジェクション対策 - エスケープ・クォート編 — Let's Postgres

基本を抑えたら、IPAの「安全なSQLの呼び出し方」を読む。

情報処理推進機構:情報セキュリティ:脆弱性対策:安全なウェブサイトの作り方 はてなブックマーク - 情報処理推進機構:情報セキュリティ:脆弱性対策:安全なウェブサイトの作り方

以上です。

[Symfony] Apache標準の404 Not Found が表示されるので mod_rewrite を有効にする

Symfony 1.4 にて、prod環境にするとApache標準の404 Not Found が表示されるという症状に陥りました。

Apache の mod_rewrite を有効にすることで解決したので、その手順をメモ。

他にもdev環境からprod環境へ切り替えると動作しない時の対処方法があるみたいなので、困ったら下記の記事を読みましょう。

dev環境からprod環境に変えると動かなくなる時の対処方法 « symfonyで開発日記 はてなブックマーク - dev環境からprod環境に変えると動かなくなる時の対処方法 « symfonyで開発日記

今回の症状は、

http://example.com/index.php/login
http://example.com/frontend_dev.php/login

とかだとアクセスできるけど、

http://example.com/login

だとアクセスできない状態でした。
 

Apache の mod_rewrite が有効か確認する

まず、mod_rewrite が有効になっているか確認するには、apachectl に -l オプションを付けて、コンパイル済みのモジュールリストを確認します。

# /usr/local/apache2/bin/apachectl -l
Compiled in modules:
 
  mod_rewrite.c

mod_rewrite.c があればOK.

なければ、config.nice に –enable-rewrite オプションを付けて再コンパイルして、インストールし直します。
 

mod_rewrite を有効にして再インストールする

# /usr/local/src/httpd-2.2.21/config.nice --enable-rewrite
# make
# make install

ちなみに、make install を実行しても今あるドキュメント、 ログファイル、設定ファイルは上書きされないみたいです。

・参考:コンパイルとインストール – Apache HTTP サーバ はてなブックマーク - コンパイルとインストール - Apache HTTP サーバ

インストール後に、もう一度 apachectl -l で mod_rewrite.c があるか確認します。

以上です。

[Apache] ベーシック(Basic)認証の設定方法

Apacheで ベーシック(Basic)認証を設定するときは下記のサイトを読む。

@IT:Apacheでユーザー認証を行うには(Basic認証編) はてなブックマーク - @IT:Apacheでユーザー認証を行うには(Basic認証編)

ベーシック認証を設定する(AuthType) – アクセス制限 – Apache入門 はてなブックマーク - ベーシック認証を設定する(AuthType) - アクセス制限 - Apache入門

ユーザー認証によるアクセス制限(ベーシック認証編)(2/2) はてなブックマーク - ユーザー認証によるアクセス制限(ベーシック認証編)(2/2)
 

[Apache] VirtualHost(バーチャルホスト)を設定するときに読む記事

Apache の VirtualHost(バーチャルホスト)を設定するときに読む記事をまとめました。

名前ベースの仮想ホスト – 仮想ホストの設定 – Apache入門 はてなブックマーク - 名前ベースの仮想ホスト - 仮想ホストの設定 - Apache入門

apache2.2 バーチャルホストの設定 前編 はてなブックマーク - apache2.2 バーチャルホストの設定 前編

apache2.2 バーチャルホストの設定 後編 はてなブックマーク - apache2.2 バーチャルホストの設定 後編

バーチャルホストの例 – Apache HTTP サーバ はてなブックマーク - バーチャルホストの例 - Apache HTTP サーバ
 

[Ruby on Rails] コントローラの作成と命名規則

Ruby on Railsにて、rails generate コマンドでコントローラを作成するときの命名規則を調べたのでメモ。

コントローラの名前は「CamelCased(キャメルケース)」か「under_scored(アンダースコアード)」のどちらかの方式で指定できます。

■ CamelCased(キャメルケース) の例

$ rails generate controller FacebookUsers

■ under_scored(アンダースコアード) の例

$ rails generate controller facebook_users

結論としては、いずれの方式も作成されるファイル名は「under_scored」の形式となり、作成されるクラス名は「CamelCased」の形式となるみたいです。

【参考】

コントローラの作成と命名規則 – コントローラ – Ruby on Rails入門 はてなブックマーク - コントローラの作成と命名規則 - コントローラ - Ruby on Rails入門
 

[Mac] Node.js と npm をインストールする方法 [Homebrew]

Macに Node.js と npm をインストールする方法を調べたのでメモ。

node.js を homebrew でインストールする

$ brew install node

正常にインストールされたことを確認します。

$ node -v
v0.4.11

 

npm を homebrew でインストールできない…

Homebrew の npm formula は、収録のポリシーに沿わない( https://github.com/mxcl/homebrew/wiki/Acceptable-Formula )として最近、取り除かれたそうです。

メッセージにあるように curl http://npmjs.org/install.sh | sh でインストールすべきみたいです。

$ brew install npm
Error: No available formula for npm
npm can be installed thusly by following the instructions at
  http://npmjs.org/
 
To do it in one line, use this command:
  curl http://npmjs.org/install.sh | sh

 

npm を curl経由でインストールする

$ curl http://npmjs.org/install.sh | sh

正常にインストールされたことを確認します。

$ npm -v
1.0.103

以上です。


参考情報

node.jsとnpmのインストール – 自分の感受性くらい

MacOSXでnode.js/npm/nvmをインストール – tagomorisのメモ置き場

[Rails 3.1.0] ActionView::Template::Errror (application.css isn’t precompiled)

Ruby on Rails 3.1.0 にて、アプリケーションを作成してdevelop環境は作らずに、Heroku上のstaging環境でいきなり動かしたら以下のようなエラーが発生しました。

ActionView::Template::Errror (application.css isn't precompiled)

対応策としては、config.assets.compile を true にすればOKです。

■ config/environments/staging.rb

# Don't fallback to assets pipeline if a precompiled asset is missed
# config.assets.compile = false
config.assets.compile = true

以下、stackoverflowに書かれていた説明と自分で翻訳したもの。

By default Rails assumes that you have your files precompiled in the production environment, if you want use live compiling (compile your assets during runtime) in production you must set the config.assets.compile to true. You can use this option to fallback to Sprockets when you are using precompiled assets but there are any missing precompiled files. If config.assets.compile option is set to false and there are missing precompiled files you will get an “AssetNoPrecompiledError” indicating the name of the missing file.

デフォルトの設定によって、RailsはProduction環境でプリコンパイル済みのファイルがあることを想定しているので、もしProduction環境でライブコンパイル(runtime中にアセットをコンパイルすること)を使いたいなら、config.assets.compile を true にしなければならない。プリコンパイル済みファイルが全くないが、プリコンパイル済みのアセットを使おうとしているとき、Sprockets *1 の代替策としてこのオプションを使うことができる。config.assets.compile のオプションが false に設定されていて、プリコンパイル済みのファイルがない場合、存在しないファイル名を指して“AssetNoPrecompiledError”が発生するでしょう。

*1 Sprockets: Rubyで書かれたJavaScriptプリプロセッサで、複数のJavaScriptソースファイルを1つにまとめるのが主な機能

【参考】

rails 3.1.0 ActionView::Template::Errror (application.css isn’t precompiled) – Stack Overflow はてなブックマーク - rails 3.1.0 ActionView::Template::Errror (application.css isn't precompiled) - Stack Overflow

Asset Pipelineを備えたRails 3.1のリリースに向けて、その根幹を担うSprocketsをちょっと触っておくことにした。 – Sooey はてなブックマーク - Asset Pipelineを備えたRails 3.1のリリースに向けて、その根幹を担うSprocketsをちょっと触っておくことにした。 - Sooey

Ruby on Rails Guides: Asset Pipeline はてなブックマーク - Ruby on Rails Guides: Asset Pipeline

[Rails] 2系と3系のルーティング(Routing)の違い

Ruby on Railsの 2系と3系のRoutingの違いを調べたのでメモ。

Simple routes

# Rails 2:
map.connect 'hello_world', :controller => 'posts', :action => 'index'
 
# Rails 3:
match 'hello_world' => 'posts#index'

Resources

# Rails 2:
map.resources :users
 
# Rails 3:
resources :users
# Rails 2
map.resources :games, :member => { :download => :get }, :collection => { :favourites => :get }
 
# Rails 3
resources :games do
  get :download,   :on => :member
  get :favourites, :on => :collection
end
# Rails 3
resources :games do
  member do
    get :download
  end
 
  collection do
    get :favourites
  end
end

Root mappings

# Rails 2
map.root :controller => 'posts', :action => 'index'
 
# Rails 3
root :to => 'posts#index'
# Rails 2
map.namespace :admin do |admin|
  admin.root :controller => 'posts'
end
 
# Rails 3
namespace :admin do
  root :to => "admin/posts#index"
end

Optional params

# Rails 2
map.connect 'posts/:year/:month', :controller => 'posts',
            :month => nil, :requirements => { :year => /\d{4}/ }
 
# Rails 3
match 'posts/:year(/:month)' => 'posts#index', :constraints => { :year => /\d{4}/ }

【参考】

Rails 3: Routing Examples – Mark Connell はてなブックマーク - Rails 3: Routing Examples - Mark Connell

2.0のmap.resourcesのオプション設定いろいろ – ザリガニが見ていた…。 はてなブックマーク - 2.0のmap.resourcesのオプション設定いろいろ - ザリガニが見ていた...。

map.resourcesを試してみる はてなブックマーク - map.resourcesを試してみる

[MySQL] File ‘./mysql-bin.index’ not found (Errcode: 13)

MySQLをソースコードからインストールして、初期化をして、起動したらエラーが発生しました。

解決方法を調べたのでメモ。

ちなみに、MySQLをソースコードからインストールする手順はこちらから。

[DB] CentOS に MySQL をソースコードからインストール | CodeNote.net はてなブックマーク - [DB] CentOS に MySQL をソースコードからインストール | CodeNote.net
 

■ エラー内容

MySQLを起動するとエラーが発生しました。

# service mysql start
Starting MySQL.The server quit without updating PID file (/[失敗]cal/mysql/data/bms.pid).

詳しくエラー内容を見るために、直接Pathを指定して実行してみる。

# /usr/local/mysql/bin/mysqld --user=mysql --basedir=/usr/local/mysql/ --datadir=/usr/local/mysql/data/
/usr/local/mysql/bin/mysqld: File './mysql-bin.index' not found (Errcode: 13)
111102 16:31:21 [ERROR] Aborting
 
111102 16:31:21 [Note] /usr/local/mysql/bin/mysqld: Shutdown complete

mysql-bin.indexというファイルがないみたいで、実際に存在しませんでした。

原因は、/usr/local/mysql 以下の全てのディレクトリの権限が root になっていたせいでした。

mysql_install_db でMySQLの初期化を実行する前に、chown でディレクトリの権限を root から mysql に変更する必要があります。

ディレクトリの権限を mysql ユーザに変更して、

chown -R mysql:mysql /usr/local/mysql/

MySQLの初期化をすればOKです。

/usr/local/mysql/scripts/mysql_install_db \
		--user=mysql \
		--basedir=/usr/local/mysql \
		--datadir=/usr/local/mysql/data

以上です。

【参考】

【MySQL】エラー対処方法 – ぱそ子のめも はてなブックマーク - 【MySQL】エラー対処方法 - ぱそ子のめも

まったり東京+ mysqld: File ‘./mysql-bin.index’ not found (Errcode: 13) はてなブックマーク - まったり東京+ mysqld: File './mysql-bin.index' not found (Errcode: 13)

:: MySQL 5.018 インストール | サラリーマンブログ :: はてなブックマーク - :: MySQL 5.018 インストール | サラリーマンブログ ::

ubuntu9.04 で mysql 5.1.33 のインストール – kameidの備忘録 – Sharpen the Saw! はてなブックマーク - ubuntu9.04 で mysql 5.1.33 のインストール - kameidの備忘録 - Sharpen the Saw!

MySQL5.5 を CentOS6.3 にソースコードからインストールする手順

CentOS に MySQL をソースコードからインストールする手順をご紹介します。(2012/11/08 修正)

公式ドキュメント(英語)にインストール手順は書いてあります。

MySQL :: MySQL 5.5 Reference Manual :: 2.10.2 Installing MySQL from a Standard Source Distribution


前提

CentOS5.7 64bit
MySQL5.5.17

MySQLのグループとユーザーの作成

まず、rootになります。

$ su

MySQLをデーモンで起動するためのグループとユーザーを作成します。

# groupadd mysql
# useradd -g mysql -d /usr/local/mysql mysql
# passwd mysql

MySQLのソースコードをダウンロード・展開

# cd /usr/local/src
# wget http://dev.mysql.com/get/Downloads/MySQL-5.5/mysql-5.5.17.tar.gz/from/http://ftp.iij.ad.jp/pub/db/mysql/
# tar zxvf mysql-5.5.17.tar.gz
# cd mysql-5.5.17

cmakeでソースコードをビルド

ソースコードをビルドするために、ディレクトリ内に configure を探しても見つからなかったので調べてみたら、MySQL 5.5系よりcmake推奨となりconfigureがなくなったようです。

代わりに cmake でコンパイルするみたいです。

CentOS yum dag リポジトリの追加方法 | Linux LABS

MySQL 5.5.9 インストール Linux cmake | Linux LABS

cmake が入っていない場合は yum でインストールしておきます。

# yum install -y cmake

次に、MySQL依存パッケージをyumで入れておきます。

# yum install -y ncurses-devel

入れてないでcmakeすると、以下のようなエラーが出るので注意です。

- Could NOT find Curses  (missing:  CURSES_LIBRARY CURSES_INCLUDE_PATH)
CMake Error at cmake/readline.cmake:82 (MESSAGE):
  Curses library not found.  Please install appropriate package,
 
      remove CMakeCache.txt and rerun cmake.On Debian/Ubuntu, package name is li             bncurses5-dev, on Redhat and derivates it is ncurses-devel.
Call Stack (most recent call first):

そのまま再度、cmake をしても、エラー表示を繰り返してしまうので、一旦MySQLのディレクトリを削除し再実行します。

# rm -fr /usr/local/src/mysql-5.5.17
# cd /usr/local/src
# tar zxvf mysql-5.5.17.tar.gz
# cd mysql-5.5.17

cmake する際のオプションは普通にインストールするときは2~3個ぐらいでいいみたいです。

cmake をデフォルトで実行したときに、何が入るかだけ確認しておきましょう。

MySQL :: Building MySQL from Source :: 3 MySQL Source-Configuration Options

cmake . \
-DCMAKE_INSTALL_PREFIX=/usr/local/mysql \
-DDEFAULT_CHARSET=utf8 \
-DWITH_EXTRA_CHARSETS=all \
-DDEFAULT_COLLATION=utf8_general_ci \
-DWITH_PIC=1

cmake時に、オプションで -DDEFAULT_CHARSET=utf8 付けたら、-DDEFAULT_COLLATION= … も付けないとうまくいかないので注意が必要らしいです。

MySQL のインストール

make
make install

以上でインストール完了です。

MySQLの初期設定

まず、ディレクトリの所有者を変更します。

UNIXコマンド [chown]

chown -R mysql:mysql /usr/local/mysql

次に、データベースを初期化します。

/usr/local/mysql/scripts/mysql_install_db \
		--user=mysql \
		--basedir=/usr/local/mysql \
		--datadir=/usr/local/mysql/data

データベースを初期化せずに他の設定をすると、下記のようなエラーが出ます。

ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock' (2)

自動起動も設定しておきます。

cp /usr/local/src/mysql-5.5.17/support-files/mysql.server /etc/init.d/mysql 
chmod +x /etc/init.d/mysql
chkconfig --add mysql

以下のコマンドを実行して状態を確認します。期待したランレベルでonになっていれば問題はありません。

# chkconfig --list | grep mysql
 
mysql           0:off   1:off   2:on    3:on    4:on    5:on    6:off

実行環境に合わせて、起動スクリプトを変更します。

vi /etc/init.d/mysql
 
basedir=/usr/local/mysql
datadir=/usr/local/mysql/data

設定ファイルをコピーします。設定ファイルは必要に応じて編集してください。

cp /usr/local/src/mysql-5.5.17/support-files/my-medium.cnf /etc/my.cnf

以上で完了です。

MySQLを service コマンドで起動して、ちゃんとインストールされているか確認します。

service mysql start

MySQLのPathを通す

# vi ~/.bashrc
 
PATH="$PATH":/usr/local/mysql/bin
# source ~/.bashrc
# mysql -V
mysql  Ver 14.14 Distrib 5.5.17, for Linux (x86_64) using  EditLine wrapper

以下のコマンドでログイン出来れば、インストール成功です。

mysql -u root

ついでに root のパスワードも変更しておきます。

mysql> set password for root@localhost=password('newpassword');
Query OK, 0 rows affected (0.02 sec)
 
mysql> \q
# mysql
ERROR 1045: Access denied for user: 'root@localhost' (Using password: NO)
# mysql -u root -p
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g. ……

これで、PASSの設定が完了しました。

初期設定は以上です。

MySQLの起動に失敗したときの対処方法

MySQLを起動時に以下のようなエラーが出ました。

Starting MySQL. ERROR! The server quit without updating PID file (/usr/local/mysql/data/localhost.localdomain.pid)

プロセスを見てみると既に起動しているみたいなのですが、mysql -u root でログイン出来ません。

少々荒いですが、killコマンドでプロセスを殺して、またMySQLを起動してやれば上手くいきました。以下、手順など。

# ps aux | grep mysql
mysql    32031  0.0  3.1 337520 32944 ?        Sl   00:28   0:00 /usr/local/mysql/bin/mysqld --localdomain.err --pid-file=/usr/local/mysql/data/localhost.localdomain.pid --socket=/tmp/mysql.
# kill 32031
# ps aux | grep mysql
# /etc/init.d/mysql start
Starting MySQL.......    [  OK  ]
# mysql -u root
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 4
Server version: 5.5.17-log Source distribution
 
Type 'help;' or '\h' for help. Type '\c' to clear the buffer.
 
mysql>

参考情報

MySQL 5.5.8をcmakeでインストールする – pgmgontaの日記

MySQLのrootパスワード設定 - Gentoo Linuxで自宅サーバ

Mysql-5.5系のインストールメモ(Fedora14の64bitへcmakeにて) | パチスロ日記と仕事メモ

Sakila Sample Database (空色ブログ)