【问题标题】:Javascript, PHP, and SQL Security - Basic validation of information received.Javascript、PHP 和 SQL 安全性 - 接收信息的基本验证。
【发布时间】:2015-10-04 22:19:22
【问题描述】:

我一直在开发一个社交网络。我注意到一些安全问题,用户可以将 javascript/jquery 中的变量更改为其他 user_id、文本内容和其他已加载到脚本中的信息。这一切都是通过检查工具或其他可以编辑语言的软件完成的。他们甚至可以重写函数。

在将 url_id 发送到 php 函数后,我通过 php 和 sql 将数据加载到页面上。

我有 javascript 和 jquery 脚本作为回报,它们使用这些数据来执行 ajax、post 和 get 请求以及执行功能。

如何阻止用户在将这些变量发送到服务器之前对其进行更改?例如,当用户发布帖子时,他们可以更改 id 以使其成为其他人的帖子,或者当他们单击删除图像时,他们可以删除其他人的图像,这会变得更加复杂。这是一个大问题。

这些脚本包含在 php 页面或通过 ajax 加载的 php 脚本中。

我怎样才能阻止这种情况?你能给我一个简单的解释吗?几个月来我一直在寻找如何阻止这种情况。我仍然不明白如何阻止用户这样做。如果有另一种方法可以做到这一点?你能给我提供100%真实的例子吗?我还有哪些其他选择?

这是我的代码的一些 sn-ps

    <? if (login_check($mysqli) == true) : ?>
    <script>
        $.post("auto/online.php?q=<? echo $id ?>");
        function o() {
            setTimeout(function() {
                $.post("auto/online.php?q=<? echo $id ?>");
                o();
            }, 6e4);
        }
    </script>
    <? endif; ?>

    <?php echo '<div class="post-btn" onclick="ajaxPost(postenter.value,\''.$name.'\',\''.$id.'\');" title="Post">Post</div>'; ?>

    function ajaxPost(content,name,id) {

    var ip = '<?php echo $ip ?>';
    content = content.replace(/<br\s*\/?>/mg,"\n");
    var postArray = [content, id, ip];
    postArray = JSON.stringify(postArray);
    alert(postArray);

    if (content.length == 0) {
        alert('Oops it looks like your post is empty.');
    } else {
        var xmlhttp = new XMLHttpRequest();
        xmlhttp.onreadystatechange = function() {
            if (xmlhttp.readyState == 4 && xmlhttp.status == 200) {
                document.getElementById("postenter").innerHTML = "";
                var html = xmlhttp.responseText; 
                alert(html);
                $(html).hide().insertAfter("#wrapper").fadeIn(500);
                document.getElementById("postenter").value = "";
            }
        }
        xmlhttp.open("POST", "auto/post.php", true);
        xmlhttp.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
        xmlhttp.send('data=' + postArray);
    }
    }

    <? if ($id == $user) : ?>
        <div class="modalSetPro" onclick="setProImage(<? echo $picID; ?>,<? echo $uid; ?>)">Set Profile</div>
        <div class="modalSetBac" onclick="setProCover(<? echo $picID; ?>,<? echo $uid; ?>)">Set Background</div>
        <div class="modalDelImg" onclick="delItemPre(<? echo $picID; ?>, 1, <? echo $uid; ?>)">Delete</div>
    <? endif; ?>

    function delItemPre(itemID, type, user) {
        var modArr = [itemID, type, user];
        modArr = JSON.stringify(modArr);        
        $("#LoadMe").load('modals/del_modal.php?p=' + modArr);
    }

【问题讨论】:

  • "你能给我一个简单的解释吗?"不。也许如果你提供一些代码,我们可以给你一些方向。

标签: javascript php jquery mysql ajax


【解决方案1】:

您无法阻止这种情况,这就是需要服务器端验证的原因。

这是一个讨论它的stackoverflow:Why do we need both client side and server side validation? 这里有一些很好的信息: http://www.w3schools.com/php/php_form_validation.asp

基本上,您希望将验证放在您将 ajax 发布到的 PHP 页面中。

【讨论】:

  • 您能否提供一个如何验证此服务器端的示例?我已经发布了一些代码 sn-ps
  • 我编辑了我的回复,以便为您添加一些信息。
  • 我了解如何对表单进行 php 检查,但是如何验证用户 ID 以便他们无法使用 php 在客户端将其更改为其他人的?
  • 啊,我明白了。我知道处理此问题的唯一方法是将 PHP 会话 ID 返回给客户端,并将其包含在您的请求中。然后确保会话 ID 有效,并且该会话中的用户可以访问该 ID。您应该始终对每个请求重新授权访问。
【解决方案2】:

如何阻止用户在将这些变量发送到服务器之前对其进行更改?例如,当用户发布帖子时,他们可以更改 id 以使其成为其他人的帖子,或者当他们单击删除图像时,他们可以删除其他人的图像,这会变得更加复杂。这是一个大问题。

你不能。

您的服务器端代码应评估用户的权限并决定他们是否可以执行该操作。 JavaScript 验证更多的是为了用户体验 - 引导和防止错误。

【讨论】:

  • 您愿意提供一个 php 页面的示例来使用我使用过的代码 sn-p 来验证这一点吗?
  • @DarkMoria 不,我不会为你编写代码。很容易找到基于 PHP 的服务器端验证示例。
  • 感谢您的反馈,在 5 个月的时间里我学到了很多关于安全的知识。谢谢。新用户很难全面了解真正的“服务器端”代码,以及您做什么和不做什么。
【解决方案3】:

首先,当您在客户端工作时,您无法控制用户如何与您的 jquery 或 javascript 代码交互。所以经验法则是永远不要在 html 或 java 脚本中暴露敏感数据。

更多如果您对安全性感到好奇,您不需要在隐藏字段或任何其他客户端代码 (html) 中加载用户 ID。在您的情况下,例如当用户回复任何帖子时,您必须在服务器端交叉检查当前登录的用户是否有权执行此任务。还要交叉检查这篇文章是否与当前登录的用户有关。 我对php一无所知,但在asp.net中,我们可以在服务器端创建一个会话,当用户发布数据时从会话而不是用户发布的html内容中获取用户ID。

【讨论】:

    【解决方案4】:

    在服务器端而不是客户端存储和检查所有不安全的数据。这种方式用户无法更改。

    【讨论】:

    • 使用 php 我将如何执行此操作?你愿意提供一个我用过的 sn-p 的例子吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-08
    • 1970-01-01
    • 2015-08-05
    相关资源
    最近更新 更多