การหลีกเลี่ยงเครื่องหมายและใน URL


203

ฉันกำลังพยายามส่งข้อความ GET ที่มีสตริงที่มีเครื่องหมายและไม่สามารถคิดวิธีที่จะหลีกเลี่ยงเครื่องหมายและใน URL

ตัวอย่าง:

http://www.example.com?candy_name=M&M
result => candy_name = M

ฉันก็ลอง:

http://www.example.com?candy_name=M\&M
result => candy_name = M\\

ฉันใช้ URL ด้วยตนเองดังนั้นฉันแค่ต้องการตัวอักษรที่ถูกต้อง

ฉันไม่สามารถใช้ห้องสมุดใด ๆ จะทำอย่างไร?

คำตอบ:


350

พวกเขาจำเป็นต้องเข้ารหัสเป็นเปอร์เซ็นต์:

> encodeURIComponent('&')
"%26"

ดังนั้นในกรณีของคุณ URL จะมีลักษณะดังนี้:

http://www.mysite.com?candy_name=M%26M

2
: -% 26 ไม่ทำงานสำหรับฉัน มีวิธีแก้ไขปัญหาอื่นอีกไหม?
Sanjiv

2
เมื่อฉันแทนที่ & เป็น% 26 มันยังคงแสดงข้อผิดพลาดเดียวกันอยู่A potentially dangerous Request.Path value was detected from the client (&).
Sanjiv

4
@Sanjiv: นั่นเป็นปัญหากับรหัสของคุณไม่ใช่การเข้ารหัสเป็นเปอร์เซ็นต์ ถามคำถาม.
ปั่น

2
@Sanjiv ตรวจสอบให้แน่ใจว่าคุณได้แทนที่ "&" ด้วย "% 26" ก่อน ดูรหัส ::: NSString * message = @ "Hello Jack & Jill"; message = [ข้อความ stringByReplacingOccurrencesOfString: @ "&" withString: @ "% 26"]; message = [ข้อความ stringByAppendingString: @ ""]; message = [ข้อความ stringByAddingPercentEscapesUsingEncoding: NSUTF8StringEncoding];
Nirav

40

นี้ไม่ได้ใช้เฉพาะเพื่อเครื่องหมายใน URL ที่ แต่ทุกตัวอักษรที่สงวนไว้ บางส่วนซึ่งรวมถึง:

 # $ & + ,  / : ; = ? @ [ ]

แนวคิดนี้เหมือนกับการเข้ารหัส&ในเอกสาร HTML แต่บริบทได้เปลี่ยนเป็นภายใน URI นอกเหนือจากการอยู่ในเอกสาร HTML ดังนั้นการเข้ารหัสเปอร์เซ็นต์ป้องกันปัญหาเกี่ยวกับการแยกวิเคราะห์ภายในบริบททั้งสอง

สถานที่ที่มีประโยชน์มากมายคือเมื่อคุณต้องใส่ URL ใน URL อื่น ตัวอย่างเช่นหากคุณต้องการโพสต์สถานะบน Twitter:

http://www.twitter.com/intent/tweet?status=What%27s%20up%2C%20StackOverflow%3F(http%3A%2F%2Fwww.stackoverflow.com)

มีอักขระที่สงวนไว้จำนวนมากในทวีตของฉันคือ?'():/ดังนั้นฉันเข้ารหัสค่าทั้งหมดของstatusพารามิเตอร์ URL สิ่งนี้มีประโยชน์เมื่อใช้mailto:ลิงก์ที่มีเนื้อหาข้อความหรือหัวเรื่องเนื่องจากคุณต้องเข้ารหัสbodyและsubjectพารามิเตอร์เพื่อให้ตัวแบ่งบรรทัดแอมเปอร์แซนด์และอื่น ๆ ไม่เป็นอันตราย

เมื่อตัวละครจากชุดที่สงวนไว้ ("ตัวละครที่สงวนไว้") มีความหมายพิเศษ ("วัตถุประสงค์ที่สงวนไว้") ในบริบทหนึ่งและชุดรูปแบบ URI บอกว่าจำเป็นต้องใช้ตัวละครนั้นเพื่อจุดประสงค์อื่น จะต้องเข้ารหัสเป็นเปอร์เซ็นต์ การเข้ารหัสเปอร์เซ็นต์อักขระที่สงวนไว้เกี่ยวข้องกับการแปลงอักขระเป็นค่าไบต์ที่สอดคล้องกันใน ASCII จากนั้นแทนค่านั้นเป็นคู่ของเลขฐานสิบหก ตัวเลขที่นำหน้าด้วยเครื่องหมายเปอร์เซ็นต์ ("%") ซึ่งใช้เป็นอักขระยกเว้นจะถูกใช้ใน URI แทนอักขระที่สงวนไว้ (สำหรับอักขระที่ไม่ใช่ ASCII โดยทั่วไปจะถูกแปลงเป็นลำดับไบต์ใน UTF-8 จากนั้นแต่ละค่าไบต์จะถูกแทนดังด้านบน) ตัวอย่างเช่นอักขระที่สงวน "/" หากใช้ใน "เส้นทาง" องค์ประกอบของ URI มีความหมายพิเศษของการเป็นตัวคั่นระหว่างส่วนของเส้นทาง หากตามรูปแบบ URI ที่กำหนดไว้ "/" จะต้องอยู่ในส่วนของเส้นทางดังนั้นต้องใช้อักขระสามตัว "% 2F" หรือ "% 2f" ในส่วนแทนที่จะเป็นแบบ "ดิบ"

http://en.wikipedia.org/wiki/Percent-encoding#Percent-encoding_reserved_characters


4
ในรายการดังกล่าวข้างต้น! ' ( ) *ไม่ได้เข้ารหัส URL encodeURIComponentใช้
Amil Waduwawara

มีฟังก์ชัน urlencode php ซึ่งแก้ปัญหานี้ได้: การใช้งาน $ escapedfilename = urlencode ($ filename);
Jeremy Young


3

คุณสามารถใช้อักขระ% เพื่อ 'หนี' ตัวละครที่ไม่ได้รับอนุญาตใน URL ดู [RFC 1738]

ตารางค่า ASCII ในhttp://www.asciitable.com/

คุณสามารถเห็นว่า&26 เป็นเลขฐานสิบหก - ดังนั้นคุณต้อง M% 26M


2

สิ่งนี้อาจช่วยได้ถ้ามีคนต้องการมันใน PHP

$variable ="candy_name=M&M";
$variable = str_replace("&", "%26", $variable);


1

ฉันต้องการเพิ่มความคิดเห็นเล็กน้อยเกี่ยวกับโซลูชัน Blender

คุณสามารถทำสิ่งต่อไปนี้:

var link = 'http://example.com?candy_name=' + encodeURIComponent('M&M');

ผลลัพธ์นั้น:

http://example.com?candy_name=M%26M

สิ่งที่ยอดเยี่ยมเกี่ยวกับเรื่องนี้มันไม่เพียงทำงานได้ & แต่สำหรับตัวละครพิเศษใด ๆ

ตัวอย่างเช่น

var link = 'http://example.com?candy_name=' + encodeURIComponent('M&M?><')

ขาออก:

"http://example.com?candy_name=M%26M%3F%3E%3C"

0

คุณสามารถส่งผ่านอาร์กิวเมนต์ของคุณโดยใช้ฟังก์ชัน encodeURIComponent นี้ดังนั้นคุณไม่ต้องกังวลกับการส่งผ่านอักขระพิเศษใด ๆ

data: "param1=getAccNos&param2="+encodeURIComponent('Dolce & Gabbana') OR
var someValue = 'Dolce & Gabbana';
data : "param1=getAccNos&param2="+encodeURIComponent(someValue)

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/encodeURIComponent

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