Rumah pembangunan bahagian belakang tutorial php 分析PHP URL中特殊字符引起的问题(+,\,=)

分析PHP URL中特殊字符引起的问题(+,\,=)

Nov 06, 2020 pm 03:05 PM
php url

推荐:《PHP视频教程

PHP中URL中特殊字符引起的问题(+,,=)

前言,在做某个渠道的过程中,发现一个验签错误的问题。但是,当时验签在两个地方表现不一致,同一套处理方法,想到了这是因为两个地方请求方式是不同的一个get方法另外一个自然是post方法。当然,出问题肯定就是get。

GET和POST

GET请求方式,由于是将参数放在URL中,所以在进行传递的时候可能会受到浏览器端的一些策略问题,对参数进行urlencode处理。所以,当你在服务端拿到参数的时候可能并不是原始的数据。因此,在通过GET方式请求拿到数据,如果不做任何处理的话去验签可能会存在问题。这边的可能就是当base64处理之后不含+这个特殊的字符,+在GET方式之后不做任何处理拿到的就是一个空白字符串。

POST请求方式,是将参数放在request body中,在进行http传递的过程中不会存在由于浏览器的一些策略问题对参数进行任何的处理。因此,通过POST请求进行参数验签的时候不会存在问题,能够很顺利的进行验签。但是,我们没有办法去要求渠道商将get请求变成post请求,因此我们只能自己想办法。

urlencode和urldecode

urlencode:
(PHP 4, PHP 5, PHP 7)
urlencode — 编码 URL 字符串
string urlencode ( string $str )
Salin selepas log masuk

此函数便于将字符串编码并将其用于 URL 的请求部分,同时它还便于将变量传递给下一页。

return
Salin selepas log masuk

返回字符串,此字符串中除了 -_. 之外的所有非字母数字字符都将被替换成百分号(%)后跟两位十六进制数,空格则编码为加号(+)。此编码与 WWW 表单 POST 数据的编码方式是一样的,同时与 application/x-www-form-urlencoded 的媒体类型编码方式一样

urldecode:
(PHP 4, PHP 5, PHP 7)
Salin selepas log masuk

urldecode — 解码已编码的 URL 字符串

string urldecode ( string $str )
Salin selepas log masuk

解码给出的已编码字符串中的任何 %##。 加号('+')被解码成一个空格字符。

返回解码后的字符串。

好像我们看到了曙光,对+这个会变成空格的字符串的"完美处理方式"。那就是,对签名字符串进行urlencode进行加密处理。然后,兴高采烈的去验证,fxxk,false。还是不通过,然后甩自己一个耳光。base64加密之后会出现=这个补位字符串,很蛋疼。于是我就想了一个临时处理方式。

urlencode(substr($str,0,strlen($sign)-2)).substr($sign,strlen($sign)-2)
Salin selepas log masuk

当时,考虑到base64最多出现两个==,所以在最后两个不进行urlencode处理。这个基本上能够处理,但是可能存在一个问题,那就是在最后两位出现+也是不行的,果然这个方案不能说服自己,推翻。并且在这个过程还发现一个问题就是,传过来的签名字符串还有可能会已经经过urlencode处理。这个还是一个小问题,先进行urldecode处理,因为decode不会引起误会。

当时,小伙伴提出一个解决办法,那就是直接替换+号不就可以了吗?的确,这是一个办法。但是我认为这个办法很挫,如果以后加密算法改变了或者增加了其他特殊字符呢,比如@#¥%……&**( 等这些,我们不可能都去匹配替换什么的。所以,我同意临时方案处理,但是我继续想。

rawurlencode和rawurldecode

rawurlencode:
(PHP 4, PHP 5, PHP 7)
Salin selepas log masuk

rawurlencode — 按照 RFC 3986 对 URL 进行编码

string rawurlencode ( string $str )
Salin selepas log masuk

根据 » RFC 3986 编码指定的字符。

rawurldecode:
(PHP 4, PHP 5, PHP 7)
Salin selepas log masuk

rawurldecode — 对已编码的 URL 字符串进行解码

string rawurldecode ( string $str )
Salin selepas log masuk

返回字符串,此字符串中百分号(%)后跟两位十六进制数的序列都将被替换成原义字符。

新的曙光出现了,理解rawurldecode,替换成原义字符。所以,解决方案呼之欲出了。

rawurldecode(urlencode(urldecode($sign))));
Salin selepas log masuk

初看上去觉得还臃肿或者为什么要这么绕来绕去处理呢?其实你还真得这么处理,至于为什么,请看上上面的吹牛逼。

后记

作为程序员,我们必须要有两手准备,一手临时方案,能够快速修复现在问题。在生产环境恢复正常,但是从长远来看必须要能够一个稳定可靠的方案。方案来源于你不断的尝试和php.net。

Atas ialah kandungan terperinci 分析PHP URL中特殊字符引起的问题(+,\,=). Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn

Alat AI Hot

Undresser.AI Undress

Undresser.AI Undress

Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover

AI Clothes Remover

Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool

Undress AI Tool

Gambar buka pakaian secara percuma

Clothoff.io

Clothoff.io

Penyingkiran pakaian AI

AI Hentai Generator

AI Hentai Generator

Menjana ai hentai secara percuma.

Artikel Panas

R.E.P.O. Kristal tenaga dijelaskan dan apa yang mereka lakukan (kristal kuning)
1 bulan yang lalu By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Tetapan grafik terbaik
1 bulan yang lalu By 尊渡假赌尊渡假赌尊渡假赌
Akan R.E.P.O. Ada Crossplay?
1 bulan yang lalu By 尊渡假赌尊渡假赌尊渡假赌

Alat panas

Notepad++7.3.1

Notepad++7.3.1

Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina

SublimeText3 versi Cina

Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1

Hantar Studio 13.0.1

Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6

Dreamweaver CS6

Alat pembangunan web visual

SublimeText3 versi Mac

SublimeText3 versi Mac

Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Panduan Pemasangan dan Naik Taraf PHP 8.4 untuk Ubuntu dan Debian Panduan Pemasangan dan Naik Taraf PHP 8.4 untuk Ubuntu dan Debian Dec 24, 2024 pm 04:42 PM

PHP 8.4 membawa beberapa ciri baharu, peningkatan keselamatan dan peningkatan prestasi dengan jumlah penamatan dan penyingkiran ciri yang sihat. Panduan ini menerangkan cara memasang PHP 8.4 atau naik taraf kepada PHP 8.4 pada Ubuntu, Debian, atau terbitan mereka

Cara Menyediakan Kod Visual Studio (Kod VS) untuk Pembangunan PHP Cara Menyediakan Kod Visual Studio (Kod VS) untuk Pembangunan PHP Dec 20, 2024 am 11:31 AM

Kod Visual Studio, juga dikenali sebagai Kod VS, ialah editor kod sumber percuma — atau persekitaran pembangunan bersepadu (IDE) — tersedia untuk semua sistem pengendalian utama. Dengan koleksi sambungan yang besar untuk banyak bahasa pengaturcaraan, Kod VS boleh menjadi c

7 Fungsi PHP Saya Menyesal Saya Tidak Tahu Sebelum ini 7 Fungsi PHP Saya Menyesal Saya Tidak Tahu Sebelum ini Nov 13, 2024 am 09:42 AM

Jika anda seorang pembangun PHP yang berpengalaman, anda mungkin merasakan bahawa anda telah berada di sana dan telah melakukannya. Anda telah membangunkan sejumlah besar aplikasi, menyahpenyahpepijat berjuta-juta baris kod dan mengubah suai sekumpulan skrip untuk mencapai op

Bagaimana anda menghuraikan dan memproses HTML/XML dalam PHP? Bagaimana anda menghuraikan dan memproses HTML/XML dalam PHP? Feb 07, 2025 am 11:57 AM

Tutorial ini menunjukkan cara memproses dokumen XML dengan cekap menggunakan PHP. XML (bahasa markup extensible) adalah bahasa markup berasaskan teks yang serba boleh yang direka untuk pembacaan manusia dan parsing mesin. Ia biasanya digunakan untuk penyimpanan data

Jelaskan JSON Web Tokens (JWT) dan kes penggunaannya dalam PHP API. Jelaskan JSON Web Tokens (JWT) dan kes penggunaannya dalam PHP API. Apr 05, 2025 am 12:04 AM

JWT adalah standard terbuka berdasarkan JSON, yang digunakan untuk menghantar maklumat secara selamat antara pihak, terutamanya untuk pengesahan identiti dan pertukaran maklumat. 1. JWT terdiri daripada tiga bahagian: header, muatan dan tandatangan. 2. Prinsip kerja JWT termasuk tiga langkah: menjana JWT, mengesahkan JWT dan muatan parsing. 3. Apabila menggunakan JWT untuk pengesahan di PHP, JWT boleh dijana dan disahkan, dan peranan pengguna dan maklumat kebenaran boleh dimasukkan dalam penggunaan lanjutan. 4. Kesilapan umum termasuk kegagalan pengesahan tandatangan, tamat tempoh, dan muatan besar. Kemahiran penyahpepijatan termasuk menggunakan alat debugging dan pembalakan. 5. Pengoptimuman prestasi dan amalan terbaik termasuk menggunakan algoritma tandatangan yang sesuai, menetapkan tempoh kesahihan dengan munasabah,

Program PHP untuk mengira vokal dalam rentetan Program PHP untuk mengira vokal dalam rentetan Feb 07, 2025 pm 12:12 PM

Rentetan adalah urutan aksara, termasuk huruf, nombor, dan simbol. Tutorial ini akan mempelajari cara mengira bilangan vokal dalam rentetan yang diberikan dalam PHP menggunakan kaedah yang berbeza. Vokal dalam bahasa Inggeris adalah a, e, i, o, u, dan mereka boleh menjadi huruf besar atau huruf kecil. Apa itu vokal? Vokal adalah watak abjad yang mewakili sebutan tertentu. Terdapat lima vokal dalam bahasa Inggeris, termasuk huruf besar dan huruf kecil: a, e, i, o, u Contoh 1 Input: String = "TutorialSpoint" Output: 6 menjelaskan Vokal dalam rentetan "TutorialSpoint" adalah u, o, i, a, o, i. Terdapat 6 yuan sebanyak 6

Terangkan pengikatan statik lewat dalam php (statik: :). Terangkan pengikatan statik lewat dalam php (statik: :). Apr 03, 2025 am 12:04 AM

Mengikat statik (statik: :) Melaksanakan pengikatan statik lewat (LSB) dalam PHP, yang membolehkan kelas panggilan dirujuk dalam konteks statik dan bukannya menentukan kelas. 1) Proses parsing dilakukan pada masa runtime, 2) Cari kelas panggilan dalam hubungan warisan, 3) ia boleh membawa overhead prestasi.

Apakah kaedah Magic PHP (__construct, __destruct, __call, __get, __set, dll) dan menyediakan kes penggunaan? Apakah kaedah Magic PHP (__construct, __destruct, __call, __get, __set, dll) dan menyediakan kes penggunaan? Apr 03, 2025 am 12:03 AM

Apakah kaedah sihir PHP? Kaedah sihir PHP termasuk: 1. \ _ \ _ Membina, digunakan untuk memulakan objek; 2. \ _ \ _ Destruct, digunakan untuk membersihkan sumber; 3. \ _ \ _ Call, mengendalikan panggilan kaedah yang tidak wujud; 4. \ _ \ _ Mendapatkan, melaksanakan akses atribut dinamik; 5. \ _ \ _ Set, melaksanakan tetapan atribut dinamik. Kaedah ini secara automatik dipanggil dalam situasi tertentu, meningkatkan fleksibiliti dan kecekapan kod.

See all articles