ฉันจะเข้ารหัส 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.