Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/297.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
向PHP脚本发送请求时使用错误的符号_Php_Ios_String_Swift_Hash - Fatal编程技术网

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

向PHP脚本发送请求时使用错误的符号,php,ios,string,swift,hash,Php,Ios,String,Swift,Hash,我从我的应用程序向网站上的PHP脚本发送请求 在我的应用程序中,我配置了如下字符串:name=John&pass=apricot&constKey=12345 然后,我对该字符串使用哈希,并接收如下内容:bla25。现在是localKey 然后我将最后一个字符串name=John&pass=apricot&localKey=bla25发送到PHP脚本 在我的PHP脚本中,除了localKey(name=John&pass=apricot)之外,我使用这个字符串并添加存储在PHP文件中的const

我从我的应用程序向网站上的PHP脚本发送请求

在我的应用程序中,我配置了如下字符串:
name=John&pass=apricot&constKey=12345

然后,我对该字符串使用哈希,并接收如下内容:
bla25
。现在是localKey

然后我将最后一个字符串
name=John&pass=apricot&localKey=bla25
发送到PHP脚本

在我的PHP脚本中,除了localKey(
name=John&pass=apricot
)之外,我使用这个字符串并添加存储在PHP文件中的constKey。我再次得到字符串
name=John&pass=apricot&constKey=12345
。那很好

然后我散列该字符串并将其与localKey进行比较,localKey是
bla25
。如果键相等,则一切正常。在大多数情况下,它运行良好

但有时我会发送,比如:
text=我很高兴。这就是我跳舞的原因。我收到了错误,因为当我用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
\\'
。这就是散列不同的原因。
我可以简单地从字符串中删除新行和撇号,但这不是最好的解决方案,我想您转义该字符串的速度太快了(这是更改“to\”的原因)。顺便说一句,只是使用一些或mysql扩展在PHP5.5.0中被弃用

更新代码以从查询中剪切键=xxx零件

$dataArray=$_POST;


if (isset($dataArray['key'])){
    unset($dataArray['key']);
}

echo http_build_query($dataArray);

如果在PHP配置中启用了
magic\u quotes\u gpc
(在PHP<5.4中默认为启用),则需要对
$\u POST
$\u GET
中的任何变量调用
stripslashes


如果我不使用mysql\u real\u escape\u string,请参见

,然后写下:
$pars[$par]=$val
然后我得到了
\'
,但它仍然与
'
不一样,我也从mysql迁移到了mysqli,但仍然没有进展(更改后你能发布你的代码吗?还要检查这行:if(isset($post['key'))$key=mysql\u real\u escape\u string($\u post['key'));我已经更新了问题。我已经添加了阻止我提问的确切文本。还有一个问题,你能准确发布var_dump($_post)的输出吗?关于swift我不能说太多,但对于php来说,我认为它看起来不错,而且如果你想从查询字符串中只剪切key=xxxx部分,你可以在我更新的答案中使用类似的代码。添加你正在使用的php版本可能会有帮助。是的,你是对的。下次我会:)注意,你真的需要升级。PHP5.3已经停止使用2年了!不是我创建了服务器端,现在我需要处理这个问题,很快我将尝试迁移到下一个php版本。你完全正确,我很快就会试试。但我想,这就是解决办法。非常感谢。是的,这就是解决办法。下次我将添加我使用的PHP版本。谢谢你!