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


Do I need to encode/decode query parameters between an ajax request and the php receiving that request?

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

比如tools.php?database=db2&sql=select * from table

如果需要转义

  • 如何在javascript/jquery中实现
  • 我该怎么在php中读取呢

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

web服务器只能从内部网络访问。如果有人闯入,他们可以得到所有的数据库,所以我通过这个问题改进的"小应用程序"根本不重要。我已经实现了整个数据库的删除,更新整个列,更新数据库的设置等通过我的web应用程序。我只是想添加这个新功能。我甚至可能是唯一一个使用这个web应用程序的人。

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

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

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

朋友们,如果你不能完全确定你在做什么,不要使用这段代码

这段代码有严重的安全漏洞,所以不要使用它,除非你绝对确定没有坏人会访问它。

发送:

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注入的攻击。但是,如果你确定你想开枪打自己的腿…

这个问题可以概括一下,这样对以后来讨论的人会有帮助。本质上,你问的是"我是否需要在ajax请求和接收该请求的php之间编码/解码查询参数?"

如果我们去掉关于发送什么类型的数据的讨论(比如sql查询),john的答案是正确的。我建议把问题的题目改得像我上面提到的那样。

为了回答更一般的问题,查询将在通过ajax发送时自动unlencoded,无论是POST还是GET。PHP将使用特殊的$_GET$_POST变量中的值作为url解码的值。这意味着您不需要担心url编码或url解码。浏览器将为您编码,PHP将为您解码。

只是不这样做。

这种方法带走了所有的安全性;不管你的"内部网络"有多安全。例如,Bob可以在Alice吃午饭的时候走到她的办公桌前,输入tools.php?database=db2&sql=update employee set resigned=1 where employee=alice,或者其他不是你的web应用程序想要的,但由于不安全的代码而成为可能的邪恶行为。

不要让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
    }
 });