복붙노트

PHP를 사용하여 SQL Server에서 문자열을 이스케이프 처리하는 방법은 무엇입니까?

PHP

PHP를 사용하여 SQL Server에서 문자열을 이스케이프 처리하는 방법은 무엇입니까?

나는 SQL Server를위한 mysql_real_escape_string ()의 대안을 찾고있다. addslashes ()가 최선의 선택인가? 아니면 사용할 수있는 다른 대체 기능이 있습니까?

편집 : mysql_error ()에 대한 또 다른 대안이 유용 할 것이다.

해결법

  1. ==============================

    1.addslashes ()는 충분하지 않지만 PHP의 mssql 패키지는 괜찮은 대안을 제공하지 않습니다. 추악하지만 완전히 일반적인 해결책은 데이터를 16 진수 (Byteestring)로 인코딩하는 것입니다.

    addslashes ()는 충분하지 않지만 PHP의 mssql 패키지는 괜찮은 대안을 제공하지 않습니다. 추악하지만 완전히 일반적인 해결책은 데이터를 16 진수 (Byteestring)로 인코딩하는 것입니다.

    $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 ()입니다.

  2. ==============================

    2.

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

    코드의 일부는 CodeIgniter에서 찢어졌습니다. 잘 작동하고 깨끗한 솔루션입니다.

  3. ==============================

    3.쿼리에서 매개 변수를 사용할 수있을 때 왜 아무 것도 이스케이프 처리하지 않겠습니까?!

    쿼리에서 매개 변수를 사용할 수있을 때 왜 아무 것도 이스케이프 처리하지 않겠습니까?!

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

    값 매개 변수가 널 (null)인지 여부에 관계없이 선택, 삭제, 업데이트에서 올바르게 작동합니다. 원칙의 문제 만들기 - SQL을 연결하지 마십시오. 항상 안전하며 쿼리가 훨씬 잘 읽혀집니다.

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

  4. ==============================

    4.PDO 라이브러리를 살펴볼 수 있습니다. 준비된 명령문을 올바르게 수행하면 문자열의 잘못된 문자를 자동으로 이스케이프 처리하는 PDO와 함께 준비된 명령문을 사용할 수 있습니다. 이것은 PHP 5만을위한 것입니다.

    PDO 라이브러리를 살펴볼 수 있습니다. 준비된 명령문을 올바르게 수행하면 문자열의 잘못된 문자를 자동으로 이스케이프 처리하는 PDO와 함께 준비된 명령문을 사용할 수 있습니다. 이것은 PHP 5만을위한 것입니다.

  5. ==============================

    5.작은 따옴표와 큰 따옴표를 처리하는 또 다른 방법은

    작은 따옴표와 큰 따옴표를 처리하는 또 다른 방법은

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

    6.작은 따옴표와 큰 따옴표를 벗어나기 위해서는 두 배의 큰 따옴표를 사용해야합니다.

    작은 따옴표와 큰 따옴표를 벗어나기 위해서는 두 배의 큰 따옴표를 사용해야합니다.

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

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

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

    기타...

    및 특성 : Microsoft SQL Server 2000의 이스케이프 문자

  7. ==============================

    7.이것을 몇 시간 동안 고민하고 나니, 나는 거의 최선을 다하는 해결책을 찾았다.

    이것을 몇 시간 동안 고민하고 나니, 나는 거의 최선을 다하는 해결책을 찾았다.

    값을 hexstring으로 변환하는 카오스의 대답은 모든 datatype, 특히 datetime 열과 함께 작동하지 않습니다.

    나는 PHP의 PDO :: quote ()를 사용하지만 PHP와 함께 제공되므로 PDO :: quote ()는 MS SQL Server에서 지원되지 않으며 FALSE를 반환합니다. 이를위한 솔루션은 Microsoft 번들을 다운로드하는 것입니다.

    그 다음에 다음 예제와 같이 DSN을 사용하여 PHP로 PDO에 연결할 수 있습니다.

    sqlsrv:Server=192.168.0.25; Database=My_Database;
    

    DSN에서 UID 및 PWD 매개 변수를 사용하면 작동하지 않으므로 연결을 만들 때 사용자 이름과 암호가 PDO 생성자의 두 번째 및 세 번째 매개 변수로 전달됩니다. 이제 PHP의 PDO :: quote ()를 사용할 수 있습니다. 즐겨.

  8. ==============================

    8.나도 알아, 조금 늦었지만, '에서 답변'2009 년 2 월 22 일 12시 10 분 '혼돈에 의해 모든 쿼리에 적합하지 않습니다. 예 : "CREATE LOGIN [0x6f6c6f6c6f] WINDOWS에서"예외가 생깁니다.

    나도 알아, 조금 늦었지만, '에서 답변'2009 년 2 월 22 일 12시 10 분 '혼돈에 의해 모든 쿼리에 적합하지 않습니다. 예 : "CREATE LOGIN [0x6f6c6f6c6f] WINDOWS에서"예외가 생깁니다.

    추신. params를 바인딩 할 수있는 php, http://msdn.microsoft.com/library/cc296181%28v=sql.90%29.aspx 및 sqlsrv_prepare 함수에 대한 mssql 드라이버를 살펴보십시오.

    p.s.s. 위의 쿼리를 사용하면 도움이되지 않습니다.)

  9. ==============================

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

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

    여전히이 mssql_ * 함수를 사용하는 사람은 v7.0.0부터 PHP에서 제거 된 것을 명심하십시오. 따라서 결국 PDO 라이브러리 인 sqlsrv_ * 등을 사용하기 위해 모델 코드를 다시 작성해야합니다. "quoting / escaping"방법으로 뭔가를 찾고 있다면 PDO를 권합니다.

  10. ==============================

    10.PDO를 사용하는 경우 PDO :: quote 메소드를 사용할 수 있습니다.

    PDO를 사용하는 경우 PDO :: quote 메소드를 사용할 수 있습니다.

  11. ==============================

    11.SQL 예약어를 탈출하는 것이 더 나은가? 예 :

    SQL 예약어를 탈출하는 것이 더 나은가? 예 :

    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;
    }
    
  12. ==============================

    12.변환을 위해 SQL에서 HEX를 ASCII로 다시 가져 오려면 여기에있는 솔루션이 필요합니다 (Chaos의 기능을 사용하여 16 진수로 인코딩)

    변환을 위해 SQL에서 HEX를 ASCII로 다시 가져 오려면 여기에있는 솔루션이 필요합니다 (Chaos의 기능을 사용하여 16 진수로 인코딩)

    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);
    
  13. ==============================

    13.나는 이것을 mysql_real_escape_string ()의 대안으로 사용했다.

    나는 이것을 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));
    
  14. ==============================

    14.[\ 000 \ 010 \ 011 \ 012 \ 015 \ 032 \ 042 \ 047 \ 134 \ 140]이라는 정규 표현식으로 mysql_real_escape_string을 자신 만의 버전으로 롤업 할 수 있습니다. 그 문자는 null, 백 스페이스, 가로 탭, 줄 바꿈, 캐리지 리턴, 대체, 큰 따옴표, 작은 따옴표, 백 슬래시, 악센트 부호를 사용합니다. 백 스페이스와 수평 탭은 mysql_real_escape_string에서 지원하지 않습니다.

    [\ 000 \ 010 \ 011 \ 012 \ 015 \ 032 \ 042 \ 047 \ 134 \ 140]이라는 정규 표현식으로 mysql_real_escape_string을 자신 만의 버전으로 롤업 할 수 있습니다. 그 문자는 null, 백 스페이스, 가로 탭, 줄 바꿈, 캐리지 리턴, 대체, 큰 따옴표, 작은 따옴표, 백 슬래시, 악센트 부호를 사용합니다. 백 스페이스와 수평 탭은 mysql_real_escape_string에서 지원하지 않습니다.

  15. from https://stackoverflow.com/questions/574805/how-to-escape-strings-in-sql-server-using-php by cc-by-sa and MIT license