2017-03-09 9 views
-2

私のSQLクエリが動作していないわずかな問題を抱えています。私はかなりjavaに新しいので、任意のヘルプはappriticatedされるだろう。Sqlクエリが必要です ';'

import javax.swing.*; 
import java.awt.event.*; 
import java.sql.*; 



    public class Manager { 
     Connection con; 
     Statement st; 
     ResultSet rs; 

JFrame f = new JFrame("User Login"); 
JLabel U = new JLabel("Username"); 
JLabel P = new JLabel("Password"); 
JTextField t = new JTextField(10); 
JTextField t1 = new JTextField(10); 
JButton b = new JButton("Login"); 


public Manager() 
{ 
    connect(); 
    frame(); 
} 
public void connect() 
{ 

try 
{  

String driver = "sun.jdbc.odbc.JdbcOdbcDriver"; 
Class.forName(driver); 
String db = "jdbc:odbc:db1"; 
con = DriverManager.getConnection(db); 
st = con.createStatement(); 
} 
catch(Exception ex) 
{ 

} 
} 
public void frame() 
{ 
    f.setSize(600,400); 
    f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    f.setVisible(true); 

    JPanel p = new JPanel(); 
    p.add(U); 
    p.add(t); 
    p.add(P); 
    p.add(t1); 
    p.add(b); 

    f.add(p); 

    b.addActionListener(new ActionListener(){ 


     public void actionPerformed(ActionEvent e) 
     { 
      try 
      { 
      String User = t.getText().trim(); 
      String Password =t1.getText().trim(); 


      String sql = "select User,Password from Table1 where User = '" + User +"'and Password='"+ Password"'"; 


      rs = st.executeQuery(sql); 

      int count = 0; 
      while(rs.next()) 
      { 
       count = count + 1; 
      } 
      if(count == 1) 
        { 
         JOptionPane.showMessageDialog(null,"User found, Acces"); 
        } 
      else if(count > 1) 
      { 
       JOptionPane.showMessageDialog(null,"Duplicated User, Access denied"); 

      } 
      else 
      { 
       JOptionPane.showMessageDialog(null,"User Not found"); 
      } 
      } 
      catch(Exception ex) 
      { 

      } 
     } 
    }); 
} 


public static void main(String[] args) { 

    new Manager(); 
} 

}

+2

文字列にクエリ全体を作成する代わりに、 'PreparedStatement'を使うことを検討してください。 – Dazak

+2

最初にオフ:*パラメータ化されたクエリ*を使用してください。あなたのフィールドにはおそらくいくつかの終値があり、クエリが中断します。パラメータ化されたクエリを使用することで、SQLインジェクション(コードが*開かれている*)を防ぐとともに、それが問題となることを防ぎます。第二に、パスワードを平文として保存しないでください。 – Siyual

+0

例外メッセージ/スタックトレースとは何ですか?また、 'sql'はSQLインジェクション攻撃に開放されています。' PreparedStatement'の使用を検討してください。 –

答えて

0

あなただけの '+' 記号が欠落しています。

+"'and Password='"+ Password + "'";

0

変更

+"'and Password='"+ Password"'";

は、配置しようとすると、あなたのSQLの文字列で...(パスワードの後に​​)

String sql = "User = '" + User + "'とPassword = '" + Password "'" + " ; ";

-1

あなたの質問に答えることはできませんが、私はこれが答えの注目に値すると考えています。あなたが文字通り何をしているのかは、毎年世界中のお金を犠牲にしています。人類の遺跡が残っています。おそらく文字通り人を殺してしまいます。(自殺した人たちは財政的に台無しになってしまったのです。

(編集)あなたの問題が何であるかを見て、実際にはかもしれないあなたのためにそれを修正します。ボーナス。

データベースアクセスで_Prepared Statements_を使用してください。私のアイデンティティが盗まれ、私の銀行が雇われた安価なプログラマーであるためにクレジットが払われれば、私はギャングを集めてあなたを見つけることになるでしょう。

とすぐに誰かがあなたのコードは安全ではないことを認識して、データベース全体がそのぽっかりセキュリティホールから崩れます。

これがダウンボウンスの束を得るなら、私はそれが私を気にしないようにしようとします。このセキュリティ上の問題を防ぐことはそれに値する。

これは、使用しているAPIと同じです。 PreparedStatementを作成し、あなたがオフに非常に良くなる

myPreparedStatement.setString(columnUser, user); 
myPreparedStatement.setString(columnPass, pass); 
myPreparedStatement.executeUpdate(); 

でそれを実行し

myPreparedStatement = databaseConnection.prepareStatement(
    "select User,Password from Table1 where User = '?'and Password='?'"); 

を行います。そうでなければ、私は最終的にあなたのデータベースを保証しますはハッキングされます(そして、すべての設定方法によってはネットワークの残りの部分)。

SQLインジェクションは、データベース攻撃のパンとバター(および糞)です。 この簡単なトリックは、ハック試行後の請求書の99%を節約します。

+0

実際、パスワードをプレーンテキストとして保存していますか?名前/パスワードのペアをここで一括ダウンロードしていますか?私がすでに取り組んでいるあなたの他の問題の上に、それはあなたのために壊滅的だったでしょう。それを知っている人の誰もがその履歴書を受け入れることができないという点を除いて、「イベントを再開する」と呼ばれる人もいます。パスワードをハッシュして塩を追加するか、他のディレクトリサービスを使用して作業してください。少なくとも、パスワードを保存する前にパスワードでハッシュ関数を実行してください(そして、認証時には再び明らかになります) – Aaron

関連する問題