【问题标题】:Passing POST data from Javascript(jquery) to php problems?将 POST 数据从 Javascript(jquery) 传递到 php 问题?
【发布时间】:2010-11-16 07:18:07
【问题描述】:

我一直在尝试传递这个值:

// Content to submit to php
Others string here. And this link:
http://www.youtube.com/watch?v=CUUgKj2i1Xc&feature=rec-LGOUT-exp_fresh+div-1r-2-HM

到一个php页面,并将其插入数据库。这是我当前的代码:

... // javascript

var content = $("#mcontent").val();
$.ajax({
    url : '<?php echo PATH; ?>functions/save.php',
    type: 'POST',
    data: 'id=<?php echo $_GET['id']; ?>&content=' + content + '&action=save&val=<?php echo md5("secr3t" . $_SESSION['userid_id']); ?>',
    dataType: 'json',

    success: function(response) {
        if (response.status == 'success') {
            alert(response.message);
        } else {
            alert(response.message);
        }
    }
});

实际上没有错误,但是在数据库中,它保存的是:

Others string here. And this link:
http://www.youtube.com/watch?v=CUUgKj2i1Xc

我想我知道是什么问题,问题是:

http://www.youtube.com/watch?v=CUUgKj2i1Xc&feature=rec-LGOUT-exp_fresh+div-1r-2-HM

我认为它将“&feature=”作为另一个 POST 数据。我尝试过的:

但两者都不起作用。你还有什么办法吗?

编辑:

您预见到可能发生的任何其他问题吗?内容由用户输入/写入。这意味着,用户可以输入/写任何东西。在反手,我做了其他检查,包括“mysql_real_escape_string”

【问题讨论】:

  • &lt;?php echo $_GET['id']; ?&gt;? 危险:您有 XSS 安全漏洞。请勿在未将其转换为您使用的语言的情况下包含用户数据!在这种情况下,JavaScript 然后检查 &lt;/script&gt; 是否转换为 &lt;\/script&gt;(如果它出现在字符串中)。
  • 感谢大卫的警告。那么,要知道哪个用户发布它,我应该存储到 $_SESSION 变量吗?请指教
  • 会话变量是存储用户 ID 的明智之选,是的。

标签: php jquery ajax post-parameter


【解决方案1】:

jQuery 的一个好处是 data 参数可以带一个 JS 对象,所以你不需要尝试手动构建查询字符串。

<?php

    $data = array("id" => $_GET['id'], 
                  "action" => "save", 
                  "val" => md5("secr3t",$_SESSION['userid_id'])
                 );
    $json_data = encode_json($data);
    $json_data = str_ireplace($json_data, '</script>', '<\/script>');
    echo "var data = $json_data;";
?>
data.content = content;
$.ajax({
            url : '<?php echo PATH; ?>functions/save.php',
            type: 'POST',
            data: data,
            dataType: 'json',

【讨论】:

  • 嗨,大卫,感谢您提供的出色解决方案(为什么我从来没想过!)但是,您不是说传递 $_GET['id'] 很危险吗?传递用户 ID 的更好方法是什么?
  • 仅仅剥离&lt;script&gt; 是不够的!您仍然可以在事件中插入 iframes/objects/javascript... 如果您不想使用 HTML,请使用 htmlentities() 函数。否则,看看htmlpurifier.org
  • 谢谢。现在可以了。我现在正在阅读 XSS 攻击。如果我记错了,twitter 不久前被 XSS 攻击了。对像我这样的新手有什么黄金建议吗? ——
  • 攻击者可以说:foo.php?id=function_to_send_to_attacker(document.cookie);并将链接提供给某人。此技术允许攻击者使用该用户的所有凭据执行用户可以执行的任何操作。黄金法则是:转义所用语言的所有数据
  • 只是逃避就是忽略问题。验证是关键字。如果您知道一个字段应该只包含数字(例如电话号码),您应该确保它只包含数字,而不包含其他任何内容。有两种方法,删除非法字符(清理),使用preg_replace() 或使用类似ctype_digit() 的函数拒绝非法内容(验证)。对于$_GET$_POST$_COOKIE输入,推荐使用filter_input()
【解决方案2】:

学会逃跑。你很容易受到XSS 的攻击。在这种情况下,您的数据是 URL 的一部分,因此您必须 urlencode() 它。

var content = $("#mcontent").val();
$.ajax({
    url : '<?php echo PATH; ?>functions/save.php',
    type: 'POST',
    data: 'id=<?php echo urlencode($_GET['id']); ?>&content=' + urlencode(content) + '&action=save&val=<?php echo md5("secr3t" . $_SESSION['userid_id']); ?>',
    dataType: 'json',

    success: function(response) {
        if (response.status == 'success') {
            alert(response.message);
        } else {
            alert(response.message);
        }
    }
});

注意:我假设 PATH 不包含像 '\ 这样的特殊字符。由于$_SESSION['user_id']是md5-ed,所以不需要转义,因为它是安全的(md5返回一个固定长度32的字符串,只包含0-9和a-f。

【讨论】:

  • 有没有用于 urlencode 的 javascript?这个: ... &content=' + urlencode(content) + '&action=save&val... 在 javascript 中,昨天我尝试了类似的事情,将 javascript 变量传递给 PHP,经过一点谷歌搜索,没有 ajax,这是不可能的
  • 您能详细解释一下我的案例中的 XSS 攻击吗?我不应该像大卫所说的那样通过 $_GET['id'] (在问题的评论中)
  • 一个与 urlencode 相当的接近 JavaScript 等效项是 encodeURIComponent(不是:空格变成 %20,而不是 +)。在您的旧代码中,您只需打开 yourpage.php?id=&lt;/script&gt;&lt;script&gt;alert(/xss/)&lt;/script&gt; 即可查看 XSS 效果。要发布表格,请查看api.jquery.com/jQuery.post
  • 谢谢。现在可以了。我现在正在阅读 XSS 攻击。如果我记错了,twitter 不久前被 XSS 攻击了。对像我这样的新手有什么黄金建议吗?
猜你喜欢
  • 2011-04-29
  • 2014-03-15
  • 2012-06-23
  • 2019-11-16
  • 1970-01-01
  • 2018-01-06
  • 2011-01-23
  • 2014-04-30
  • 1970-01-01
相关资源
最近更新 更多