セキュリティ系の勉強、その他開発メモとか雑談. GithubはUnity触っていた頃ものがメイン Twitterフォローもよろしくです

【Rails5】Administrateのスタイルシート読込先を変更する

やること

管理画面生成のgemadministrateにてRailsのデフォルトのスタイルシートapplication.cssから、スタイルを読み込ませる方法。そんなに難しいことはしません。

方法

以下のコマンドで_styoesheet.html.erbを生成します。これでadministrateのデフォルト挙動のレイアウト周りを編集可能になります。

$ bin/rails generate administrate:views:layout
      create  app/views/layouts/admin/application.html.erb
      create  app/views/admin/application/_navigation.html.erb
      create  app/views/admin/application/_stylesheet.html.erb
      create  app/views/admin/application/_javascript.html.erb
      create  app/views/admin/application/_flashes.html.erb


こちらが生成される_stylesheet.html.erbの中身。

# _stylesheet.html.erb
<%#
# Stylesheet Partial

This partial imports the necessary stylesheets on each page.
By default, it includes the application CSS,
but each page can define additional CSS sources
by providing a `content_for(:stylesheet)` block.
%>

<% Administrate::Engine.stylesheets.each do |css_path| %>
  <%= stylesheet_link_tag css_path %>
<% end %>

<%= yield :stylesheet %>



eachのなかに、読込先を記述します。今回であれば、デフォルトの所から呼び出すようにしたいので、applicationを指定

<% Administrate::Engine.stylesheets.each do |css_path| %>
  <%= stylesheet_link_tag css_path %>
<%= stylesheet_link_tag 'application', media: 'all', 'data-turbolinks-track': 'reload' %>
<% end %>

これで、administarteの画面から既存のスタイルシートを読込ことができます。

私はslimを使っているのでerbでの動作確認はできてませんが、、管理画面しか使用しないプロジェクトなどではこっちの方がいいかもしれません。

【Rails】登録内容がユニークでないユーザへの条件別対応

例えば

ユーザが電話番号で仮登録をし、認証のためのURLを生成して返す場合、同じ電話番号を使って再度仮登録の内容をPOSTしてくる場合がある。1時間以内に2回送ってくる人は恐らくイタズラに近い可能性があるのでエラーを返すが、それ以降に再度送ってきた場合、本当に認証のURLを紛失している可能性がある。

処理方法

まずPOSTされた電話番号が既に登録されているか確認する。

user = User.find_or_initialize_by(tel_number: q[:tel_number])

これで既に登録されていた場合はそのレコードを取得できる。

このレコードが新規のものか確認し、そうでないなら前回送信してから1時間経過しているかを判定する。

    if !user.new_record?
      return raise HogeError if user.requested_at > Time.current - 60.minutes
    end

requested_atは前回送信する際に保存した送信時間。もし新規レコード(初めての仮登録)ならここもパスする。

レコードを更新or保存する

    user.update_attributes!(
      registered_url: https://hogehoge..
      token: hogehoge..
      requested_at: Time.current
    )



これで、新規登録、重複の登録に対応することが可能。

【Rails】コールバックで自分以外のレコードとユニーク判定を行う

解決

レアケースだと思いますが、バリデーションのコールバックでhoge_columnsという属性のユニーク判定をしたい場合です。特に難しいことはなく、下のようにやります。

User.where(hoge_columns:self.hoge_columns).where.not(id: self.id).empty?


本来ならuniqueness:trueをかければ良いと思いますが、色々と状態で判定を分けたかったので、こうなりました。


参考

teratail.com

OWASP Juice-Shop 初心者感想

Juice-Shop

OWASPから提供されているやられサイト。githubから取ってきて自分で建てて、そこで試せます。答えを見ながらもようやく完走したので、初心者目線で感想を書いてみます。

github.com



コンテンツ内容

今まで見つかったライブラリとかの脆弱性がみっちり再現されている、というわけではなく、サイトの実装不備であったり、公開されていないAPIを叩いてみたりといった、粗探しの仕方を練習できる?みたいな印象でした。ctfのエスパー問を解くに近い形のものでしょうか?実際のバグバウンティでもおそらくサイトの実装を予測して、調べるみたいな力が必要なのかなとやっていて思いました。

初心者へのフォロー

英語ですが、問題(チャレンジ)とその回答という形で、学習のフォローがされています。難易度別に問題が出されていて、それを解く形でサイトを探索し、解ければscore boardに記載され、、といった感じで進めていけるので、一人でも基本不自由なく学習を進めることができました。 bkimminich.gitbooks.io

終わってみて

勉強になりました。捜索の観点がわかったかと聞かれると、実際のサイトではどうなのかまだわからないので、イマイチ力が付いたかは体感しにくいです。ただ、ハンズオンで勉強できる機会はそうそう無いので、やってよかったと思います。

上のサイトでは、始める時にどの問題から着手すればいいのかわかりにくい(別の問題をあらかじめ解いておくのが望ましいものがあったりする)ので、その辺りは戸惑うかもしれません。おそらく、サイドバーpart2のこのページから順に上から解いていくのがいいかと思います。

終わりに

このサイトも面白そうと思ったので、内容が重複しそうな感じですが、時間があったらやってみようと思っています。 portswigger.net

【Rails】Administrateでモデルを持たないページ(Rootページ)を作成

Administrate

管理画面を簡単に作れるgemで、カスタマイズが他のものよりも容易である点が特徴っぽいです。 f:id:thinline196:20190827112627p:plain github.com



今回使用したバージョン

# Gemfile.lock
    administrate (0.11.0)
    administrate-field-nested_has_many (1.1.0)

トップページ

ルーティングはこのような感じで行います。root toで指定したページが/admin以下のルートページとして使用されるようです。

Rails.application.routes.draw do
  namespace :admin do
      resources :users
      resources :hoges
      root to: "root#index"
    end
end



gemの特性

名前空間admin内に指定したものが自動的にadministrateの管轄下に置かれる?そうで、自動的にindexページやナビゲーションバー(他ページへのリンク)などが生成されます。便利。

しかし、このせいでモデルが準備されていないただのページを作ることができません。例えば上のルーティングはRootController#indexをたどると思うのですが、Rootなんてモデルは存在しない(作らないし)ので、エラーになります。

解消法

このエラーは、ナビゲーションバーを生成する際に起きているっぽいので、指定したモデルのみサイドバーに表示させるようにすることで回避します。
- まず、administrateのlayoutファイルを書き出します。

$ bin/rails generate administrate:views:layout

これで生成されたうちのapp/views/admin/application/_navigation.html.erbを編集します。(今回slimに書き換えてます。) - eachで回している部分を表示したいモデル名のみに書き換えます。今回はベタ書きしていますが、Globalなんかで別ファイルに定義するといいと思います。下のようにします。

nav.navigation role="navigation"
  - ['users','hoges'].each do |resource|
    = link_to(   ....             


こうすることで、Rootなんて存在しないモデルを探索しなくなるのでエラーが出なくなりました。後は、administrateの指定通りにControllerviewを作ってやればうまく表示されると思います。