как мне предотвратить вставку пустых данных в базу данных mysql из запроса post http

#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-кода.