Ruby関連のことを調べてみた2020年09月12日

Ruby関連のことを調べてみた2020年09月12日

セッションを用いたセキュリティ攻撃(セッションID、クッキー)

“`
前提
プログラミング初学者(2~3ヶ月)が学んだ内容をまとめています。
実際の現場では通用しないことや間違った内容が含まれている可能性があります。
間違っている部分や浅い部分については追記、ご指摘いただけると幸いです。
“`
セッションを用いたセキュリティ攻撃について学んだ内容をまとめました。
#セッションを狙った攻撃と対策
##セッションとは?
セッションとは、データを一時的に保存しておく仕組みのことです。
この一時保存される保存先はクッキーと呼ばれます。
youtubeやtwitterに同じ端末からアクセスすると自分のアカウントでログインされた状態になっていますよね。
あれはセッションという仕組みでログイン情報がクッキーに一時的に保存されているため、毎回ログインをしなくてもログイン状態になっているということです。
このログイン情報などが一時的に保存されているクッキーを狙った攻撃をセッションハイジャックといいます。
##セッションハイジャック
XSSなどを用いて、正規利用者ではないものが正規利用者のセッションを取得する攻撃方法です。

XSSはwebアプリやwebページを開

元記事を表示

rails tutorial 第10章

#はじめに

独学で[rails tutorial](https://railstutorial.jp/)を進めていく過程を投稿していきます。

進めていく上でわからなかった単語、詰まったエラーなどに触れています。

個人の学習のアウトプットなので間違いなどあればご指摘ください。

初めての投稿なので読みにくいところも多々あるかと思いますがご容赦ください。

#第10章 ユーザーの更新・表示・削除
##10.1.1 編集フォーム
演習2

“`ruby:app/views/users/_form.html.erb
#リスト 10.5: newとeditフォーム用のパーシャル
<%= form_with(model: @user, local: true) do |f| %>
<%= render 'shared/error_messages', object: @user %>

<%= f.label :name %>
<%= f.text_field :name, class: 'form-control' %>

<%= f.label :email %>

元記事を表示

重要な処理(購入処理)における脆弱性と対策(CSRF)

“`
前提
プログラミング初学者(2~3ヶ月)が学んだ内容です。
実際の現場で通用しないことや間違ったことが含まれている可能性があります。
間違っている部分や理解が浅いと思われる部分についてはご指摘や追記いただければ幸いです。
“`

重要な処理に対する攻撃の1つ、CSRF(クロスサイトリクエストフォージェリ)についてまとめました。
重要な処理とは例えば、
掲示板への投稿や、メールの送信、ECサイトでの商品購入といった本来外部から実行されてはいけない処理のことです。
CSRFではこの重要な処理を攻撃者が正規利用者になりすまして使う(リクエストを送る)ことを言います。
#CSRFの仕組みと対策
**具体的にCSRFはどのようなことをされるのか**
Webアプリケーションには以下のような重要な処理が存在します。
・クレジットカードでの決済
・メールの送信
・パスワードの変更
こういった重要な処理を正規利用者になりすまして攻撃者が使えてしまいます。
##CSRF(クロスサイトリクエストフォージェリ)
攻撃者がユーザーのログイン情報を盗み出し(セッションハイジャック)脆弱性のあるWebアプ

元記事を表示

Rails 6で認証認可入り掲示板APIを構築する #7 update, destroy実装

←[Rails 6で認証認可入り掲示板APIを構築する #6 show, create実装](https://qiita.com/rf_p/items/11c1d310f3b67c7f4881)

# updateテストの実装

残り2アクションupdateとdestroyを実装します。

updateは更新処理です。
createができていたら似たようなものなので、大きく詰まることはないはずです。

“`diff:spec/requests/v1/posts_controller.rb

+ describe “PUT /v1/posts#update” do
+ let(:update_param) do
+ post = create(:post)
+ update_param = attributes_for(:post, subject: “update_subjectテスト”, body: “update_bodyテスト”)
+ update_param[:id] = post.id
+ update_param
+

元記事を表示

rails Action Textの実装

#はじめに
自分用メモとして残します。

#環境
* Rails v6.0.3.2
* ruby v2.6.6p146
* node v12.18.3
* yarn v1.22.4

#手順
###1.アプリ作成
MySQLを使ったアプリを作成する。

“`
$ rails new actionText -d mysql
“`

作成したアプリに移動

###2.scaffold
scaffoldでアプリの雛形を作成する。
※articleはtitleとcontentを持つが、後で追加するためここではtitleのみでOK

“`
$ rails g scaffold article title:string
“`

###3.DB作成

“`
$ rails db:create
“`

###4.migrate
“`
$ rails db:migrate
“`
#5.Action Textインストール

“`
$ rails action_text:install
“`

#6.migrate
“`
$ rails db:migrate
“`

#7.アソシエー

元記事を表示

【Ruby】even?メソッドを使用して配列の中の偶数の数をカウントする

配列にある値の中から、偶数の数をカウントして出力するメソッドを作ります。
値が偶数かどうかの判定は`even?メソッド`を使います。

出力例:
count_evens([2, 1, 4, 6]) → 3

## 解答1

“`Ruby
def count_evens(nums)
count = 0
nums.each do |num|
if num.even?
count += 1
end
end
puts count
end
“`

* 偶数の数を入れておく`変数count`を用意
* eachメソッドで配列の中を1つずつ取り出して`even?メソッド`で偶数か判定
* 偶数だったら`count`に1を足す
* これを繰り返して最後に`count`を出力する

## 解答2

解答1と比べるとまどろっこしい感じですが・・・

“`Ruby
def count_evens(nums)
result = []
nums.each do |num|
if num.even?
result << num

元記事を表示

チャットアプリケーションで一人二役の動作確認を行う

#背景
railsでチャットアプリケーションを開発した。
ブラウザで二つのウィンドウを開いて動作確認をしようとしたところ、うまくいかなかった。
具体的には、片方のウィンドウはユーザA、もう片方のウィンドウはユーザBでログインし、ユーザAが投稿したコメントがユーザBのウィンドウに反映されるか確認しようとした。
しかし、片方のウィンドウでユーザAとしてログインした後、もう片方のウィンドウでユーザBとしてログインすると、両方のウィンドウがユーザBとしてログインしている状態になってしまって、やりたいことができなかった。

#解決策
片方は通常のウィンドウで起動し、もう片方のウィンドウはシークレットモードで立ち上げることで、それぞれのウィンドウが干渉せず、やりたいことができた。

元記事を表示

rails tutorial 第9章

#はじめに

独学で[rails tutorial](https://railstutorial.jp/)を進めていく過程を投稿していきます。

進めていく上でわからなかった単語、詰まったエラーなどに触れています。

個人の学習のアウトプットなので間違いなどあればご指摘ください。

初めての投稿なので読みにくいところも多々あるかと思いますがご容赦ください。

#第9章 発展的なログイン機構
##9.1.1 記憶トークンと暗号化
attr_accessorの復習

参考
https://qiita.com/Hassan/items/0e034a1d42b2335936e6
.remember_tokenが使えるようになります(remember_token属性が扱えるようになった)

“`
def remember
self.remember_token = User.new_token
update_attribute(:remember_digest, User.digest(remember_token))
end
“`
最後の(remember_token)はself.

元記事を表示

rails チュートリアル

4章まで終了
次回5章から

元記事を表示

【RubyonRails】APIでadd_token_to_usersしてログイン機能を実装する

##はじめに
APIでウェブサービスを制作中。
ユーザーのログイン機能を実装することに。
APIのログイン機能作るのは初めてだったので、下記のページを参考に実装。

[Railsでトークン認証のログインAPI実装 – Qiita](https://qiita.com/puremoru0315/items/7a0b57cb69e3a5b69f08#controller)

##環境
MacBookAir
ruby 2.6.3
Rails 6.0.3.2

##ルーティングを考える
“`config/routes.rb
Rails.application.routes.draw do
namespace ‘api’ do
namespace ‘v1’ do
resources :users, only: [:create, :show, :update]
post ‘/users/login’, to: ‘users#login’
end
end
end
“`

##マイグレーションの追加
“`
$rails g migration A

元記事を表示

ユーザー管理機能をウィザード形式で実装する

#概要
今回は、ユーザー管理機能をウィザード形式で実装することに関してです。
ウィザード形式とは、画面遷移しながらユーザー登録を行っていく形式です。

今回、userモデルの登録要件は
nickname, grade, email, password

続いて画面遷移してuser_infoモデルに
subject, school, profile

を登録します。

ちなみに、user_infoは得意教科、在籍校、プロフィールとなっています。

#実装

まずはdeviseをインストールして、userモデルを作成します。

emailとpasswordはデフォルトで入っているので、nicknameとgradeを追加します。

カラムを追加したので、次のようにコントローラーを編集します。

“`controllers.application_controller.rb
class ApplicationController < ActionController::Base before_action :configure_permitted_parameters, if: :dev

元記事を表示

AWSを使ってアプリケーションを公開する手順(6)Nginxを導入する

#はじめに
AWSを使ってアプリケーションを公開する手順を記載していく。
この記事ではWebサーバであるNginxを導入する。

#Nginxをインストールする
##Nginxとは
NginxとはWebサーバの一種である。
ユーザのリクエストに対して静的なコンテンツの取り出し処理を行い、動的なコンテンツの生成をアプリケーションサーバに依頼する。

##「.ssh」ディレクトリに移動する
以下のコマンドを実行し、「.ssh」ディレクトリに移動する。

“`
cd ~/.ssh/
“`

##ssh接続
以下のコマンドを実行し、EC2インスタンスにsshでアクセスする。
(ダウンロードしたpemファイル名が「xxx.pem」、ElasticIPが123.456.789の場合)

“`
ssh -i xxx.pem ec2-user@123.456.789
“`

##Nginxのインストール
以下のコマンドを実行し、Nginxをインストールする。

“`
sudo yum -y install nginx
“`

#Nginxの設定ファイルを編集する
以下のコマンドを実行しvi

元記事を表示

セレクトボックスから複数のデータを取り出すまで

Ruby on Railsにおいてセレクトボックスから複数のデータを取り出す作業が意外と複雑な為、これまで試行錯誤した過程をこちらで整理しています。
まだ解決済みではありませんので、進捗が有り次第更新していきます。

# バージョン情報
ruby 2.6.4p104
RubyGems 3.0.3
Rails 5.2.3

# やりたいこと
現在語学学習系SNSサイトを制作しています。今回はプロフィール編集画面で、ユーザーが学習中の言語を複数選択出来るセレクトボックスを作成したいと思います。
最終的には[世界中の言語が網羅されているgem](https://github.com/stefanpenner/country_select)を使おうと思うのですが、まずはテスト段階として「日本語、英語、中国語、スペイン語」の4言語が入ったセレクトボックスを作っていきます。

# 多対多の関係性
「ユーザー」と「言語」は多対多の関係にあると思いますので、「user_language」と言う中間テーブルを用い「user」と「language」を多対多の関係で結びました。

**Userモデル**

元記事を表示

errors.full_messagesの配列を文字に変えて出力する

## 起こった問題とやりたいこと
errors.full_messagesが配列なので、flashメッセージが、[“hoge hoge”]が出力される
→ 文字に変えて、hogehogeと出力したい

## やったこと
errors.full_messagesにto_sentenceメソッドをつけるだけ

“`user_contorller.rb
class Users::UserController < Users::ApplicationController #中略 def update @user = user.Users flash[:alert] = @user.errors.full_messages.to_sentence end #中略 end ``` 今日もお疲れ様でした。

元記事を表示

No route matches [GET] “/logout”の解決

##はじめに
プログラミング初学者です。
No route matches [GET] “/logout”となりログアウトリンクがうまく動かなかった時の対処法を記載します。

##環境
Rails 6.0.3.2
ruby 2.7.1
ubuntu 18.04 LTS

##問題点
ログアウトのリンクを押すとNo route matches [GET] “/logout”とでてログアウトできない。

##確認事項
・ルーティングのリクエストがdeleteとなっているか
・リンクをmethod: :deleteとしているか
・htmlソースコードがrel=”nofollow” data-method=”delete”となっているか

##解決方法
調べてみるとJQueryがないと動かないらしい

app/javascript/pasks/application.jsに

“`
//= require jquery 
//= require jquery_ujs
“`
と記入

“` 
gem ‘jquery-rails’ 
“`

gemfileからjquery-rails

元記事を表示

【Rails】「&.」あ!それみたことある!!(意味は知らない)

# 「&.」とは(概要)

**ぼっち演算子**と呼ばれます。

`Ruby`では通常、レシーバーに対してメソッドが実行された時、**レシーバー(オブジェクト)が`nil`だった場合にエラーを返します。**

しかしプログラムによっては、エラーを返したくない時があります。そんな時に使うのが「&.」(ぼっち演算子)です。

ぼっち演算子はオブジェクトが`nil`だった場合にエラーではなく、`nil`を返してくれます。

# 「&.」は何が嬉しい??

返り値が「〇〇かnil」を返すみたいなメソッドが`Ruby`にはあります。それを受け取ったレシーバーに、レシーバーに「`nil`が想定されていないメソッド」を使ってしまうと、エラーが出力されてしまいます。

そんな時に**「&.」**を使うことで、そのメソッドはエラーではなく、`nil`を返してくれるようになります。

# 「&.」の懸念点

ぼっち演算子を使ったからと言って、確実に`nil`を返してくれるというわけではありません。そのメソッド名が存在しない(スペルミス等)場合には`NoMethodError`が出力されてしまいます。

元記事を表示

【Ruby on Rails】model,controllerターミナルコマンド

# 概要
個人的によく使うmodelとcontrollerのコマンドをまとめてみました。
コピペして使えるよう「$」の記述はなくしています。
メモ程度なので説明は最小限にします。
適宜更新していきます。

# model、table

“`:【作成】
rails g model Post user:references body:string genre:integer
“`
“`:【モデル、テーブルを削除】
rails destroy Post
“`
“`:【テーブルのみ削除】
rails g migration DropPosts
“`
“`:【テーブル名変更】
rails g migration RenamePostsToBooks
“`

# カラム
“`:【カラム追加】
rails g migration AddNameToPosts name:string price:integer
“`

他にも追加したい時

migrationファイルに追加
add_column :posts, :body, :t

元記事を表示

Hanamiでmysqlのsocketを指定する

## こうやる

[Hanami::Model](https://github.com/hanami/model)は内部的に[ROM](https://rom-rb.org/)(rubyのorm)を呼び出している

query parameterで渡せる

“`ruby

DATABASE_URL=”mysql2://root:password@host/database?socket=/mysql/mysql.sock”
“`
#### 参考
https://rom-rb.org/learn/sql/3.2/#mysql

## Cloud RunでHanami
今回 GCPのcloud runでcloud sql と接続するのにsocketを指定する必要があった
#### cloud sql proxy経由で接続する
“`ruby

DATABASE_URL=”mysql2://root:password@host/database?socket=/cloudsql/
“`

Hanamiは文献が少ないので積極

元記事を表示

Rubyの細かい文法: 同名の変数とメソッドがある場合

Ruby では変数とメソッドに同じ名前をつけられます。同名の変数とメソッドがある場合、変数のほうが優先されます。定義の順序とは関係ありません。

`()` を付ければ、メソッドと見なされます。

“`ruby
def foo
“method”
end

foo = “variable”

# これは変数
foo #=> “variable”
# これはメソッド呼び出し
foo() #=> “method”
“`

`.` を付けてレシーバを指定したときも、メソッドと見なされます。

“`ruby
public # private だと . で呼び出せない
def foo
“method”
end

foo = “variable”

# これは変数
foo #=> “variable”
# これはメソッド呼び出し
self.foo #=> “method”
“`

Rubyのクラス名は定数名、つまり変数の一種なので、同じ名前のクラスとメソッドがあるときは上記と同じ動作になります。

“`ruby
public
def Foo
“method”
end

clas

元記事を表示

brew upgradeしたらopensslが1.1.1gになってしまいRailsが起動できなくなってしまったとき

# 参考
[Cannot install Ruby versions < 2.4 because of openssl@1.1 dependency](https://github.com/rbenv/ruby-build/issues/1353#issuecomment-573414540) # 経緯 [問題](#問題) [過程](#過程) [解決](#解決) # 問題 `ruby 2.0.0-p648`で動いているプロジェクトの修正をローカルで試すタイミングで動かないことに気づきました。 ```bash $ bundle exec rails s Library not loaded: /usr/local/opt/openssl/lib/libssl.1.0.0.dylib (LoadError) ``` - brew upgradeでopensslが`1.1.1g`になってしまっていて、今までopenssl`1.0.0`で動かしていたプロジェクトが動かなくなってしまっていました。 # 過程 ちょっと試してこの時点では以下の2点を考えていました。 - `ruby 2.0

元記事を表示

OTHERカテゴリの最新記事