Support for non-emulated claims from MS SQL Server via PHP on Linux

Summary

I am trying to use prepared instructions to stop SQL injections, but I cannot find the support needed to guarantee that it works properly.


Scenario

I host a site on Linux that connects to Microsoft SQL Server with FreeTDS version 0.91, specifically using FreeTDS dblib. I installed version tds7.4 to connect to the database and I am using the PHP PDO object.

According to the FreeTDS documentation , 4.2 does not support prepared instructions:

TDS 4.2 has limitations

  • Only ASCII, of course.
  • RPC is not supported.
  • BCP is not supported.
  • varchar 255 . , .
  • ( ) .

, 7.4 , , , , .

PHP PDO PDO::setAttribute(). PDO::ATTR_ERRMODE, PDO::ATTR_EMULATE_PREPARES, , .


:

: SQLSTATE [IM001]: :

PDO::ATTR_EMULATE_PREPARES, , , .

, MS SQL Server Linux?

+4
1

ODBC dblib, PDO. , ODBC: ODBC FreeTDS ODBC. , , FreeTDS ODBC, .


ODBC

StackOverflow , ODBC. :

, ODBC FreeTDS Debian.

TDS 8.0 .

. SET NAMES a SET CHARSET a ; FreeTDS. ODBC ASCII . . .

:

sudo apt-get install freetds-bin freetds-common unixodbc tdsodbc php5-ODBC

  • freetds-bin FreeTDS, tsql isql ( ).
  • freetds-common , . freetds-bin .
  • unixodbc - ODBC
  • tdsodbc TDS ODBC
  • php5-odbc - php ODBC. , php .

unixODBC

ODBC /etc/odbcinst.ini:

[odbc]
Description     = ODBC driver
Driver          = /usr/lib/x86_64-linux-gnu/odbc/libtdsodbc.so
Setup           = /usr/lib/x86_64-linux-gnu/odbc/libtdsS.so 
UsageCount      = 1

/etc/odbc.ini:

[datasourcename]
 Driver         = odbc
 Description    = Standalone ODBC
 Server         = <IP or hostname>
 Port           = <port>
 TDS_Version    = 8.0

unixODBC FreeTDS:

ODBC /etc/odbcinst.ini:

[odbc]
Description     = ODBC driver
Driver          = /usr/lib/x86_64-linux-gnu/odbc/libtdsodbc.so
Setup           = /usr/lib/x86_64-linux-gnu/odbc/libtdsS.so 
UsageCount      = 1

/etc/odbc.ini:

[datasourcename]
Driver          = FreeTDS_odbc
Description     = Uses FreeTDS configuration settings defined in /etc/freetds/freetds.conf
Servername      = datasourcename
TDS_Version     = 8.0

ODBC FreeTDS /etc/freetds/freetds.conf:

[datasourcename]
    host = <IP or hostname>
    port = <port>
    client charset = UTF-8
    tds version = 8.0
    text size = 20971520
    encryption = required

: , odbc . -, www-data, !

freetds.conf PDO

$pdo = new PDO('odbc:datasourcename');

:

tsql, , FreeTDS .

tsql -S datasourcename -U username -P password

isql, ODBC.

isql -v datasourcename

ODBC PHP:

ODBC PHP php.ini, :

extension = odbc.so

, php.ini , - . <?php phpinfo(); ?> -, .

Apache

EDIT: ​​ , ODBC, .

+1

All Articles