所以我有一个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页面返回“...”而不是所需的结果。
我觉得我错过了一些明显的东西。任何帮助都将是非常感激的。
答案 0 :(得分:2)
我猜您已定义_UNICODE
,这意味着TCHAR
为wchar_t
,CString
为CStringT<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