【发布时间】:2015-08-10 19:54:52
【问题描述】:
我一直在尝试自己制作“更改密码”功能。这意味着当用户想要更改他的密码时,会弹出一个对话框并显示三个字段:旧密码、新密码和确认新密码。旧密码使用SharedPreferences 处理。
public void invokeChangePass 工作。所以你不必看那个。
问题出在php文件和private void updateDataBase 不会改变数据库中用户的密码。
除了 php 文件和 updateDatabase 函数之外的所有东西都可以正常工作,所以不用担心。
实用说明:
- 我知道它容易受到 mysql 注入的影响。目前不是我的首要任务。
-
EmailKey和PassKey在用户登录时在SharedPreferences中生成。 - 应该在数据库中找到
EmailKey,以便更改该用户的密码。 - 这是不久前我做的,所以它可能有愚蠢的错误或我刚刚忘记添加的东西。
非常感谢。
JAVA 文件:
public class ChangePassDialog extends Activity {
private EditText setOldPass;
private EditText setNewPass;
private EditText setNewPass2;
public static final String MyPREFERENCES = "MyPrefs";
SharedPreferences sharedpreferences;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.dialog_changepass);
setOldPass = (EditText) findViewById(R.id.setOldPass);
setNewPass = (EditText) findViewById(R.id.setNewPass);
setNewPass2 = (EditText) findViewById(R.id.setNewPass2);
}
public void invokeChangePass(View view) {
String oldpass = setOldPass.getText().toString();
String pass = setNewPass.getText().toString();
String pass2 = setNewPass2.getText().toString();
sharedpreferences = getSharedPreferences(MyPREFERENCES, Context.MODE_PRIVATE);
String passKey = sharedpreferences.getString("passKey", "DEFAULT");
String name = sharedpreferences.getString("emailKey", "DEFAULT");
// onPreExecute();
if (oldpass.equals(passKey) && pass.length() >= 6 && pass.length() <= 30 && (pass2.length() >= 0 && (pass.equals(pass2)) && (!pass.equals(pass.toLowerCase()) &&
!pass.equals(pass.toUpperCase()) &&
pass.matches(".*\\d+.*")))) {
updateDatabase(pass, name);
setNewPass2.requestFocus();
setNewPass2.setError("TEST WORKING.");
} else {
errorTest(oldpass, pass, pass2);
}
}
private void updateDatabase(String pass, String name) {
class SendPostReqAsyncTask extends AsyncTask<String, Void, String> {
@Override
protected String doInBackground(String... params) {
String name = params[0];
String pass = params[1];
List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>();
nameValuePairs.add(new BasicNameValuePair("pass", pass));
nameValuePairs.add(new BasicNameValuePair("name", name));
try {
HttpClient httpClient = new DefaultHttpClient();
HttpPost httpPost = new HttpPost("http://calisapp.esy.es/changepass.php");
httpPost.setEntity(new UrlEncodedFormEntity(nameValuePairs));
HttpResponse response = httpClient.execute(httpPost);
InputStream entity = response.getEntity().getContent();
InputStreamReader inputStream = new InputStreamReader(entity);
BufferedReader bufferedReader = new BufferedReader(inputStream);
StringBuilder stringBuilder = new StringBuilder();
String bufferedStrChunk = null;
while ((bufferedStrChunk = bufferedReader.readLine()) != null) {
stringBuilder.append(bufferedStrChunk);
}
return stringBuilder.toString();
} catch (ClientProtocolException e) {
} catch (IOException e) {
}
return "";
}
@Override
protected void onPostExecute(String result) {
super.onPostExecute(result);
String s = result.trim();
if(s.equalsIgnoreCase("success")){
Intent intent = new Intent(ChangePassDialog.this, Settings.class);
startActivity(intent);
Toast.makeText(ChangePassDialog.this, "Registered successfully", Toast.LENGTH_LONG).show();
finish();
}
// loadingDialog.dismiss();
}
}
SendPostReqAsyncTask sendPostReqAsyncTask = new SendPostReqAsyncTask();
sendPostReqAsyncTask.execute(name,pass);
}
PHP 文件:
<?php
define('HOST','X');
define('USER','X');
define('PASS','X');
define('DB','X');
$con = mysqli_connect(HOST,USER,PASS,DB);
$name = $_POST['name'];
$pass = $_POST['pass'];
$sql = "UPDATE tbl_user SET password='$pass' WHERE username = '$name'";
if(mysqli_query($con,$sql)){
echo 'success';
}
mysqli_close($con);
?>
【问题讨论】:
-
您将如何阻止随机连接到此服务的人将人们的密码更改为他们选择的密码?他们需要做的就是知道某人的用户名。
-
另外,您以纯文本形式存储密码 - 最好不要这样做。使用强哈希算法。
-
Logcat 不显示错误?服务器端的错误日志?尝试
error_log($name)和error_log($pass)并检查错误日志。看看帖子能不能通过。并在您的 javahttpPost.addHeader("Content-Type","application/x-www-form-urlencoded");中设置内容类型 -
连接到?您必须在应用程序上登录并知道您当前的密码吗?为了存储密码,我稍后会做安全性。一步一步来。第一种至少想要这个工作。
-
哦!感谢您的提醒!稍后我会调查的!
标签: java php android sql-update