কিভাবে পিএইচপি ব্যবহার করে এসকিউএল সার্ভারে স্ট্রিংগুলি এড়ানোর জন্য?


89

আমি mysql_real_escape_string()এসকিউএল সার্ভারের বিকল্প খুঁজছি । কি addslashes()আমার সবচেয়ে ভাল বিকল্প বা অন্য বিকল্প ফাংশন যা ব্যবহার করা যেতে পারে?

এর বিকল্পও mysql_error()কার্যকর হবে।


4
আমার জন্য এটি কোনও সদৃশ প্রশ্ন নয় কারণ এটি নির্দিষ্ট এমএসএসকিউএল কেস সম্পর্কিত যার কোনও সম্পর্কিত অফিসিয়াল পিডিও নেই
পিয়েরে লেস্পিনে

উত্তর:


74

addslashes()সম্পূর্ণরূপে পর্যাপ্ত নয়, তবে পিএইচপি এর এমএসকিউএল প্যাকেজটি কোনও শালীন বিকল্প সরবরাহ করে না। কুরুচিপূর্ণ কিন্তু সম্পূর্ণরূপে সাধারণ সমাধান হেক্স বাইস্টেস্টিং হিসাবে ডেটা এনকোড করছে, অর্থাৎ

$unpacked = unpack('H*hex', $data);
mssql_query('
    INSERT INTO sometable (somecolumn)
    VALUES (0x' . $unpacked['hex'] . ')
');

বিমূর্ত, এটি হবে:

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()সমতূল্য mssql_get_last_message()


4
ওহো, এর নির্বাচন করুন SCOPE_IDENTITY ()!
ব্রায়ান রেহবেইন

4
@ জেনিয়ো: মিমি, দুর্দান্ত, এটি বাদে আসলে। আমি মনে করি না যে আপনি সমস্যাটিকে কী বলে মনে করেন আপনি তা ব্যাখ্যা করবেন?
বিশৃঙ্খলা

4
আপনি কি ডেটটাইম কলামগুলি দিয়ে চেষ্টা করেছেন? আমি এই ত্রুটিটি SQLSTATE[22007]: Invalid datetime format: 210 [Microsoft][ODBC SQL Server Driver][SQL Server]Conversion failed when converting datetime from binary/varbinary string.পাচ্ছি : আমি বিশ্বাস করি যে এই পদ্ধতিটি প্রতিটি এমএসএসকিউএল ডেটাটাইপের সাথে কাজ করলেই সঠিক হতে পারে।
আলেজান্দ্রো গার্সিয়া ইগলেসিয়াস

4
mssql_escape()ফাংশনটির সামগ্রীটি আমার জন্য তা করছে না। একটি নির্বাচন করার পরে পাঠ্য প্রদর্শনটি এমনভাবে 0x4a2761696d65206269656e206c652063686f636f6c6174অপঠনযোগ্য দেখতে লাগছে ।
জেফ নোয়েল

4
@ জেফনোয়েল আপনার সম্ভবত স্ট্রিং সিঙ্গল কোটস বা ডাবল কোট মোড়ানো। যেহেতু আইটেমটি হেক্সে পাল্টে গেছে সেগুলি উদ্ধৃতিগুলি প্রয়োজনীয় নয়। এসকিউএল সার্ভার হেক্স মানকে ডিবি বোঝে এমন কিছুতে রূপান্তর করার কথা।
danielson317

41
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;
    }

এখানকার কিছু কোড কোডিগনিটার থেকে ছিঁড়ে গেছে। ভাল কাজ করে এবং একটি পরিষ্কার সমাধান।

সম্পাদনা: উপরের কোড স্নিপেটের সাথে প্রচুর সমস্যা রয়েছে। সেগুলি কী তা জানতে দয়া করে মন্তব্যগুলি পড়া না করে এটি ব্যবহার করবেন না। আরও ভাল, দয়া করে এটিকে ব্যবহার করবেন না। প্যারামিটারাইজড কোয়েরিগুলি আপনার বন্ধু: http://php.net/manual/en/pdo.prepared-statements.php


4
তোমার দরকার কেন preg_replace? str_replaceপর্যাপ্ত না ?
গাবে ২

গ্যাবে: এই ক্ষেত্রে পূর্ববর্তী স্থানটি আমাকে নিয়মিত অভিব্যক্তি চরিত্রের ক্লাসে আমার কাছে সাধ্যের সীমা ব্যবহার করতে দেওয়া হয়েছিল। অন্যথায় এটিতে আরও অনেক স্ট্রিং প্রতিস্থাপন হবে।
জিনো ২

7
-1। ম্যাঙ্গাল ডেটাতে উদ্ধৃতি ফাংশনটির দায়িত্ব নয় - এটি করা উচিত যে স্ট্রিংটি এমন বিন্যাসে রয়েছে তা এটি কোনও এসকিউএল স্টেটমেন্টে যুক্ত করা যায় এবং অশোধিত থেকে বেঁচে থাকতে পারে।
সিএওও

6
দুঃখিত, কিন্তু এই প্রথম কোড লাইন থেকে ভুল হয় - empty($value)ফিরে আসবে trueনা শুধুমাত্র '', কিন্তু জন্য null, 0এবং '0'! আপনি এই সমস্ত ক্ষেত্রে একটি খালি স্ট্রিং ফিরে আসবেন।
Nux

আমি এটি উত্সাহিত করেছি, আমি মনে করি এটি যতক্ষণ না আপনি উপরের সমস্যাগুলি সম্পর্কে পুরোপুরি সচেতন হন ততক্ষণ এটি একটি দুর্দান্ত সূচনা function আমি যদিও এটি এমএস_সেস্কেপ_আর_স্ট্রিপ_স্ট্রিং বলব, সুতরাং এতে কাজ করা অন্য যে কেউ এটি দেখতে পাবে যে এই দুটি কাজই করে। যতক্ষণ না আপনি কেবলমাত্র এখানে একটি বৃহত্তর পয়েন্ট মিস করছি তবে একাধিক ক্ষেত্রে খালি স্ট্রিং ফিরিয়ে দেওয়া ঠিক আছে। যদি এটি আপনার প্রয়োজনের সাথে খাপ খায় না তবে আপনি সর্বদা সেই লাইনটি বাইরে নিয়ে যেতে পারেন এবং যুক্তি দিয়ে এটি প্রতিস্থাপন করতে পারেন যা আপনার প্রয়োজন অনুসারে হয়।
নেটেটসেইট

16

আপনি যখন আপনার ক্যোয়ারীতে প্যারামিটার ব্যবহার করতে পারেন তখন কেন কিছু ছাড়তে বিরক্ত করবেন ?!

sqlsrv_query(
    $connection, 
    'UPDATE some_table SET some_field = ? WHERE other_field = ?', 
    array($_REQUEST['some_field'], $_REQUEST['id'])
)

আপনার মানগুলির প্যারামিটারগুলি কিনা তা নির্বিশেষে এটি নির্বাচন, মুছে ফেলা, আপডেটগুলিতে সঠিকভাবে কাজ করে null। নীতিগত বিষয়টি তৈরি করুন - এসকিউএলকে একত্রিত করবেন না এবং আপনি সর্বদা সুরক্ষিত থাকেন এবং আপনার অনুসন্ধানগুলি আরও ভালভাবে পড়তে পারে।

http://php.net/manual/en/function.sqlsrv-query.php


এটি সঠিক পদ্ধতির। আপনার সর্বদা অ্যাডহক প্রশ্নের বিপরীতে প্যারামিটার ব্যবহার করা উচিত। যাইহোক, ওপি স্কেলসার্ভ ড্রাইভারগুলি ব্যবহার করছে না। তিনি এমএসকিউএল চালক ব্যবহার করছেন। সুতরাং আপনারা যারা sqlsrv ড্রাইভার ব্যবহার করে আটকেছিলেন তাদের ব্যবহারের লিঙ্কটি হ'ল http://php.net/manual/en/function.mssql-query.php
স্মুলহোল্যান্ড 2

4
@ smulholland2 আপনি কি বোঝাতে চেয়েছেন "বা আপনাদের মধ্যে যারা ব্যবহার আটকে এমএস স্কুয়েল ড্রাইভার"
কনস্টানটিন

আপনি যদি ডেটা মাইগ্রেশন দৃশ্যে ব্যবহারের জন্য INSERT স্টেটমেন্টের একটি ফাইল তৈরি করতে চান তবে একটি দৃশ্য হতে পারে।
গ্যারি রেকার্ড

11

আপনি PDO গ্রন্থাগারটি সন্ধান করতে পারেন । আপনি PDO এর সাথে প্রস্তুত বিবৃতিগুলি ব্যবহার করতে পারেন, যা আপনি যদি সঠিকভাবে প্রস্তুত বিবৃতিগুলি সঠিকভাবে করেন তবে আপনার স্ট্রিংয়ের যে কোনও খারাপ অক্ষর স্বয়ংক্রিয়ভাবে পালিয়ে যাবে। এটি কেবলমাত্র আমার মনে হয় পিএইচপি 5 এর জন্য।


আমি পিডিও থেকে দেখেছি এমন অর্ধেক আচরণের সাথে, সমস্ত ডেটা সঠিকভাবে এড়াতে বিশ্বাস করার আগে আমাকে কিছু গুরুতর পরীক্ষা করাতে হবে।
বিশৃঙ্খলা

@ চাওস সত্যি? আমি এ সম্পর্কে অসচেতন .. আপনার কোনও নিবন্ধের লিঙ্ক আছে?
অ্যালেক্স

আমি যার কথা ভাবছিলাম তা হ'ল পিডিওর সাথে গতকাল এই লোকটির যে সমস্যা হয়েছিল। নিরপেক্ষ লেনদেনের স্টাফ, তবে অমনোযোগী। একত্রিত করুন যে পিএইচপি (php.net) এ লোকেরা অ্যাড্ল্যাশগুলি () ব্যবহার করতে বলছে! এবং অপ্রত্যাশিত ডেটা পালনের সমস্ত ইতিহাসের সাথে এবং আমি খুব সন্দেহজনক হয়ে উঠি।
বিশৃঙ্খলা

4
আমি পিডিও পছন্দ করি এবং এটি প্রথম চেষ্টা করেছিলাম, তবে এমএসএসকিউএল এর জন্য একটি (ইউনিক্সে, ডাবলিবের উপর ভিত্তি করে) কখনও কখনও আমার উপর ব্যর্থ হয় (সেগমেন্টেশন ফল্ট), এ কারণেই আমি উপরে বর্ণিত এমএসকিউএল_স্কেপ অবলম্বন করেছি।
lapo

আপনার মন্তব্যের জন্য ধন্যবাদ, ইপো। আমি একটি এমএসকিউএল প্রকল্পের জন্য পিডিও-তে স্যুইচ করার কথা ভাবছিলাম - বিশেষত পালানোর জন্য - তবে আপনি আমাকে সমস্যাটি রক্ষা করেছেন।
উইনফিল্ড ট্রেল

4

একক এবং ডাবল উদ্ধৃতি হ্যান্ডেল করার আরেকটি উপায় হ'ল:

function mssql_escape($str)
{
    if(get_magic_quotes_gpc())
    {
        $str = stripslashes($str);
    }
    return str_replace("'", "''", $str);
}

get_magic_quites_gpc পিএইচপি 5.3.0 হিসাবে এবং পিএইচপি 5.4.0 অনুযায়ী সরানো হয়েছে। দেখুন php.net/manual/en/info.configuration.php#ini.magic-quotes-gpc
জানুয়ারী

2

একক- এবং দ্বিগুণ-উদ্ধৃতি থেকে বাঁচতে আপনাকে সেগুলি দ্বিগুণ করতে হবে:

$value = 'This is a quote, "I said, 'Hi'"';

$value = str_replace( "'", "''", $value ); 

$value = str_replace( '"', '""', $value );

$query = "INSERT INTO TableName ( TextFieldName ) VALUES ( '$value' ) ";

ইত্যাদি ...

এবং এ্যাট্রিবিউশন: মাইক্রোসফ্ট এসকিউএল সার্ভার 2000 এ ক্যারেক্টার অবলম্বন করুন


2

ঘন্টাখানেক লড়াই করার পরে, আমি এমন একটি সমাধান নিয়ে এসেছি যা প্রায় সেরা অনুভব করে।

মানগুলি হেক্সস্ট্রিংয়ে রূপান্তর করার বিশৃঙ্খলার উত্তরটি প্রতিটি ডেটাটাইপের সাথে বিশেষত ডেটটাইম কলামগুলির সাথে কাজ করে না।

আমি পিএইচপি'র ব্যবহার করি PDO::quote()তবে এটি পিএইচপি এর সাথে আসে, PDO::quote()এমএস এসকিউএল সার্ভার এবং রিটার্নের জন্য সমর্থিত নয় FALSE। এটির কাজ করার সমাধানটি ছিল কিছু মাইক্রোসফ্ট বান্ডিল ডাউনলোড করা:

এর পরে আপনি পিএসএফের সাথে পিডিওর সাথে নিম্নলিখিত উদাহরণের মতো ডিএসএন ব্যবহার করে সংযুক্ত করতে পারেন:

sqlsrv:Server=192.168.0.25; Database=My_Database;

ডিএসএন-এ UIDএবং PWDপ্যারামিটারগুলি ব্যবহার করে কাজ হয়নি, তাই সংযোগ তৈরি করার সময় পিডিও কনস্ট্রাক্টরের ব্যবহারকারীর নাম এবং পাসওয়ার্ড দ্বিতীয় এবং তৃতীয় প্যারামিটার হিসাবে পাস করা হয়। এখন আপনি পিএইচপি এর ব্যবহার করতে পারেন PDO::quote()। উপভোগ করুন।


1

ব্যবহারকারী বিশৃঙ্খলা দ্বারা 2009-02-22T121000 এর একটি উত্তর সমস্ত প্রশ্নের সাথে খাপ খায় না।

উদাহরণস্বরূপ, "উইন্ডো থেকে লোগিন [0x6f6c6f6c6f] তৈরি করুন" আপনাকে একটি ব্যতিক্রম দেয়।

পিএস: পিএইচপি, http://msdn.microsoft.com/library/cc296181%28v=sql.90%29.aspx এবং sqlsrv_prepare ফাংশন, যা পরামিতি আবদ্ধ করতে পারে জন্য এসকিউএল সার্ভার ড্রাইভার দেখুন ।

পিএসএস: যা উপরোক্ত প্রশ্নের সাথে আপনাকেও সহায়তা করেনি;)


0

সতর্কতা: এই ফাংশনটি পিএইচপি 7.0.0 এ সরানো হয়েছে।

http://php.net/manual/en/function.mssql-query.php

যে কেউ এখনও এই এমএসকিএল_ * ফাংশন ব্যবহার করছেন, মনে রাখবেন যে তারা পিএইচপি থেকে v7.0.0 হিসাবে সরানো হয়েছে as সুতরাং, এর অর্থ হল আপনাকে শেষ পর্যন্ত PDO লাইব্রেরি, sqlsrv_ * ইত্যাদি ব্যবহার করতে আপনার মডেল কোডটি পুনরায় লিখতে হবে যদি আপনি "উদ্ধৃতি / পলায়ন" পদ্ধতিতে কোনও বিষয় সন্ধান করছেন, আমি পিডিওর প্রস্তাব দেব।

এই ফাংশনের বিকল্পগুলির মধ্যে রয়েছে: PDO :: ক্যোয়ারী (), sqlsrv_query () এবং odbc_exec ()



0

এসকিউএলে হেক্সাডেসিমাল মানগুলি ASCII এ ফিরে আসার জন্য রূপান্তরকরণের জন্য, আমি এখানে যে সমাধানটি পেয়েছি তা এখানে রয়েছে ( ব্যবহার্য বিশৃঙ্খলা থেকে হেক্সাডেসিমেলের মধ্যে এনকোড করার জন্য ফাংশনটি ব্যবহার করে )

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);

0

এসকিউএল সংরক্ষিত শব্দগুলি এড়ানো ভাল। উদাহরণ স্বরূপ:

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;
}

-1

আমি এটিকে বিকল্প হিসাবে ব্যবহার করছি 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));

-2

আপনি আপনার নিজস্ব সংস্করণ পাকানো পারে mysql_real_escape_stringনিম্নলিখিত রেগুলার এক্সপ্রেশন সঙ্গে, (এবং উপর উন্নত): [\000\010\011\012\015\032\042\047\134\140]। এটি নিম্নলিখিত অক্ষরগুলির যত্ন নেয়: নাল, ব্যাকস্পেস, অনুভূমিক ট্যাব, নতুন লাইন, ক্যারেজ রিটার্ন, বিকল্প, ডাবল উদ্ধৃতি, একক উদ্ধৃতি, ব্যাকস্ল্যাশ, গুরুতর উচ্চারণ। ব্যাকস্পেস এবং অনুভূমিক ট্যাব দ্বারা সমর্থিত নয় mysql_real_escape_string

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.