REST请求中的特殊字符

时间:2011-12-09 12:01:05

标签: php codeigniter rest

我正在使用CodeIgniter和Phils RESTserver开发API。 我正在尝试发送包含特殊字符的POST请求,但该字符串未添加到数据库中。

CodeIgniter还说lastname是必需的(字符串中不存在)。为什么呢?

我使用的是这种格式:

application/x-www-form-urlencoded

这是我的字符串:

firstname=Andrew&lastname=Åsberger

我可以使用特殊字符进行国际化。

感谢所有输入!

5 个答案:

答案 0 :(得分:6)

您应该对每个名称和值进行URI编码。希望客户端和服务器代码都同意UTF-8应该用于编码US-ASCII范围之外的字符的八位字节(因为早期的URI编码标准不是特定的,并且有遗留代码在那里尝试其他编码),所以你的例子变成了:

firstname=Andrew&lastname=%C3%85sberger

就像在与GET一起使用的URI的查询部分中那样。

答案 1 :(得分:3)

您似乎遇到了编码问题。您需要确保从端到端使用UTF8:客户端(浏览器),服务器(PHP),数据库连接和数据库。我假设您的数据库表已经是UTF8,但许多人忘记了与数据库的连接。在连接到数据库之后,您应该运行“查询”SET NAMES UTF8。不确定CodeIgniter是否使用db连接来转义字符。

我不使用CodeIgniter,但如果它没有使用正确的编码,那么双字节字符会扩展为2个字符。例如,如果您运行urlencode('Å'),则返回%C3%85,而不是%C5。这实际上是一种SQL注入方法。如果它“解码”的一个字符是'或',则会出现引用问题/漏洞。这可能导致CodeIgniter错误地评估字符串。

最后,你是通过javascript进行POST吗? Javascript不支持UTF8编码,因此根据您的POST方式会导致一些问题。您可以使用javascript来发布html表单,但是当您尝试使用自己创建的字符串执行ajax发布时,可能会遇到问题。虽然unescape(encodeURIComponent(s))应该可行。

答案 2 :(得分:2)

在将名称中带有特殊字符的产品插入购物车和创建我的网址时,我遇到了类似的问题

不确定,但从另一个角度来看可能会有所帮助。我还为我的项目添加了一个my_url_helper来处理网址。 mb_string非常好地处理char替换。抱歉我的语言不好。 :(
文件: application / config.php

/*
|--------------------------------------------------------------------------
| Allowed URL Characters
|--------------------------------------------------------------------------
|
| This lets you specify with a regular expression which characters are permitted
| within your URLs.  When someone tries to submit a URL with disallowed
| characters they will get a warning message.
|
| As a security measure you are STRONGLY encouraged to restrict URLs to
| as few characters as possible.  By default only these are allowed: a-z 0-9~%.:_-
|
| Leave blank to allow all characters -- but only if you are insane.
|
| DO NOT CHANGE THIS UNLESS YOU FULLY UNDERSTAND THE REPERCUSSIONS!!
|
*/  

//This is not default, its modified for turkish chars
$config['permitted_uri_chars'] = 'a-üöçşığz A-ÜÖÇŞİĞZ 0-9~%.:_\-';

答案 3 :(得分:1)

我对CodeIgniter不是特别熟悉;但是,这个:

Codeigniter seems to break $_POST of '£' character (Pound)

......可能是相关的。也就是说,问题可能在您的服务器堆栈中,而不是您的代码或框架!否则,这里有一些其他链接可以解决其他需要关注的领域w.r.t. CodeIgniter和UTF-8:

http://hash-bang.net/2009/02/utf8-with-codeigniter/

http://philsturgeon.co.uk/blog/2009/08/UTF-8-support-for-CodeIgniter

希望这有帮助。

答案 4 :(得分:0)

这不是MongoDb,因为你没有从帖子中得到你需要的东西。

我几乎完全确定它是您的编码细节,而不是从客户端到服务器的匹配。

其他人对UTF-8标准化的建议是很好的做法,但如果您不想这样做,只需确保使用的是与您的字符一起使用的编码模式,并且在客户端和服务器端都使用。

我不是PHP的专家,但你得到普通字符(B)加上特殊字符(&和%)转义正常字符(%26) ...但没有转义像%C3%85这样的特殊字符。

更新有关您如何发布到服务器的更多信息,我将详细说明。