我是不是需要在 ajax 请求和接收该请求的 php 之间编码/解码查询参数?

Posted

技术标签:

【中文标题】我是不是需要在 ajax 请求和接收该请求的 php 之间编码/解码查询参数?【英文标题】:Do I need to encode/decode query parameters between an ajax request and the php receiving that request?我是否需要在 ajax 请求和接收该请求的 php 之间编码/解码查询参数? 【发布时间】:2011-10-27 19:30:02 【问题描述】:

我想通过 ajax 调用作为参数发送整个 sql 命令。我必须逃避它还是为此做一些特别的事情?

类似tools.php?database=db2&sql=select * from table

如果需要转义

我如何在 javascript/jquery 中做到这一点 然后在 php 中我该怎么做才能阅读它

注意 - 非常具体的用例和系统设置

网络服务器只能从内部我们的内部网络访问。如果有人闯入,他们可以获得所有数据库,所以我正在通过这个问题改进的“小应用程序”根本不重要。我已经通过我的 Web 应用程序实现了整个数据库的 DROPping、更新整个列、更新数据库的设置等。我只想添加这个新功能。我什至可能会成为这个 Web 应用程序的唯一用途。

【问题讨论】:

请不要。这是完全危险的。真的,而且很明显。 tools.php?database=db2&sql=drop table customers 完全同意@Albin。请预定义您想要执行的命令并调用它们。每次你做这样的事情,上帝都会杀死一只小猫:p 可能是您想要允许这种语句的 sql 前端。 @Albin:为了争论,如果数据库角色只有检索权限怎么办? @Henning:没有什么能阻止他 :-) 但是要对我们造成一些“伤害”,公司的某些人必须find 链接,click 链接,ip 必须是正确的,php file 名称必须正确,structure of url 参数必须正确,database name 必须正确....然后在大多数情况下,我会“只”恢复另一个备份....跨度> 【参考方案1】:

您没有理由构建 SQL 查询客户端。如果您正在构建的系统可能是这条规则的例外,那么您就不会在这里问这个问题。

在 AJAX 请求中发送基本信息,并使用该信息构建查询。

使用 PDO 和参数化查询来保护自己免受 SQL 注入攻击。

【讨论】:

【参考方案2】:

如果您不确定自己在做什么,请不要使用此代码

此代码存在灾难性的安全漏洞,因此请不要使用它,除非您绝对确定没有邪恶的人会访问它。

发送:

jQuery.ajax(
    type: 'post',
    dataType: 'json',
    url: *your backend url here*,
    data: database: 'db', sql: "select * from table",
    success: function(data, textStatus)
        //perform any processing with data returned from backend here
    
);

接收:

<?php
    $sql = $_POST['sql'];
    $db = $_POST['db'];
    //db connection
    $result = mysql_query($sql);
    //processing query result, $rslt is processing result
    echo json_encode($rslt);
?>

但是,从客户端发送 SQL 并不是一个好主意,这种方法极易受到 SQL 注入的攻击。但是,如果你确定要打自己的腿......

【讨论】:

@JOHN 你为什么要发布这个? OP显然不了解这对安全的影响。 也许是因为他想帮忙? @Stephen,由他来决定。我警告过他很多,甚至比你还多。所以,不要扮演“大哥”,让拉德克为自己的所作所为负责。 @Stephen,这次讨论的目的是什么?仅供参考,我赞成您的回答并首先赞扬问题本身,所以我同意您的观点。你想要我做什么?我对这个问题的看法是,人们,尤其是程序员,必须为自己的行为负责。所以,如果 OP 要求什么 - 我会回答。如果这很危险 - 我警告并劝阻他很多,但使用与否,这是他的责任。所以除非你改变我的想法,否则这个讨论是没有用的。 这是一个问答网站。有一个 Q,这就是 A。要完成“有用”方面,这个场景的问题非常清楚。来自我的+1,这里没有问题。 // 反对者:如果它对您有帮助,请将其视为远程命令行数据库管理工具。像 SQLYog 或 PhpMyAdmin 这样的客户端是否会阻止您编写任意查询? 不,它没有。嘘,继续前进!【参考方案3】:

这个问题可以概括一下,以便对以后来这里的其他人有所帮助。本质上,您要问的是“我是否需要在 ajax 请求和接收该请求的 php 之间编码/解码查询参数?”

如果我们删除关于正在发送什么类型的数据的讨论(例如 sql 查询),J0HN 的答案是正确的。我建议将问题的标题更改为类似于我上面提到的内容。

为了回答更一般的问题,查询将在通过 ajax 发送时自动进行 urlencode,无论是 POST 还是 GET。 PHP 会将特殊的$_GET$_POST 变量中的值作为urldecoded 值提供。这意味着您无需担心 urlencoding 或 urldecoding。浏览器会为你编码,PHP 会为你解码。

【讨论】:

更改了标题。谢谢你的建议。 你能帮我澄清一下吗? the query will be urlencoded automatically as it is sent via ajax 是通过一般的 ajax 还是 jQuery ajax? 一般来说。浏览器将处理 urlencoding post 并获取参数,无论是常规 http 还是通过 ajax 完成。 @Radek 很有趣!还没发现。【参考方案4】:

不要这样做。

这种方法带走了所有安全性;无论您的“内部网络”有多安全。例如,Bob 可以在 Alice 吃午饭的时候走到 Alice 的办公桌前输入tools.php?database=db2&amp;sql=update employee set resigned=1 where employee=alice,或者其他恶意行为,这些行为不是您的 Web 应用程序有意的,而是由不安全的代码促成的。

不要让网络应用用户可以不受限制地访问您的数据库中运行的查询。

应该做的是弄清楚你所有的查询将是什么,并给它们命名。

将这些名称和查询放入您的 PHP 代码中,并在您的 Web 代码中单独使用该名称。这让可以控制数据库发生的事情,而不是您网络上的每个人

基于其他答案的示例:

接收:

<?php
    // presuming a PDO connection here
    $dbh = get_db_connection($_REQUEST['db']);

    // map from arbitrary name to the actual query
    // instead of giving the client control of the actual query
    switch ($_REQUEST['query']) 
    case "get-user":
        $sql = "SELECT * FROM users WHERE id = ?";
        break;
    case "sign-in":
        $sql = "UPDATE users SET signed_in = 1 WHERE id = ?";
        break;
    default:
        die();
    

    $sth = $db->prepare($sql);

    // assuming an array of parameters
    $params = $_REQUEST['params'];
    if (!is_array($params)) $params = array();

    // PDO makes it easy to bind positional parameters
    $sth->execute($params);

    echo json_encode($sth->fetchAll());
?>

发送:

jQuery.ajax(
    type: 'post',
    dataType: 'json',
    url: *your backend url here*,
    data: database: 'db', query: "get-user", "params[0]": 123,
    success: function(data, textStatus)
        //perform any processing with data returned from backend here
    
 );

【讨论】:

以上是关于我是不是需要在 ajax 请求和接收该请求的 php 之间编码/解码查询参数?的主要内容,如果未能解决你的问题,请参考以下文章

从 Prestashop 模块发出 ajax 请求

AJAX表单提交以及数据接收

ajax请求返回数据保存为全局变量

AJAX跨域请求数据

“如何在功能后修复'Ajax请求执行get而不是patch'错误”

玩!框架 1.2.5 |在 Action 控制器上接收和处理 jquery ajax 请求