【问题标题】:Add/Remove <button> from <div>?从 <div> 中添加/删除 <button>?
【发布时间】:2013-10-03 19:35:49
【问题描述】:

目标

目标是为经过身份验证的用户提供库存管理功能。其他访问者只能查阅库存,并过滤他们的发现。

身份验证

身份验证是通过ajaxSession() javascript 函数进行的,如此处所述。

  1. PHP / Ajax : How to show/hide DIV on $_SESSION variable value?(见答案)
  2. PHP: $_SESSION doesn't seem to get set. Any idea?

现在,$.ajax() 委托从 PHP 服务器获得正确答案。现在,我虽然简单地使用 CSS 类 .hide.show,但出于安全原因,这似乎不是一个好主意。

ajaxSession() 函数

function ajaxSession(actionUrl) {
    $.ajax(function() {
        url: actionUrl
        success: function(authenticated) {
            if (authenticated == 'true') {
                // create buttons here.
            } else {
                // ensure to empty those div
            }
        }
    });
}

注意$.ajax()调用中设置了其他成员,但重要的是在那里。

【问题讨论】:

  • 拥有 10K 代表,您应该清楚,标题中不允许使用诸如“谢谢”和标签之类的内容。
  • .show/.hide 对安全性很好,因为页面很容易被黑客入侵,真正的安全性必须在您的服务器上。
  • 任何在客户端实施的安全性本质上都是不安全的;手段完全无关紧要。使用您的服务器。
  • 强烈建议在应用程序中使用带有经过验证的用户的数据库。然后,您可以使用 echo 通过您的字段从中获取信息。 $it="DB"; ;-)
  • @WillMarcouiller 这是元问题:meta.stackexchange.com/questions/2950/…(我确实同意大多数答案。)

标签: javascript php jquery html ajax


【解决方案1】:

安全机制应该​​在服务器端实现!

如果您在 JS 中创建一些特定于登录的按钮,则不会存在安全漏洞。请确保您不从您的后端 (PHP) 输出敏感数据,或者您执行任何未经授权的操作(再次从您的后端)。

始终在服务器端(针对每个操作)检查用户是否已获得授权!
将登录状态存储在会话等中。不要依赖像 isLoggedIn=1 或 POST 数据这样的 URL 参数。它们来自客户。客户端始终是应用程序中不受信任的部分。

【讨论】:

  • +1 感谢您指定敏感数据。我终于可以在服务器端成功了! =)
【解决方案2】:

如果您担心人们猜到它们,您可以使用随机类名而不是隐藏/显示...“230583”或“fss83hjg”等。

如果我理解正确,这就是你想要的吗?

function ajaxSession(actionUrl) {
$.ajax(function() {
    url: actionUrl
    success: function(authenticated) {
        if (authenticated == 'true') {
            // create buttons here.
            var buttons = '<input type="button" value="Button 1">'
            buttons += '<input type="button" value="Button 2">'
            buttons += 'etc...';
            $('#button-container-div').html( buttons );
        } else {
            // ensure to empty those div
            $('#button-container-div').html('');
        }
    }
});
}

在 jQuery 中创建元素时,您应该动态地执行它们,以便元素默认不在页面上(见上文)。但是,如果有人正在寻找(甚至没有那么难),他们将能够看到您在源代码中所做的事情,并且可以相当容易地使用控制台重新创建您正在做的任何事情(如果经过身份验证)......我会建议使用服务器端代码(您使用的是 PHP?)来生成您的敏感数据。 (见下文)

<?php
// start sessions if you aren't including a global config file that does it for you
session_start();

if($_SESSION['is_logged_in'] == true) {
    // logged in, show buttons
    $buttons = '<input type="button" value="Button 1">';
    $buttons .= '<input type="button" value="Button 2">';
    $buttons .= 'etc...';

    echo $buttons;
} else {
    // not logged in
}
?>

【讨论】:

  • 你忘记了最重要的元素:session_start(); ;-)
  • true - 假设这背后有一个脚本检查登录并且可能会共享一个包含它的配置文件,但你是对的
  • 覆盖所有基础总是最好的 ;-)
  • 将按钮的代码移动到服务器端并不能真正提高安全性。应该保护敏感数据并且只执行授权操作。
  • 按钮代码是授权操作的一个例子......至少在那个例子中,如果你在任何时候都没有被授权,你不会知道这些元素的存在(而不是 jQuery 方式)
【解决方案3】:

为了成功:

Function myFunction()
{
    var btn=document.createElement("BUTTON");
    var t=document.createTextNode("CLICK ME");
    btn.appendChild(t);
    document.getElementById("theDiv").appendChild(btn);
}

失败

function myFailFunction() {
   var node = document.getElementById("theDiv");
   while (node.hasChildNodes()) {
        node.removeChild(node.lastChild);
    }
}

【讨论】:

  • +1 感谢您的意见!这教会了我一些关于 Javascript 的知识! =)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-01
  • 2020-08-18
  • 1970-01-01
相关资源
最近更新 更多