1

コマンドライン引数を介してユーザーからJavaプログラムを取得しStringています。

問題は、攻撃の可能性や脆弱性を防ぐためにどのようなチェックを実行する必要があるかということです。

私はセキュリティ分野の専門家ではありませんが、私の知る限りでは

  • Cでは、ユーザーが指定した行が長すぎて不適切に処理されると、バッファ オーバーフローが発生する可能性があります
  • ` 文字を含むPHP行で不適切に処理すると、SQL インジェクションが発生する可能性があります

String今のところ、正規表現を適用してチェックするための a の特定の形式については考えられません。恣意的かもしれませんが、有害に見える場合はすぐにやめたいです。文字列は、ネットワークを使用して Java サーバーに送信される場合があり、そこで SQL クエリに使用される場合があります。

if (args.length > 0) {
    String arg0 = args[0];
    if (!isValidString(arg0)){
        System.exit(1);
    }
}

public boolean isValidString (String str) {
    if (str == null) return false;

    //TODO: many more checks here

    return true;
}

Java は C や初期の PHP よりもはるかに安全であると確信していますが、何に注意すればよいでしょうか?

4

3 に答える 3

6

このメイン クラスが引数を別の場所に渡す以外に何もしない場合、文字列を検証する責任はありません。

この文字列が最終的に SQL クエリでそれを使用するクラスに送られる場合、準備されたステートメントを使用するのはこのクラスの責任であり、したがって SQL インジェクション攻撃が不可能であることを確認します。

この文字列が生成された HTML ページの一部になった場合、HTML ジェネレーターは文字列を HTML エスケープする必要があります。

文字列自体は決して有害ではありません。検証する必要がある場合は、いつ有効で、いつ有効でないかを知る必要があります。そして、それは文脈に依存します。

于 2013-01-25T07:45:43.757 に答える
3

それはすべて、文字列で何をしているかに依存します。どのような入力が期待されているかは、使用する前に常に再確認してください。

ユーザーからの SQL インジェクションが心配な場合は、準備済みステートメントを使用して SQL インジェクションを防ぐことができます。これは、ステートメントが使用される前にコンパイルされ、さらに使用するためにクエリ プランが保存されるため、パラメーターが実行可能な SQL の一部にならないようにするためです。

Web ページなどに表示されるユーザー入力が心配な場合は、Web ページ用にエスケープする必要があり ます。Java で HTML をエスケープするための推奨される方法

行う必要があるエスケープ/検証は、文字列の使用に完全に依存します。

于 2013-01-25T07:46:15.090 に答える
0

残念ながら、この質問はとてつもない問題です。

OutOfMemory最悪の場合、メソッドに渡された String 配列main()が十分に大きくなると、例外が発生する可能性があると思います (どのように再現できるか想像できません) 。

于 2013-01-25T07:47:48.963 に答える