Saya mencari alternatif mysql_real_escape_string()
untuk SQL Server. Apakah addslashes()
pilihan terbaik saya atau ada fungsi alternatif lain yang dapat digunakan?
Sebuah alternatif mysql_error()
juga akan berguna.
php
sql-server
escaping
input-sanitization
Klik Suka
sumber
sumber
Jawaban:
addslashes()
tidak sepenuhnya memadai, tetapi paket mssql PHP tidak memberikan alternatif yang layak. Solusi yang jelek tapi sepenuhnya umum adalah mengkodekan data sebagai hex bytestring, yaitu$unpacked = unpack('H*hex', $data); mssql_query(' INSERT INTO sometable (somecolumn) VALUES (0x' . $unpacked['hex'] . ') ');
Diabstraksi, itu akan menjadi:
function mssql_escape($data) { if(is_numeric($data)) return $data; $unpacked = unpack('H*hex', $data); return '0x' . $unpacked['hex']; } mssql_query(' INSERT INTO sometable (somecolumn) VALUES (' . mssql_escape($somevalue) . ') ');
mysql_error()
setaramssql_get_last_message()
.sumber
SQLSTATE[22007]: Invalid datetime format: 210 [Microsoft][ODBC SQL Server Driver][SQL Server]Conversion failed when converting datetime from binary/varbinary string.
Saya yakin metode ini bisa benar hanya jika bekerja dengan setiap tipe data MSSQL.mssql_escape()
fungsi yang dikembalikan tidak melakukannya untuk saya. Tampilan teks setelah melakukan pemilihan terlihat seperti ini0x4a2761696d65206269656e206c652063686f636f6c6174
sehingga tidak dapat dibaca.function ms_escape_string($data) { if ( !isset($data) or empty($data) ) return ''; if ( is_numeric($data) ) return $data; $non_displayables = array( '/%0[0-8bcef]/', // url encoded 00-08, 11, 12, 14, 15 '/%1[0-9a-f]/', // url encoded 16-31 '/[\x00-\x08]/', // 00-08 '/\x0b/', // 11 '/\x0c/', // 12 '/[\x0e-\x1f]/' // 14-31 ); foreach ( $non_displayables as $regex ) $data = preg_replace( $regex, '', $data ); $data = str_replace("'", "''", $data ); return $data; }
Beberapa kode di sini diambil dari CodeIgniter. Bekerja dengan baik dan merupakan solusi yang bersih.
EDIT: Ada banyak masalah dengan cuplikan kode di atas. Tolong jangan gunakan ini tanpa membaca komentar untuk mengetahui apa itu. Lebih baik lagi, tolong jangan gunakan ini sama sekali. Permintaan parameterized adalah teman Anda: http://php.net/manual/en/pdo.prepared-statements.php
sumber
preg_replace
? Bukankahstr_replace
cukup?empty($value)
akan mengembalikantrue
tidak hanya untuk''
, tetapi juga untuknull
,0
dan'0'
! Anda akan mengembalikan string kosong dalam semua kasus tersebut.Mengapa Anda repot-repot melarikan diri jika Anda dapat menggunakan parameter dalam kueri Anda ?!
sqlsrv_query( $connection, 'UPDATE some_table SET some_field = ? WHERE other_field = ?', array($_REQUEST['some_field'], $_REQUEST['id']) )
Ini berfungsi dengan benar dalam memilih, menghapus, memperbarui terlepas dari apakah parameter nilai Anda
null
atau tidak. Buat masalah prinsip - Jangan menggabungkan SQL dan Anda selalu aman dan kueri Anda terbaca jauh lebih baik.http://php.net/manual/en/function.sqlsrv-query.php
sumber
Anda dapat melihat ke Perpustakaan PDO . Anda dapat menggunakan pernyataan yang telah disiapkan dengan PDO, yang secara otomatis akan menghilangkan karakter buruk apa pun dalam string Anda jika Anda melakukan pernyataan yang disiapkan dengan benar. Ini untuk PHP 5 saja menurut saya.
sumber
Cara lain untuk menangani tanda kutip tunggal dan ganda adalah:
function mssql_escape($str) { if(get_magic_quotes_gpc()) { $str = stripslashes($str); } return str_replace("'", "''", $str); }
sumber
Untuk menghindari tanda kutip tunggal dan ganda, Anda harus menggandakannya:
$value = 'This is a quote, "I said, 'Hi'"'; $value = str_replace( "'", "''", $value );
$value = str_replace( '"', '""', $value );
$query = "INSERT INTO TableName ( TextFieldName ) VALUES ( '$value' ) ";
dll ...
dan atribusi: Karakter Escape di Microsoft SQL Server 2000
sumber
Setelah bergumul dengan ini selama berjam-jam, saya telah menemukan solusi yang terasa hampir terbaik.
Jawaban kekacauan untuk mengonversi nilai menjadi hexstring tidak berfungsi dengan setiap tipe data, khususnya dengan kolom datetime.
Saya menggunakan PHP
PDO::quote()
, tetapi karena itu datang dengan PHP,PDO::quote()
tidak didukung untuk MS SQL Server dan kembaliFALSE
. Solusi agar berfungsi adalah mengunduh beberapa bundel Microsoft:Setelah itu Anda bisa terhubung di PHP dengan PDO menggunakan DSN seperti contoh berikut:
sqlsrv:Server=192.168.0.25; Database=My_Database;
Penggunaan parameter
UID
danPWD
di DSN tidak berfungsi, jadi nama pengguna dan sandi dikirimkan sebagai parameter kedua dan ketiga pada konstruktor PDO saat membuat koneksi. Sekarang Anda dapat menggunakan PHPPDO::quote()
. Nikmati.sumber
Jawaban dari 2009-02-22T121000 oleh kekacauan pengguna tidak cocok untuk semua kueri.
Misalnya, "BUAT LOGIN [0x6f6c6f6c6f] FROM WINDOWS" akan memberi Anda pengecualian.
PS: lihat driver SQL Server untuk PHP, http://msdn.microsoft.com/library/cc296181%28v=sql.90%29.aspx dan fungsi sqlsrv_prepare, yang dapat mengikat parameter.
PSS: Yang juga tidak membantu Anda dengan kueri di atas;)
sumber
http://php.net/manual/en/function.mssql-query.php
Bagi siapa pun yang masih menggunakan fungsi mssql_ * ini, perlu diingat bahwa fungsi tersebut telah dihapus dari PHP mulai v7.0.0. Jadi, itu berarti Anda pada akhirnya harus menulis ulang kode model Anda untuk menggunakan pustaka PDO, sqlsrv_ * dll. Jika Anda mencari sesuatu dengan metode "mengutip / keluar", saya akan merekomendasikan PDO.
sumber
Jika Anda menggunakan PDO, Anda dapat menggunakan
PDO::quote
metode ini.sumber
Untuk konversi untuk mendapatkan nilai heksadesimal dalam SQL kembali menjadi ASCII, berikut adalah solusi yang saya dapatkan untuk ini (menggunakan fungsi dari kekacauan pengguna untuk disandikan menjadi heksadesimal)
function hexEncode($data) { if(is_numeric($data)) return $data; $unpacked = unpack('H*hex', $data); return '0x' . $unpacked['hex']; } function hexDecode($hex) { $str = ''; for ($i=0; $i<strlen($hex); $i += 2) $str .= chr(hexdec(substr($hex, $i, 2))); return $str; } $stringHex = hexEncode('Test String'); var_dump($stringHex); $stringAscii = hexDecode($stringHex); var_dump($stringAscii);
sumber
Lebih baik juga menghindari kata-kata khusus SQL. Sebagai contoh:
function ms_escape_string($data) { if (!isset($data) or empty($data)) return ''; if (is_numeric($data)) return $data; $non_displayables = array( '/%0[0-8bcef]/', // URL encoded 00-08, 11, 12, 14, 15 '/%1[0-9a-f]/', // url encoded 16-31 '/[\x00-\x08]/', // 00-08 '/\x0b/', // 11 '/\x0c/', // 12 '/[\x0e-\x1f]/', // 14-31 '/\27/' ); foreach ($non_displayables as $regex) $data = preg_replace( $regex, '', $data); $reemplazar = array('"', "'", '='); $data = str_replace($reemplazar, "*", $data); return $data; }
sumber
Saya telah menggunakan ini sebagai alternatif dari
mysql_real_escape_string()
:function htmlsan($htmlsanitize){ return $htmlsanitize = htmlspecialchars($htmlsanitize, ENT_QUOTES, 'UTF-8'); } $data = "Whatever the value's is"; $data = stripslashes(htmlsan($data));
sumber
Anda bisa roll versi Anda sendiri
mysql_real_escape_string
, (dan meningkatkan atasnya) dengan ekspresi reguler berikut:[\000\010\011\012\015\032\042\047\134\140]
. Itu menangani karakter berikut: null, backspace, tab horizontal, baris baru, carriage return, pengganti, petik ganda, petik tunggal, garis miring terbalik, aksen kuburan. Tab spasi mundur dan horizontal tidak didukung olehmysql_real_escape_string
.sumber