如果以前有人问过这个问题,如果它只是在评论中链接到我,我道歉。
所以我为android/iOS应用程序创建了一个web服务,php
的工作原理是这样的。
-
应用程序向
http://www.example.com/ws/getCookingData.php
发送请求,$_POST
参数为userID
和foodType
-
php
文件然后使用这两个变量查询数据库并返回json_encode
结果。
我担心的是,如果有人发现我的web服务链接,他们可能会发送垃圾邮件请求,导致100的调用我的数据库,只是不需要的
下面是我当前的getData.php
文件的一个例子
<?php
$userID = mysql_escape_string($_POST['userID']);
$foodType = mysql_escape_string($_POST['foodType']);
$mysqli = getDB();
echo json_encode(getDate($mysqli, $userID, $foodType); //mysql database interaction is here
$mysqli->close();
?>
这里没有任何东西可以阻止黑客试图向我的数据库发布恶意SQL语句
所以我想知道的是,如果我添加了第三个参数到我的帖子请求称为appID
这是一个很好的解决方案吗?
例如,如果我要更新我的getData.php
文件到下面,这会更安全还是有一个漏洞,我错过了?
<?php
$appID = $_POST['appID'];
if($appID === "hardCodedEquivalentID"){
$userID = mysql_escape_string($_POST['userID']);
$foodType = mysql_escape_string($_POST['foodType']);
$mysqli = getDB();
echo json_encode(getDate($mysqli, $userID, $foodType); //mysql database interaction is here
$mysqli->close();
}
?>
如果这是一个很好的解决方案,或者已经有一个等价的做法,可以达到我想要做的,请告诉我
首先,使用mysqli
或PDO
代替已弃用的mysql
函数。其次,创建一个函数,该函数将对用户进行身份验证,并查看用户是否具有访问数据的权限。第三,如果可能的话,尝试将数据LIMIT
到100左右。
硬编码appId不是解决方案。为每个特定的注册用户创建唯一的Id,然后将appId
与该特定用户进行匹配。当他们的会话过期时,清除访问令牌。在他们的会话开始时,您可以登录他们并创建新的访问令牌,并可以在整个会话中使用相同的令牌。
回答你的第一个问题
我担心的是,如果有人发现我的网络服务链接他们可以垃圾邮件的帖子请求导致100的呼叫我不需要的数据库
如果有人想要DoS你,那么你不能在你的代码中做太多来防止它,但你可以尝试使用cloudflare这样的服务。不值得一开始就担心。
这里没有任何东西可以阻止黑客试图发布恶意SQL语句进入我的数据库
然后阅读PDO上的文档
1 - 使用mysql_real_escape_string()
2-使用str_replace(" ","",$_POST['userID'])
和str_replace("%20","",$_POST['userID'])
(因为恶意攻击涉及使用%20和空间注入sql查询)
3-将这行添加到页面的顶部,因此脚本只需要请求,如果它来自您的网站(这就是我使用的也是!)
$referrer = $_SERVER['HTTP_REFERER'];
if (strpos($referrer,"yourwebsite.com")) {
} else {
die();
}