Пропуск "(" и ")" через URI вызывает ошибку 403, как я могу их кодировать? - PullRequest
1 голос
/ 16 ноября 2011

(JavaScript для XML-запроса HTTP и PHP для выполнения SQL-запроса.)

Я создаю веб-приложение, которое выполняет запросы. Он использует метод GET XMLHTTP запроса и передает запрос в скрипт 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 ]

9 голосов
/ 16 ноября 2011

Ниже следует сделать это:

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

Круглые скобки - это странности в грамматике URI. Многие кодировщики рассматривают их как особые, даже если они только появляются в устаревшей «марке». При использовании обычных веб-протоколов (http, https, mailto) их можно безопасно кодировать в %28 и %29, хотя веб-серверам разрешено присваивать им специальные значения. Вы уже используете encodeURI или encodeURIComponent, поэтому вы уже предполагаете, что escape-последовательности URL-адресов имеют UTF-8.

Из RFC 3986:

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

...

obsolete rule     translation
mark              "-" / "_" / "." / "!" / "~" / "*" / "'"
                / "(" / ")"
2 голосов
/ 16 ноября 2011

Как комментаторы, у вас есть ряд вопросов.Скобки () и [] допустимы в URI, но имеют конкретные цели, поэтому они не кодируются стандартными функциями кодирования.

Во-вторых, отправлять SQL по проводам очень плохо, особенно в запросе get,См. RFC 2616 .Такие методы, как get и head, считаются «безопасными», они должны реализовывать только поиск, они не предназначены для изменения состояния.Я действительно пересмотрю то, что вы делаете, и посмотрю, сможете ли вы достичь этого более чистым способом, возможно, запросив мнения о вашей концептуальной архитектуре на Programmers.stackexchange .

...