我是不是需要在 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&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 之间编码/解码查询参数?的主要内容,如果未能解决你的问题,请参考以下文章