通过URI传递“(”和“)”会导致403错误,我该如何编码?

时间:2011-11-15 21:01:48

标签: javascript xmlhttprequest encode

(用于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()进行编码。提前谢谢!

2 个答案:

答案 0 :(得分:9)

以下应该这样做:

urlFetch = "http://my.url.com/script.php?qry=" + encodeURIComponent(qry)
    .replace(/\(/g, "%28").replace(/\)/g, "%29");

括号在URI语法中是古怪的。许多编码器将它们视为特殊编码器,即使它们出现在过时“mark”生产中。使用常见的网络协议(httphttpsmailto),可以安全地将它们编码为%28%29,但允许网络服务器分配特殊含义给他们。您已经在使用encodeURIencodeURIComponent,因此您已假设网址转义序列为UTF-8。

来自RFC 3986:

sub-delims    "!" / "$" / "&" / "'" / "(" / ")"
            / "*" / "+" / "," / ";" / "="
     

...

obsolete rule     translation
mark              "-" / "_" / "." / "!" / "~" / "*" / "'"
                / "(" / ")"

答案 1 :(得分:2)

作为评论者,您有很多问题。括号()和[]在URI中有效,但具有特定目的,因此它们不是由标准编码函数编码的。

其次,通过网络发送SQL是一个非常糟糕的主意,尤其是在get请求中。见RFC 2616。像get和head这样的方法被认为是“安全的”,它们只应该实现检索,它们并不意味着改变状态。我真的会重新考虑你在做什么,看看你是否能够以更清洁的方式实现它,可能在Programmers.stackexchange寻求对你的概念架构的意见。