Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
LaravelでLIKE句のSQLインジェクション対策をする
Search
ゆい
September 25, 2022
Programming
3.8k
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
LaravelでLIKE句のSQLインジェクション対策をする
ゆい
September 25, 2022
More Decks by ゆい
See All by ゆい
PHPの緩やかな比較の実態
fyui001
0
1.6k
Other Decks in Programming
See All in Programming
Spring Security 実践 ─ GraphQL APIで実務に役立つ 認証・認可 を学ぶ
wagyu
0
220
Claspは野良GASの夢をみるか
takter00
0
180
Agentic UI
manfredsteyer
PRO
0
140
フロントエンドとバックエンドで「1文字」を揃えよう
youkidearitai
PRO
0
260
Webフレームワークの ベンチマークについて
yusukebe
0
160
AIとASP.NET Coreで雑Webアプリを作った話
mayuki
0
500
Make SRE Operations Easier with Azure SRE Agent
kkamegawa
0
5.3k
代数的データ型って何が嬉しいの? #frontend_phpcon_do
kajitack
8
3.3k
Oxlintのカスタムルールの現況
syumai
6
1.1k
軽量Java基盤の設計 DIコンテナに頼らない、長期保守と1秒起動の実現 JJUG CCC 2026 Spring
macha64
0
490
Technical Debt: Understanding it Rightly, Engaging it Rightly #LaravelLiveJP
shogogg
0
220
Copilot CLI の継戦能力を高める コンテキスト管理
nozomutu
1
1.2k
Featured
See All Featured
A Tale of Four Properties
chriscoyier
163
24k
Art, The Web, and Tiny UX
lynnandtonic
304
22k
First, design no harm
axbom
PRO
2
1.2k
The Straight Up "How To Draw Better" Workshop
denniskardys
239
140k
Visualizing Your Data: Incorporating Mongo into Loggly Infrastructure
mongodb
49
10k
Data-driven link building: lessons from a $708K investment (BrightonSEO talk)
szymonslowik
1
1.1k
The Power of CSS Pseudo Elements
geoffreycrofte
82
6.3k
Balancing Empowerment & Direction
lara
6
1.2k
How to Build an AI Search Optimization Roadmap - Criteria and Steps to Take #SEOIRL
aleyda
1
2.1k
Unsuck your backbone
ammeep
672
58k
SEOcharity - Dark patterns in SEO and UX: How to avoid them and build a more ethical web
sarafernandez
0
200
How People are Using Generative and Agentic AI to Supercharge Their Products, Projects, Services and Value Streams Today
helenjbeal
1
210
Transcript
Copyright© M&AΫϥυ LaravelͰLIKE۟ͷSQLΠϯδΣΫγϣϯରࡦΛ͢Δ PHP Conference Japan 2022
Copyright© M&AΫϥυ 2 Profile גࣜձࣾM&AΫϥυ Ώ͍ fyui001 @fyui_001
Copyright© M&AΫϥυ 3 खͳSQLΠϯδΣΫγϣϯҰൠతͳWebϑϨʔϜϫʔΫΛ༻͢Εجຊతʹൃੜ͠·ͤΜɻ ͔͠͠ɺLIKEݕࡧΛߦ͏߹DoS߈ཱܸ͕ͯ͠͠·͏͜ͱ͕͋Γ·͢ɻ LIKE "%a%b%c%d%e%e%f%g%@%.%" ্هͷΑ͏ͳΫΤϦSQLΤϯδϯʹେ͖ͳෛՙΛ͔͚·͢ɻ LIKE۟ͷϝλจࣈΤεέʔϓ͢Δඞཁ͕͋Γ·͕͢ɺ
$query->where('hoge', 'LIKE', '%' . $value . '%'); ͱʹॻ͍ͯ͠·͏έʔεଟ͍ͱࢥ͍·͢ɻ
Copyright© M&AΫϥυ 4 ରࡦ LaravelͰͷ͜ͷLIKE۟ͷΠϯδΣΫγϣϯରࡦ͓ͦΒ̏͘௨Γ΄Ͳ͋Δͱࢥ͏ͷͰ ͦΕͧΕͷιϦϡʔγϣϯΛ͝հ͍ͯ͜͠͏ͱࢥ͍·͢ɻ
Copyright© M&AΫϥυ 5 1. macroΛ༻ҙ͢Δ ·ͣBlueprintͷmacroΛఆٛ͢ΔͨΊʹ αʔϏεϓϩόΠμΛ৽͘͠࡞Γ·͢ɻ(AppServiceProvider.phpʹॻ͖ࠐΉํ๏͋Δɻ php artisan make:provider
BlueprintServiceProvider
Copyright© M&AΫϥυ 6 1. macroΛ༻ҙ͢Δ <?php namespace App\Providers; use Illuminate\Support\ServiceProvider;
class BlueprintServiceProvider extends ServiceProvider { /** * Register services. * * @return void */ public function register() { // } /** * Bootstrap services. * * @return void */ public function boot() { // } ͢ΔͱҎԼͷΑ͏ͳϑΝΠϧ͕ੜ͞Ε·͢ɻ
Copyright© M&AΫϥυ 7 1. macroΛ༻ҙ͢Δ ͜ͷbootϝιουʹmacroΛఆ͍͖ٛͯ͠·͢ɻ < /** * Bootstrap
services. * * @return void */ public function boot() { Builder::macro('whereLike', function (string $attribute, string $keyword, int $position = 0) { $keyword = addcslashes($keyword, '\_%'); $condition = [ 1 => "{$keyword}%", -1 => "%{$keyword}", ][$position] ?? "%{$keyword}%"; return $this->where($attribute, 'LIKE', $condition); }); Builder::macro('orWhereLike', function (string $attribute, string $keyword, int $position = 0) { $keyword = addcslashes($keyword, '\_%'); $condition = [ 1 => "{$keyword}%", -1 => "%{$keyword}", ][$position] ?? "%{$keyword}%"; return $this->orWhere($attribute, 'LIKE', $condition); }); }
Copyright© M&AΫϥυ 8 2.ΫΤϦείʔϓΛ͏ ModelͰҎԼͷΑ͏ʹఆٛ͠·͢ɻ <?php namespace App\Models; use Illuminate\Database\Eloquent\Model
as EloquentModel; /** * This class contains shared setup, properties and methods * of all application models * */ class Model extends EloquentModel { public function scopeWhereLike($query, string $attribute, string $keyword, int $position = 0) { $keyword = addcslashes($keyword, '\_%'); $condition = [ 1 => "{$keyword}%", -1 => "%{$keyword}", ][$position] ?? "%{$keyword}%"; return $query->where($attribute, 'LIKE', $condition); } public function scopeOrWhereLike($query, string $attribute, string $keyword, int $position = 0) { $keyword = addcslashes($keyword, '\_%'); $condition = [ 1 => "{$keyword}%", -1 => "%{$keyword}", ][$position] ?? "%{$keyword}%"; return $query->orWhere($attribute, 'LIKE', $condition); }
Copyright© M&AΫϥυ 9 3.TraitͰ͍ճͤΔύʔπͱͯ͠༻ҙ͢Δ macroɾΫΤϦείʔϓఆٛͰIDEࢧԉ͕ޮ͔ͳ͍͕͋Γ·͢ɻ ·ͨɺνʔϜͷنʹΑͬͯϑϨʔϜϫʔΫͷཧղϨϕϧʹόϥ͖͕ͭग़ͯ͘Δ͜ͱ͋Γ·͢ɻ ͳͷͰݴޠϨϕϧͰཧղͷ͍͢͠TraitͰػೳΛ༻ҙͯ͋͛͠Δͱ͍͏ղग़͖ͯ·͢ɻ TraitͳΒIDEͷࢧԉޮ͘ͷͰɺ৽ϝϯόʔͳͲ͕ίʔυΛݟͨͱ͖ʹίʔυδϟϯϓͰͨͲΓண͘ίετ͕͘ͳΔ͔͠Ε·ͤΜɻ ͕͔ͩ͠͠ɺTraitͰ͍͍ײ͡ʹ࣮͢Δํ๏͕Θ͔Βͳ͔ͬͨͷͰఘΊͨ Πϝʔδͱͯ͠ҎԼͷײ͡Ͱ࣮Ͱ͖ͨΒΑ͔ͬͨͷͰ͕͢ɺEloquent\Builder
Λ࣋ͯͳ͍ҝ $result = Model::whereLike('hoge', $value)->get() Έ͍ͨͳॻ͖ํग़དྷͯ $result = Model::where('hoge', $value)->orWhereLike('hoge', $value)->get(); Έ͍ͨͳEloquent\Builderͷ͔ؔΒݺͼग़ͦ͏ͱ͢Δͱવίέͯ͠·͍·͢ɻ ͳΜ͔͍͍ײ͡ʹTraitͰ࣮͢Δํ๏͕͋ͬͨΒڭ͑ͯԼ͍͞ɻ
Copyright© M&AΫϥυ 10 3.TraitͰ͍ճͤΔύʔπͱͯ͠༻ҙ͢Δ Ϙπ <?php declare(strict_types=1); namespace App\Libs; trait
EloquentQueryBuilder { protected function whereLike(string $attribute, string $keyword, int $position = 0) { $keyword = addcslashes($keyword, '\_%'); $condition = [ 1 => "{$keyword}%", -1 => "%{$keyword}", ][$position] ?? "%{$keyword}%"; return $this->orWhere($attribute, 'LIKE', $condition); } protected function orWhereLike(string $attribute, string $keyword, int $position = 0) { $keyword = addcslashes($keyword, '\_%'); $condition = [ 1 => "{$keyword}%", -1 => "%{$keyword}", ][$position] ?? "%{$keyword}%"; return $this->orWhere($attribute, 'LIKE', $condition); } }
Copyright© M&AΫϥυ 11 ͍ํ $result = Model::whereLike('hoge', $keyword)->get(); // or
$query = Model::query(); $result = $query::whereLike('hoge', $keyword)->get(); whereLike $result = Model::where('hoge', $value)->orWhereLike('hoge', $keyword)->get(); // or $query = Model::query(); $result = $query::where('hoge', $value)->orWhereLike('hoge', $keyword)->get(); orWhereLike
Copyright© M&AΫϥυ 12 ·ͱΊ macro͔ΫΤϦείʔϓΛ࣮͢Δ͜ͱͰEloquentͷwhere۟Λॻ͘ͷͱಉ༷ͷه๏ͰҎԼͷ͕ؔ༻Ͱ͖·͢ɻ • whereLike • orWhereLike ͋ͱɺwhere۟ʹੜͷLIKE͕۟ࠞೖ͠ͳ͍Α͏ʹίʔυͷ࣭ΛΩʔϓ͢ΕղܾͰ͖·͢ɻ
લड़ͷ௨ΓmacroΫΤϦείʔϓͰIDEࢧԉ͕ޮ͔ͳ͍ͷͰɺ LaravelʹิɾܕใΛ༩ͯ͘͠ΕΔϥΠϒϥϦLaravel IDE Helper GeneratorͳͲΛ༻͢Δͱศརͩͱࢥ͍·͢ɻ
Copyright© M&AΫϥυ ͝ਗ਼ௌ͋Γ͕ͱ͏͍͟͝·ͨ͠ʂ 13