Проверка существующих URL перед добавлением в базу данных - PullRequest
1 голос
/ 01 июня 2011

Я пытаюсь проверить наличие существующих URL-адресов в поле формы пользователя, и мне нужно небольшое руководство.Я учусь на стажировке, и мне сказали, в каком месте я работаю, я не очень хорошо разбираюсь в PHP, и здесь я работаю с PHP.

Это выглядит как лучшее, что я пробовал до сих пор:*

    $file = [url];
    $file_headers = @get_headers($file);
    if($file_headers[0] == 'HTTP/1.1 404 Not Found') {
         $exists = false;
    }
    else {
         $exists = true;
    }


    if ($_POST[code] == '') {
        header("Location: index.php"); 
        exit;
    }
    else if ($exists == false){
        print("URL is not valid");

    } 
    else {

        $query = "INSERT INTO redirects
        SET code = '$_POST[code]',
        url  = '$_POST[url]',
        requester = '$_POST[requester]',
        date = '$_POST[iw_start]',
        webperson = '$_POST[webperson]',
        active = '$_POST[active]'";

        mysql_query ($query, $link);

    }

?>

Я на правильном пути?

* ПЕРЕД ВАМИ ОТВЕТА: ЗАПРОС SQL НЕ МОЙ.ПОЖАЛУЙСТА, ХОТИТЕ, ЧТО В РАЗУМЕ.

Ответы [ 4 ]

0 голосов
/ 01 июня 2011

Может быть, попытаться использовать шаблон регулярных выражений, чтобы определить, является ли он первым действительным URL?

$valid = "/^(http://|https://)(([a-z0-9]([-a-z0-9]*[a-z0-9]+)?){1,63}\.)+[a-z]{2,6}/";

if (preg_match($valid, $file)) { echo "OK" };
0 голосов
/ 01 июня 2011

Если вы прочитали руководство, get_headers возвращает false при ошибке, поэтому я бы также проверил это перед проверкой кода состояния HTTP.

Также вам не удалось избежать ни одной из ваших переменных в вашем запросе SQL.

0 голосов
/ 01 июня 2011

Попробуйте заменить ваш запрос следующим образом:

$query = "INSERT INTO redirects
        SET code = '" . mysql_real_escape_string($_POST['code']) . "',
        url  = '" . mysql_real_escape_string($_POST['url']) . "',
        requester = '" . mysql_real_escape_string($_POST['requester']) . "',
        date = '" . mysql_real_escape_string($_POST['iw_start']) . "',
        webperson = '" . mysql_real_escape_string($_POST['webperson']) . "',
        active = '" . mysql_real_escape_string($_POST['active']) . "'";
0 голосов
/ 01 июня 2011

Вы должны использовать CURL для проверки существующего URL.

С Как можно проверить, существует ли удаленный файл с использованием PHP? :

$ch = curl_init($_POST[url]);

curl_setopt($ch, CURLOPT_NOBODY, true);
curl_exec($ch);
$retcode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
// $retcode > 400 -> not found, $retcode = 200, found.
curl_close($ch);

Затем для вашей базы данных вы должны добавить уникальное ограничение, чтобы избежать добавления дублирующихся URL.

Теперь, как упоминалось в комментариях, то, что вы сделали, уязвимо для SQL-инъекций. Пользователь может разместить вредоносные данные через форму и, например, удалить все записи в вашей базе данных. Вы должны защитить входные данные (POST / GET), которые вы получаете от своих пользователей, всегда .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...