\r\nなどとhtmlに書きますが、これだとクリック1つでクライアントにmain.jsの中身がバレてしまい、せっかく苦労して作成したコードもパクられてしまいます。\r\n\r\n改行マーク等を取り除いて難読化 -> リコンパイルできるし、難読状態のまま使われてしまうケースもあるようです。\r\n\r\nhttps://qiita.com/yomogenium/items/881a55417dc047756e78\r\nこのサイトによると、直接アクセスした場合ニセのコードを出力してソースコードを見られないようにすることができるようですが、PHPを例に挙げているため、Node.jsでどのように実装すればよいのかわかりません。\r\n\r\nJavascriptはクライアントサイドで動く=クライアントのデバイスにダウンロードされて動く、ので完全に防ぐことができないことは理解していますが、なにか良い方法をご存知の方がいらっしゃいましたら、ご教授いただければ幸いです。\r\n\r\nまた、Node.jsをお使いのみなさんがどのように対策しているかにも興味があります(Javascriptのクライアントサイドのコードはバレても仕方ないと割り切っているとか)。\r\n\r\n忌憚なきご意見をいただければと思います。\r\nよろしくお願いいたします。","answerCount":4,"upvoteCount":1,"datePublished":"2021-11-01T07:45:10.656Z","dateModified":"2021-11-01T07:45:10.656Z","acceptedAnswer":{"@type":"Answer","text":"> Javascriptのクライアントサイドのコードはバレても仕方ないと割り切っているとか\r\n\r\nそれがいちばん現実的です。","dateModified":"2021-11-01T07:57:07.474Z","datePublished":"2021-11-01T07:57:07.474Z","upvoteCount":2,"url":"https://teratail.com/questions/367243#reply-498829"},"suggestedAnswer":[{"@type":"Answer","text":"レンダリング部分と、論理部分が混じっているのですね。作成開始した時から計画していないと、一体成型になるのは良くありそうです。私もそうでした。\r\nその構造だと、追加・変更が難しいので、レンダリングと論理の分離、更に表現機能毎に論理を分割と進んでいきました。APIがどうあるべきか理想的形の方向からとできてしまっている(けどバグっている)コードの間を段々埋める形で直しています。","dateModified":"2021-11-09T04:50:22.942Z","datePublished":"2021-11-09T04:50:22.942Z","upvoteCount":0,"url":"https://teratail.com/questions/367243#reply-500154","comment":[{"@type":"Comment","text":"すみません。書き方が紛らわしかったかも知れません。レンダリング等サーバーサイドのコード部分については問題ないのです。クライアントが見ることのできるhtmlのソースコードJavascript部分(ex. /js/my.js)をクリックすれば誰でも見られてしまうよなあ、という話です。クライアントサイドのJavascriptコードはクライアントマシンにダウンロードされて実行されてしまうので、見られてしまうのは当たり前のことなのですが、なんとか隠す方法はないものかと虫の良いことを思った次第です。\r\n失礼いたしました。","datePublished":"2021-11-09T05:54:43.673Z","dateModified":"2021-11-09T05:54:43.673Z"}]},{"@type":"Answer","text":"nodeは、サーバサイドで動作するjavascriptの処理系です。javascriptが言語の名前で、nodeは、それを処理するプログラム。IE, Firefox, Edge などそれぞれ別のプログラムです。\r\n\r\nnodeで表現する論理を隠したいのであれば、論理を全てサーバサイドで実行して、結果のみをクライアントに返すようにします。結果をHTMLにしてクライアント側のHTMLのどこかに、innerHTMLとして挿入します。隠蔽効果に加えて、クライアントへの通信量の削減効果もあります。もちろん言語はjavscriptに限らずサーバサイドで実行できればどれでも同じことができます。\r\n\r\nボタンの名前、使用するデータフィールドの値、サーバーのアドレス等は露出してしまいますが、論理は完全に隠すことができます。\r\n\r\n\r\n実際の例で、隠蔽具合が納得できる例は、amazon, google へのログイン部分です。\r\nAPIの名前をAPIにして、cmd=99 みたいにAPIの中身を推定しにくい形にすると更に論理の推測は難しくなります。露出するのは、以下の程度になります。\r\n```\r\nhttps://azjjioe0.amazon.com/myapi?cmd=099&data0=\"名前\"&data1=\"姓\"\r\n```","dateModified":"2021-11-08T23:36:32.009Z","datePublished":"2021-11-08T23:36:32.009Z","upvoteCount":0,"url":"https://teratail.com/questions/367243#reply-500103","comment":[{"@type":"Comment","text":"ご回答ありがとうございます。\r\nそうですね。WebサーバーはNode.jsでも何回も立てているので基本原理がわかっていないわけではありません。APIキーなど絶対漏れてはいけない部分はサーバー内のdotenvなどに記述してしてわからないようにしています。ただ、今回たまたまクライアントサイドのJavascriptでかなり混んだもの(作成するのに苦労したもの)を作ってしまったためこれを隠せないかなと思った次第です。\r\n\r\n>論理を全てサーバサイドで実行して、結果のみをクライアントに返すようにします。結果をHTMLにしてクライアント側のHTMLのどこかに、innerHTMLとして挿入します。\r\nちなみにこれも行っています。\r\n\r\nありがとうございました。","datePublished":"2021-11-09T00:55:27.991Z","dateModified":"2021-11-09T00:57:10.775Z"}]},{"@type":"Answer","text":"> PHPを例に挙げているため、Node.jsでどのように実装すればよいのかわかりません。\r\n\r\nWebブラウザは「HTTPリクエスト」というWeb業界のお作法に則って\r\nWebサーバに対してデータをくださいという要求を行います。\r\n\r\nこれはWeb(インターネット)の仕様書のRFCにバッチリ記載されています。\r\n参考記事: [ハイパーテキスト転送プロトコル -- HTTP/1.1 (RFC2616)](https://triple-underscore.github.io/rfc-others/RFC2616-ja.html)\r\n\r\nこれに基づいて動作してないWebブラウザなんてありませんし\r\n(個人で勝手に作ったブラウザなら知らんけど、ChromeでRFCを無視してたら速攻バレて袋叩きにされるでしょう)\r\nこれに準拠していないWebサーバなんてありません。\r\nそこから掘り下げればなんとでもなります。\r\n\r\nってHTTP REQUEST_METHODが分からないってやばくね?\r\nWebサーバ立ち上げた事一度もありませんレベルの告白なんだけど……\r\n\r\n- [HTTP リクエストメソッド - MDN](https://developer.mozilla.org/ja/docs/Web/HTTP/Methods)\r\n- [ルーティング - Express.js](https://expressjs.com/ja/guide/routing.html)\r\nNode.js初心者御用達のExpressでは`app.post(path, fn)`で実現できる\r\n\r\n> https://qiita.com/yomogenium/items/881a55417dc047756e78\r\nこのサイトによると、直接アクセスした場合ニセのコードを出力してソースコードを見られないようにすることができるようですが\r\n\r\nなんだこれ\r\nデベロッパーツールのnetworkタブ開きっぱなしで全部抜けるのでは?\r\nローカル持ち逃げからのコピペ実装を踏まえると何も質問文の要件を満たせてません。\r\n\r\n丸パクリを牽制するなら\r\n実行ドメインが想定してるサーバと合ってるか否かを確認して、\r\n違ってたらAjaxで自社に通報する仕組みでも導入すれば良いんじゃ?\r\n\r\nまたQiita記事のような小細工レベルではなく\r\nそこそこの技術力があってもさじを投げるレベルは可能です。\r\n\r\n具体的な例だと[お城プロジェクト](https://games.dmm.com/detail/oshirore/)のPCブラウザ版ですね。\r\n\r\nこのゲームはJavaScriptで動いていますが、\r\n[Emscripten](https://ja.wikipedia.org/wiki/Emscripten)で[LLVM](https://ja.wikipedia.org/wiki/LLVM)越しに何かの言語からコンパイルして作っています。\r\n我々Web系エンジニアがこの処理はちょっとマシンパワー使うかもしれないからRustでやろうかな?\r\nレベルではなく、全てがまるっとEmscriptenで包んであって何やってるかわかりません。\r\n\r\nデベロッパーツールを開いて通信内容を見張っていても\r\nお行儀の良いテキストファイルではなく、がっつりバイナリデータを授受してるので\r\n解析することも困難です。\r\n\r\n---\r\n\r\n丸ごと保管して環境エミュレートしてローカルで動かせばええやねと思っても、\r\n相当時間が掛かること請け合いです。\r\n\r\nしかもこのゲーム、2週間に1度程度のペースでアップデートされます。\r\nこういう所に価値があるので\r\n\r\n> せっかく苦労して作成したコードもパクられてしまいます。\r\n\r\nこれは解消出来たと言っても良いのではないでしょうか?\r\nパクるのに時間かかるし価値もコピー出来ない。\r\n\r\n---\r\n\r\nとまぁ、どの程度まで対策や難読化を頑張るかにもよりますが、\r\n基本的にDLしたファイルを全て持ち逃げして\r\nローカルで環境エミュレートしながら逆コンパイルを含めると流石に質問文の要件を全て満たす事は不可能です。\r\n\r\n> せっかく苦労して作成したコードもパクられてしまいます。\r\n\r\nそこでマネタイズするなら辛いでしょうね。\r\n\r\nしかし世のほぼ全てのサービスは他のユーザーとのコミュニケーションだとか\r\nインターネット越しに商品が購入出来るだとか\r\n音楽や映画等のコンテンツを視聴するだとか\r\n\r\nそういうパクれない所でユーザーをもてなす事でマネタイズをしています。\r\nユーザーの体験で勝負!\r\nユーザー体験をUXと呼び、UXを最大化することでマネタイズをします。\r\n\r\n貴方が会社の社長・取締役の立場なら\r\nHTML、CSS、JavaScriptはコピーされるかもしれない、\r\nでも俺達が作ったサービスは真似が出来ないぞ、何故ならば○○だから!\r\nこういう何かしらで丸パクリされても戦えるサービスを捻出しなければなりません。\r\n\r\n例えば私に限らず少し技術力があれば誰でも可能ですが、\r\nTwitterのソースコードを丸パクリして同じようなサービスをすぐにリリース出来ます。\r\nでもコードを解析して付加価値付けてるわけでもないし、全てがTwitterの追従でしかない。\r\n誰も使わないのは目に見えてますのでそんな気はおきません。\r\nやる奴はタダのバカです。\r\n\r\n社員の立場ならそういう事が出来ない社長・取締役が居ない会社は\r\nそのうち立ちいかなくなるのでさっさと逃げましょう。\r\nまぁ、流石に何か考えてると思うので数年頑張ってみては?","dateModified":"2021-11-02T09:59:09.168Z","datePublished":"2021-11-02T09:59:09.168Z","upvoteCount":1,"url":"https://teratail.com/questions/367243#reply-499029","comment":[{"@type":"Comment","text":"ご返信、ありがとうございます。\r\nNode.jsでもPHPでもWebサーバーを立てたことはありますし、貴殿のおっしゃることはもちろん理解の範疇なのですが、Node.jsでもっと簡単にできる手がないかと思っただけです。まあ、ニセのコードを吐き出してもChromeのデベロッパーツールなどで分かる人には分かってしまうという程度でしかないですね。\r\n\r\nともあれ、先に書いたとおり、無駄なことはやめることにしましたので。\r\n\r\nありがとうございました。","datePublished":"2021-11-02T10:47:44.725Z","dateModified":"2021-11-02T11:21:00.109Z"}]}],"breadcrumb":{"@type":"BreadcrumbList","itemListElement":[{"@type":"ListItem","position":1,"item":{"@id":"https://teratail.com","name":"トップ"}},{"@type":"ListItem","position":2,"item":{"@id":"https://teratail.com/tags/Node.js","name":"Node.jsに関する質問"}},{"@type":"ListItem","position":3,"item":{"@id":"https://teratail.com/questions/367243","name":"[Node.js]クライアントにJavascriptのソースコードを見られないようにする方法"}}]}}}
質問するログイン新規登録

Q&A

解決済

4回答

7706閲覧

[Node.js]クライアントにJavascriptのソースコードを見られないようにする方法

kobo_jp

総合スコア19

Node.js

Node.jsとはGoogleのV8 JavaScriptエンジンを使用しているサーバーサイドのイベント駆動型プログラムです。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

1グッド

2クリップ

投稿2021/11/01 07:45

1

2

Node.jsでWebサービスを開発中の者です。

クライアントサイドのJavascriptのファイルをmain.jsとした場合、

<script src="./main.js"></script>

などとhtmlに書きますが、これだとクリック1つでクライアントにmain.jsの中身がバレてしまい、せっかく苦労して作成したコードもパクられてしまいます。

改行マーク等を取り除いて難読化 -> リコンパイルできるし、難読状態のまま使われてしまうケースもあるようです。

https://qiita.com/yomogenium/items/881a55417dc047756e78
このサイトによると、直接アクセスした場合ニセのコードを出力してソースコードを見られないようにすることができるようですが、PHPを例に挙げているため、Node.jsでどのように実装すればよいのかわかりません。

Javascriptはクライアントサイドで動く=クライアントのデバイスにダウンロードされて動く、ので完全に防ぐことができないことは理解していますが、なにか良い方法をご存知の方がいらっしゃいましたら、ご教授いただければ幸いです。

また、Node.jsをお使いのみなさんがどのように対策しているかにも興味があります(Javascriptのクライアントサイドのコードはバレても仕方ないと割り切っているとか)。

忌憚なきご意見をいただければと思います。
よろしくお願いいたします。

GenbuHase👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答4

0

ベストアンサー

Javascriptのクライアントサイドのコードはバレても仕方ないと割り切っているとか

それがいちばん現実的です。

投稿2021/11/01 07:57

maisumakun

総合スコア146853

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

maisumakun

2021/11/01 08:03

「完全に防ぐことができない」というのは、「完全に/防ぐことができない」ということです。 気休め程度で実質的な効果のない対策へ労力を費やしても、見返りは見込めません。
kobo_jp

2021/11/01 08:08

なるほど。結局そういうことなのですね。サーバーサイドにおけるコード(パスワード発行など)はサーバーに置くとして、それ以外はすっぱりあきらめたほうが良いということですね。すっきりしました。ありがとうございました。
guest

0

PHPを例に挙げているため、Node.jsでどのように実装すればよいのかわかりません。

Webブラウザは「HTTPリクエスト」というWeb業界のお作法に則って
Webサーバに対してデータをくださいという要求を行います。

これはWeb(インターネット)の仕様書のRFCにバッチリ記載されています。
参考記事: ハイパーテキスト転送プロトコル -- HTTP/1.1 (RFC2616)

これに基づいて動作してないWebブラウザなんてありませんし
(個人で勝手に作ったブラウザなら知らんけど、ChromeでRFCを無視してたら速攻バレて袋叩きにされるでしょう)
これに準拠していないWebサーバなんてありません。
そこから掘り下げればなんとでもなります。

ってHTTP REQUEST_METHODが分からないってやばくね?
Webサーバ立ち上げた事一度もありませんレベルの告白なんだけど……

https://qiita.com/yomogenium/items/881a55417dc047756e78
このサイトによると、直接アクセスした場合ニセのコードを出力してソースコードを見られないようにすることができるようですが

なんだこれ
デベロッパーツールのnetworkタブ開きっぱなしで全部抜けるのでは?
ローカル持ち逃げからのコピペ実装を踏まえると何も質問文の要件を満たせてません。

丸パクリを牽制するなら
実行ドメインが想定してるサーバと合ってるか否かを確認して、
違ってたらAjaxで自社に通報する仕組みでも導入すれば良いんじゃ?

またQiita記事のような小細工レベルではなく
そこそこの技術力があってもさじを投げるレベルは可能です。

具体的な例だとお城プロジェクトのPCブラウザ版ですね。

このゲームはJavaScriptで動いていますが、
EmscriptenLLVM越しに何かの言語からコンパイルして作っています。
我々Web系エンジニアがこの処理はちょっとマシンパワー使うかもしれないからRustでやろうかな?
レベルではなく、全てがまるっとEmscriptenで包んであって何やってるかわかりません。

デベロッパーツールを開いて通信内容を見張っていても
お行儀の良いテキストファイルではなく、がっつりバイナリデータを授受してるので
解析することも困難です。


丸ごと保管して環境エミュレートしてローカルで動かせばええやねと思っても、
相当時間が掛かること請け合いです。

しかもこのゲーム、2週間に1度程度のペースでアップデートされます。
こういう所に価値があるので

せっかく苦労して作成したコードもパクられてしまいます。

これは解消出来たと言っても良いのではないでしょうか?
パクるのに時間かかるし価値もコピー出来ない。


とまぁ、どの程度まで対策や難読化を頑張るかにもよりますが、
基本的にDLしたファイルを全て持ち逃げして
ローカルで環境エミュレートしながら逆コンパイルを含めると流石に質問文の要件を全て満たす事は不可能です。

せっかく苦労して作成したコードもパクられてしまいます。

そこでマネタイズするなら辛いでしょうね。

しかし世のほぼ全てのサービスは他のユーザーとのコミュニケーションだとか
インターネット越しに商品が購入出来るだとか
音楽や映画等のコンテンツを視聴するだとか

そういうパクれない所でユーザーをもてなす事でマネタイズをしています。
ユーザーの体験で勝負!
ユーザー体験をUXと呼び、UXを最大化することでマネタイズをします。

貴方が会社の社長・取締役の立場なら
HTML、CSS、JavaScriptはコピーされるかもしれない、
でも俺達が作ったサービスは真似が出来ないぞ、何故ならば○○だから!
こういう何かしらで丸パクリされても戦えるサービスを捻出しなければなりません。

例えば私に限らず少し技術力があれば誰でも可能ですが、
Twitterのソースコードを丸パクリして同じようなサービスをすぐにリリース出来ます。
でもコードを解析して付加価値付けてるわけでもないし、全てがTwitterの追従でしかない。
誰も使わないのは目に見えてますのでそんな気はおきません。
やる奴はタダのバカです。

社員の立場ならそういう事が出来ない社長・取締役が居ない会社は
そのうち立ちいかなくなるのでさっさと逃げましょう。
まぁ、流石に何か考えてると思うので数年頑張ってみては?

投稿2021/11/02 09:59

miyabi-sun

総合スコア21553

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kobo_jp

2021/11/02 11:21 編集

ご返信、ありがとうございます。 Node.jsでもPHPでもWebサーバーを立てたことはありますし、貴殿のおっしゃることはもちろん理解の範疇なのですが、Node.jsでもっと簡単にできる手がないかと思っただけです。まあ、ニセのコードを吐き出してもChromeのデベロッパーツールなどで分かる人には分かってしまうという程度でしかないですね。 ともあれ、先に書いたとおり、無駄なことはやめることにしましたので。 ありがとうございました。
guest

0

レンダリング部分と、論理部分が混じっているのですね。作成開始した時から計画していないと、一体成型になるのは良くありそうです。私もそうでした。
その構造だと、追加・変更が難しいので、レンダリングと論理の分離、更に表現機能毎に論理を分割と進んでいきました。APIがどうあるべきか理想的形の方向からとできてしまっている(けどバグっている)コードの間を段々埋める形で直しています。

投稿2021/11/09 04:50

gm300

総合スコア580

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kobo_jp

2021/11/09 05:54

すみません。書き方が紛らわしかったかも知れません。レンダリング等サーバーサイドのコード部分については問題ないのです。クライアントが見ることのできるhtmlのソースコードJavascript部分(ex. /js/my.js)をクリックすれば誰でも見られてしまうよなあ、という話です。クライアントサイドのJavascriptコードはクライアントマシンにダウンロードされて実行されてしまうので、見られてしまうのは当たり前のことなのですが、なんとか隠す方法はないものかと虫の良いことを思った次第です。 失礼いたしました。
guest

0

nodeは、サーバサイドで動作するjavascriptの処理系です。javascriptが言語の名前で、nodeは、それを処理するプログラム。IE, Firefox, Edge などそれぞれ別のプログラムです。

nodeで表現する論理を隠したいのであれば、論理を全てサーバサイドで実行して、結果のみをクライアントに返すようにします。結果をHTMLにしてクライアント側のHTMLのどこかに、innerHTMLとして挿入します。隠蔽効果に加えて、クライアントへの通信量の削減効果もあります。もちろん言語はjavscriptに限らずサーバサイドで実行できればどれでも同じことができます。

ボタンの名前、使用するデータフィールドの値、サーバーのアドレス等は露出してしまいますが、論理は完全に隠すことができます。

実際の例で、隠蔽具合が納得できる例は、amazon, google へのログイン部分です。
APIの名前をAPIにして、cmd=99 みたいにAPIの中身を推定しにくい形にすると更に論理の推測は難しくなります。露出するのは、以下の程度になります。

https://azjjioe0.amazon.com/myapi?cmd=099&data0="名前"&data1="姓"

投稿2021/11/08 23:36

gm300

総合スコア580

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kobo_jp

2021/11/09 00:57 編集

ご回答ありがとうございます。 そうですね。WebサーバーはNode.jsでも何回も立てているので基本原理がわかっていないわけではありません。APIキーなど絶対漏れてはいけない部分はサーバー内のdotenvなどに記述してしてわからないようにしています。ただ、今回たまたまクライアントサイドのJavascriptでかなり混んだもの(作成するのに苦労したもの)を作ってしまったためこれを隠せないかなと思った次第です。 >論理を全てサーバサイドで実行して、結果のみをクライアントに返すようにします。結果をHTMLにしてクライアント側のHTMLのどこかに、innerHTMLとして挿入します。 ちなみにこれも行っています。 ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.29%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問