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

Phi*_*l_t 1 javascript encode xmlhttprequest

(用于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;
 }
Run Code Online (Sandbox Code Playgroud)

这是一个快速参考,我知道我的xmlhttp请求工作正常,因为它执行其他查询传递时需要做的事情,例如:

SELECT * FROM `tableName`
Run Code Online (Sandbox Code Playgroud)

工作正常,但当你尝试做类似的事情

CREATE TABLE `new_table`
AS (SELECT * FROM `old_table`)
Run Code Online (Sandbox Code Playgroud)

然后这就是它不会执行的时候,我得到了403错误,所以我认为这是一个()因为我甚至在PHP本身上尝试了相同的代码,而不必通过它并且它工作,所以必须有一个URL编码过程的问题对吗?如果这是问题,是否有一种编码这些字符的方法?我假设还有其他字符不能用encodeURI()方法编码encodeURIComponent().提前致谢!

Mik*_*uel 10

以下应该这样做:

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

括号在URI语法中是古怪的.许多编码器将它们视为特殊编码器,即使它们出现在过时的 "标记"生产中.与普通的网络协议(http,https,mailto)它是安全的,它们编码为%28%29,虽然Web服务器允许指定特殊含义给他们.您已经在使用encodeURIencodeURIComponent已经假定URL转义序列是UTF-8.

来自RFC 3986:

sub-delims    "!" / "$" / "&" / "'" / "(" / ")"
            / "*" / "+" / "," / ";" / "="
Run Code Online (Sandbox Code Playgroud)

...

obsolete rule     translation
mark              "-" / "_" / "." / "!" / "~" / "*" / "'"
                / "(" / ")"
Run Code Online (Sandbox Code Playgroud)