私はクライアントと通信するサーバーを持っています。ストリームが閉じられない限り、BufferedWriterはテキストを送信しません。
サーバーがマルチスレッド化されている、そしてこのスレッドがソケットとソケットに接続をBufferedReaderを使用して作成され、ソケットから読み取る最初の行は「要求」のとき:
public class scriptComm implements Runnable {
private Socket sock;
private Socket sock2;
private Connection connection;
private BufferedReader reader;
@Override
public void run() {
try {
String name = reader.readLine();
String password = reader.readLine();
String line;
connection = methods.connectToDatabase();
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(sock.getOutputStream()));
if (connection != null && name != null && password != null) {
try {
ResultSet rs = connection.createStatement().executeQuery(
"SELECT name, password, doupdate FROM accounts "
+ "WHERE name = '" + name + "' AND doupdate = 'yes'"
+ " AND password = '" + password + "'");
if (rs.next()) {
methods.log("worked");
bw.write("accept");
bw.flush();
bw.close();
reader = new BufferedReader(new InputStreamReader(sock2.getInputStream()));
if ((line = reader.readLine()) != null) {
mainFrame.jTextArea1.append("line \n");
connection.createStatement().executeUpdate(
"UPDATE accounts SET updatetext = '" + line + "' "
+ "WHERE name = '" + name + "'");
}else{
mainFrame.jTextArea1.append("No text received \n");
}
} else {
bw.write("decline");
bw.flush();
}
bw.close();
rs.close();
} catch (SQLException ex) {
methods.log("Error when executing statement in scriptComm");
ex.printStackTrace();
} catch (IOException ex) {
ex.printStackTrace();
}
} else {
methods.log("missing values in scriptComm");
}
} catch (IOException ex) {
}
}
public scriptComm(Socket sock, BufferedReader reader) {
this.sock = sock;
this.sock2 = sock;
this.reader = reader;
}}
あなたはそのI気づくかもしれ"accept"を書き込んだ後にbwストリームを閉じます。
これは、クライアントがストリームを閉じていないときに入力を受信しないかのように単純にハングしているためです。
クライアント:。
try{
String line;
Socket sock = new Socket("myipaddresshere",portnumber);
PrintWriter writer = new PrintWriter(sock.getOutputStream());
BufferedReader reader = new BufferedReader(new InputStreamReader(sock.getInputStream()));
writer.println("script");
writer.flush();
writer.println(jTextField1.getText());
writer.flush();
writer.println(jTextField2.getText());
writer.flush();
if ((reader.readLine()).equals("accept")) {
writer.write("testing123");
writer.flush();
writer.close();
} else {
jTextArea1.append("fail");
}
reader.close();
writer.close();
}catch(IOException e){
jTextArea1.append("Server not available. Please try again later.");
}
ストリームは、サーバーから「受け入れる」の書き込み後にクローズされていない場合は、クライアントがあるかの(reader.readLine()に座っているかのように、それはだ等号(「受け入れます"))boolean check(そしてyes、ストリームはサーバー側でフラッシュされます)。
しかし、ストリームがサーバー側でも閉じられている場合、ブールチェックに合格し、引き続きストリーム "testing123"に書き込みます。 BufferedReaderが閉じられたとき、ソケットストリームが閉じられたので、サーバーは明らかにこの行を読み取ることができません。ご存じのように、私はsock2という別の変数を作成するだけでソケットを複製しようとしましたが、この接続も閉じているようです(意味があります)。
注:間違ったユーザー/パスで接続した場合(つまり、rs.next()がfalseを返す場合)、ストリームに「拒否」と書き込まれ、クライアントはこれを取得します。この約1本当に混乱し
..
おかげで、 マイク。
私はそれを見つけなかったので、愚かなようです:p。ありがとう。 また、SQLインジェクションを防ぐことについてどこから読んで始めたらよいでしょうか? –
Googleでそれを実行する必要がありますが、これはパラメータ付きで 'PreparedStatement'に切り替えることです。そのJavaクラスはあなたのためにエスケープ処理を行います。二重引用符または一重引用符はもはや問題にはなりません。 – Kaj
この記事では、この問題を回避する方法について説明します。https://www.owasp.org/index.php/Preventing_SQL_Injection_in_Java – Kaj