2013-07-31 2 views
0

EditText 및 (순간 2 버튼)에 대한 활동이 있습니다. 버튼을 누르면 EditText의 데이터가 비어 있거나 널 문자열인지 검사됩니다. 그렇다면 AlertDialog가 표시되어야합니다. TextEdit 결과가 비어 있지 않을 때까지이 작업을 반복해야합니다. Activity에서 더 이상 처리하지 않는 한 제대로 작동합니다. 만약 내가 더 자세한 설명이 있다면 Alertdialog는 보이지 않습니다. 단계별 디버깅 단계는 응용 프로그램이 검사에 들어가고 Alertdialog를 생성하지만 표시되지 않고 대신 코드의 다음 명령이 수행되었음을 보여줍니다. 그래서 그것은 말이되지 않습니다. 응용 프로그램 은 AlertDialog가 표시된 지점에서 처리를 중지해야합니다 (). 비어 있지 않은 문자열을 받으면 다양한 SQL 주입 문자열을 가진 텍스트 파일과 비교하여 테스트 진행 상황을 나타내는 ProgressDialog를 제기해야합니다. 테스트가 양수이면 EditText로 돌아가서 데이터를 수정할 수 있어야합니다. 지금까지 모든 동작이 동일합니다. 그래서 나는 이러한 행동을위한 자신의 (내부) 클래스를 만드는 것이 최선의 방법이라고 믿습니다. 추가 작업 (아직 암시되지 않음)은 다음과 같아야합니다. 하나의 단추가 데이터를 수동으로 완료하라는 다른 활동을 호출하면 다른 단추는 다양한 인터넷 자원에서 누락 된 데이터를 가져 오려고 시도합니다. 올바른 데이터를 선택할 수 있도록 다른 활동에서 결과를 보여줍니다. 그러면 전체 데이터가 데이터베이스로 전송됩니다. (SQL 주입 문자열에 대한 테스트를위한 하나의 이유) 여기Alertdialog 표시되지 않습니다.

코드입니다 : 가능한 한 많은 도움을 제공하는 경우

public class BlahverwaltungDateneingabeActivity extends Activity { 

    public String vtitel=null; //Variable, der der Wert des Texteingabefeldes zugewiesen werden soll 
    public String vtitel_1 = null; //Variable für Stringmanipulation 
    private EditText input_vtitel; //Texteingabefeld 
    public static Boolean inject_2=false; 
    final Context context_1=this; 
    Toast einToast; 

// private String filename=getString(R.string.Tempfile_fuer_Blahdaten); // Temporäres File für Blahdaten 


    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_blahverwaltung_dateneingabe_1); 

     Button manuellButton = (Button) findViewById(R.id.manuell_button); 
     Button ofdbButton = (Button) findViewById(R.id.blah_button); 


     //OnClicklistener erzeugen 

     manuellButton.setOnClickListener(new View.OnClickListener() { 


      @Override 
      public void onClick(View view) { 

       input_vtitel = (EditText) findViewById(R.id.Blahtitel); //Texteingabefeld initialisieren 
       vtitel = input_vtitel.getText().toString(); //Texteingabe String zuweisen 

       if (vtitel.equals(null) || vtitel.equals("")) { 
        AlertDialog.Builder adb_1 = new AlertDialog.Builder(context_1); //Alertdialog wenn Texteingabe leer 
        adb_1.setTitle(R.string.Nullstring); //Alertdialgo Titel setzen 
        adb_1.setMessage(R.string.Nullstring_1); //AlertNachricht setzen 
        adb_1.setCancelable(false); //kann nicht durch Back abgebrochen werden 
        adb_1.setPositiveButton(R.string.ok, new DialogInterface.OnClickListener() { //OnClickListener erzeugen 
         public void onClick(DialogInterface dialog, int which) {  //Activity neu starten 
          dialog.dismiss(); 
          if (Build.VERSION.SDK_INT >= 11) {  //Methode zum Neustart in Abhängigkeit vom SDK wählen 
           recreate(); 
          } else { 
           Intent in_1 = getIntent(); 
           overridePendingTransition(0, 0); 
           in_1.addFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION); 
           finish(); 

           overridePendingTransition(0, 0); 
           startActivity(in_1); 
          } 

         } 
        }); 
        AlertDialog ad_1 = adb_1.create();  //Alertdialig erzeugen 
        ad_1.show(); 
              //Alertdialog anzeigen 
       } 
       InjectionDialog id_1= new InjectionDialog(BlahverwaltungDateneingabeActivity.this); 
       id_1.execute(vtitel); 
       try { 
        inject_2=id_1.get(); 
       } catch (InterruptedException e) { 
        e.printStackTrace(); 
       } catch (ExecutionException e) { 
        e.printStackTrace(); 
       } 
      } 


//    vtitel_1 = vtitel.replace(" ", "+"); //Leerzeichen durch "+" ersetzen 
/* 
       try { 
        outputstream_1 = openFileOutput(filename, Context.MODE_PRIVATE); 
        outputstream_1.write(vtitel.getBytes()); 
        outputstream_1.close(); 
       } catch (FileNotFoundException e) { 
        e.printStackTrace(); 
       } catch (IOException e) { 
        e.printStackTrace(); 
       } catch (NullPointerException e) { 
        e.printStackTrace(); 
       } 
*/ 

      }); 
     } 



    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     // Inflate the menu; this adds items to the action bar if it is present. 
     getMenuInflater().inflate(R.menu.blahverwaltung_dateneingabe, menu); 
     return true; 
    } 

} 

가, 설명해주십시오, 나는 자바/안드로이드 초보자를 해요 때로는하지 않습니다 내가하는 일을 완전히 이해하라. 학습 서적과 인터넷 자료는 종종 도움이되지 않습니다. 제공된 솔루션을 채택 할 수는 있지만 코드가 수행하는 방식과 이유가 무엇인지 이해하고 싶습니다.

본인이 위에서 언급했듯이 데이터가 interent로 전송 될 수 있으므로 HTML 해킹, 크로스 사이트 스크립팅 Java 스크립트, PHP 공격 코드가 전송 될 때 데이터에 어떻게 있는지 확인할 수 있습니까? aRe 거기도 일부 comon 문자열에 대해 데이터 문자열을 확인할 수 있습니까?

답변

0

지금까지 아무도 내 질문에 답변하지 않았습니다. 그래서 나는 스스로 그것을하려고 노력할 것이다. 위의 코드 샘플은 완전히 다시 작성되었으며 Android 프로그램 예외 및 변수 초기화 및 할당 동작을 이해하기 위해 디버깅 단계별로 많은 단계를 수행했습니다.

지금까지 내가 이해 한 것을 설명 할 것입니다. 오류가있는 경우 수정하십시오.

여기에 새 코드가 있지만 아직 완성되지 않은 상태이며 일부 경우 쓸모없는 "디버깅"이 포함되어 있으며 프로그램 종료 및 변수 할당 작동 방식을 이해하기 위해 추가 한 무한 루프 코드가 있습니다.

public class BlahverwaltungDateneingabeActivity extends Activity implements OnClickListener { 

    public String vtitel_1 = null; //Variable für Stringmanipulation 
    public static Boolean inject_2=false; 
    private Button manuell_Button; 
    private Button ofdb_Button; 
    Context context_1=BlahverwaltungDateneingabeActivity.this; 
    Toast einToast; 

// private String filename=getString(R.string.Tempfile_fuer_Blahdaten); // Temporäres File für Blahdaten 


    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_blahverwaltung_dateneingabe_1); 

     manuell_Button = (Button) findViewById(R.id.manuell_button); 
     manuell_Button.setOnClickListener(this); 

     ofdb_Button = (Button) findViewById(R.id.ofdb_button); 
     ofdb_Button.setOnClickListener(this); 

    } 

    public void onClick(View v) { 
     EditText input_vtitel =(EditText) findViewById(R.id.Blahtitel); 

     String vtitel = input_vtitel.getText().toString(); 

     if (vtitel.length() == 0) { 
      new Builder(this) 
        .setTitle(R.string.Nullstring) 
        .setMessage(R.string.NullstringText) 
        .setCancelable(false) 
        .setNeutralButton(R.string.ok, null) 
        .show(); 
      return; 
     } else { 
      Builder adb_2 = new Builder(this); 
      adb_2.setTitle(R.string.SQLInjectionPruefung) 
       .setCancelable(false) 
       .setIcon(R.drawable.sand_glass_23654_150) 
       .setNeutralButton(R.string.ok, null); 
      AlertDialog ad_2 = adb_2.create(); 
      ad_2.show(); 
      Button okButton = ad_2.getButton(AlertDialog.BUTTON_NEUTRAL); 
      okButton.setEnabled(false); 
      inject_2=InjectionCheck.InjectionCheckResult(context_1, vtitel); 
      okButton.setEnabled(true); 
      okButton.setOnClickListener(new OnClickListener() { 

       @Override 
       public void onClick(View v_1) { 
        Toast.makeText(VideoverwaltungDateneingabeActivity.this, "testtest", Toast.LENGTH_LONG).show(); 
       } 
      }); 
      Toast.makeText(this, "testtesttest", Toast.LENGTH_LONG).show(); 
      if (inject_2) { 
       okButton.performClick(); 
       new Builder(this) 
         .setTitle(R.string.SQLInjectionResult) 
         .setMessage(R.string.SQLInjectionResultText) 
         .setCancelable(false) 
         .setNeutralButton(R.string.ok, null) 
         .show(); 
       return; 
      } 
     } 
     Toast.makeText(this, "test", Toast.LENGTH_LONG).show(); 


    } 

    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     // Inflate the menu; this adds items to the action bar if it is present. 
     getMenuInflater().inflate(R.menu.menu_blahverwaltung_dateneingabe, menu); 
     return true; 
    } 

} 

첫 번째 변경 사항은 이제 내 활동에 OnClickListener를 구현하는 것입니다.

public class BlahverwaltungDateneingabeActivity extends Activity implements OnClickListener { 

장점 : 모든 Button에 대해 OnClickListener의 새 인스턴스를 만들 필요가 없습니다.

두 번째 변경, 버튼에 독립적 인 OnClick 메서드가 있습니다. 장점 : 여기에 넣을 수있는 모든 활동 버트 노스에 대해 동일한 모든 코드 항목. 어떤 버튼이 클릭되었는지는 중요하지 않습니다.이 방법에서 코드는 모두 활성 버튼에 대해 실행됩니다.

나중에 (v == manuell_Button) ... 같은 버튼을 클릭했는지 확인하면됩니다. 버튼 특정 코드를 넣을 수 있습니다. (이게 잘되기를 바랍니다)

이제 EditText 필드에 아무 것도 입력하지 않았다고 가정하고 버튼을 클릭하십시오. 지금은 어떻게 될 것입니까?

프로그램은 ""빈 문자열 발생합니다

String vtitel = input_vtitel.getText().toString(); 

exectutes.

다음은

if (vtitel.length() == 0) 

로 이동합니다 우리가 길이가 빈 문자열을 가지고 있기 때문에 = 0이 지침을 실행합니다.

new Builder(this) 
     .setTitle(R.string.Nullstring) 
     .setMessage(R.string.NullstringText) 
     .setCancelable(false) 
     .setNeutralButton(R.string.ok, null) 
     .show(); 
return; 

이 코드는 실행 블록 한 것으로 보입니다. 복귀 지시에 중단 점을 설정했지만 절대 멈추지 않았습니다. AlerDialog가 아직 표시되지 않고 대신 OnClick 메서드의 끝으로 이동합니다. 그런 다음 대화 상자를 표시하지 않고 view.java를 호출 한 다음 handler.java - 대화 상자를 표시하지 않고 마지막으로 looper.java를 표시합니다. 대화 상자가 표시됩니다. 대화 상자 단추에 대한 OnClicklstener를 구현하지 않았기 때문에 단추를 클릭하면 추가 작업없이 대화 상자가 닫히고 Activity로 돌아갑니다.

이제 TextEdit 필드에 내용을 입력했다고 가정합니다. 그런 다음 프로그램은 "if (vtitel.length() == 0)"명령의 "else"트리로 이동합니다. all Alertdialog를 표시하지 않고 트리에서 적절한 단계를 실행 한 다음 작업의 나머지 코드에서 적절한 작업을 수행하고 대화 상자를 표시하기 전에 다시 view.java, handler.java 및 looper.java를 호출합니다.

이는 거의 불가능이 같은 동작을 만들 수 있습니다 :

  1. 인상 대화
  2. 정지 프로그램 실행 및
  3. 는 사용자의 응답에 따라 추가 코드를 수행하는 사용자 작업을 기다리는

내 코드에서 사용자 입력을 사출 문자열이있는 파일과 비교하여 검사합니다. 나의 원래 의도는 점검이 수행되는 동안 대화 상자를 표시 한 다음 대화 상자를 자동으로 취소하고 점검 결과에 따라 프로그램을 계속 진행하는 것입니다. 내 파일이 작아서 많은 지연이 발생하지 않으므로 Thread.sleep() 명령어를 추가하거나 for 루프를 체크하고 100 번 실행하도록 노력했습니다. 결과가 동일하지 않다는 것은 중요하지 않습니다. 전에이 AlertDialog를 표시하기 전에 수행됩니다. 따라서이 경우 AlertDialog는 쓸모가 없습니다. 또 다른 가능성은 ProgressDialog 였을 것이지만 여기에는 비슷한 문제가 있습니다. ProgressDialog는 Activity와 독립적으로 실행됩니다. 즉, ProgressDialog가 실행되는 동안 Activity가 추가 작업을 수행합니다. 그러나 활동에는 Progressdialog의 결과가 필요합니다. 두 번째 문제는 ProgressDialog의 결과를 Activity로 전달하는 쉬운 방법이 없다는 것입니다. ProgressDialog.get() 메서드는 작동하지만 ProgressDialog도 표시되지 않습니다. OnPostExecute 메서드도 사용할 수 없습니다. 활동 스레드에서 수행 되더라도 결과를 다시 활동으로 전달하도록 설계되었습니다. 나는 지금 당장 붙어있다.원하는 동작을 쉽게 구현할 수있는 방법이 없으며 원하는 기능을 많이 잃지 않고 Android 프로그램의 동작을 처리 할 방법을 찾아야합니다.