Làm cách nào để URl mã hóa thứ gì đó trong Node.js?


314

Tôi muốn mã hóa URL này:

SELECT name FROM user WHERE uid = me() 

Tôi có phải tải xuống một mô-đun cho điều này? Tôi đã có mô-đun yêu cầu.


8
Thật vậy, đây là một con đường trơn và nên tránh bằng mọi giá.
Alfred

19
Bạn đang cố gắng đưa câu lệnh SQL vào url của mình ??? hãy cẩn thận với SQL Attack Attack ! Nói chung là một ý tưởng tồi để phơi bày SQL cho người dùng, nó thực sự nguy hiểm.
Leonmax

4
@LightnessRacesinOrbit: trông giống như một truy vấn FQL.
nikc.org

2
@Demi: Không? Làm thế nào mà làm việc. Các quyền DBMS không đủ chi tiết, ngay cả khi mọi người dùng SO đơn lẻ có tài khoản DB của riêng họ. Hãy cho tôi biết nơi nào trên SO bạn thấy các truy vấn SQL được truyền trực tiếp? Một ngoại lệ là trình thám hiểm dữ liệu, nhưng đó là tất cả các chế độ xem chỉ đọc và chắc chắn nó không được đưa vào URL.
Các cuộc đua nhẹ nhàng trong quỹ đạo

17
Anh chàng có thể đang xây dựng một công cụ xác thực SQL, không có gì sai khi truyền các lệnh SQL trong một ví dụ như thế. Quá tập trung vào việc không trả lời câu hỏi cũng không đưa ra lời khuyên tốt (bình luận được đánh giá cao nhất không đưa ra lời khuyên tốt, chỉ làm cho niềm vui của OP)
Rafael Eyng

Câu trả lời:


598

Bạn có thể sử dụng JavaScript encodeURIComponent:

encodeURIComponent('select * from table where i()')

31
Để lưu khách truy cập, có ... decodeURIComponentlà cách bạn giải mã URI được mã hóa. Không có gì.
KyleFarris

125

Mô-đun tích hợp querystringlà những gì bạn đang tìm kiếm:

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
trong trường hợp này, chúng ta chỉ có thể vượt qua một bản đồ không phải là một chuỗi, vì vậy nếu arg là một chuỗi thì bạn sẽ không thấy kết quả gì. Vì vậy, nếu bạn có chuỗi để mã hóa, hãy sử dụng encodeURIComponent ().
Ankit Patial

1
Điều này tốt hơn để mã hóa các đối tượng JSON và POST-ing chúng.
Alex W

Không phải nếu chuỗi chứa 'hoặc "ký tự
Jkarttunen

47

Sử dụng escapechức năng của querystring. Nó tạo ra một chuỗi an toàn 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
Điều này chắc chắn dường như là chức năng chính xác; querystring.stringify()(trong câu trả lời của Nicolas) dường như trả về một chuỗi trống bây giờ.
brandonscript

4
nodejs.org/api/ Good nói: " querystring.escape()Phương thức này được sử dụng bởi querystring.stringify()và thường không được dự kiến ​​sẽ được sử dụng trực tiếp."
Simon Hänisch

17

Lưu ý rằng mã hóa URI tốt cho phần truy vấn, nó không tốt cho miền. Tên miền được mã hóa bằng cách sử dụng Punycode. Bạn cần một thư viện như URI.js để chuyển đổi giữa URI và IRI (Mã định danh tài nguyên quốc tế).

Điều này đúng nếu bạn dự định sử dụng chuỗi sau này dưới dạng chuỗi truy vấn:

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

Nếu bạn không muốn ký tự ASCII thích /, :?để được thoát, sử dụng encodeURIthay vì:

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

Tuy nhiên, đối với các trường hợp sử dụng khác, bạn có thể cần uri-js thay thế:

> 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 (chuỗi) sẽ làm điều đó:

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

Truyền SQL xung quanh trong một chuỗi truy vấn có thể không phải là một kế hoạch tốt,

xem cái này

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.