Параметры привязки ODBC не отправляют полный параметр - PullRequest
0 голосов
/ 16 сентября 2018

Компания, в которой я работаю, использует PHP и SQL Server для нашего основного, ориентированного на клиента веб-сайта.Для связи между сайтом и базой данных мы используем встроенные в PHP функции ODBC.Используя это, всякий раз, когда я использую переменные, отправленные из Интернета, я всегда использую параметры привязки, и они всегда работали для меня.Проблема, с которой я столкнулся, заключалась в том, что при хранении данных кредитной карты с использованием параметров привязки в базу данных передавалась только первая цифра.Поскольку числа были зашифрованы, проблема не была сразу замечена.Я понимаю, где возникла проблема, но не могу понять, почему.

Справочная информация: На прошлой неделе я настроил веб-страницу для одного из наших крупнейших событий года и использовал немного другой вызов в базе данных, чем я.обычно делают при хранении номера кредитной карты.Я проверил это, увидел, что информация сохраняется, и отправил ее на производство.Вернемся к пятнице, когда я пошел, чтобы проверить некоторые цифры, ради страницы обработки платежа этого события, и я узнал, что у нас не было ни одного из чисел в файле.У нас была только первая цифра.На странице регистрации я проследил за вводом до вызова базы данных, и даже после вызова, и обнаружил, что он весь процесс.

Вот соответствующие функции, которые я использовал

<?php 
// ...
$registerID = placeRegistration($eventInfo["ID"], $attendeeFirst, $attendeeLast, $attendeePhone, $attendeeEmail, $attendeeClub);
if($registerID === NULL){
    $errStr .= "Unable to place registration. Please try again later.<br>";
}else{
    if(placePayment($registerID, _POST("bigInt"), _POST("bigIntMon"), _POST("bigIntYear"), _POST("totalCost")) === false){
    $errStr .= "Unable to place payment for this registration. Please try again.<br>";
}
// ...
?>
<!-- ... -->
<?php
/**
* Places a registration into EventsRegister.
* Returns the ID of the added entry if successful, else returns false.
*/
function placeRegistration($eventID, $firstName, $lastName, $phone, $email, $clubCard){
    $placeRegister = odbc_prepare($GLOBALS["dbh_WEB"], "
        INSERT INTO EventRegisters(EventID, FirstName, LastName, Phone, Email, ClubCard)
        OUTPUT INSERTED.ID
        VALUES (?, ?, ?, ?, ?, ?)
    ");

    if(!odbc_execute($placeRegister, array($eventID, $firstName, $lastName, $phone, $email, $clubCard))){
        $registerID = false;
        print_error(9, array($eventID, $firstName, $lastName, $phone, $email, $clubCard), __FILE__, __LINE__);
    }else{
        $temp = odbc_fetch_array($placeRegister);
        $registerID = $temp["ID"];
    }

    return $registerID;
}

/**
* Adds the payment for the corresponding registration ID.
* Returns true if successful, else false
*/
function placePayment($registerID, $pink, $expMo, $expYr, $total){
    $placePayment = odbc_prepare($GLOBALS["dbh_WEB"], "
        INSERT INTO EventPayments(RegisterID, Pink, ExpMo, ExpYr, Total)
        VALUES (?, ENCRYPTBYPASSPHRASE('".$GLOBALS["pinkySwear"]."', ?), ?, ?, ?)
    ");

    if(!odbc_execute($placePayment, array($registerID, $pink, $expMo, $expYr, $total))){
        return false;
    }else{
        return true;
    }
}

Упомянутые здесь $GLOBALS: $pinkySwear пароль шифрования, $dbh_WEB дескриптор базы данных

$dbh_WEB = odbc_connect("Driver={SQl Server Native Client 11.0};Server=$server;Database=website", $server_user, $server_password)
             or die('Something went wrong while connecting to MSSQL');

Заявление о проблеме является следующим:

$placePayment = odbc_prepare($GLOBALS["dbh_WEB"], "
    INSERT INTO EventPayments(RegisterID, Pink, ExpMo, ExpYr, Total)
    VALUES (?, ENCRYPTBYPASSPHRASE('".$GLOBALS["pinkySwear"]."', ?), ?, ?, ?)
");
if(!odbc_execute($placePayment, array($registerID, $pink, $expMo, $expYr, $total))){
    return false;
}else{
    return true;
}

Это утверждение по какой-то причине вводится только в первую цифру $pink.Если бы я использовал следующее утверждение, которое у меня было под впечатлением, функционирует так же, оно прекрасно работает.

$placePayment = odbc_prepare($GLOBALS["dbh_WEB"], "
    INSERT INTO EventPayments(RegisterID, Pink, ExpMo, ExpYr, Total)
    VALUES (?, ENCRYPTBYPASSPHRASE('".$GLOBALS["pinkySwear"]."', '$pink'), ?, ?, ?)
");
if(!odbc_execute($placePayment, array($registerID, $expMo, $expYr, $total))){
    return false;
}else{
    return true;
}

В чем причина того, что параметр привязки будет усекать 12-От 19 цифр до первой цифры?

В наших системах используется PHP 7.1.19, драйвер ODBC «Собственный клиент SQL Server 11.0», SQL Server 12.0.5579.0

1 Ответ

0 голосов
/ 20 сентября 2018

ошибка.

Я предполагаю, что это связано с расширением переменной.Трудно сказать без отладчика и дополнительной информации, например, о том, что на самом деле отправляется (wireshark).

Я пытался найти в исходном коде php odbc , но не смог найти ничего подозрительного.

РЕДАКТИРОВАТЬ на основе комментария

Расширение каким-то образом затрудняется при использовании в функции ENCRYPTBYPASSPHRASE в сочетании с odbc_prepare / odbc_execute (в настоящее время неизвестно, как).

Если вы добавите $pink напрямую, вы получите значение, представленное этой переменной, и обработка через odbc_prepare / odbc_execute.

не производится.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...