inputReader
オブジェクトからの入力を信頼するかどうかを決定しています。攻撃者が悪意あるコマンドを実行する inputReader
の実装を提供できる場合、このコードはオブジェクトが無害であるか悪意あるものであるかを区別することができなくなります。
if (inputReader.GetType().FullName == "CompanyX.Transaction.Monetary")
{
processTransaction(inputReader);
}
inputReader
オブジェクトからの入力を信頼するかどうかを決定しています。攻撃者が悪意あるコマンドを実行する inputReader
の実装を提供できる場合、このコードはオブジェクトが無害であるか悪意あるものであるかを区別することができなくなります。
if (inputReader.getClass().getName().equals("com.example.TrustedClass")) {
input = inputReader.getInput();
...
}
inputReader
オブジェクトからの入力を信頼するかどうかを決定しています。攻撃者が悪意あるコマンドを実行する inputReader
の実装を提供できる場合、このコードはオブジェクトが無害であるか悪意あるものであるかを区別することができなくなります。
if (inputReader::class.qualifiedName == "com.example.TrustedClass") {
input = inputReader.getInput()
...
}
finalize()
メソッドは super.finalize()
をコールします。finalize()
メソッドで super.finalize()
のコールを行うことは適切な方法であるとしています [1]。super.finalize()
のコールを省略しています。
protected void finalize() {
discardNative();
}
x = NULL
および x != NULL
は常に false となります。NULL
の値は確定できません。どのような値とも等しくならず、別の NULL
値と同じになることもありません。また、null
値が他の値と同じになることはありません。例 2: 以下のステートメントは必ず false になります。
checkNull BOOLEAN := x = NULL;
checkNotNull BOOLEAN := x != NULL;
==
または !=
ではなく、equals()
メソッドと比較してください。==
または !=
を使用し、2 つのオブジェクトの値ではなく、オブジェクトが等価かどうかを比較します。このような場合、2 つの参照が等価でない可能性が高いのです。
if (args[0] == STRING_CONSTANT) {
logger.info("miracle");
}
==
および !=
演算子は、等価であるオブジェクトに含まれる文字列を比較するために使用されるときにのみ、予期されるとおりに動作します。これが発生する一般的な状況は、文字列が抑留され、String
クラスにより保持されるオブジェクトのプールにこの文字列が追加される場合です。文字列が一度抑留されると、同じオブジェクトと等価演算子を使用する文字列のすべての使用は、予期されるとおりに動作します。すべての文字列リテラルおよび文字列値の定数は、自動的に抑留されます。その他の文字列は String.intern()
を呼び出して手動で抑留できます。これにより、現在の文字列の正準な (規則に沿った) インスタンスが返されます (必要な場合には、正準なインスタンスが作成されます)。pthread_mutex_unlock()
をコールしてミューテックスをアンロックする必要がありますシグナルを送信しているスレッドがミューテックスをアンロックできない場合は、2 番目のスレッドにある pthread_cond_wait()
コールは返されず、スレッドは実行されません。 pthread_cond_signal()
をコールしてミューテックスを待機している他のスレッドにシグナルを送信していますが、他のスレッドが待機しているミューテックスのアンロックに失敗しています。
...
pthread_mutex_lock(&count_mutex);
// Signal waiting thread
pthread_cond_signal(&count_threshold_cv);
...
getChunk
であるため、述部 getChunk == NULL
は常に false になります。
if (getChunk == NULL)
return ERR;
char* getName() {
char name[STR_MAX];
fillInName(name);
return name;
}
class AccessLevel{
public static final int ROOT = 0;
//...
public static final int NONE = 9;
}
//...
class User {
private static int access;
public User(){
access = AccessLevel.ROOT;
}
public static int getAccessLevel(){
return access;
}
//...
}
class RegularUser extends User {
private static int access;
public RegularUser(){
access = AccessLevel.NONE;
}
public static int getAccessLevel(){
return access;
}
public static void escalatePrivilege(){
access = AccessLevel.ROOT;
}
//...
}
//...
class SecureArea {
//...
public static void doRestrictedOperation(User user){
if (user instanceof RegularUser){
if (user.getAccessLevel() == AccessLevel.ROOT){
System.out.println("doing a privileged operation");
}else{
throw new RuntimeException();
}
}
}
}
getAccessLevel()
をインスタンス user
にコールしているのであって、クラス User
や RegularUser
にコールしているのではないため、この場合は常に true
が返され、instanceof
が使用される場合でも、if/else
ブロックのこの部分に到達するために操作が制限されます。
private void writeObject(java.io.ObjectOutputStream out) throws IOException;
private void readObject(java.io.ObjectInputStream in) throws IOException, ClassNotFoundException;
private void readObjectNoData() throws ObjectStreamException;
serialPersistentFields
を正しく使用するには、private
、static
、および final
として宣言する必要があります。serialPersistentFields
配列内で指定して、クラスの Serializable フィールドを手動で定義できるようになります。この機能は、serialPersistentFields
が private
、static
、および final
として宣言されている場合にのみ奏功します。serialPersistentFields
が、private
、static
、および final
ではないため、Serializable
フィールドの定義には使用されません。
class List implements Serializable {
public ObjectStreamField[] serialPersistentFields = { new ObjectStreamField("myField", List.class) };
...
}
java.util.Arrays.equals().
ではなく Object.equals()
をコールしています。 Object.equals()
をコールすることは、多くの場合誤りです。この関数は配列の要素ではなく配列のアドレスが等価かどうかをチェックするため、通常は java.util.Arrays.equals()
で置き換える必要があります。 Object.equals()
関数を使ってチェックしようとしています。
...
int[] arr1 = new int[10];
int[] arr2 = new int[10];
...
if (arr1.equals(arr2)){
//treat arrays as if identical elements
}
...
pthread_cleanup_push()
を使用して、関数 routine
をコールしたスレッドのクリーンアップスタックにプッシュして戻っています。pthread_cleanup_push()
およびそのパートナ関数 pthread_cleanup_pop()
が IBM AIX 以外のプラットフォームではマクロとして実装されているため、pthread_cleanup_push()
で作成されるデータ構造は、pthread_cleanup_pop()
への後続のコールで利用できなくなります。このコードは、これらの関数がマクロとして実装されているすべてのプラットフォームでコンパイルに失敗するか、あるいは、ランタイム時の動作が不正となります。
void helper() {
...
pthread_cleanup_push (routine, arg);
}
void clean_up()
{
char tmp[256];
...
free(tmp);
return;
}
System.Object.Equals()
を上書きするためのものです。
public boolean Equals(string obj) {
...
}
System.Object.Equals()
は、object
タイプの引数を取るため、メソッドがコールされることはありません。Object.equals()
を上書きするためのものです。
public boolean equals(Object obj1, Object obj2) {
...
}
Object.equals()
は単一引数のみを受け取るため、Example 1
のメソッドがコールされることはありません。ISerializable
インターフェイスを実装しているが、[Serializable]
属性を宣言していないクラスはシリアライズされません。[Serializable]
属性が宣言されているすべてのオブジェクトのシリアライズを許可します。.NET フレームワークにより定義されるデフォルトのシリアライズメソッドを使用してクラスがシリアライズ可能な場合、オブジェクトを正しくシリアライズするためにこれは必要十分条件となります。クラスで独自のシリアライズメソッドが必要となる場合には、ISerializable
インターフェイスを実装する必要もあります。ただし、クラスは [Serializable]
属性をここでも宣言する必要があります。CustomStorage
クラスは ISerializable
インターフェイスを実装します。しかし、このクラスは [Serializable]
属性を宣言していないため、シリアライズされません。
public class CustomStorage: ISerializable {
...
}
getOutputStream
をコールした後に、getWriter()
をコールする場合もエラーが発生しやすくなります。HttpServletRequest
の転送、HttpServletResponse
のリダイレクト、またはサーブレットの出力ストリームバッファーのフラッシュによって、関連ストリームがコミットされます。後続のバッファーがストリームをリセットまたはコミットすると (追加のフラッシュまたはリダイレクトなど)、IllegalStateException
となります。ServletOutputStream
または PrintWriter
のいずれか (両方ではありません) を使用して、レスポンスストリームへのデータの書き込みが許可されます。getOutputStream()
をコールした後に、getWriter()
をコールする、また逆の処理を行った場合、IllegalStateException
となります。IllegalStateException
によって、レスポンスハンドラの実行が防止され、レスポンスがドロップすることになります。これによりサーバーの動作が不安定になります。また、サーブレットが適切に実装されていないことを示します。例 2: 逆に、次のコードは、リクエストが転送された後に、書き込みを行い、
public class RedirectServlet extends HttpServlet {
public void doGet(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {
...
OutputStream out = res.getOutputStream();
...
// flushes, and thereby commits, the output stream
out.flush();
out.close(); // redirecting the response causes an IllegalStateException
res.sendRedirect("http://www.acme.com");
}
}
PrintWriter
のバッファーをフラッシュしようとしています。
public class FlushServlet extends HttpServlet {
public void doGet(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {
...
// forwards the request, implicitly committing the stream
getServletConfig().getServletContext().getRequestDispatcher("/jsp/boom.jsp").forward(req, res);
...
// IllegalStateException; cannot redirect after forwarding
res.sendRedirect("http://www.acme.com/jsp/boomboom.jsp");
PrintWriter out = res.getWriter();
// writing to an already-committed stream will not cause an exception,
// but will not apply these changes to the final output, either
out.print("Writing here does nothing");
// IllegalStateException; cannot flush a response's buffer after forwarding the request
out.flush();
out.close();
}
}
Content-Length
ヘッダーには負の数が設定されています。Content-Length
ヘッダーを設定した開発者は、0
または正の数をContent-Length
を設定することになります。
URL url = new URL("http://www.example.com");
HttpURLConnection huc = (HttpURLConnection)url.openConnection();
huc.setRequestProperty("Content-Length", "-1000");
Content-Length
ヘッダーには負の数が設定されています。Content-Length
ヘッダーを設定した開発者は、0
または正の数をContent-Length
ヘッダーに誤って負の数を設定しています。
xhr.setRequestHeader("Content-Length", "-1000");
java.io.Serializable
を実装している内部クラスは、問題が発生したり、外部クラスから情報が漏えいする可能性があります。
...
class User implements Serializable {
private int accessLevel;
class Registrator implements Serializable {
...
}
}
Example 1
では、内部クラス Registrator
がシリアライズされると、外部クラス User
からのフィールド accessLevel
もシリアライズされます。