web-dev-qa-db-ja.com

仲間のプログラマーが最悪のプログラミング方法を使用した

奇妙に思うかもしれませんが、同僚のプログラマーが故意に意図的にいくつかの悪いプログラミング方法を使用しました!説明します。まず、彼は頭のいい人であり、大部分は理解しやすいコードを書いていると言いましょう。

彼は、Javaで書かれたWebアプリケーションプロジェクトにライセンスを実装するように求められました。それはJavaなので、本当に望めば、jarをハックして内部に記述されたクラスとメソッドの名前を読み取ることができるでしょう。この問題に対する彼の解決策は、文字通り、変数とメソッドを明白ではない名前でぎこちなく呼び出し、新しいクラスを生成するのではなく、すでに混雑したクラス内にそれらを植えることでした。

彼の正当性は、ハッカーがライセンスチェックを回避するために特定のクラスを切り替えたい(したがって、製品の無料コピーを入手したい)場合、どの方法が明らかでないと、はるかに困難な時間を費やすことになるということです。これらの特定のタスクを実行します。彼がそれをした後で初めて、私は彼とその問題に立ち向かいました。良いプログラミングの実践を維持しながら、私たちがそれを行うために、ある種の難読化ライブラリを購入できると示唆しました。彼はその種の解決策を探す時間やリソースがなかったと主張している。

..ジレンマに陥る。 Java=で難読化ライブラリを探し、彼の古いコードを修正しますか(コードの再構築について少し手間がかかるかもしれません)、それともそのままにしておくのは、私が気になることです。終わりまで?

37
Neil

難読化によるセキュリティが優れたセキュリティになることは決してありません。あなたの知的財産を保護するより良い方法がなければなりません。そして、それはあなたとあなたの同僚があなたのマネージャーとの共同の懸念として持ち上がるべきものです。経営陣がセキュリティの向上に時間やお金を費やしたくないと決定した場合、あなたとあなたの両方がその決定を受け入れなければならず(それはあなたの製品ではなく、会社の製品です)、費やさない(無駄ですか?)この件に関しては、これ以上の時間はありません。

94
wolfgangsz

オリジナル:あなたの上司は何と言っていますか?調べてください-それをしてください。


上記について詳しく説明するように求められました。

まず第一に、あなたには複数のジレンマがあると思います:

  • 他の人のコードを「修正」する必要がありますか?
  • 他の人の実装(ここからA)は、他のもので置き換える必要があるほど悪いですか?
  • 難読化ツール(ここからB)は、この「アプリケーションにライセンスを埋め込む」のに適していますか?

まず、ビジネスケースから見ると、問題[〜#〜] [〜#〜]が解決されます。 Aは適切に配置されており、ほとんどの場合、問題に対する「十分な」ソリューションです。あなたの会社はそれを壊すために故意の努力が必要であるように基本的に十分に保護されたそれで満足しているかもしれません。

これは、あなたがそれを嫌っていても(そして、私を信頼してください あなたはあなたのキャリアを通してもっと悪くなるでしょう )それが必要なことをします。したがって、IS解決した問題として、あなたは「それを行うだけ」ではなく、あなたの仕事の割り当てを担当する人に長期この実装の価格は、ロールバックを保証し、ストック難読化ツールを選択するのに十分なほど高くなります。これには、かなりの準備が必要です。また、難読化ツールには、知っておく必要のある欠点もあります(他の回答ではカバーしています)たとえば、スタックトレースはすぐに使用できないなどです。これはすべて、著作権侵害を回避することがどれほど重要であるかによって異なります。ハードウェアドングルの実行が必要であり、顧客よりも高価である可能性が最も高いことに注意してください。好きになります。

したがって、あなたの会社はBに行くために追加のリソースを使用する必要があるので、この決定はあなたが決めることではありません。したがって、あなたはあなたの懸念を責任者に持ってきて、これと他の長期を説明する必要がありますなぜあなたがそれをあなたの提案よりも劣ると考えるのかを彼が理解するのに十分な心配事。それから彼に決定をさせ、それがどうなるかは関係なく、それを尊重し、それに応じてプロのやり方で行動してください。元の作者は、彼が書いたとおり、とにかくそれを維持する必要があることに注意してください。彼が去るか、もう望まない場合は、問題を再度提起できます。

つまり、あなたの上司は何と言っていますか?調べてください-それをしてください。

また、以前に問題を提起し、Aの実装に費やされた時間の浪費が少なかった場合、これは異なっていたことにも注意してください。つまり、AとBの間のchoiceを作成する必要がある場合です。

最後に、「他の人のコードを修正するだけ」についてのあなたの質問にコメントしたいと思います。これは既存のコードへの小さな修正ではありません(特にテストを実施している場合、私はこれを問題なく推奨します)。これは破壊的なロールバックと再実装であり、共通のコード所有権を持つチームであっても、事前の承認がなければ、これは(少なくとも私にとって)許容できることではありません。

うまくいけば、これは私の見解を明らかにします。

84
user1249

Java=で難読化ライブラリを探して、彼の古いコードを修正しますか(コードのリモデリングについて少し手間がかかるかもしれません)、それともそのままにしておくのは、私を困らせますか?終わりまで?

いいえ、誰かの後ろに戻って責任のあるコードを変更することは、最初に疑わしいコードを書くよりも悪い違反です。

あなたはプログラマーと一緒にそれを育てました、あなたの次のステップはあなたの鼻をそれに近づけないようにするか、それを管理者と一緒に育ててあなたの鼻をそれに近づけないようにすることです。

13
DKnight

公式のコードレビューはありましたか、それとも非公式の「コードレビュー」があったのですか?これはセキュリティやライセンスなどのデリケートで重要なテーマであるため、チェーンを引き上げる必要があります。あなたは最初の部分を完了しました-プログラマーに立ち向かいます。しかし、彼は聞いていないので、あなたはそれを取り上げることができます/すべきです。そうでない場合は、問題の一部である可能性があります。

私はあなたにそれをするつもりだと彼に言います-これは彼の考えを変えるかもしれません。そうでない場合は、非常に政治的に正しく、正確かつ簡潔な状況に関するメールを上司に書き、プログラマーにCCしてください。メールで、3人の参加者または他の参加者との面会を依頼します。

これらのことは常に真正面から、政治的で友好的な方法で行われます。

6
Catchops

クラスのシグネチャ(メソッド名など)を難読化できる難読化ツールを見つけた場合は、それを購入して使用することを提案します。

それまでは、一緒に暮らさなければならないかもしれません。最近のGrailsプロジェクトで同様のことを行っていることを認めます。ライセンスチェックは、すでに大規模なログインメソッドに意図的に組み込まれているため、チェックをバイパスするためにメソッドを置き換えるのはかなり困難です。

2
user281377

彼はそのようなハッキングが実行可能であることを実証できますか、それとも彼がちょっと心配している仮説的なシナリオだけですか?彼はこの作業のライブデモを行うことができますか?彼は試すべきです。真剣に。機能する場合は、管理者に提示し、難読化ツールを入手するように提案する必要があります。

難読化ツールが十分に安全でない場合、JARを保護する他の方法、たとえば暗号化やネイティブコードへのコンパイルなどを検討しましたか?

RE:彼のコードを作り直す:名前を変更するだけのことですか?多くのIDEには、これを非常に簡単に実行できるリファクタリングツールがあります。

IPの価値に関係なく、インテリジェントなことは、ハッカーを混乱させることを期待してコードを壊すことではありません。それが今後も続くのは悪夢になるという事実は別として、それは本当に問題を解決しません。それだけで難しくなりますが、不可能ではありません。したがって、それは実際には解決策ではなく、副作用は悪いものです。効かず、副作用の悪い薬を飲むようなものです。

問題は、IPを保護する方法です。そのためのソリューションを見つけます:難読化ツール、ライセンスサーバーなど。

2
Tundey

別の開発者が暗号化/復号化ルーチンに名前を付けたとき、私は同様の問題に遭遇しましたstr__copyおよびstr__delete(2番目の下線に注意してください)。それは不十分で、もっとうまくできたかもしれないので、ライセンスを更新する必要があるという話が出るまで待ちました。 「クリーンアップして、次にライセンスを取得するときに時間がかからず、セキュリティが強化される」と説明したので、管理者は数時間余分に問題を抱えていませんでした。問題は解決し、傷ついた感情はありません。

1

私の最初の考えは、そのコードの保守でした。コードが既に難読化されており、彼が先に進んでいる場合は、そのコードのハンドルを取得しようと頑張ってください。その後、コードを解読しようとするハッカーになります。

代わりに、コードをクリーンアップし、難読化ツールを使用してすべてのハードワークを実行することをお勧めします。長期的には、管理しやすいコードが多くなり、ライセンスをハッキングしたい人には、すべてのクレイジーな複雑さを委ねることになります。

完璧な難読化ツールはなく、非常に断固としたハッカーは何でもリバースエンジニアリングすることができますが、少なくともそれは彼だけです。さらに、難読化プログラムは、おそらく1人の人ができるよりもはるかに複雑になります。

1
Steph

「問題を知る最も優れた専門家にならないでください」。

言い換えれば、あなたの上司に言って、そこから行きましょう。あなたが静かにしていて、あなたがその秘密のトップポールである場合、プッシュが突き出てくるときに責任があります。上司に合格するように伝え、上司にアプローチする方法を決めさせます。そうすることで、選択の負担から解放されます。

多くのマネージャーは技術的ではない可能性があるため、上司に伝えるだけでなく、私たちがいつも行っていることを実行してください。問題と可能な解決策に、それぞれの解決策の長所と短所を示します。次に、彼らに決めさせ、それを渡します。それが、マネージャー/リーダーに多額の報酬が支払われる理由です!

0
user29981

明白な真実は、十分な時間とリソースがあれば、何でも解読できるということです。これは、アプリの人気度の単純な関数です。ポピュラーになればなるほど、ハッカーはスキルが高くなり、ハッキングに時間をかけることができます。コード難読化はまさにそれを提供します-暗号化と同様に、解読に必要な時間を増やす手段です。したがって、コードが難読化されている場合、攻撃者は熟練し、それに時間を費やす必要があります。そうでない場合、攻撃者は絶望してあきらめます。あなたはあなたのアプリが両端で問題の価値があるかどうか自分自身に尋ねなければなりません。

難読化されたコードを解読するのがどれほど難しいかは、実に驚くべきことです。難読化により、単純な10行のCプログラムを100行のアセンブリ1に簡単に変換できます。デバッグしようとすると、コード内で無意味にジャンプしてしまい、ステップスルーするのに本当にイライラすることがあります。最終的には壊れますが、それは本当に難しくなり、本当に不可能なことは何もないので、それがポイントです。コードの難読化により、コードを解読できる人の数が減ります。

もちろん、クラッカーではなくデバッガーを混乱させるようなより良い方法がありますが、これは安価で効率的な方法です。しかし、不自然に名前を付けることはそれを完全にカットしません。コード全体に対して実際には何も行わない制御フロー呼び出し関数を変更する必要がありますが、そのサイズと複雑さは増加します。戻り値がどこにも使用されないダミー関数は、実際に何かを行う関数の内部から呼び出します。これがどのように非常に混乱するかはすでにお分かりでしょう。

攻撃者にはない何かがあります。オリジナルのソースコード。自分のために整理する方法を見つけましょう。

0
user66734

あなたが上司に問題について尋ね、彼が言うことをするべきだという答えに私は強く同意します。

ただし、これらの回答に対する非常に重要な補遺は、セキュリティと保守性の両方に関する懸念を文書化する必要があることです。あなたがコードを変更するかどうかにかかわらず、人々があなたが何を心配しているのか、そしてその理由を知っていることが重要です。これは、積極的に(上司が決定を下す必要がないことさえ判断できない)と防御的に(ハッカーが安全性の低いライセンスシステムに穴を開けた場合、彼らはあなたのせいにできません)の両方で重要です。間違い。)

0
jhocking