我要做的是为此http get请求添加密码,用户名标头。如果用户名和密码正确,则让.php页面允许该功能。我已经看到很多关于基本授权和发布数据的标题的答案。我想要做的是为这个http get请求添加一些基本的安全性。
data.ts
getData() {
let headers = new Headers({ 'Content-Type':'*/*' });
headers.append('Authorization', 'Basic' + (loginname + ':' + password) );
this.http.get('https:data.php', { headers: headers }, {})
.map(res => res.json())
.subscribe(data => {
console.log(data.data);
},
err => {
this.connectionAlert();
});
}
data.php
<?php
$login = ‘loginname’; // move to lib config
$pass = ‘password’; // move to lib config
if (!isset($_SERVER['PHP_AUTH_PW']!= $pass || $_SERVER['PHP_AUTH_USER'] != $login)) {
header('WWW-Authenticate: Basic realm="My Site"');
header('HTTP/1.0 401 Unauthorized');
echo 'User not allowed';
exit;
} else {
echo "<p>Sucess</p>";
}
?>
我的错误是
不能对表达式的结果使用isset()(可以使用“null!== expression”代替)
我在网上找到的答案似乎无法解决问题。
答案 0 :(得分:1)
isset
用于测试变量是否存在,而不是将其与另一个值进行比较。您必须将比较作为if
声明的单独部分进行比较:
if (
!isset($_SERVER['PHP_AUTH_PW'])
|| $_SERVER['PHP_AUTH_PW'] !== $pass
|| !isset($_SERVER['PHP_AUTH_USER'])
|| $_SERVER['PHP_AUTH_USER'] !== $login
) {
header('WWW-Authenticate: Basic realm="My Site"');
在使用服务器变量之前检查是否存在服务器变量始终是个好主意。在这种情况下,如果用户直接在浏览器中访问该页面,则必须进行!isset()
检查,因为在用户有机会在其浏览器的基本内容中输入用户名和密码之前,页面将至少被请求一次验证对话框。有关isset
。
为确保安全的用户名和密码检查,我建议使用严格比较!==
运算符。不确定这是否与您的用例相关,但请注意,基本身份验证以纯文本形式传输用户名和密码,并且只有在与https一起使用时才能通过互联网保护。
另外,我必须将前两行中的引号更改为普通'
字符才能测试此代码:
$login = 'loginname'; // move to lib config
$pass = 'password'; // move to lib config