2012-12-31 10 views
15

मैं हाइबरनेट का उपयोग कर एक एप्लीकेशन विकसित कर रहा हूं। जब मैं लॉगिन पेज बनाने की कोशिश करता हूं, तो एसक्यूएल इंजेक्शन की समस्या उत्पन्न होती है। मैं कैसे इस परिदृश्य में एसक्यूएल इंजेक्शन पाएगाहाइबरनेट में एसक्यूएल इंजेक्शन को कैसे रोकें?

@Component 
@Transactional(propagation = Propagation.SUPPORTS) 
public class LoginInfoDAOImpl implements LoginInfoDAO{ 

@Autowired 
private SessionFactory sessionFactory;  
@Override 
public LoginInfo getLoginInfo(String userName,String password){ 
    List<LoginInfo> loginList = sessionFactory.getCurrentSession().createQuery("from LoginInfo where userName='"+userName+"' and password='"+password+"'").list(); 
    if(loginList!=null) 
     return loginList.get(0); 
    else return null; 
      } 
     } 

बनाने loginInfo तालिका की तालिका वाक्य रचना इस प्रकार है:: मैं निम्नलिखित कोड है?

create table login_info 
    (user_name varchar(16) not null primary key, 
    pass_word varchar(16) not null); 
+0

कृपया इस लिंक को देखें [1]: http://stackoverflow.com/questions/4606505/prevention-against-sql-injection-in-hibernate –

उत्तर

19
Query q = sessionFactory.getCurrentSession().createQuery("from LoginInfo where userName = :name"); 
q.setParameter("name", userName); 
List<LoginInfo> loginList = q.list(); 

आप अन्य विकल्पों भी है , मैकॉन्ग से यह अच्छा article देखें।

+0

धन्यवाद, हम प्रश्न में पासवर्ड कैसे शामिल कर सकते हैं ?? @ पेट्र मेन्सिक –

+0

वैसे ही जैसे मैंने उपयोगकर्ता नाम –

0

हमें हमेशा एसक्यूएलएनजेक्शन को रोकने के लिए संग्रहीत प्रक्रियाओं का उपयोग करने की कोशिश करनी चाहिए .. यदि संग्रहित प्रक्रियाएं संभव नहीं हैं; हमें तैयार वक्तव्यों की कोशिश करनी चाहिए।

+0

शामिल किया है, मैं सहमत हूं, यह गति की वजह से तकनीकी रूप से बेहतर है। हालांकि, किसी भी भाषा में मुझे पता नहीं है कि कोई ओआरएम ढांचा संग्रहीत प्रक्रिया उत्पन्न करता है। अगर उन्होंने किया तो यह वास्तव में अच्छा होगा। लेकिन चूंकि वे नहीं करते हैं, और ओआरएम ढांचे द्वारा प्रदान की गई उत्पादकता आवश्यक है, तैयार बयान पर हावी होने जा रहे हैं। – Dennis

+0

सब कुछ के लिए संग्रहीत प्रक्रियाओं का उपयोग ओआरएम में इतना बुद्धिमान नहीं है। तैयार बयान अच्छा होना चाहिए! – Diablo

15

आपको एसक्यूएल इंजेक्शन से बचने के लिए नामित पैरामीटर का उपयोग करने की आवश्यकता है। इसके अलावा (एसक्यूएल इंजेक्शन के साथ कुछ भी नहीं, लेकिन सामान्य रूप से सुरक्षा के साथ) पहले परिणाम को वापस न करें, लेकिन getSingleResult का उपयोग करें, इसलिए यदि किसी कारण से एक से अधिक परिणाम हैं, तो क्वेरी NonUniqueResultException के साथ विफल हो जाएगी और लॉगिन नहीं होगा सफल

Query query= sessionFactory.getCurrentSession().createQuery("from LoginInfo where userName=:userName and password= :password"); 
query.setParameter("username", userName); 
query.setParameter("password", password); 
LoginInfo loginList = (LoginInfo)query.getSingleResult(); 
0
  1. HQL

    क्वेरी hqlQuery = session.createQuery में स्थितीय पैरामीटर ("आदेश के रूप में आदेश से जहां orders.id =?");

    सूची परिणाम = hqlQuery.setString (0, "123-ADB-567-QTWYTFDL")। सूची();

  2. HQL में पैरामीटर का नाम

    क्वेरी hqlQuery = session.createQuery ("कर्मचारियों से रोजगार के रूप में जहां emp.incentive>: प्रोत्साहन");

    सूची परिणाम = hqlQuery.setLong ("प्रोत्साहन", नया लांग (10000))। सूची();

  3. HQL में नामित पैरामीटर सूची

    सूची आइटम = नए ArrayList(); आइटम.एड ("पुस्तक"); items.add ("घड़ी"); items.add ("स्याही");

    सूची परिणाम = session.createQuery ("कार्ट के रूप में कार्ट से जहां कार्ट.इटम में (: itemList)") सेट पैरामीटर लिस्ट ("आइटमलिस्ट", आइटम) .list(); HQL में

  4. JavaBean

क्वेरी hqlQuery = session.createQuery ("के रूप में किताबें जहां book.name = पुस्तकें से: नाम और book.author =: लेखक");

सूची परिणाम = hqlQuery.setProperties (javaBean)।सूची();

  1. मूल निवासी-एसक्यूएल

क्वेरी sqlQuery = session.createSQLQuery ("किताबें से चुनें * जहाँ लेखक =?");

सूची परिणाम = sqlQuery.setString (0, "चार्ल्स डिकेंस")। सूची();