Як я можу кодувати URl щось у Node.js?


314

Я хочу зашифрувати URL-адресу:

SELECT name FROM user WHERE uid = me() 

Чи потрібно завантажити модуль для цього? У мене вже є модуль запиту.


8
Дійсно, це слизька дорога і її слід уникати будь-якою ціною.
Альфред

19
Чи намагаєтесь ви поставити оператор SQL у свою URL-адресу ??? будьте уважні до атаки ін'єкцій SQL ! Це взагалі погана ідея піддавати SQL користувачам, це дійсно небезпечно.
Леонмакс

4
@LightnessRacesinOrbit: схожий на FQL-запит.
nikc.org

2
@Demi: Ні? Як би це працювало. Дозволи на СУБД не є досить чіткими, навіть якщо кожен користувач 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()'

4
в цьому випадку ми можемо передавати лише карту не рядок, тож якщо аргумент - це рядок, то в результаті ви нічого не побачите. Тож якщо у вас є рядки для кодування, використовуйте encodeURIComponent ().
Ankit Patial

1
Це краще для кодування JSON-об'єктів та розміщення їх.
Alex 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'

1
Очевидно, це правильна функція; querystring.stringify()(у відповіді Ніколя), схоже, зараз повертає порожню рядок.
фірмовий сценарій

4
nodejs.org/api/… говорить: " querystring.escape()Метод використовується, querystring.stringify()і, як правило, не застосовується безпосередньо."
Simon Hänisch

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 (рядок) зробить це:

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

Хоча передача SQL навколо рядка запиту може бути не гарним планом,

дивись цей

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.