(用于XML HTTP请求的JavaScript和用于执行SQL查询的PHP。)
我正在构建一个执行查询的Web应用程序。它使用XMLHTTP请求GET方法并将查询传递给执行它的PHP脚本。它工作正常,直到我在其中引入括号( )
。
以下是工作原理的示例:
function executeQry(){
qry = document.getElementByID('textarea').value;
qryHTTPRequest(encodeURI(qry));
//I've also tried encodeURIComponent(qry);
}
function xmlHTTPRequest(qry){
//fetches
urlFetch = "http://my.url.com/script.php?qry=" + qry;
}
这是一个快速参考,我知道我的xmlhttp请求工作正常,因为它执行了其他查询传递时需要做的事情,例如:
SELECT * FROM `tableName`
工作正常,但是当你尝试做类似
的事情时CREATE TABLE `new_table`
AS (SELECT * FROM `old_table`)
然后这就是它不会执行的时候,我得到了403错误所以我认为它与()
是一个因为我甚至在PHP本身上尝试了相同的代码,而不必通过它它有效,所以URL编码过程一定存在问题吗?如果这是问题,是否有一种编码这些字符的方法?我假设还有其他字符不能使用encodeURI()
方法以及encodeURIComponent()
进行编码。提前谢谢!
答案 0 :(得分:9)
以下应该这样做:
urlFetch = "http://my.url.com/script.php?qry=" + encodeURIComponent(qry)
.replace(/\(/g, "%28").replace(/\)/g, "%29");
括号在URI语法中是古怪的。许多编码器将它们视为特殊编码器,即使它们仅出现在过时“mark”生产中。使用常见的网络协议(http
,https
,mailto
),可以安全地将它们编码为%28
和%29
,但允许网络服务器分配特殊含义给他们。您已经在使用encodeURI
或encodeURIComponent
,因此您已假设网址转义序列为UTF-8。
来自RFC 3986:
sub-delims "!" / "$" / "&" / "'" / "(" / ")" / "*" / "+" / "," / ";" / "="
...
obsolete rule translation mark "-" / "_" / "." / "!" / "~" / "*" / "'" / "(" / ")"
答案 1 :(得分:2)
作为评论者,您有很多问题。括号()和[]在URI中有效,但具有特定目的,因此它们不是由标准编码函数编码的。
其次,通过网络发送SQL是一个非常糟糕的主意,尤其是在get请求中。见RFC 2616。像get和head这样的方法被认为是“安全的”,它们只应该实现检索,它们并不意味着改变状态。我真的会重新考虑你在做什么,看看你是否能够以更清洁的方式实现它,可能在Programmers.stackexchange寻求对你的概念架构的意见。