Shikata Ga Nai

Private? There is no such things.

パラメータ化されたステートメントのコードレビューについてふれてみた

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, (^^ゞ