从我的应用程序中,我向网站上的PHP脚本发送请求。
在我的应用中,我配置了一个类似这样的字符串:name=John&pass=apricot&constKey=12345
。
然后我在该字符串上使用hash并收到类似这样的内容:blablabla25
。现在是localKey。
然后我将最终字符串name=John&pass=apricot&localKey=blablabla25
发送到PHP脚本。
在我的PHP脚本中,我接受除了localKey(name=John&pass=apricot
)之外的这个字符串,并添加存储在PHP文件中的constKey。我再次得到字符串name=John&pass=apricot&constKey=12345
。这很好。
然后我散列该字符串并将其与localKey进行比较,即blablabla25
。如果键是相等的,那么一切都没问题。在大多数情况下,它工作正常。
但有时候我会发送这个:text=I'm happy.That's why I'm dancing
。我收到错误,因为当我在Swift中散列字符串时,它看起来是一样的。当我在PHP中散列该字符串时 - 撇号被替换为类似的东西 - \\\'
以下是我的Swift和PHP文件代码的一部分。
post = post + "key=\(sign)"
post = post.stringByAddingPercentEncodingWithAllowedCharacters(.URLHostAllowedCharacterSet())!
post = post.stringByReplacingOccurrencesOfString("+", withString: "%2B")
let postData = post.dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: true)
let postLength = "\(postData?.length)"
let url: NSURL = NSURL(string: "http://google.com/admin.php")!
let request:NSMutableURLRequest = NSMutableURLRequest(URL:url)
request.URL = url
request.cachePolicy = NSURLRequestCachePolicy.ReloadIgnoringCacheData
request.HTTPMethod = "POST"
request.setValue(postLength, forHTTPHeaderField: "Content-Length")
request.setValue("application/x-www-form-urlencoded" , forHTTPHeaderField: "Content-Type")
request.HTTPBody = postData
和PHP文件
$key = NULL;
if (isset($POST['key'])) $key = mysql_real_escape_string($_POST['key']);
if (!$key)
{
exit();
}
$login = NULL;
$pass = NULL;
//////////////////////////////////////////////////////////////////////////////////////////
$pars = array();
foreach ($_POST as $par => $val)
{
$pars[$par] = mysql_real_escape_string($val);
}
ksort($pars);
$str = "";
foreach ($pars as $pr => $vl)
{
if ($pr != 'key') $str .= $pr . '=' . $vl;
}
$str .= genkey;
$sign = md5($str);
if (strcmp($key, $sign) !== 0)
{
retError(err_unknown, 'Unknown error');
exit();
}
我知道MD5今天并不好,但这不是问题的关键。
PHP更新代码
$key = NULL;
if (isset($_POST['key'])) $key = $_POST['key'];
if (!$key)
{
exit();
}
$login = NULL;
$pass = NULL;
//////////////////////////////////////////////////////////////////////////////////////////
$pars = array();
foreach ($_POST as $par => $val)
{
$pars[$par] = $val;
}
ksort($pars);
$str = "";
foreach ($pars as $pr => $vl)
{
if ($pr != 'key') $str .= $pr . '=' . $vl;
}
$str .= genkey;
$sign = md5($str);
if (strcmp($key, $sign) !== 0)
{
exit();
}
我发送给PHP脚本的字符串:
'Suggs
'H
Fgdfh'dg'hd'hgd
字符串,在PHP中:
\\'Suggs\n\\'H\nFgdfh\\'dg\\'hd\\'hgd
所以,新行是\n
,撇号是\\'
当我在swift中散列字符串时,没有\n
和\\'
。这就是为什么哈希是不同的。
我可以简单地从字符串中删除新行和撇号,但这不是最好的解决方案,我想
答案 0 :(得分:1)
如果您的PHP配置中有magic_quotes_gpc
(默认情况下在PHP <5.4),则需要对stripslashes
或{{1}中的任何变量调用$_POST
}}
答案 1 :(得分:0)