Penggunaan fungsi INURL:INFO.PHP di PHP

Penggunaan fungsi INURL:INFO.PHP di PHP
[WapMaster][Tutoriall][Zona Trik Fb][Bot Auto Like][Download][Game][Aplikasi][Lainnya]

Jangan lupa follow Admin di Facebook yaah sobz

Penggunaan fungsi INURL:INFO.PHP di PHP

PHP. tanda kutip, garis miring, kueri SQL

Diakses dari phpfaq. ru
Garis miring, atau garis miring terbalik, dari garis miring belakang bahasa Inggris
- backslash ("\"), yang tiba-tiba muncul secara misterius
sendirian dalam variabel Anda. Dia menambahkan
beberapa karakter khusus, tetapi terutama karena
pernyataan kutipan
Ini terjadi karena pengaturan PHP khusus, biasanya
sudah termasuk dalam hosting bawaan. Secara teoretis,
Pengaturan ini dapat meningkatkan keamanan skrip
bekerja dengan basis data. Dalam praktek,
Namun, secara otomatis
menambahkan garis miring sering didapat
bingung dan tidak nyaman, karena saat bekerja
dengan database, dan tidak ada
Di bawah ini kami menganalisis yang kedua secara mendetail
kasus ini
Untuk penambahan full slash secara otomatis
php. arahan ini, yang secara kolektif disebut "tanda
kutipan ajaib"
magic_quotes_gpc dan magic_quotes_runtime
Saat pertama kali diaktifkan, PHP secara otomatis
tambahkan garis miring ke data yang dikirim
dari pengguna - dari POST, GET permintaan dan cookie
(dan juga - untuk login dan kata sandi diterima
melalui Otorisasi HTTP)
Jika yang kedua, garis miring ditambahkan ke data
diperoleh selama eksekusi skrip - misalnya, dari
berkas atau basis data
Bagaimana menyingkirkan
Jika Anda bekerja tanpa database, atau bekerja
dengan database dengan benar (yang akan ditulis dalam
di bawah), tebasan ekstra Anda hanya akan
mengganggu, dan kita harus menyingkirkan mereka
Lebih mudah dan lebih akurat untuk dinonaktifkan
penambahan otomatis, dalam pengaturan PHP
Ini dapat dilakukan dengan menyesuaikan instruksi
yang persis di php. ini, jika Anda memiliki akses ke
di sana, atau dengan membuat situs di
htaccess file direktori root,. Dan tambahkan garis
php_flag magic_quotes_gpc 0
php_flag magic_quotes_runtime 0
Jika Anda menonaktifkan metode ini tidak berhasil, Anda
harus menulis kode untuk tingkat kerumitan itu
berbeda untuk menghapus garis miring dari data
yang masuk. (Namun, jika Anda ingin menulis a
aplikasi portabel yang tidak bergantung pada
Setting PHP, maka penulisannya tetap diperlukan
Dan sertakan unit terpisah di awal skrip Anda. )
Dengan data yang diperoleh selama bekerja, caranya
paling mudah untuk mengetahuinya. tulis saja naskahnya
pada awalnya
set_magic_quotes_runtime (0);
Untuk data yang diterima dari pengguna, semuanya
jauh lebih rumit. Untuk kode ini, kita membutuhkan dua fungsi
periksa apakah PHP menambahkan, Anda bisa
menggunakan fungsi get_magic_quotes_gpc
hapus fungsi garis miring garis miring garis miring
Karena itu, dengan yang pertama kita harus
periksa dan, jika PHP ditambahkan, maka
alihkan semua variabel input dan
dibersihkan oleh yang kedua
Jika Anda bekerja dengan baik, kapan
register_globals = Nonaktif, cukup untuk
terapkan stripslash ke semua array
berisi data yang berasal dari browser
Misalnya, Anda dapat menyertakan semua skrip
kode situs seperti ini
fungsi strip(&$el) {
jika (is_array($el))
foreach ($el as $k => $v)
strip ($el[$k]);
lain $el = stripslashes ($el);
}
jika (get_magic_quotes_gpc()) {
strip($_GET);
strip($_POST);
strip($_COOKIE);
strip($_REQUEST);
jika (isset($_SERVER['PHP_AUTH_USER'])) strip($
_SERVER ['PHP_AUTH_USER']);
jika (isset($_SERVER['PHP_AUTH_PW'])) strip($_SERVER
['PHP_AUTH_PW']);
}
Dalam kasus pengaturan register_globals yang salah dan
membuat solusi yang dapat diterima akan sulit dilakukan
temukan, jadilah yang terbaik - lagi - hanya untuk
bekerja dengan pengaturan yang benar
Sekarang untuk bekerja dengan MySQL
Aturan untuk menyusun kueri MySQL
Untuk memulai - sedikit tentang mengapa kita membutuhkan ini
garis miring
Jika kami menggantinya di kueri data, maka,
untuk membedakan data dari perintah SQL, mereka
harus dikutip
Misalnya, jika Anda menulis
PILIH * DARI tabel MANA nama = Bill
maka dasar memutuskan bahwa tagihan - adalah nama
dari bidang lain, tidak akan menemukannya, dan
menyebabkan kesalahan. Oleh karena itu, data diganti
(dalam hal ini nama tagihan) harus ditutup dengan tanda
kutipan
- Maka alas yang ditemukan memiliki a
string, yang nilainya harus ditetapkan ke nama bidang
PILIH * DARI tabel MANA nama = 'Tagihan'
Namun, dalam data itu sendiri dapat memenuhi sasaran
kutipan juga. Misalnya,
SELECT * FROM table WHERE name = 'D' Artagnan '
Di sini, database menentukan bahwa 'D' - adalah data,
dan Artagnan - tim yang tidak dia kenal, dan juga
menghasilkan kesalahan. Oleh karena itu, semua data harus
prosleshivat untuk menjelaskan dasar dari apa
mereka temukan dalam tanda kutip (dan beberapa
karakter khusus lainnya) mengacu pada data
Hasilnya adalah permintaan yang valid, yang tidak
akan menyebabkan kesalahan
SELECT * FROM table WHERE name = 'D\' Artagnan '
Jadi, kami menemukan substitusi itu
data dalam permintaan, harus mengikuti dua aturan
- Semua data yang dimasukkan ke dalam kueri harus dilampirkan
tanda kutip (tunggal atau ganda, tetapi lebih nyaman
dan lebih sering digunakan secara tunggal)
- Semua variabel string harus di-escape dengan karakter baris
huruf miring khusus
Harus ditekankan. garis miring tidak ditambahkan
masukkan basis data. Mereka hanya dibutuhkan di
kueri. Saat disuntikkan ke tebasan dasar
DITOLAK. Jadi, kesalahan umum adalah
dengan menggunakan garis miring saat mengambil
data dari basis data
Faktanya, semua hal di atas berlaku untuk tipe string
data dan tanggal. Nomor dapat dimasukkan atau tidak
prosleshivaya mengutip okruzhaya. Jika kamu melakukan
ini, Anda HARUS. terpaksa membawa data ke
jenis yang tepat sebelum masuk ke kueri,
Misalnya
$Id = intval($id);
Namun, untuk kesederhanaan (dan kehandalan) bisa
bekerja dengan angka sebagai string (proskolku mysql
masih mengonversinya ke jenis yang benar)
Jadi, kami akan, data dimasukkan ke dalam
dalam permintaan prosleshivat dan dikelilingi oleh tanda kutip
Juga, ada satu aturan - opsional, tetapi harus diikuti
untuk menghindari kesalahan
Nama bidang dan tabel harus diapit dengan tanda kutip tunggal
return - kunci "`" (ditandai dengan simbol ini adalah
pada tombol keyboard standar di sebelah kiri" 1")
Mungkin nama field sama dengan kata kunci
mysql, tetapi jika kita menggunakan tanda kutip
kembali, maka MySQL akan mengerti semuanya
Baik
PILIH * DARI `tabel` WHERE `tanggal` = '04-04-2006
'
Ini diperlukan untuk membedakan antara tanda-tanda
kutipan dan jangan bingung satu sama lain. Anda
juga harus ingat bahwa tanda kutip adalah garis belakang
huruf miring tidak luput
Kueri dinamis
Jika kueri SQL dalam skrip ditulis lengkap, dan
tidak berubah, seperti
PILIH * DARI `tabel`
ada masalah dengannya dan tidak akan pernah
Tapi kekuatan dari seluruh naskah kami adalah kompilasi
pertanyaan dinamis
Alih-alih menulis permintaan siap untuk semua orang
peluang, kami membuatnya berdasarkan data
yang masuk ke dalam skrip
Dan di sini kita menghadapi bahaya berkembang
Misalkan kita membuat kueri menggunakan variabel
PILIH * DARI tabel WHERE '$nama' nama =
Sepertinya - oke?
Dan jika $ nama kita punya D'Artagnan?
akan gagal
Artinya, substitusi variabel untuk kueri harus
pelacur
Hal ini dapat dilakukan dengan beberapa cara
Yang termudah (dan salah) - mengandalkan tanda
kutipan sihir. Seperti yang mungkin sudah Anda duga, untuk kasus ini
mereka diciptakan. Untuk menyimpan kueri SQL
programmer melupakan kesalahan dan semua data
yang masuk ke script prosleshivayutsya tanpa
melihat rambut
Jika Anda menggunakan kode orang lain, itu yang terbaik
menggunakan kutipan ajaib. Ini mungkin
membuat beberapa ketidaknyamanan, dan tidak ada
menjamin Anda terhadap kesalahan atau retak
(seperti aturan prosleshivaniem membuat permintaan
tidak terbatas pada) tetapi setidaknya mengurangi risiko
Jadi, jika Anda menggunakan kode orang lain, pastikan
bahwa kutipan ajaib diaktifkan
Jika Anda menulis zy
semua kode sendiri, Anda harus belajar persiapan
yang benar dari permintaan
Gunakan tanda kutip dengan benar saat menulis
kueri
Jadi. Seperti yang kita pelajari di atas, untuk menjadi kenyataan
membuat permintaan, harus diapit oleh tanda petik dan
prosleshivat informasi mereka
Jelas dulu. Dalam menyusun kueri
dinamis, kami tidak akan pernah melupakan semua data
terlampir dalam tanda petik
$Query = "INSERT INTO` tabel `NILAI (NULL, '$
nama', '$tanggal', '$harga')";
Jika variabel price $ harus bertipe int, dan we
berikan ke tipe itu, maka tidak
dapat diapit dengan tanda petik. Namun, jika kita
menyimpulkan bahwa tidak ada masalah khusus,
tapi kamu bisa mendapatkan pekerjaan
dilakukan dengan data yang seragam
Yang kedua - prosleshivanie - dan hanya itu,
untuk apa, bahkan, sebagian besar, dan menulis
semua teks. Seperti kebanyakan masalah dan
kesulitan
Pertama, nonaktifkan kutipan ajaib. dengan
demikian, seperti yang dijelaskan di awal
Mengapa ini harus dilakukan?
Karena berbagai alasan. Yang paling jelas - logika
"Kutipan ajaib" ditambahkan miring, bukan dalam
di mana mereka dibutuhkan - dalam persiapan
permintaan, tetapi sebelum memasukkan skrip. Tapi ini
tidak berarti setelah itu akan dimasukkan ke dalam
kueri. Mungkin mereka harus menunjukkannya
pengguna, dan hanya akan mengganggu garis miring
Plus, ditambahkan untuk mencegah garis miring,
misalnya, memeriksa panjang string input dengan benar
Selain itu, prosleshivat kami tidak hanya berasal
data pengguna, dan umumnya ada, dimasukkan ke dalam
dalam kueri - banyak dari fakta ini jelas atau tidak
muncul dalam pikiran. Daftarnya terus berlanjut, tapi satu
kesimpulan. Anda tidak perlu menambahkan baris
miring, pistol, tanpa pandang bulu, sebelum memulai
skrip, tetapi hanya jika benar-benar diperlukan -
dalam penyusunan permintaan tersebut
Ada alasan lain. penggunaan pengkodean Unicode, yang
mendapatkan popularitas, dan akhirnya menduduki
posisi dominan di web, kutipan ajaib hanya bisa
merusak teks, mengambil bagian dari string multibyte
karakter spesial
Sekarang mari tambahkan garis miring kita sendiri
Pertama, kami menggunakan prosleshivaniya
fungsi mysql_real_escape_string ()
Perlu dicatat bahwa itu hanya dapat diterapkan
setelah terhubung ke database
Fitur ini membuat lebih dari yang lama, dan
mysql_escape_string menambahkan garis miring. Pertama, memfasilitasi
pemeliharaan dan membaca log mysql, mengganti,
misalnya, karakter baris baru di "\n", dan
beberapa karakter lain dalam urutan pelarian-. Kedua,
dan yang paling penting - ini berfungsi dengan benar
dengan serangkaian karakter multibyte, dengan
pertimbangkan rangkaian karakter MySQL saat ini dan bukan
korup, sehingga teks dalam Unicode
Kedua, jangan lupa bahwa semuanya harus
data prosleshit yang telah kita masukkan
permintaan dalam tanda kutip
$Nama = mysql_real_escape_string ($nama);
$Umur = mysql_real_escape_string($umur);
$ Query = "INSERT INTO table (nama, umur, kelas)
NILAI('$nama', '$umur', 11)";
atau
$ Query = "SELECT * FROM table WHERE name LIKE '"
mysql_real_escape_string ($_GET. ['Nama'] ")%". ';
Dapat dilihat bahwa kode menjadi cukup rumit
Untuk memudahkan penyusunan permintaan bisa
dikirim ke uhischneniya berbeda - membuat fungsi
untuk kueri dari file (sangat berguna untuk kueri
seperti INSERT dan UPDATE), data array prosleshivat
dalam lingkaran, dan seterusnya
Anda dapat menulis, dan perpustakaan, atau fungsi
untuk kueri
Hal utama - ingat bahwa hanya ketaatan pada aturan
ajukan pertanyaan untuk mengamankan Anda dari peretasan
database, serta untuk mengakui bahwa penggunaan
"tanda kutip ajaib", dengan kemudahan yang jelas dari
membuat pertanyaan, tidak memberikan jaminan
seperti itu, tetapi itu hanya mencegah aplikasi
Jadi, kita belajar cara mengganti
data kueri
Tetapi. Kueri dinamis tidak terbatas pada penggantian
data. Seringkali kita harus mengganti perintah SQL
untuk kueri dan nama bidang. Dan inilah kami
beralih ke topik keamanan
Injeksi SQL
Injeksi SQL
- Cara serangan hacking, ketika data dimodifikasi script
agar terbentuk request di script ini jangan
mulai memenuhi apa yang dimaksud
Aturan untuk melindungi dari serangan semacam itu
dapat dibagi menjadi dua item
A. Bekerja dengan Data
dua. Bekerja dengan elemen kontrol kueri
Poin pertama yang telah kami ulas secara detail di atas
Bisa dikatakan, dan sebenarnya tidak,
dilindungi. Kepatuhan terhadap peraturan ditambahkan
ke zannyh mendikte permintaan, pertama-tama,
persyaratan Sintaks SQL. Dan sebagai efek
sisi yang kita miliki, dan perlindungan dari
GANGGUAN
Poin kedua jauh lebih rumit, karena tidak ada
satu aturan yang sama universalnya untuk data -
backquote tidak melindungi nama bidang dari modifikasi
hacker. Tidak mungkin melindungi nama merek
tabel kutipan, operator dari SQL, perintah LIMIT
parameter, dan operator lainnya
Oleh karena itu, aturan dasar tentang penggantian
kontrol dalam kueri seperti ini
Jika Anda ingin mengubah secara dinamis dalam kueri SQL
atau nama bidang, basis data, tabel, di negara bagian
apa pun, jangan masukkan mereka ke dalam
permintaan langsung
Semua versi add-on harus didaftarkan sebelumnya
Script Anda dan dipilih atas dasar bahwa pengguna
memasuki
Misalnya, jika Anda harus melewati nama operator
bidang untuk, maka dalam hal apapun tidak
bisa langsung diganti. Pertama saya harus
coba lihat. Misalnya, buat array nilai
yang valid, dan untuk menggantikan di
permintaan hanya jika parameter diteruskan dalam array
ini hadir
$Order = array("nama", "harga", "jumlah");
$Key = array_search($_GET['type'], $command));
$orderby = $order[$key];
$Query = "PILIH * DARI tabel` ORDER BY $
dipesan oleh ";
Kami mencari dalam berbagai varian sebelumnya
dijelaskan dari kata-kata yang dimasukkan oleh pengguna
dan, jika ditemukan, pilih item yang sesuai
dalam sebuah larik. Jika tidak ada yang cocok, itu akan terjadi
memilih elemen pertama dari array
Jadi, pertanyaannya diganti dengan apa-apa
pengguna masuk, dan apa yang tertulis dalam skrip kami
Demikian pula, orang harus bertindak dalam masalah ini
LAGI
Misalnya, jika operator dibuat secara dinamis
DI MANA
jika $ di mana = "harga = '" mysql_real_escape_string ($
_MENDAPATKAN. ['harga'] ""(kosong ($_GET['harga'])). ). ';
$Query = "SELECT * FROM` table `WHERE $ where";
Sulit membayangkan kasus di mana
nama tabel dapat diganti menjadi kueri dinamis,
tetapi jika itu terjadi, nama juga harus dimasukkan
hanya dari set yang telah ditentukan sebelumnya dalam skrip
Parameter klausa LIMIT harus dipaksakan
mengarah ke bilangan bulat menggunakan aritmatika atau
fungsi intval()
Kita seharusnya tidak berpikir bahwa contohnya ada di sini
hapus semua opsi untuk membuat kueri dinamis
Anda hanya perlu memahami prinsip dan
menerapkannya dalam semua kasus
Pernyataan yang disiapkan
Sejauh ini kita telah berbicara tentang cara bekerja
dengan database ketika permintaan dibuat seluruhnya
dalam bentuk baris, dan dikirim ke database
Tapi ada lagi, yang disebut "pernyataan
siap" (pernyataan siap)
Esensinya terletak pada kenyataan bahwa polanya
permintaan disiapkan dengan penanda khusus di
tempat yang akan diganti dengan komponen dinamis
Contoh pola ini
PILIH * DARI tabel MANA nama =?
Tanda tanya di sini - ini adalah penanda yang sama. di dalam
selain itu, itu adalah nazyvaetsy placeholder (placeholder)
Rahasianya adalah datanya ada di pengganti
di mana fitur khusus yang "mengikat" variabel ke
kueri
Berikut adalah kode dalam kasus ini
$ Stmt = $ mysqli-> siapkan ("PILIH Distrik DARI
DI MANA Kota = Nama?");
$Stmt->bind_param("s", $city);
$Stmt->eksekusi();
Baris pertama adalah menyiapkan pola kueri
Yang kedua - mengikat nilai penanda kota variabel $
Pada saat yang sama - yang terbaik dari semuanya. - Mereka semua
operasi yang diperlukan (mengutip, prosleshivanie)
fungsinya melakukan itu sendiri
Di baris ketiga eksekusi disiapkan sampai
tuntutan
Jelas ada banyak pertanyaan. Tapi volumenya bagus
dan topik artikel ini
tidak memungkinkan mereka untuk tinggal lebih detail
Saya sarankan untuk berkonsultasi dengan dokumentasi
untuk pustaka mysqli dan PDO, terapkan
prinsip ini
Anda juga dapat menggunakan DbSimple
Perpustakaan Dmitry Koterova atau PEAR. DB
Perbedaan utama antara keduanya adalah bahwa mereka
terapkan mekanisme pernyataan ready hanya di
penampilan. Dalam karya kuno - akuntansi
permintaan dan mengirimkannya ke
basis data. Sebuah PDO dan mysqli bekerja dengan
database dari awal, yaitu template
langsung dari pertanyaan, masuk ke database, itu saja
dibongkar, dan alasnya sendiri menggantikan nilai terlampir
pada penanda
Bekerja dengan operator LIKE
Kasus khusus yang cukup - operator SUKA
Pertama, selain prosleshivaniya biasa, variabel itu
diganti dengan LIKE, memiliki garis miring ganda
Artinya, jika sebuah variabel mengandung karakter \, itu harus
gandakan, lalu lakukan prosleshivanie
biasanya melalui mysql_real_escape_string
Misalnya, jika kita mencari garis
Karakter \ disebut "garis miring terbalik"
dan kami membutuhkan persis sama, kami hanya menggunakan
mysql_real_escape_string dan kueri diperoleh dengan
standar
PILIH * DARI MANA bidang uji = 'a \ \ adalah \
"garis miring terbalik"'
Jika kita ingin mengganti string ini LIKE, pertama-
perlu untuk mengganti setiap garis miring atau
dua, lalu gunakan
mysql_real_escape_string. Hasilnya adalah
PILIH * DARI tabel WHERE kolom SEPERTI '% a \ \ \ \
\"garis miring terbalik \"%'
Kedua, kita harus memperhatikan fakta bahwa itu tidak benar
ada fitur yang menambahkan garis miring, tidak
tambahkan mereka untuk mencari metakarakter
"%" dan "_", seperti yang digunakan pada operator
MENYUKAI. Jadi, jika Anda menggunakan operator ini, dan
tidak ingin karakter _ dan % digunakan sebagai
topeng, lalu tambahkan garis miring
manual. Ini bisa dilakukan dengan mengetik
$Data = addCslashes($data, '%_');
Peringatan - ini bukan addlash. Nama fungsi ini
memiliki huruf tambahan "c"
Dengan demikian terlihat bahwa variabel that
digunakan dalam operator LIKE, kita harus menanganinya
terpisah
pertama untuk mengganti satu atau dua garis miring,
dengan bantuan ini, misalnya, kode
$var = str_replace('\ \', '\ \ \ \', $var);
dan kemudian (mungkin bersama dengan semua data
yang lain akan memasukkan kueri) prosleshivaem
$var = mysql_real_escape_string($var);
lalu, jika Anda ingin melihat _ dan %
sesuai persis dengan diri mereka sendiri,
tidak
$var = addCslashes($var, '_%');
Akibatnya, jika kita melihat, misalnya garis
Karakter \ disebut "backslash", simbol _ disebut
"garis bawah"
setelah memproses permintaan, seharusnya
terlihat seperti ini
'% A \ \ \ \ adalah \ "backslash \", dan simbol \ _ dipanggil
\ "garis bawah \"
Artinya, garis miring, yang awalnya berurutan -
empat kali. Karakter yang tersisa seperti prosleshilis
biasa. Plus - karakter prosleshilsya dari garis bawah
catatan
Di antara alasan mengapa Anda tidak boleh
tergantung pada "kutipan ajaib", ada satu. sangat
tidak mungkin, tapi tetap saja. Dengan "tanda kutip
heran" ini sebenarnya bukan dua arah dan tiga. ketiga
- magic_quotes_sybase. Selain itu, tambahnya
garis miring bukan tanda kutip - jadi garis miring juga tumpang tindih
magic_quotes_gpc. Kalau karena keajaiban, kedua
direktif memiliki status 'on', lalu yang terakhir
Tidak akan berhasil. Artinya, tergantung pada "tanda
kutipan ajaib" dalam hal ini kita mendapatkan segalanya
pesona permintaan tidak diformat dengan benar
Secara umum, secara teoritis, perlu
mengingat adanya arahan ini, karena
juga menghadirkan kejutan, seperti. PERUBAHAN
perilaku fungsi addlashes dan stripslashes. jika
magic_quotes_sybase = aktif, maka fungsi-fungsi ini
alih-alih garis miring, mulailah menambahkan dan menghapus tanda kutip
tunggal yang cocok
Semua contoh ini hanya berlaku untuk
Database mysql. Aturan khusus untuk kompilasi
permintaan mungkin berbeda untuk database lain,
tetapi prinsip umumnya tetap sama
Jika API untuk bekerja dengan database atau
perpustakaan pihak ketiga menyediakan
fungsi khusus untuk kueri, dan dimungkinkan untuk
gunakan, lalu gunakan di tempat
pertama bagi mereka
Jika fungsi ini tidak, Anda harus melihat
dokumentasi untuk memfilter karakter khusus untuk
basis data ini
OPS. Tautan yang sangat berguna
Tentang PHP Price Magic. BERSIH online
Beberapa materi tentang SQL Injection
http. // www. securitylab. ru/45438. html
http. // www. securitylab. ru/49424. html
http. // www. nextgens. com/papers/
advanced_sql_injection. pdf
catatan. membentuk
Untuk mengurangi nilai pada tag formulir input, baris
Miring tidak berfungsi
Untuk membuat teks di bidang ini ditampilkan
seluruh nilai, harus diapit dengan tanda kutip, seperti
diterapkan pada data fungsi htmlspecialchars diturunkan
()
contoh
"">