向PHP脚本发送请求时错误的符号

时间:2016-04-21 02:03:39

标签: php ios string swift hash

从我的应用程序中,我向网站上的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\\'。这就是为什么哈希是不同的。 我可以简单地从字符串中删除新行和撇号,但这不是最好的解决方案,我想

2 个答案:

答案 0 :(得分:1)

如果您的PHP配置中有magic_quotes_gpc(默认情况下在PHP <5.4),则需要对stripslashes或{{1}中的任何变量调用$_POST }}

请参阅http://php.net/manual/en/function.stripslashes.php

答案 1 :(得分:0)

你正在逃避这个字符串太快(这是chnaging&#39;到\&#39;)的原因。顺便说一句。只需使用PHP 5.5.0中不推荐使用的PDOMySQLi mysql_扩展名

更新代码以从查询中剪切key = xxx部分

settings.load()' called for every object that includes