ฉันจะเข้ารหัส URl บางอย่างใน Node.js ได้อย่างไร


314

ฉันต้องการที่จะเข้ารหัส URL นี้:

SELECT name FROM user WHERE uid = me() 

ฉันต้องดาวน์โหลดโมดูลสำหรับสิ่งนี้หรือไม่? ฉันมีโมดูลคำขออยู่แล้ว


8
อันที่จริงนี่เป็นถนนที่ลื่นและควรหลีกเลี่ยงค่าใช้จ่ายทั้งหมด
อัลเฟรด

19
คุณพยายามจะใส่คำสั่ง SQL ใน url ของคุณ ??? ระวังSQL Injection Attack ! โดยทั่วไปแล้วมันเป็นความคิดที่ดีที่จะเปิดเผย SQL ให้กับผู้ใช้มันเป็นอันตรายจริงๆ
Leonmax

4
@LightnessRacesinOrbit: ดูเหมือนแบบสอบถาม FQL
nikc.org

2
@Demi: ไม่ จะทำงานอย่างไร สิทธิ์ของ DBMS นั้นไม่ได้มีการปรับให้เหมาะสมอย่างเพียงพอแม้ว่าผู้ใช้ SO ทุกคนจะมีบัญชี DB ของตัวเอง บอกฉันทีว่าคุณเห็นข้อความค้นหา SQL ที่ส่งโดยตรงหรือไม่ ข้อยกเว้นเดียวคือ data explorer แต่เป็นมุมมองแบบอ่านอย่างเดียวและไม่ได้ใส่ใน URL อย่างแน่นอน
Lightness Races ที่ Orbit

17
คนที่แต่งตัวประหลาดอาจจะสร้างเครื่องมือตรวจสอบ SQL ไม่มีอะไรผิดปกติกับการส่งคำสั่ง SQL ในตัวอย่างเช่นนั้น เน้นมากเกินไปที่จะไม่ตอบคำถามและไม่ให้คำแนะนำที่ดี (ความคิดเห็นที่ upvoted ที่สุดไม่ได้ให้คำแนะนำที่ดีเพียง แต่ทำให้สนุกกับ OP)
Rafael Eyng

คำตอบ:


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
ในกรณีนี้เราสามารถส่งผ่านแผนที่ไม่ใช่สตริงเท่านั้นดังนั้นหาก arg เป็นสตริงคุณจะไม่เห็นผลลัพธ์ใด ๆ ดังนั้นหากคุณมีสตริงที่จะเข้ารหัสให้ใช้ 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()(ในคำตอบของ Nicolas) ดูเหมือนจะส่งคืนสตริงว่างตอนนี้
brandonscript

4
nodejs.org/api/…พูดว่า: " querystring.escape()วิธีการใช้งานโดยquerystring.stringify()ทั่วไปไม่คาดว่าจะใช้โดยตรง"
Simon Hänisch

17

โปรดทราบว่าการเข้ารหัส URI นั้นดีสำหรับส่วนของแบบสอบถาม แต่ก็ไม่ดีสำหรับโดเมน โดเมนได้รับการเข้ารหัสโดยใช้ punycode คุณต้องการไลบรารีเช่นURI.jsเพื่อแปลงระหว่าง URI และ IRI (Internationalized Resource Identifier)

สิ่งนี้ถูกต้องถ้าคุณวางแผนที่จะใช้สตริงในภายหลังเป็นสตริงแบบสอบถาม:

> 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 ไปรอบ ๆ ในสตริงการสืบค้นอาจไม่ใช่แผนการที่ดี

ดูอันนี้

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.