🖼

異次元のスクレイピング対策

2023/05/14に公開

著作権や肖像権を守るため、Web サイトで公開した画像の取得を禁じたいという需要はありますが、根本的には不可能です。
ブラウザから外のことは基本的にわからないので、スクリーンショットやそうでなくても画面ごとカメラで取るという行為に対して無力です。
そのため、現実的な対策としてはいかに取得するのを面倒にし、大量に取得するのを防ぐかということになるでしょう。

既存の対策

既存の対策を挙げてみます。

  • Bot 検知
    • 人間による監視、機械学習ベースの異常検知等
    • reCAPTCHA もこれに含まれる
  • レート制限
    • 厳しすぎると通常ユーザにも影響が出る
  • 閲覧をログイン必須にする
    • Bot を使う場合 Selenium 等が必要になり、それだけでも結構面倒になる
    • IP 制限 だけでなく、アカウント BAN 等の手数が増える
    • 同時に複数アカウントの作成を難しくできるとなおよい(SMS 認証等)
  • リファラのチェック
    • 直リンクを防げるからやって損はないはず
    • リファラの偽装は容易
    • 403 とかじゃなくて、変な画像返すようにしたら面白そう
  • (画像の)URL を推測しにくくする
    • 連番にしない
  • DOM を解析しにくくする
    • DOM 要素の id, class を含め DOM を頻繁に変える
      • いっそランダム性を加える
    • JavaScript で構築する
    • <iframe>
  • スマートフォンアプリのみの提供
    • Android ではアプリで OS のスクリーンショットを禁止することができる
    • PC からエミュレータを立ち上げられて、スクリーンショットを取ることはできてしまう
  • 右クリック禁止?
    • 通常利用するユーザに影響があるだけで、悪用しようとするユーザには無意味。悪手
  • <img> タグではなく、CSS の background-image を使う
    • 右クリック禁止するくらいならこれをしたほうがいい
  • 画像を分割する
    • 例えば 10x10 px ごとに分割し、CSS + JS を使って並べる
    • ダウンロードしても組み合わせるのが多少面倒

対策自体は色々とありますが、どれも完璧ではありません。
ということで、自分も興味がてらスクレイピング対策を考えてみました。
結果、実用性の薄いものになってしまいましたが、一応動作するものになったので紹介します。

考えた対策

ベースは最後に挙げた「画像を分割する」です。これも自力で考えたのですが、後で調べたら漫画サイトで使われているらしいです。
ですが、これもユーザには正しく見せる必要がある都合上、スクリーンショットに対しては効果がありません。
せめて、自動でスクリーンショットをとっていくようなプログラムの対策をとりたいと考えました。
ということで、開いた状態では以下のようにバラバラになっており、スクロールすると次第に整列していくようにしてみました。

以下のデモサイトで実際の動作が確認できます。

https://eduidl.github.io/vs-scraping/tile-move

批評

ユーザにとっても使いにくいという問題はありますが、UI を工夫すれば許容できるかもしれません。
より大きな懸念としては、他人の著作物の場合、同一性保持権を侵害することになるのではないかという点です。

企業の対策例

https://about.fb.com/ja/news/2021/04/how-we-combat-scraping/

https://inside.pixiv.blog/2023/05/09/183635

GitHubで編集を提案

Discussion