- 投稿日:2020-10-12T17:44:43+09:00
【PDO】複文禁止オプションの注意点(ATTR_EMULATE_PREPARES)
環境
OS:CentOS 7.3
PHP:7.1.21
mariadb:10.1.22概要
PDOで PDO::ATTR_EMULATE_PREPARES を
false
にすると、
(機能のひとつとして)セミコロンでつなげたSQL(複文)を禁止できるようですが、
コメント(--) の部分は複文として検知してくれないようです。※ 以下、query() メソッド使用。
$sql .= "select * from table1;\n"; $sql .= "select * from table2;\n"; //検知してくれる OK You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'select * from table2' at line 2$sql .= "select * from table1;\n"; $sql .= "-- select * from table2;\n"; //検知しなかった???$sql .= "select * from table1;\n"; $sql .= "-- select * from table2;\n"; $sql .= "select * from table3;\n"; //これは検知するけど3行目なんだ・・・ You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'select * from table3' at line 3まとめ
複文禁止といっても「有効なSQLの複文」を禁止するみたいで、
コメント行は有効なSQLでないということなのでしょう。コメント(--) を使ったSQLインジェクションがありますが、
PDO::ATTR_EMULATE_PREPARES の設定だけでは不十分ということですね。コメント使用の攻撃に対しては、
プリペアドステートメントを併用して防ぎましょう。
- 投稿日:2020-10-12T15:38:15+09:00
【Ruby on Rails】MySQL構築からデータベース変更まで
はじめに
様々な記事を参考にしながらなんとか導入できたので、
備忘録として残します。
もしおかしな点や、こうした方がいいなどありましたら
ご教授頂けますと幸いです。開発環境
ruby 2.5.7
Rails 5.2.4.3
Vagrant 2.2.4
VirtualBox 6.0.14
OS: macOS Catalina
centos 7流れ
1 vagrant上にMySQLを構築
2 既存アプリをSqliteからMySQLに変更
3 新規アプリをMySQLに設定
※基本的にはvagrant上で行うため、ssh接続しておいてください。vagrant上にMySQLを構築
CentOS確認
まずは現在のCentOSを確認します。
確認方法はvagrantファイルにあるVagrantfileを確認します。VagrantfileVagrant.configure("2") do |config| GUEST_RUBY_VERSION = '2.5.7' config.vm.box = "centos/7" ...今回はCentOSが7である前提で話を進めます。
CentOSとは仮想環境構築に使用する代表的なLinux系OSです。MySQLのインストール(CentOS7用)
Vagrant+Rails6+MySQL 開発環境構築
こちらの記事を参考にまずはvagrant上にMySQLを構築します。ターミナル$ vagrant ssh $ sudo yum -y install http://dev.mysql.com/get/mysql-community-release-el7-5.noarch.rpm $ sudo yum -y install mysql-community-server $ mysqld --versionバーションが表示されればOKです。
自動起動設定後、MySQL起動
vagrant起動時に自動で起動するように設定します。
2行目はmysqld.service enabledになっていればOKです。ターミナル$ sudo systemctl enable mysqld.service $ sudo systemctl list-unit-files -t service | grep mysqld $ sudo systemctl start mysqld.serviceMySQL初期設定(任意)
https://style.potepan.com/articles/19020.html
こちらの記事がわかりやすかったので、
$ mysql_secure_installation を実行後、
この記事のMySQLの初期設定を実施しよう!から設定してください。# rootユーザーにパスワードを設定(今回はrootパスワードを設定) $ /usr/bin/mysqladmin -u root password 'root' # セキュリティー関連の初期設定(ここでパスワードを聞かれると'root'とする) $ mysql_secure_installation設定後、下記を実行しパスワードを入力後、
mysql>
この表示になればOKです。ターミナル$ mysql -u root -p既存アプリをSqliteからMySQLに変更
Railsでmysql2をインストールするときにハマったところ
[初学者]既存アプリのDBをMySQLに変更する方法
上記記事を参考に導入していきます。railsアプリの作成、データベース確認
試しにscaffoldでpostテーブルを作成します。
ターミナル$ rails new sam $ cd sam $ rails g scaffold post name:stringcongig/database.ymlがこのような表記になっているかと思います。
初期設定ではsqlite3のデータベースをしようしています。congig/database.ymldefault: &default adapter: sqlite3 pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %> timeout: 5000 development: <<: *default database: db/development.sqlite3 # Warning: The database defined as "test" will be erased and # re-generated from your development database when you run "rake". # Do not set this db to the same as development or production. test: <<: *default database: db/test.sqlite3 production: <<: *default database: db/production.sqlite3gemの導入
Gemfile# Use sqlite3 as the database for Active Record gem 'sqlite3' ↓ gem 'mysql2'ターミナル$ bundle installエラーが出る場合は下記を実行するか、
Gemfileのgem 'mysql2'のバージョンを
gem 'mysql2', '~> 0.4.4'
に変更してみてください。ターミナル$ sudo yum install -y mysql-develデータベース設定をMySQLに変更
congig/database.ymldefault: &default adapter: mysql2 encoding: utf8 pool: 5 username: root password: 初期設定をした場合はパスワードを記述 host: localhost development: <<: *default database: sam_development # samはアプリ名です。 # Warning: The database defined as "test" will be erased and # re-generated from your development database when you run "rake". # Do not set this db to the same as development or production. test: <<: *default database: sam_test # samはアプリ名です。 production: <<: *default database: sample_production username: sample_app password: <%= ENV['SAMPLE_DATABASE_PASSWORD'] %>下記でデータベースを作成。
ターミナル$ bundle exec rake db:create $ rails db:migrateターミナル$ mysql -u root -p $ show tables from sam_development; +---------------------------+ | Tables_in_sam_development | +---------------------------+ | ar_internal_metadata | | posts | | schema_migrations | +---------------------------+ 3 rows in set (0.00 sec)このようになっていたら設定完了です。
新規アプリをMySQLに設定
こちらは既存アプリの変更より簡単に出来ます。
ターミナル$ rails new sample -d mysql $ cd sample $ rails g scaffold post name:stringcongig/database.ymldefault: &default adapter: mysql2 encoding: utf8 pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %> username: root password: 初期設定をした場合はパスワードを記述 socket: /var/lib/mysql/mysql.sock development: <<: *default database: sample_development # Warning: The database defined as "test" will be erased and # re-generated from your development database when you run "rake". # Do not set this db to the same as development or production. test: <<: *default database: sample_test # As with config/secrets.yml, you never want to store sensitive information, # like your database password, in your source code. If your source code is # ever seen by anyone, they now have access to your database. # # Instead, provide the password as a unix environment variable when you boot # the app. Read http://guides.rubyonrails.org/configuring.html#configuring-a-database # for a full rundown on how to provide these environment variables in a # production deployment. # # On Heroku and other platform providers, you may have a full connection URL # available as an environment variable. For example: # # DATABASE_URL="mysql2://myuser:mypass@localhost/somedatabase" # # You can use this database configuration with: # # production: # url: <%= ENV['DATABASE_URL'] %> # production: <<: *default database: sample_production username: sample password: <%= ENV['SAMPLE_DATABASE_PASSWORD'] %>Gemfile# Use mysql as the database for Active Record gem 'mysql2', '>= 0.4.4', '< 0.6.0'ターミナル$ bundle exec rake db:create $ rails db:migrateもしAccess deniedのエラーが出た場合は、
下記のように一度ログイン後、再度上記を実行してください。ターミナル$ mysql -u root -p exitまとめ
初期設定を行うことによってAccess deniedで弾かれるこtがありますが、
セキュリティー上仕方がないことかもしれません。
間違っている記述や方法がございましたらご教授頂けますと幸いです。またtwitterではQiitaにはアップしていない技術や考え方もアップしていますので、
よければフォローして頂けると嬉しいです。
詳しくはこちら https://twitter.com/japwork
- 投稿日:2020-10-12T09:22:39+09:00
【MySQL】WHERE句でひらがな/カタカナが区別されない
SELECT結果がなんかおかしかった
テーブル(仮)
id name 1 テスト 2 テスト 3 てすと 3 test SELECT * FROM test WHERE name = 'テスト';
id name 1 テスト 2 テスト 3 てすと WHEREって完全一致だと思ってたので、ひらがな/カタカナが区別されていないことに動揺。
調べてみるとCollationの設定が関係しているらしい??
MySQLを使って2年目で初めてCollationというものを知りました(それまでは気にしたことがなかった)Collationとは
各データベースにはデータベース文字セットとデータベース照合順序があります。
https://dev.mysql.com/doc/refman/5.6/ja/charset-database.html
ここでいうデータベース照合順序がCollationのことで、
データに含まれるの文字を比較するときにどの文字を区別してどの文字を同じものと見なすか?という設定のようなもの(らしい)
サーバレベル、データベースレベル、テーブルレベル、カラムレベルそれぞれで設定できる(らしい)じゃあ今のCollationを確認してみます
Collationの確認方法
データベース
SELECT @@character_set_database, @@collation_database;テーブル
show table status from [DB名];カラム
SHOW FULL COLUMNS FROM test;上記のテーブルは
utf8mb4_unicode_ci
になっていました。(だからSELECT結果がおかしく見えた)
区別したいのでutf8_general_ci
に変更してみますCollationの変更方法
データベース
ALTER DATABASE COLLATE [照合順序];テーブル
ALTER TABLE [テーブル名] COLLATE [照合順序];カラム
ALTER TABLE [テーブル名] MODIFY COLUMN [カラム名] [型] COLLATE [照合順序];結果
SELECT * FROM test WHERE name = 'テスト';
id name 1 テスト 欲しかった挙動になりました(とりあえずめでたしめでたし)
Collationについて理解しきれてないところがあるのでちゃんと調査・理解できたら後ほど追記などします
- 投稿日:2020-10-12T08:24:29+09:00
ExcelからMySQLのデータを取得する
概要
超久しぶりにExcel VBAを触ることになったんですが、
その内容がMySQLからデータを取ってきて
指定のセルに入れるって処理で。多分、しばらくこの手の話はこないだろうから、
備忘のために手順を残しておきます。準備
ODBC Driver for MySQLをダウンロードします
①https://www.mysql.com/jp/products/connector/にアクセスします。
②ODBC Driver for MySQL (Connector/ODBC)のダウンロードボタンをクリックします。
③お使いのパソコン環境に合わせて、インストーラーのDownloadボタンをクリックします。
④以下のような画面が表示されるので、とりあえず「No thanks, just start my download」をクリックします。
⑤インストーラーがダウンロードされます。ダウンロード完了したら、インストーラーを起動します。
⑥インストーラーが起動したら、以下のような画面が表示されます。「Next」をクリックしてください。
⑦続いて以下のような画面が表示されます。「License Agreement」をよく読み、問題なければ「I accept・・・」を選択した上で、「Next」をクリックしてください。
⑧セットアップ種別の選択画面が表示されます。とりあえず「Typical」を選択し、「Next」をクリックしてください。
⑩インストールが完了したら、以下のような画面が表示されます。「Finish」をクリックしてインストーラーを終了します。
Excel VBA実装例
ここからは、VBAで処理を実装してみます。
Excelを起動し、開発者タブのVisual Basicをタッチします。
コードエディタが起動します。
ボタンをクリックしたら、MySQLのあるテーブルにSELECT構文のSQLを発行し、データを取得する例です。
※エラー処理は端折ってます。Private Sub DataGetButton_Click() Dim AdoConnection As Object ' ADO コネクション Dim AdoRecordSet As Object ' ADO レコードセット Dim SQL As String ' SQL文 ' ADOコネクションを作成します Set AdoConnection= CreateObject("ADODB.Connection") ' ODBC接続を行います AdoConnection.Open _ "DRIVER={MySQL ODBC 8.0 Unicode Driver};" & _ " SERVER=(servername);" & _ " DATABASE=(databasename);" & _ " UID=(username);" & _ " PWD=(password);" ' SQL文を作成します SQL = "select tbl_aaa.ID, " & _ " tbl_aaa.name, " & _ " tbl_aaa.item_num, " & _ " tbl_bbb.item_name " & _ "from tbl_aaa " & _ "inner join tbl_bbb on tbl_bbb.ID = tbl_aaa.item_id " ' SQLを実行します Set AdoRecordSet = AdoConnection.Execute(SQL) ' 取得したレコードを適当なセルに表示していきます i = 0; Do Until AdoRecordSet .EOF Cells(i, 1) = AdoRecordSet!ID Cells(i, 2) = AdoRecordSet!name Cells(i, 3) = AdoRecordSet!item_name Cells(i, 4) = AdoRecordSet!item_num ' 次のレコードに移動 AdoRecordSet .MoveNext i = i + 1 Loop End Sub(servername)、(databasename)、(username)、(password)には、MySQLとの接続情報をセットしてください。
- 投稿日:2020-10-12T06:21:35+09:00
DBをSQLiteからMySQLに変更する
はじめに
モデル作ってマイグレートして、シークエルプロでDB確認したら
作ったつもりのデータベースがない!となったので、備忘録として対処法を載せときます。
解決法
こちらの記事を参考に対処したところ、解決に至りました。
やったこと
gemfileの修正
初歩的ミスですが、下画像の選択部分(gemfileのSQLite3)をコメントアウトします。
ターミナルにて
bundle install --without productionDBを作る必要があるので
bundle exec rake db:createそして、これは必要あったのかな?既にやっていたので不要だったかも
rails db:migrateできた
- 投稿日:2020-10-12T00:47:48+09:00
DockerのMySQLでdumpファイルを読み込む
目的
- DockerのMySQLにdumpファイルを読み込む方法をまとめる
実施環境
- ハードウェア環境
項目 情報 OS macOS Catalina(10.15.5) ハードウェア MacBook Pro (13-inch, 2020, Four Thunderbolt 3 ports) プロセッサ 2 GHz クアッドコアIntel Core i5 メモリ 32 GB 3733 MHz LPDDR4 グラフィックス Intel Iris Plus Graphics 1536 MB
- ソフトウェア環境
項目 情報 備考 dumpファイル作成MySQLバージョン 8.0.19 for osx10.13 on x86_64 Homwbrewを用いてこちらの方法で導入→Mac HomebrewでMySQLをインストールする dumpファイル読み込みMySQLバージョン 8.0.19 for osx10.13 on x86_64 Homwbrewを用いてこちらの方法で導入→Mac HomebrewでMySQLをインストールする 前提条件
- dumpファイルが自分のPCのローカルに用意されていること。
- MySQLのコンテナが起動していること。
前提情報
- dumpファイルを読み込むDockerのMySQLは自分の先輩に用意していただいた環境のものとする。
概要
- dumpファイルの移動
- 読み込み
- 確認
詳細
dumpファイルの移動
- dumpファイルが設置されているディレクトリまで
$ cd
コマンドで移動する。下記コマンドを実行してdockerコンテナの中にdumpファイルをコピーする。
$ docker cp dumpファイル名 コンテナ名:/コピー先のdumpファイル名例えばローカルの
~/Downloads
直下にあるmy_dump.sqlをコンテナ名「docker_mysql_1」のルートディレクトリ直下にコピーしたい場合は下記のようになる。$ docker cp ~/Downloads/my_dump.sql docker_mysql_1:/my_dump.sql読み込み
下記コマンドを実行してMySQLのコンテナに入る。
$ docker exec -it コンテナ名 bash下記コマンドを実行してdumpファイルを読み込ませる。
$ mysql -u MySQLユーザ名 -pMySQLのユーザ名に紐付いたパスワード dumpファイルを読み込むDB名 < dumpファイル名確認
MySQLのコンテナ内で下記コマンドを実行してMySQLにログインする。
$ mysql -u root -p下記SQLを実行してdumpファイルの内容が正常に読み込まれテーブルなどが存在していることを確認する。
use dumpを読み込んだDB名; show tables;