Hello there, ('ω')ノ
重要なソフトウェアのベストプラクティスは。
パラメータ化されたステートメントを使用することで。
このアプローチは、入力をコマンド文字列に連結するのではなく。
入力を引数としてコマンドプロセッサに渡すことに依存していて。
パラメータ化されたステートメントは。
OWASP TOP10アプリケーションセキュリティリスクと。
MITRE TOP25の最も危険なソフトウェアエラーの上位にリストされている。
SQLインジェクションとコマンドインジェクションの両方の脆弱性を。
防ぐために使用されて。
下記が、コマンドインジェクション攻撃を防ぐコードスニペットで。
String updateServer = request.getParameter("updateServer");
String cmdProcessor = Utils.isWindows() ? "cmd" : "/bin/sh";
String command = cmdProcessor + "-c ping " + updateServer;
Process p = Runtime.getRuntime().exec(command);
⇩
下記のコードサンプルは、パラメータ化されたコマンドオブジェクトを使用して。
脆弱性を防止していて。
String updateServer = request.getParameter("updateServer");
List<String> commandArgs = new ArrayList<String>();
commandArgs.add("ping");
commandArgs.add(updateServer);
ProcessBuilder build = new ProcessBuilder(commandArgs);
String query = String.format("SELECT * FROM users WHERE usr='%s' AND pwd='%s'", usr, pwd);
Connection conn = db.getConn();
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery(query);
⇩
下記のコードサンプルは、プリペアドステートメントを使用しており。
入力はパラメータとして渡されて。
String query = "SELECT * FROM users WHERE usr = ? AND pwd = ?";
Connection conn = db.getConn();
PreparedStatement stmt = conn.preparedStatement(query);
stmt.setString(1, usr);
stmt.setString(2, pwd);
ResultSet rs = stmt.executeQuery(query);
Best regards, (^^ゞ