Bagaimana cara URl menyandikan sesuatu di Node.js?

314

Saya ingin URL menyandikan ini:

SELECT name FROM user WHERE uid = me() 

Apakah saya harus mengunduh modul untuk ini? Saya sudah memiliki modul permintaan.

TIMEX
sumber
8
Memang, ini jalan yang licin dan harus dihindari dengan cara apa pun.
Alfred
19
Apakah Anda mencoba meletakkan pernyataan SQL di url Anda ??? hati-hati terhadap Serangan Injeksi SQL ! Itu umumnya ide yang buruk untuk mengekspos SQL kepada pengguna, itu benar-benar berbahaya.
Leonmax
4
@LightnessRacesinOrbit: tampak seperti FQL-query.
nikc.org
2
@Emi: Tidak? Bagaimana cara kerjanya? Izin DBMS tidak cukup halus, bahkan jika setiap pengguna SO tunggal memiliki akun DB mereka sendiri. Katakan di mana pada SO Anda melihat pertanyaan SQL diteruskan langsung? Satu-satunya pengecualian adalah data explorer, tapi itu semua hanya baca, dan itu pasti tidak dimasukkan ke dalam URL.
Lightness Races dalam Orbit
17
Orang itu bisa membangun alat validasi SQL, tidak ada yang salah dengan mengirimkan perintah SQL dalam contoh seperti itu. Terlalu banyak fokus untuk tidak menjawab pertanyaan dan tidak memberikan saran yang baik (komentar yang paling banyak dipilih tidak memberikan saran yang baik, hanya mengolok-olok OP)
Rafael Eyng

Jawaban:

598

Anda dapat menggunakan JavaScript encodeURIComponent:

encodeURIComponent('select * from table where i()')
Joe
sumber
31
Untuk menyelamatkan pengunjung dari pencarian, ya ... decodeURIComponentadalah bagaimana Anda memecahkan kode URI yang disandikan. Sama-sama.
KyleFarris
125

Modul bawaan querystringadalah yang Anda cari:

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
sumber
4
dalam hal ini kita hanya bisa meneruskan peta bukan string, jadi jika arg adalah string maka Anda tidak akan melihat hasil apa pun. Jadi jika Anda memiliki string untuk mengkodekan gunakan encodeURIComponent ().
Ankit Patial
1
Ini lebih baik untuk menyandikan objek JSON dan POST-ing mereka.
Alex W
Tidak jika string berisi karakter 'atau "
Jkarttunen
47

Gunakan escapefungsi querystring. Ini menghasilkan string URL aman.

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
sumber
1
Tampaknya ini adalah fungsi yang benar; querystring.stringify()(dalam jawaban Nicolas) tampaknya mengembalikan string kosong sekarang.
naskah merek
4
nodejs.org/api/… mengatakan: " querystring.escape()Metode ini digunakan oleh querystring.stringify()dan umumnya tidak diharapkan untuk digunakan secara langsung."
Simon Hänisch
17

Perhatikan bahwa pengkodean URI baik untuk bagian permintaan, itu tidak baik untuk domain. Domain akan disandikan menggunakan punycode. Anda memerlukan perpustakaan seperti URI.js untuk mengonversi antara URI dan IRI (Pengidentifikasi Sumber Daya Internasional).

Ini benar jika Anda berencana menggunakan string nanti sebagai string kueri:

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

Jika Anda tidak ingin karakter ASCII suka /, :dan ?ingin melarikan diri, gunakan encodeURI:

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

Namun, untuk kasus penggunaan lainnya, Anda mungkin perlu uri-js sebagai gantinya:

> 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'
Flimm
sumber
12

encodeURIComponent (string) akan melakukannya:

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

Melewati SQL di dalam string kueri mungkin bukan rencana yang baik,

lihat yang ini

John Culviner
sumber