Как мне кодировать URl в Node.js?

314

Я хочу, чтобы URL закодировал это:

SELECT name FROM user WHERE uid = me() 

Должен ли я скачать модуль для этого? У меня уже есть модуль запроса.

TIMEX
источник
8
Действительно, это скользкая дорога, и ее следует избегать любой ценой.
Альфред
19
Вы пытаетесь поместить оператор SQL в свой URL-адрес ??? будьте осторожны с атакой SQL-инъекций ! Обычно плохая идея выставлять пользователям SQL, это действительно опасно.
Leonmax
4
@LightnessRacesinOrbit: выглядит как FQL-запрос.
nikc.org
2
@ Деми: Нет? Как это будет работать? Разрешения СУБД недостаточно детализированы, даже если у каждого пользователя SO есть собственная учетная запись в БД. Скажите, где на SO вы видите запросы SQL, переданные напрямую? Единственное исключение - это проводник данных, но это все представления, доступные только для чтения, и он, конечно, не указан в URL.
Гонки
17
Парень мог бы создать инструмент проверки SQL, ничего плохого в передаче команд SQL в подобном примере. Слишком много внимания уделяется тому, чтобы не отвечать на вопрос и не давать хорошие советы (самый голосующий комментарий не дает хороших советов, а только высмеивает ОП)
Рафаэль Эйнг,

Ответы:

598

Вы можете использовать JavaScript encodeURIComponent:

encodeURIComponent('select * from table where i()')
Джо
источник
31
Чтобы сохранить посетителям поиск, да ... decodeURIComponentэто то, как вы декодируете закодированный URI. Пожалуйста.
KyleFarris
125

Встроенный модуль querystring- это то, что вы ищете:

var querystring = require("querystring");
var result = querystring.stringify({query: "SELECT name FROM user WHERE uid = me()"});
console.log(result);
#prints 'query=SELECT%20name%20FROM%20user%20WHERE%20uid%20%3D%20me()'
nicolaskruchten
источник
4
в этом случае мы можем передать только карту, а не строку, поэтому, если arg является строкой, вы ничего не увидите в результате. Поэтому, если у вас есть строки для кодирования, используйте encodeURIComponent ().
Анкит Патиал
1
Это лучше для кодирования объектов JSON и их размещения.
Алекс W
Нет, если строка содержит символы 'или'
Jkarttunen
47

Используйте escapeфункцию querystring. Генерирует безопасную строку URL.

var escaped_str = require('querystring').escape('Photo on 30-11-12 at 8.09 AM #2.jpg');
console.log(escaped_str);
// prints 'Photo%20on%2030-11-12%20at%208.09%20AM%20%232.jpg'
Kamrul
источник
1
Это определенно кажется правильной функцией; querystring.stringify()(в ответе Николаса), кажется, теперь возвращает пустую строку.
brandonscript
4
nodejs.org/api/… говорит: « querystring.escape()Метод используется querystring.stringify()и, как правило, не ожидается, что он будет использоваться напрямую».
Симон Хениш,
17

Обратите внимание, что кодировка URI хороша для части запроса, но не для домена. Домен кодируется с использованием punycode. Вам нужна библиотека типа URI.js для преобразования между URI и IRI (интернационализированный идентификатор ресурса).

Это правильно, если вы планируете использовать строку позже как строку запроса:

> encodeURIComponent("http://examplé.org/rosé?rosé=rosé")
'http%3A%2F%2Fexampl%C3%A9.org%2Fros%C3%A9%3Fros%C3%A9%3Dros%C3%A9'

Если вы не хотите, чтобы символы ASCII, такие как /, :и ?были экранированы, используйте encodeURIвместо:

> encodeURI("http://examplé.org/rosé?rosé=rosé")
'http://exampl%C3%A9.org/ros%C3%A9?ros%C3%A9=ros%C3%A9'

Однако для других случаев использования вам может понадобиться uri-js :

> var URI = require("uri-js");
undefined
> URI.serialize(URI.parse("http://examplé.org/rosé?rosé=rosé"))
'http://xn--exampl-gva.org/ros%C3%A9?ros%C3%A9=ros%C3%A9'
Флимм
источник
12

encodeURIComponent (string) сделает это:

encodeURIComponent("Robert'); DROP TABLE Students;--")
//>> "Robert')%3B%20DROP%20TABLE%20Students%3B--"

Передача SQL в строке запроса может быть плохим планом,

увидеть это

Джон Кульвинер
источник