#php #post #get
#php #Публикация #получить
Вопрос:
Я создал функцию post из приложения на c #, затем я хочу вставить данные post в базу данных mysql через php-файл.
как я могу предотвратить ввод пустых данных в базу данных? потому что, если я открою URL http://example.com/api/index.php непосредственно в браузере, тогда будут пустые данные, которые поступают в базу данных, за исключением ip-адреса.
Я не хочу, чтобы кто-то открывал URLhttp://example.com/api/index.php напрямую, тогда в базу данных будут поступать пустые данные, потому что это может вызвать спам.
код на c # :
public void uploadFile(string url, string filepath)
{
WebClient webClient = new WebClient();
try
{
webClient.UploadFile(url, "POST", filepath);
}
catch
{
}
finally
{
webClient.Dispose();
}
}
string lickey = desktoppath randnumber ".lic";
uploadFile(string.Format(url api,
new object[]
{
licKeyID,
name,
GetAddress(),
}),
lickey);
private string url = "http://example.com/api";
private string api = "/index.php?lickey_id={0}amp;username={1}amp;password={2}amp;address={3}";
php-код :
<?php
include('config.php');
$uploaddir = 'newdir/';
$uploadfile = $uploaddir . basename($_FILES['file']['name']);
$id = mysql_real_escape_string($_GET['license_id']) . '.lic';
$blacklist = array(".php", ".phtml", ".php3", ".php4", ".html", ".htm");
foreach ($blacklist as $item)
if(preg_match("/$item$/i", $_FILES['file']['name'])) exit;
$f1 = file_get_contents($_FILES['file']['tmp_name']);
$fd = fopen($uploaddir.$id, 'w') or die("failed to create file");
fwrite($fd, $f1);
fclose($fd);
$check = mysql_query("SELECT * FROM `License` WHERE
`license_id`='".mysql_real_escape_string($_GET['license_id'])."' AND `checked`='false'");
if(mysql_num_rows($check) > 0)
{
exit(0);
}
mysql_query("INSERT INTO `License` SET
`ip`='".$_SERVER['REMOTE_ADDR']."',
`file`='$uploaddir".$id."',
`license_id`='".mysql_real_escape_string($_GET['license_id'])."',
`username`='".mysql_real_escape_string($_GET['username'])."',
`address`='".mysql_real_escape_string($_GET['address'])."',
`checked`='false'");
echo mysql_error();
mysql_close($dbcon);
?>
Комментарии:
1. проверьте, установлены ли
license_id'
,username
, .. или нет. И / или работать с authtoken, отправленным приложением.2. Ваш код небезопасен! Используйте подготовленные инструкции! И я бы предпочел иметь белый список типов файлов, чем черный список.
3. И для сохранения загруженного файла вам не нужно будет его читать и записывать, просто используйте move_uploaded_file()
4. хорошо, я знаю, это всего лишь основа, которую я создал на localhost
5. Я попробую это изменить
Ответ №1:
Подтвердите ввод.
Это можно сделать многими способами. Одним из них может быть проверка, содержит ли $_FILES
глобальная переменная file
ключ, и если $_GET
содержит license_id
, username
и address
.
if (isset($_FILES['file'])) {
die('Request invalid');
}
PS. Как правило, использование глобальных переменных сопряжено с риском для безопасности. Что вы могли бы сделать, не проводя полного рефакторинга, подумайте о добавлении пользовательского заголовка (например X-Client: My Fancy CSharp Application
) и проверке его внутри PHP-кода.