我想通过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
}
});