นโยบายความปลอดภัยของเนื้อหา“ ข้อมูล” ไม่ทำงานสำหรับ base64 Images ใน Chrome 28


247

ในตัวอย่างง่ายๆนี้ฉันพยายามตั้งส่วนหัว CSP ด้วยส่วนหัวของ meta http-equiv ฉันรวมภาพ base64 แล้วและฉันพยายามทำให้ Chrome โหลดภาพ

ฉันคิดว่าdataคำหลักควรทำเช่นนั้น แต่อย่างใดมันก็ไม่ทำงาน

ฉันเพิ่งได้รับข้อผิดพลาดต่อไปนี้ในเครื่องมือสำหรับนักพัฒนา:

ปฏิเสธที่จะโหลดอิมเมจ 'data: image / png; base64, R0lGODlhDwAPAOZEAMkJCfAwMMYGGAGBAAGAKBAGBAGBAGAAGAKBAGBAGBAGBAGBAGAGTAGTAGTAGTAGTAGONDYGTAGTAG_HARVALGTAGTAGTAGTAGTABAHKUTHATHAUDGAMBUTHUTHAUDGAMBUTHUTHAUDGAMAGTAGTAGTA # nW7yk4Mjr6gAgAgAgAgAgAgAgAg2yAr "

โค้ดตัวอย่าง (JSFiddle ไม่ทำงานสำหรับตัวอย่างนี้เพราะฉันไม่สามารถตั้งค่าเมตาส่วนหัวได้):

<html>
<head>
<meta http-equiv="Content-Security-Policy" content="
        default-src 'none';
        style-src 'self' 'unsafe-inline';
        img-src 'self' data;
        " />
    <style>
        #helloCSP {
            width: 50px;
            height: 50px;
            background: url(data:image/png;base64,R0lGODlhDwAPAOZEAMkJCfAwMMYGBtZMTP75+euIiPFBP+hVVf3v7+iHh/JNTfh9dNUYGPjTvskXFfOLi/daVe96es4eHPWIiOqbi9dNRvzWwexdV9U1NeFSS94iIvuxodVGP/ZsZM8jI+ibm/alluQzMdxSSvbGstwsKu2Yid4iIfjQu/JnYO6djvajlMQEBPvLuOJdXeMxL/3jzPBSTdwqKNY2Mf3i4vU5OfbPz/3f3/zUv/zizO0tLc0NDfMzM+UlJekpKeEhId0dHdUVFdkZGdEREf///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAEAAEQALAAAAAAPAA8AAAepgESCRBsLEDQQCxuDgxYdO5CROx0WgywGAQEKM0M2CpkGN0QvMDmmE0OpE6Y5KEQqPbE9D6lDD7I9IBc8vDwRtRG9PBcuPsY+B7UHxz4hP8/PGghDCBrQPyYxQdvbBUMF3NskGUDl5QwtDOblGSVC7+8JNQnw7yk4Mjr6GLUY+joiBI2QAACABwJDCHgoKOHEoAYVBAgY8GGAxAoNGAmiwMHBCgccKDAKBAA7) no-repeat;
            border: 1px solid red;
        }
    </style>
</head>
<body>
<h1>CSP</h1>
    <div id="helloCSP"></div>
</body>
</html>

คุณสามารถเปิดตัวอย่างนี้ได้ที่นี่:
https://dl.dropboxusercontent.com/u/638360/ps/csp.html

คำตอบ:


468

ตามหลักไวยากรณ์ในสเป็คซีเอสพีที่คุณจะต้องระบุรูปแบบเป็นไม่เพียงscheme: schemeดังนั้นคุณต้องเปลี่ยนคำสั่งแหล่งรูปภาพเป็น:

img-src 'self' data:;

41
เหตุผลของความเชื่องช้านี้ก็คือมันยากที่จะแยกแยะความแตกต่างระหว่าง 'data' scheme และ host ที่ชื่อว่า 'data'
Mike West

1
ฉันคิดว่า URL นั้นค่อนข้างแปลกที่จะแยกวิเคราะห์โดยทั่วไป

5
ฉันมีข้อมูลของฉัน: ในเครื่องหมายคำพูด - 'ข้อมูล:' - นั่นยังไม่สามารถใช้งานได้ - และคำตอบของคุณก็แจ้งเตือนฉันด้วยว่าเป็นปัญหา
kris

18
มีประโยชน์ที่จะต้องทราบว่าคุณไม่ควรเพิ่มสิ่งนี้โดยไม่คำนึงถึงผลกระทบด้านความปลอดภัย ดูคำถามแลกเปลี่ยนความปลอดภัยสแต็ก
Matthijs Wessels

1
สแกนเนอร์เพื่อความปลอดภัยค้นหาข้อมูล: เป็นองค์ประกอบที่ไม่ปลอดภัย
Sajithd

0

ลองสิ่งนี้

ข้อมูลที่จะโหลด:

<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 4 5'><path fill='#343a40' d='M2 0L0 2h4zm0 5L0 3h4z'/></svg>

รับ utf8 เป็น base64 แปลงและแปลงสตริง "svg" เป็น:

PHN2ZyB4bWxucz0naHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnIHZpZXdCb3g9JzAgMCA0IDUn
PjxwYXRoIGZpbGw9JyMzNDNhNDAnIGQ9J00yIDBMMCAyaDR6bTAgNUwwIDNoNHonLz48L3N2Zz4=

และ CSP คือ

img-src data: image/svg+xml;base64,PHN2ZyB4bWxucz0naHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnIHZpZXdCb3g9JzAgMCA0IDUn
PjxwYXRoIGZpbGw9JyMzNDNhNDAnIGQ9J00yIDBMMCAyaDR6bTAgNUwwIDNoNHonLz48L3N2Zz4=

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