Commit 30e8255e by Patryk Czarnik

Zapytania z parametrami i SQL injection

parent cdb57456
package bazy.na_zywo;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import javax.swing.JOptionPane;
/* Rozwiązanie 1:
Z bazy odczytujemy wszystkie rekordy, a po stronie w Javy, za pomocą equals filtrujemy rekordy i wyświeltlamy tylko te, które spełniają warunek.
Problem: niska wydajność.
Baza musi odczytać wszystkie rekordy z dysku (nawet, gdyby były zdefinioane indeksy),
wszystkie dane są transferowane przez sieć,
wszystkie dane są przeglądane przez Javę, co obciąża aplikację kliencką.
*/
public class OdczytajNiektorych_v1 {
public static void main(String[] args) {
String szukanyJob = JOptionPane.showInputDialog("Podaj job_id, np. IT_PROG");
// Niech program wypisuje dane tylko tych pracowników, którzy mają takie job_id
String url = "jdbc:postgresql://localhost:5432/hr";
try(Connection c = DriverManager.getConnection(url, "kurs", "abc123")) {
System.out.println("connection: " + c);
try(PreparedStatement stmt = c.prepareStatement("SELECT * FROM employees")) {
System.out.println("stmt: " + stmt);
System.out.println();
try(ResultSet rs = stmt.executeQuery()) {
while(rs.next()) {
String job = rs.getString("job_id");
if(job.equals(szukanyJob)) {
System.out.printf("Pracownik nr %d, %s %s (%s) zarabia %s%n",
rs.getInt("employee_id"),
rs.getString("first_name"),
rs.getString("last_name"),
job,
rs.getBigDecimal("salary"));
}
}
}
}
} catch(SQLException e) {
throw new RuntimeException(e);
}
}
}
package bazy.na_zywo;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import javax.swing.JOptionPane;
/* Rozwiązanie 2:
* Za pomocą WHERE filtrujemy rekordy po stronie bazy danych, co poprawia wydajność.
*
* Ze względu na to, że zapytaniu budujemy samodzielnie sklejając kawałki tekstu, stwarzamy zagrożenie SQL Injection.
* Przykładowe wartości, które powodują SQL Injection:
* IT_PROG'; DROP TABLE employees CASCADE; SELECT '
* '; UPDATE employees SET salary = 1000 WHERE salary > 10000; UPDATE employees SET salary = 99000 WHERE last_name = 'Olson'; SELECT '
*/
public class OdczytajNiektorych_v2 {
public static void main(String[] args) {
String szukanyJob = JOptionPane.showInputDialog("Podaj job_id, np. IT_PROG");
// Niech program wypisuje dane tylko tych pracowników, którzy mają takie job_id
String url = "jdbc:postgresql://localhost:5432/hr";
try(Connection c = DriverManager.getConnection(url, "kurs", "abc123")) {
System.out.println("connection: " + c);
String sql = "SELECT * FROM employees WHERE job_id = '" + szukanyJob +"'";
try(PreparedStatement stmt = c.prepareStatement(sql)) {
System.out.println("stmt: " + stmt);
System.out.println();
try(ResultSet rs = stmt.executeQuery()) {
while(rs.next()) {
System.out.printf("Pracownik nr %d, %s %s (%s) zarabia %s%n",
rs.getInt("employee_id"),
rs.getString("first_name"),
rs.getString("last_name"),
rs.getString("job_id"),
rs.getBigDecimal("salary"));
}
}
}
} catch(SQLException e) {
throw new RuntimeException(e);
}
}
}
package bazy.na_zywo;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import javax.swing.JOptionPane;
/* Rozwiązanie 3:
* Za pomocą WHERE filtrujemy rekordy po stronie bazy danych, co poprawia wydajność.
* Tutaj prawidłowo używamy parametrów JDBC zapisywanych za pomocą ?
*/
public class OdczytajNiektorych_v3 {
public static void main(String[] args) {
String szukanyJob = JOptionPane.showInputDialog("Podaj job_id, np. IT_PROG");
// Niech program wypisuje dane tylko tych pracowników, którzy mają takie job_id
String url = "jdbc:postgresql://localhost:5432/hr";
try(Connection c = DriverManager.getConnection(url, "kurs", "abc123")) {
System.out.println("connection: " + c);
String sql = "SELECT * FROM employees WHERE job_id = ?";
try(PreparedStatement stmt = c.prepareStatement(sql)) {
System.out.println("stmt: " + stmt);
stmt.setString(1, szukanyJob);
System.out.println("stmt: " + stmt);
System.out.println();
try(ResultSet rs = stmt.executeQuery()) {
while(rs.next()) {
System.out.printf("Pracownik nr %d, %s %s (%s) zarabia %s%n",
rs.getInt("employee_id"),
rs.getString("first_name"),
rs.getString("last_name"),
rs.getString("job_id"),
rs.getBigDecimal("salary"));
}
}
}
} catch(SQLException e) {
throw new RuntimeException(e);
}
}
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment