通过我的应用程序,我向网站上的PHP脚本发送了一个请求。
在我的应用中,我配置了一个类似于以下内容的字符串:name=John&pass=apricot&constKey=12345
。
然后,在该字符串上使用哈希,并收到类似以下内容: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
,撇号是\\'
And并且当我快速哈希字符串时,没有\n
and \\'
。这就是为什么哈希不同的原因。我可以简单地从字符串中删除新行和撇号,但这不是最好的解决方案,我想
如果您magic_quotes_gpc
启用了PHP配置(默认情况下在PHP <5.4中stripslashes
启用),则需要调用$_POST
或中的任何变量$_GET
。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句