2013-06-30 5 views
2

Я новичок в JavaEE и пытаюсь научиться делать простую страницу входа, проверяя базу данных. Вот пример кода:Устранение SQL-инъекции в java

ResultSet result=null; 
     Statement s = (Statement) con.createStatement(); 
    result=s.executeQuery("select username from Table where ID="+id and " password="+password); 

Он должен быть уязвим для SQL-инъекции справа? Я хотел бы сделать это с помощью параметризованную запроса в ASP.NET, как следующее:

SqlConnection con = new SqlConnection(); 
SqlCommand cmd=new SqlCommand("select username from Table where [email protected] and [email protected]",con);  
cmd.Parameters.AddWithValue("@id", id); 
cmd.Parameters.AddWithValue("@password", password); 

Есть ли способ использовать параметризованные запросы в Java, как это? Может ли кто-либо использовать этот запрос в параметризованной форме, чтобы избежать инъекции SQL?

Благодаря

+1

Да, используйте 'PreparedStatement'. –

+0

Почему бы не использовать ORM? Спящий режим или любой другой? – Ayman

+3

http://docs.oracle.com/javase/tutorial/jdbc/basics/prepared.html –

ответ

3

Да, вы можете сделать это с PreparedStatement; например:

PreparedStatement preparedStatement = con.PreparedStatement(
     "SELECT * FROM MY_TABLE WHERE condition1 = ? AND condition2 = ?"); 
preparedStatement.setString(1,condition1_value); 
preparedStatement.setString(2,condition2_value); 
ResultSet rs = preparedStatement.executeQuery(); 
+2

Фактически, этот запрос должен быть действительным на любом диалекте SQL. –

+0

Большое спасибо – yrazlik

0

Ниже приведена сокращенная версия класса, предназначенного для динамического создания запроса на основе различных критериев. Запрос создается с использованием API JPA CriteriaBuilder. Вам нужно будет адаптировать этот код к вашей структуре таблицы. Вы должны легко найти этот класс, как только вы поймете код.

@Stateless 
public class sample { 


    @PersistenceContext 
    private EntityManager em; 
    private CriteriaBuilder criteriaBuilder; 
    private Root<Branch> root; 
    private CriteriaQuery<Integer> query; 


    @PostConstruct 
    private void init(){ 
     criteriaBuilder = em.getCriteriaBuilder(); 
     resetCriteria(); 
     query = criteriaBuilder.createQuery(Integer.class); 
     root = query.from(Branch.class); 
    } 


    private String branchName; 
    private Predicate[] validPredicates; 


    public void resetCriteria() { 
     branchName = ""; 
     query = criteriaBuilder.createQuery(Integer.class); 
     validPredicates = new Predicate[0]; 
    } 




    public void setBranchName(String criteria){ 
     this.branchName = criteria; 
    } 




    public List<Integer> runQuery(){ 
     buildPredicates(); 

     if(validPredicates.length != 0){ 
      query.select(root.<Integer>get("branchID")) 
       .where(criteriaBuilder.and(validPredicates)); 
     } 
     else{ 
      query.select(root.<Integer>get("branchID")); 
     } 
     TypedQuery<Integer> q = em.createQuery(query); 
     List<Integer> result = q.getResultList(); 
     return result; 
    } 




    private void buildPredicates(){ 
     ArrayList<Predicate> predicates = new ArrayList<Predicate>(); 

     if(branchName != null && !branchName.isEmpty()){ 
      StringBuilder sb = new StringBuilder(); 
      sb.append("%") 
       .append(branchName) 
       .append("%"); 
      Predicate p = criteriaBuilder.like(root.<String>get("branchName"), sb.toString()); 
      predicates.add(p); 
     } 

     createPredicateArray(predicates); 
    } 
    private void createPredicateArray(List<Predicate> predicates){ 
     if (predicates.size() > 0){ 
      validPredicates = new Predicate[predicates.size()]; 
      predicates.toArray(validPredicates); 
     } 
     else{ 
      validPredicates = new Predicate[0]; 
     } 
    } 


} 
Смежные вопросы