在C ++应用程序中使用libcurl从.INI文件中的值发送POST数据

时间:2011-08-24 19:26:08

标签: c++ post libcurl ini

所以我有一个C ++应用程序,它从settings.INI文件中的键中获取值,使用libcurl来访问PHP页面,发布该数据,它应该返回一些不同的数据。

除了从INI文件中获取数据之外,它确实有效。如果我明确键入libcurl的POSTFIELDS选项(e.i:“Serial = 454534”,而不是存储从我的文件中重新获取的数据的变量)。

这是一些代码..
PHP:

<?
include("DBHeader.inc.php");
$Serial= $_POST['Serial'];

$sql = "SELECT * FROM `LockCodes` WHERE `sLockCode`=\"$Serial\"";
$RS=mysql_query($sql, $SQLConn);
$num_rows=mysql_num_rows($RS);

if ($num_rows>0)
{
      while ($row = mysql_fetch_array($RS))
  {
       echo $row['iLockCodeID'];
  }
}
else
{
  echo "...";
}


?>

C ++代码片段:

TCHAR szKeyValue[36];
GetPrivateProfileString(_T("Test"), _T("LockCode"), _T(""), szKeyValue, 36, _T("C:\\Test\\Settings.INI"));

CString sLockCode = szKeyValue;
CURL *curl;
CURLcode res;
CString Serial = _T("Serial=") + sLockCode;
string LCID;

curl_global_init(CURL_GLOBAL_ALL);

curl = curl_easy_init();
if (curl)
{
    curl_easy_setopt(curl, CURLOPT_URL, "http://regserver2.nyksys.com/GetLCID.php");
    curl_easy_setopt(curl, CURLOPT_POSTFIELDS, Serial);
    res = curl_easy_perform(curl);
    curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, &writeCallback);
    curl_easy_setopt(curl, CURLOPT_VERBOSE, 1L);
    res = curl_easy_perform(curl);

    if (data == _T("..."))
    {
        data = "0";
        AfxMessageBox("Invalid Serial Number");
        exit(0);
    }

我的Settings.INI采用标准格式..

[Test]
LockCode=1D4553C7E7228E462DBAAE267977B7CDED8A

当我使用变量“Serial”而不是输入变量时,会发生什么,PHP页面返回“...”而不是所需的结果。

我觉得我错过了一些明显的东西。任何帮助都将是非常感激的。

1 个答案:

答案 0 :(得分:2)

我猜您已定义_UNICODE,这意味着TCHARwchar_tCStringCStringT<wchar_t>,代码为:

curl_easy_setopt(curl, CURLOPT_POSTFIELDS, Serial);
当函数期望一个窄字符串时,

实际上将宽字符串传递给curl_easy_setopt()。如果你的机器是小端,那么curl_easy_setopt()会将参数解释为字符串"S\x00e\x00r\x00i\x00...(在Big Endian机器上,它是"\x00S\x00e\x00r\x00i...),因为curl_easy_setopt()将使用{{1}如果未设置strlen(),则一个小的Endian机器上的整个POST请求主体为CURLOPT_POSTFIELDSIZE。例如,请参阅http://codepad.org/JE2MYZfU

您需要做的是使用窄字符串:

S

此外,您的PHP脚本看起来容易受到SQL注入攻击。

编辑:还有一件事。您是否将#define ARRAY_LEN(arr_id) ((sizeof (arr_id))/(sizeof ((arr_id)[0]))) char szKeyValue[36]; GetPrivateProfileStringA("Test", "LockCode", "", szKeyValue, ARRAY_LEN(szKeyValue), "C:\\Test\\Settings.INI"); CURL *curl; CURLcode res; CStringT<char> Body = CStringT<char>("Serial=") + szKeyValue; string LCID; curl_global_init(CURL_GLOBAL_ALL); curl = curl_easy_init(); if (curl) { curl_easy_setopt(curl, CURLOPT_URL, "http://regserver2.nyksys.com/GetLCID.php"); curl_easy_setopt(curl, CURLOPT_POSTFIELDS, Body); res = curl_easy_perform(curl); curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, &writeCallback); curl_easy_setopt(curl, CURLOPT_VERBOSE, 1L); res = curl_easy_perform(curl); //... 设置为1?

CURLOPT_POST