【问题标题】:Can I use a php variable in an Angular if statement?我可以在 Angular if 语句中使用 php 变量吗?
【发布时间】:2016-04-25 16:49:54
【问题描述】:

我不确定这是否是最佳实践,但我只是想在我拥有的网站上为我创建一个简单的登录系统。我不想使用数据库来存储一个密码,并且我在整个站点中使用 Angular。我不希望密码在 javascript 中以纯文本形式显示,任何人都可以看到。

我想到的一个解决方案是这样做:

  $scope.loginValue = false;
  $scope.loginFunction = function(password){
    if(password == <?php echo 'test123' ?>){
      $scope.loginValue = true;
    }
  }

有谁知道我如何能够做到这一点?现在我收到一个错误,因为 JavaScript 不喜欢我的 if 语句中的 '

我的其他想法是使用哈希,这是我以前从未做过的......是的,我对想法持开放态度。 :)

提前谢谢大家。

**********************下面更新**********************

所以,我最终选择了@musicfuel 建议的答案。我现在正试图让它发挥作用。按照建议,我的 login.php 文件具有以下内容:

<? echo $_POST['password'] == 'test123' ? true : false ?>

密码是来自用户输入的 $scope.password。当他们提交凭据时,它会调用此函数

$scope.loginFunction = function(){
    loginService.getLogin().then(function(response){
      console.log(response);
    }, function(error){
      $rootScope.loggedIn = false;
    });
};

这里是登录服务:

myApp.controller('myController', ['$scope', '$rootScope', 'loginService', function myController($scope, $rootScope, loginService) {

.service('loginService', ['$http', '$q', '$rootScope', function($http, $q, $rootScope){
    var getLogin = function() {
      $http.post('login.php'), {
          password: $scope.password
      }, function (success) {
          console.log("Login result: " + success);
      }, function (error) {
          console.log("Couldn't complete the login request.");
      } 
    }
  }])
}]);

当这个函数运行时,我得到以下错误:TypeError: loginService.getLogin is not a function 知道为什么找不到吗?

【问题讨论】:

  • “我不希望密码在 javascript 中可见,但我没有使用数据库或 API 调用” 您必须进行 API 调用或如果您不希望它出现在 JS 源代码中,请以某种方式计算该值。即使你设法让&lt;?php echo 'test123' ?&gt; 正常工作,它也会简单地将那个值放入发送到浏览器的 JS 源代码中。
  • 我认为您应该阅读 stackoverflow.com/q/13840429/218196 以更好地了解客户端 JS 和服务器端 PHP 如何协同工作。
  • 感谢@Felix Kling。决定制作一个简单的 login.php 文件。感谢您的帮助!

标签: javascript php angularjs password-protection


【解决方案1】:

错误的原因是您的 *.js 文件可能没有被 PHP 处理并且是静态提供的。您对值进行硬编码并直接在 JavaScript 中检查的解决方案存在缺陷,因为 JavaScript 将始终以纯文本形式显示。您可以对其进行混淆并做一些诡计,但所有要管理的代码也将是可见的并被逆向工程。

您确实应该考虑创建一个 PHP 端点并将输入的值传递给该端点,然后处理响应。例如,您可以创建一个简单的login.php 文件,它只检查 GET 或 POST 中的单个值与 test123,然后在正文中返回字符串 truefalse。这是一个简单的解决方案,但会阻止明文访问,并且可以轻松扩展以最终支持数据库访问。

假设您发送的变量是密码,它是通过 POST 发送的。您的login.php 可能是:

<? echo $_POST['password'] == 'test123' ? true : false ?>

在 Angular 方面,您可以利用 $http 服务来发送变量并处理响应:

$http.post('login.php', {
    password: $scope.password // Assuming you use ng-model for text entry binding
}, function (success) {
    console.log("Login result: " + success);
}, function (error) {
    console.log("Couldn't complete the login request.");
}

【讨论】:

  • 在决定走这条路线后刚刚更新了我的问题。感谢您的所有帮助。
【解决方案2】:

您必须生成语法上有效的 javascript,这意味着您的代码正在生成语法错误。例如一旦 php 处理完页面,你会得到

 if (password == test123) {

test123 极有可能是一个未定义/未知的变量。

基本经验法则:永远不要EVER直接将 PHP 中的文本转储到 javascript 上下文中。始终使用 json_encode:

if (password == <?php echo json_encode('test123'); ?>) {

产生:

if (password = 'test123') {
               ^-------^---note these quotes.

【讨论】:

  • 不能解决 “我不希望密码在 javascript 中可见” 问题。另外我认为这种情况下的根本问题是JS没有通过PHP传递。
  • 确实如此。但至少 javascript 可以工作,而不是因为语法错误而死。
  • 感谢您的快速cmets。那么是否有可能从 php 中提取变量或字符串并用于 javascript 中的密码验证,而无法在脚本中或调试时看到它的值?
  • 如果该JS在客户端执行,则密码对客户端可见,因为代码在他们的浏览器中。
猜你喜欢
  • 2020-11-24
  • 2018-07-31
  • 1970-01-01
  • 2022-07-12
  • 1970-01-01
  • 2016-04-12
  • 2014-12-27
  • 2011-08-06
  • 1970-01-01
相关资源
最近更新 更多