Java HttpsURLConnection和BufferedReader问题

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

我目前正在尝试为我的Android应用程序创建一个安全的登录页面

登录程序的总体概述如下:

  • 用户输入密码
  • 打开HttpURLConnection,并使用URLEncoder和PHP脚本将密码与sql数据库中的条目进行比较。(注意,这是一个HTTP连接,不安全)
  • 如果密码无效,它将返回“登录失败”的PHP回音,Android后台任务将相应地对此做出响应
  • 这一切都很好。然而

    我最近在主机服务器上安装了一个证书,使站点HTTPS[Secure]——因此,我在Android代码中将“HttpURLConnection”更改为“HttpsURLConnection”,以适应该证书

    现在,每当我使用有效凭据登录时,如果它应该返回PHP echo“login Failed”,那么它将返回null…这将导致后台任务中的if语句冗余

    下面是BackgroundTaskLogin.java代码:


    不太清楚更改连接类型时为什么返回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)