Java HttpsURLConnection和BufferedReader问题
我目前正在尝试为我的Android应用程序创建一个安全的登录页面 登录程序的总体概述如下:Java HttpsURLConnection和BufferedReader问题,java,php,android,http,httpsurlconnection,Java,Php,Android,Http,Httpsurlconnection,我目前正在尝试为我的Android应用程序创建一个安全的登录页面 登录程序的总体概述如下: 用户输入密码 打开HttpURLConnection,并使用URLEncoder和PHP脚本将密码与sql数据库中的条目进行比较。(注意,这是一个HTTP连接,不安全) 如果密码无效,它将返回“登录失败”的PHP回音,Android后台任务将相应地对此做出响应 这一切都很好。然而 我最近在主机服务器上安装了一个证书,使站点HTTPS[Secure]——因此,我在Android代码中将“HttpURLCon
不太清楚更改连接类型时为什么返回null?是否引发任何异常?另外,尝试使用外部工具(如邮递员)发送请求,看看结果如何。另请注意:您的PHP代码非常容易受到攻击,为了您自己的利益,请不要在生产(或任何)环境中使用此代码。感谢您的回复,请查看我的logcat编辑,我还将使用Postman运行外部测试-也感谢您指出SQL注入,但该应用程序是为选择用户发布的,因此不会成为问题:)我知道它仅适用于选择用户,但是,Internet上的每个人都可以使用您的URL,因此任何人都可以向其发送请求,从而使其易受攻击。另外,您确定在此之前没有任何异常吗?您应该将它们视为正常输出,因为您使用
e.printStackTrace()
而不是将其发送到日志。是否引发任何异常?另外,尝试使用外部工具(如邮递员)发送请求,看看结果如何。另请注意:您的PHP代码非常容易受到攻击,为了您自己的利益,请不要在生产(或任何)环境中使用此代码。感谢您的回复,请查看我的logcat编辑,我还将使用Postman运行外部测试-也感谢您指出SQL注入,但该应用程序是为选择用户发布的,因此不会成为问题:)我知道它仅适用于选择用户,但是,Internet上的每个人都可以使用您的URL,因此任何人都可以向其发送请求,从而使其易受攻击。另外,您确定在此之前没有任何异常吗?您应该将它们视为正常输出,因为您使用e.printStackTrace()
而不是将其发送到日志。
public class BackgroundTaskLogin extends AsyncTask<String,Void,String>{
String response;
Context ctx;
BackgroundTaskLogin(Context ctx){
this.ctx = ctx;
}
@Override
protected void onPreExecute() {
super.onPreExecute();
}
@Override
protected String doInBackground(String... params) {
String login_url = "http://apps02.abbeyfield.com/json/json_login.php";
String method = params[0];
if(method.equals("login")){
String database_name = params[1];
String password_user = params[2];
try {
URL url = new URL(login_url);
HttpURLConnection httpURLConnection = (HttpURLConnection) url.openConnection();
httpURLConnection.setRequestMethod("POST");
httpURLConnection.setDoOutput(true);
httpURLConnection.setDoInput(true);
OutputStream outputStream = httpURLConnection.getOutputStream();
BufferedWriter bufferedWriter = new BufferedWriter(new OutputStreamWriter(outputStream, "UTF-8"));
String data = URLEncoder.encode("database_name","UTF-8")+"="+URLEncoder.encode(database_name,"UTF-8")+"&"+
URLEncoder.encode("password_user","UTF-8")+"="+URLEncoder.encode(password_user,"UTF-8");
bufferedWriter.write(data);
bufferedWriter.flush();
bufferedWriter.close();
outputStream.close();
InputStream inputStream = httpURLConnection.getInputStream();
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream,"iso-8859-1"));
response = "";
String line = "";
while((line = bufferedReader.readLine())!=null){
response += line;
}
bufferedReader.close();
inputStream.close();
httpURLConnection.disconnect();
return response;
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
return null;
}
@Override
protected void onProgressUpdate(Void... values) {
super.onProgressUpdate(values);
}
@Override
protected void onPostExecute(String result) {
if(result.equals("Login Failed")){
Toast.makeText(ctx, "Database password incorrect", Toast.LENGTH_SHORT).show();
}else{
//Create shared preferences module called "database" and write result to shared preferences variable "database_name"
SharedPreferences preferences = ctx.getSharedPreferences("database", Context.MODE_PRIVATE);
SharedPreferences.Editor editor = preferences.edit();
editor.putString("database_name", result);
editor.apply();
Intent intent = new Intent(ctx, MainActivity.class);
ctx.startActivity(intent);
((Activity)ctx).finish();
}
}
<?php
require "../init_accounts.php";
$database_name = $_POST["database_name"];
$password_user = $_POST["password_user"];
$sql_query = "SELECT database_name FROM abhandym_users WHERE database_name LIKE '$database_name' and password_user LIKE '$password_user';";
$result = mysqli_query($con,$sql_query);
if (mysqli_num_rows($result)>0)
{
$row = mysqli_fetch_assoc($result);
$database_name = $row["database_name"];
echo "$database_name";
}
else
{
echo "Login Failed" . mysqli_error($con);
}
?>
--------- beginning of crash
01-18 09:49:46.926 3193-3193/com.example.user.ABHandyM E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.user.ABHandyM, PID: 3193
java.lang.NullPointerException: Attempt to invoke virtual method 'boolean java.lang.String.equals(java.lang.Object)' on a null object reference
at com.example.user.ABHandyM.BackgroundTaskLogin.onPostExecute(BackgroundTaskLogin.java:90)
at com.example.user.ABHandyM.BackgroundTaskLogin.onPostExecute(BackgroundTaskLogin.java:26)
at android.os.AsyncTask.finish(AsyncTask.java:651)
at android.os.AsyncTask.-wrap1(AsyncTask.java)
at android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:668)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:148)
at android.app.ActivityThread.main(ActivityThread.java:5417)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)