私は最近ここで尋ねました:どのウェブサイトがphpによって提供される外部画像を要求するかを知る方法は?
サードパーティのWebサイトは、次のような画像を要求します。
<img src="http://www.myserver.com/mypage.php?api=APIKEY&text=some-text-here" alt=""/>
特定のAPIキーへのアクセスを1時間ごとおよび1日ごとに制限する必要があります。
今、私はmysqlDBにいくつかのデータを保存しました:
id、apikey、limit_ip、limit_referer、limit_hour、limit_day
1、JFKHJSDLGHUFIE、127.0.0.1、*、250、10000
<?php
//Verify Referer
if(
!isset($_SERVER['HTTP_REFERER']) || $_SERVER['HTTP_REFERER'] == "" ||
!isset($_GET['apik']) || $_GET['apik'] == "" ||
!isset($_SERVER['REMOTE_ADDR']) || $_SERVER['REMOTE_ADDR'] == "") {
exit("API error, your referer informations aren't set");
} else {
//Site referer
$site = $_SERVER['HTTP_REFERER'];
//Ip referer
$ip = $_SERVER['REMOTE_ADDR'];
//Get api key
$apik = htmlentities($_GET['apik']);
try
{
$options = array(
PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8"
);
//MySQL connection
$bdd = new PDO('mysql:host=localhost;dbname=apitest', 'root', '', $options);
}
catch(Exception $e)
{
//If error, die
die('Error: '.$e->getMessage());
}
//Lookup for the apikey in the database
$answer = $bdd->query('SELECT * FROM apiCode WHERE apikey = "'.$apik.'" LIMIT 0,1');
//Fetch settings for this api key
while ($data = $answer->fetch()) {
$limit_ip = $data['limit_ip'];
$limit_referer = $data['limit_referer'];
$limit_hour = $data['limit_hour'];
$limit_day = $data['limit_day'];
}
//Verify API limits
//Cookie, session, database?
//Return content
echo "Api : Success!";
}
最善の方法は、データベースに次のようなテーブルを作成することだと思います。
id、access_hour、access_day
cronジョブなどを使用して1時間ごとにaccess_hourフィールドをリセットしますが、MySQLは非常に低速であり、高速である方がよいため、コンテンツの提供にははるかに時間がかかります:)。
Cookieはリモートコンピュータに保存されるため、信頼性は低くなります。
セッションの継続時間は15分です...したがって、アクセスを保存および制限するには短すぎます。
上記のすべてのステートメントは、私の観点からのみです。
私の質問は、提供速度に影響を与えることなく、特定のAPIキーへのアクセス数を1時間ごとおよび1日ごとに保存および制限する方法です。
- なし:高速で信頼性が高い必要があります。