我已经在Windows 8上安装了wamp ,每当我访问 localhost 或 phpmyadmin 时都会收到上述错误。经过大量搜索,我找到了许多答案,其中包括将 httpd.conf 修改为等。此链接显示了这样一个常见的答案以及更多信息。Allow from All
我的问题是,许多人认为它允许所有用户访问 phpMyAdmin 并且它不安全且易受攻击等。我想创建完全安全的 WAMP 服务器,如果我这样做可以吗?
有人可以为我提供一些参考或信息吗?
我已经在Windows 8上安装了wamp ,每当我访问 localhost 或 phpmyadmin 时都会收到上述错误。经过大量搜索,我找到了许多答案,其中包括将 httpd.conf 修改为等。此链接显示了这样一个常见的答案以及更多信息。Allow from All
我的问题是,许多人认为它允许所有用户访问 phpMyAdmin 并且它不安全且易受攻击等。我想创建完全安全的 WAMP 服务器,如果我这样做可以吗?
有人可以为我提供一些参考或信息吗?
1.
首先,必须允许 TCP 和 UDP 数据包使用端口 80(或您正在使用的端口)和 443。为此,请在 Windows 防火墙上为端口 80 和 443 为 TPC 和 UDP 创建 2 个入站规则。(或者,如果允许入站规则,您可以禁用整个防火墙进行测试,但永久解决方案)
2.
您需要更改 Apache 上的安全设置以允许从其他任何地方进行访问,因此请编辑您的httpd.conf
文件。
将此部分更改为:
# onlineoffline tag - don't remove
Order Deny,Allow
Deny from all
Allow from 127.0.0.1
Allow from ::1
Allow from localhost
至 :
# onlineoffline tag - don't remove
Order Allow,Deny
Allow from all
如果“全部允许”行不适合您,则使用“要求全部授予”,那么它将适合您。
在 WAMPServer 的版本 3 和 > 中,预定义了一个虚拟主机,localhost
因此根本不要修改httpd.conf
文件,保持原样。
使用菜单编辑httpd-vhosts.conf
文件。
它应该是这样的:
<VirtualHost *:80>
ServerName localhost
DocumentRoot D:/wamp/www
<Directory "D:/wamp/www/">
Options +Indexes +FollowSymLinks +MultiViews
AllowOverride All
Require local
</Directory>
</VirtualHost>
修改为
<VirtualHost *:80>
ServerName localhost
DocumentRoot D:/wamp/www
<Directory "D:/wamp/www/">
Options +Indexes +FollowSymLinks +MultiViews
AllowOverride All
Require all granted
</Directory>
</VirtualHost>
注意:如果您在端口 80 以外运行 wamp,则 VirtualHost 将类似于 VirtualHost *:86.(86 或您使用的任何端口)而不是 VirtualHost *:80
3. 进行此更改后不要忘记重新启动 Wamp 或 Apache 的所有服务
我发现最好(也是最不Allow from All
令人沮丧)的路径是从.Allow from 127.0.0.1
Allow from ::1
只要您的防火墙配置正确,Allow from all
应该不会导致任何问题,但如果您不需要其他计算机能够访问您的站点,最好只允许来自本地主机。
每次更改 httpd.conf 时不要忘记重新启动 Apache。它们将在下一次开始之前生效。
希望这足以让您入门,网上有很多可用的文档。
默认情况下,wamp 将以下内容设置为任何未明确声明的目录的默认值:
<Directory />
AllowOverride none
Require all denied
</Directory>
对我来说,如果我注释掉表明Require all denied
我开始有权访问相关目录的行。我不推荐这个。
相反,在我包含的目录指令Require local
中,如下所示:
<Directory "C:/GitHub/head_count/">
AllowOverride All
Allow from all
Require local
</Directory>
注意:当我只有Allow from all
. 添加Require local
对我有帮助。
添加Allow from All
对我不起作用。然后我尝试了这个,它奏效了。
操作系统:Windows 8.1
Wamp:2.5
我在文件C:\wamp\bin\apache\apache2.4.9\conf\extra\httpd-vhosts.conf中添加了这个
<VirtualHost *:80>
ServerAdmin localhost@localhost.com
DocumentRoot "c:/wamp/www/"
ServerName localhost
ServerAlias localhost
ErrorLog "logs/localhost-error.log"
CustomLog "logs/localhost-access.log" common
</VirtualHost>
这可能是一种解决方案。
public class RegisterActivity extends AppCompatActivity {
private static final String TAG = "RegisterActivity";
private static final String URL_FOR_REGISTRATION = "http://192.168.10.4/android_login_example/register.php";
ProgressDialog progressDialog;
private EditText signupInputName, signupInputEmail, signupInputPassword, signupInputAge;
private Button btnSignUp;
private Button btnLinkLogin;
private RadioGroup genderRadioGroup;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_register);
// Progress dialog
progressDialog = new ProgressDialog(this);
progressDialog.setCancelable(false);
signupInputName = (EditText) findViewById(R.id.signup_input_name);
signupInputEmail = (EditText) findViewById(R.id.signup_input_email);
signupInputPassword = (EditText) findViewById(R.id.signup_input_password);
signupInputAge = (EditText) findViewById(R.id.signup_input_age);
btnSignUp = (Button) findViewById(R.id.btn_signup);
btnLinkLogin = (Button) findViewById(R.id.btn_link_login);
genderRadioGroup = (RadioGroup) findViewById(R.id.gender_radio_group);
btnSignUp.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
submitForm();
}
});
btnLinkLogin.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent i = new Intent(getApplicationContext(),MainActivity.class);
startActivity(i);
}
});
}
private void submitForm() {
int selectedId = genderRadioGroup.getCheckedRadioButtonId();
String gender;
if(selectedId == R.id.female_radio_btn)
gender = "Female";
else
gender = "Male";
registerUser(signupInputName.getText().toString(),
signupInputEmail.getText().toString(),
signupInputPassword.getText().toString(),
gender,
signupInputAge.getText().toString());
}
private void registerUser(final String name, final String email, final String password,
final String gender, final String dob) {
// Tag used to cancel the request
String cancel_req_tag = "register";
progressDialog.setMessage("Adding you ...");
showDialog();
StringRequest strReq = new StringRequest(Request.Method.POST,
URL_FOR_REGISTRATION, new Response.Listener<String>() {
@Override
public void onResponse(String response) {
Log.d(TAG, "Register Response: " + response.toString());
hideDialog();
try {
JSONObject jObj = new JSONObject(response);
boolean error = jObj.getBoolean("error");
if (!error) {
String user = jObj.getJSONObject("user").getString("name");
Toast.makeText(getApplicationContext(), "Hi " + user +", You are successfully Added!", Toast.LENGTH_SHORT).show();
// Launch login activity
Intent intent = new Intent(
RegisterActivity.this,
MainActivity.class);
startActivity(intent);
finish();
} else {
String errorMsg = jObj.getString("error_msg");
Toast.makeText(getApplicationContext(),
errorMsg, Toast.LENGTH_LONG).show();
}
} catch (JSONException e) {
e.printStackTrace();
}
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
Log.e(TAG, "Registration Error: " + error.getMessage());
Toast.makeText(getApplicationContext(),
error.getMessage(), Toast.LENGTH_LONG).show();
hideDialog();
}
}) {
@Override
protected Map<String, String> getParams() {
// Posting params to register url
Map<String, String> params = new HashMap<String, String>();
params.put("name", name);
params.put("email", email);
params.put("password", password);
params.put("gender", gender);
params.put("age", dob);
return params;
}
};
// Adding request to request queue
AppSingleton.getInstance(getApplicationContext()).addToRequestQueue(strReq, cancel_req_tag);
}
private void showDialog() {
if (!progressDialog.isShowing())
progressDialog.show();
}
private void hideDialog() {
if (progressDialog.isShowing())
progressDialog.dismiss();
}
}