向PHP脚本发送请求时使用错误的符号
我从我的应用程序向网站上的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
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版本。谢谢你!