使用PHP / MYSQL构建安全公共API

时间:2011-02-04 17:21:59

标签: php mysql api

我目前正在为一个非常繁忙的互联网网站构建API。它是用PHP编写的PHP。现在这是我写的第一个API,允许人们远程访问他们的帐户。一旦API在线,开发人员就可以从中编写自己的工具。

现在我有API工作,但我不确定它是否完全安全。

可行的示例网址是:http://domain.com/api.php?api_option=list&api_user_name=USERNAME&api_user_password=PASSWORD

USERNAME:将是用户的实际用户名

PASSWORD:将是MD5编码的实际密码字符串。

如果细节匹配,则返回结果,如果没有,则返回错误。

所有外部$_GET输入均获得mysql_real_escape_string()处理。

我想保持简单,但我不确定这种方式是否是一种安全的方式,可以直接使用公共API直接访问用户帐户数据。

非常感谢您的意见和建议。

3 个答案:

答案 0 :(得分:17)

请为了对互联网的热爱,不要这样做。我恳求您花时间为您的API实施OAuth。请。请拜托。

看看这个:http://toys.lerdorf.com/archives/55-Writing-an-OAuth-Provider-Service.html

答案 1 :(得分:8)

如何使用HMAC_SHA1和用户密码签名请求?例如,您的网址为:http://domain.com/api.php?api_option=list&api_user_name=USERNAME&api_user_password=PASSWORD

添加时间戳和/或随机字符串(nonce)并构建规范化的base_string:

$base_string = "api_option=list&api_user_name=USERNAME&timestamp=1296875073&nonce=hgg65JHFj";
$signature = hmac_sha1($base_string, PASSWORD);

然后新的URL将是: http://domain.com/api.php?api_option=list&api_user_name=USERNAME&timestamp=1296875073&nonce=hgg65JHFj&signature=kfvyhgfytgyr6576yfgu

您的服务器所做的是获取除签名之外的所有选项,然后使用相同的方法生成签名,并将其与客户端发送的签名进行比较,该签名应该相同。

答案 2 :(得分:5)

即使进行了编码,也不要使用密码进行API清除,尤其是在MD5中进行编码时。此外,我也不会使用用户名。让用户生成一个密钥。您正在让某人知道访问用户帐户时需要知道的50%,并且MD5有很多站点可以撤消它并找到密码匹配。关键当然是最好的方法,因此开发人员可以为了安全目的而进一步重新开发它。总是想到安全。