Slide 1

Slide 1 text

ほんとに 怖い話 あ つ た Kaigi on Rails 2023 (非公式) 前夜祭 2023年10月25日 (水) 高田 雄大(本名) 発表者

Slide 2

Slide 2 text

ɾ Name: Yudai Takada ɾ GitHub: @ydah / X: @ydah_ ɾ Software Engineer at ANDPAD, Inc. ɾ Member of RuboCop RSpec team ɾ Member of Ruby Kansai ɾ Loves beer and heavy metal/hardcore self.inspect

Slide 3

Slide 3 text

ݐஙɾݐઃۀʹಛԽͨ͠Ϋϥ΢υαʔϏε ఏڙ

Slide 4

Slide 4 text

ほんとに 怖い話 あ つ た Slimに棲むもの 総集編2023秋

Slide 5

Slide 5 text

これはアンドパッドの人が体験した 実話を元に再現したものです

Slide 6

Slide 6 text

4MJNJTBGBTU MJHIUXFJHIUUFNQMBUJOH FOHJOFXJUITVQQPSUGPS3BJMTBOE MBUFS*UIBTCFFOIFBWJMZUFTUFEPOBMM NBKPSSVCZJNQMFNFOUBUJPOT8FVTF DPOUJOVPVTJOUFHSBUJPO HJUIVCBDUJPOT

Slide 7

Slide 7 text

doctype html html head title My Slim Template body ruby: message = "Slim!" h1 Welcome to # { message} p This is a simple example.

Slide 8

Slide 8 text

消えない注記 Wanna be沢慎吾(仮名) 体験者 き ちゅう き

Slide 9

Slide 9 text

body p / This line won't get displayed. Neither does this line. /! But this one will displayed.

Slide 10

Slide 10 text

Slide 11

Slide 11 text

body h1 Welcome to Slim! javascript: // JavaScript comment here alert("Hello, World!”); css: /* CSS comment here */ h1 { color: red; }

Slide 12

Slide 12 text

Aさん「ここに…コメント書いち ゃだめ…すぐに消して!!!!」

Slide 13

Slide 13 text

Welcome to Slim! < / h1> body> / / JavaScript comment here alert("Hello, World!"); </ script> <style> / * CSS comment here * / h1 { color: red; } </ style>

Slide 14

Slide 14 text

No content

Slide 15

Slide 15 text

໰୊ͱͳΔίϝϯτ͸ͳ͔͕ͬͨɺࠓޙॻ͍ͯ ͠·͏ϦεΫ͸ແ͍ͨ͘͠ɻ

Slide 16

Slide 16 text

%BOHFS΍4FNHSFQͰݕ஌ͯ͠ܯࠂ͢Δʁ ܯࠂͩͱϧʔϧ͕૿͑Δ౓ʹຒ΋Εͯ͠·͏ ίϝϯτॻ͍ͯ·Ͱ఻͍͑ͨࣄͳͷͰ͸ʁ

Slide 17

Slide 17 text

ZEBITMJNFNCFEEFENJOJGZ

Slide 18

Slide 18 text

body h1 Welcome to Slim! javascript: / / JavaScript comment here alert("Hello, World!”);

Welcome to Slim! h1> body> / / JavaScript comment here alert("Hello, World!"); </ script> slim HTML Compile

Slide 19

Slide 19 text

body h1 Welcome to Slim! javascript: / / JavaScript comment here alert("Hello, World!”);

Welcome to Slim! < / h1> < / body> alert("Hello, World!"); < / script> slim HTML slim - embedded - minify Compile

Slide 20

Slide 20 text

module Slim class Embedded < Filter class TagEngine < Engine prepend Minify::Tag end class JavaScriptEngine < TagEngine prepend Minify::Javascript end ennd

Slide 21

Slide 21 text

module Slim class Embedded < Filter module Minify module Javascript include Tag def on_slim_embedded(engine, body, attrs) mini fi ed_body = minify(body) super(engine, mini fi ed_body, attrs) end ennnnd

Slide 22

Slide 22 text

ίϝϯτΛ҆શʹࣗ༝ʹॻ͚Δ ಋೖ࡟আ࣌ʹϓϩμΫτଆͷมߋෆཁ ίϯύΠϧ݁ՌΛൺֱͯ͠ίϝϯτͷΈ͕ ফ͍͑ͯΔ͔ʹΑͬͯ֬ೝՄ

Slide 23

Slide 23 text

それ以来、コメントが姿を現すこと はなくなりました。

Slide 24

Slide 24 text

それを消しては いけません Debian・スー(仮名) 体験者 け

Slide 25

Slide 25 text

ruby: def calc_sugoi_keisan(a, b) a + b end

Slide 26

Slide 26 text

まさかあんなことになるとは、この 時は思っていませんでした。

Slide 27

Slide 27 text

ruby: def calc_sugoi_keisan(a, b) a + b end

Slide 28

Slide 28 text

とあるslimファイル表示時に計算結果がお かしい 計算結果がおかしくなったりならなかった りする エラーも発生していない

Slide 29

Slide 29 text

h1 #{ calc_sugoi_keisan(3, 4)} h1 #{ calc_sugoi_keisan(1, 2)} ruby: def calc_sugoi_keisan(a, b) a + b end index.slim show.slim ᶃ ᶄ

Slide 30

Slide 30 text

h1 #{ calc_sugoi_keisan(3, 4)} h1 #{ calc_sugoi_keisan(1, 2)} ruby: def calc_sugoi_keisan(a, b) a + b end index.slim show.slim ᶃ ᶄ NoMethodError ✅

Slide 31

Slide 31 text

h1 #{ calc_sugoi_keisan(1, 2)} ruby: def calc_sugoi_keisan(a, b) a + b end h1 #{ calc_sugoi_keisan(3, 4)} index.slim show.slim ᶃ ᶄ

Slide 32

Slide 32 text

h1 #{ calc_sugoi_keisan(1, 2)} ruby: def calc_sugoi_keisan(a, b) a + b end h1 #{ calc_sugoi_keisan(3, 4)} index.slim show.slim ᶃ ᶄ ✅ ✅

Slide 33

Slide 33 text

おわかりいただけただろうか

Slide 34

Slide 34 text

他のslimファイルからでもメソッドが呼び出 せてしまう…

Slide 35

Slide 35 text

これだけではなかった…

Slide 36

Slide 36 text

h1 #{ calc_sugoi_keisan(1, 2) rescue 0} ruby: def calc_sugoi_keisan(a, b) a + b end

Slide 37

Slide 37 text

おわかりいただけただろうか

Slide 38

Slide 38 text

REPLAY

Slide 39

Slide 39 text

h1 #{ calc_sugoi_keisan(1, 2) rescue 0} ruby: def calc_sugoi_keisan(a, b) a + b end

Slide 40

Slide 40 text

h1 #{ calc_sugoi_keisan(1, 2) rescue 0} ruby: def calc_sugoi_keisan(a, b) a + b end

Slide 41

Slide 41 text

NoMethodErrorがにぎりつぶされていた…

Slide 42

Slide 42 text

ಉ༷ͷ໰୊͕ൃੜ͢ΔͱݪҼͷಛఆ΋೉͘͠ɺ λΠϛϯά࣍ୈͰ͸໰୊ͳ͍Α͏ʹৼΔ෣͏ͷ ͰԿͱ͔͍ͨ͠

Slide 43

Slide 43 text

spec/f i xtures/dummy.slim:1 : 5 : F : Lint/Syntax: unexpected token tCOLON (Using Ruby 2.7 parser; conf i gure using TargetRubyVersion parameter, under AllCops) ruby: ^ 4MJN͸3VCZͰ͸ͳ͍ͷͰɺ3VCP$PQͰ͸ղ ੳෆՄɻ4ZOUBY&SSPSʹͳΔɻ ͦΕ͸ͦ͏

Slide 44

Slide 44 text

r7kamura/slimcop r7kamura/rubocop - slim ຒΊࠐΜͰ͍ΔRubyίʔυͷղੳ͸ඇରԠ sds/slim - lint ຒΊࠐΜͰ͍ΔRubyίʔυͷղੳʹରԠ͍ͯ͠ Δ͕autocorrectඇରԠ

Slide 45

Slide 45 text

ZEBITMJNFNCFEDPQ

Slide 46

Slide 46 text

html ruby: if File.exists?("foo.txt") message = "Yay!" else message = "Nooo!" end h1 #{ message} ੾Γग़ͯ͠3VCP$PQʹ౉ͯ͠ ղੳͯ͠΋Β͏

Slide 47

Slide 47 text

html ruby: if File.exists?("foo.txt") message = "Yay!" else message = "Nooo!" end h1 # { message} if File.exists?("foo.txt") message = "Yay!" else message = "Nooo!" end Extract & Calc offset Slim Code Offset

Slide 48

Slide 48 text

❯ slimembedcop dummy.slim Inspecting 1 f i le W Offenses: dummy.slim:3 : 8 : W : [Correctable] Lint/ DeprecatedClassMethods: File.exists? is deprecated in favor of File.exist ?. if File.exists?("foo.txt") ^^^^^^^^^^^^

Slide 49

Slide 49 text

w 3VCP$PQͷطଘͷDPQΛ࢖͑Δ w ࣗಈमਖ਼ʹରԠ͍ͯ͠Δ w DPQͷ࡞Γํ͕෼͔Ε͹ɺTMJNFNCFEDPQ ͷDPQΛ࡞Δ͜ͱ͕Ͱ͖Δ

Slide 50

Slide 50 text

それ以来、危険なコードが姿を現す ことはなくなりました。

Slide 51

Slide 51 text

あなたのふだん使っているものに も、もしかすると「何か」がいるか もしれません…

Slide 52

Slide 52 text

弱気退散! 喝!

Slide 53

Slide 53 text

end