изменение короткого скрипта URL - PullRequest
1 голос
/ 05 апреля 2011

Я использовал Johnboy URL shortner , и я заметил, что он не проверяет и не видит, существует ли генерируемый URL в базе данных.Как я могу убедиться, что URL уникален>

Ответы [ 5 ]

2 голосов
/ 05 апреля 2011

Таблица БД выглядит так:

CREATE TABLE IF NOT EXISTS `urls` (
  `url_id` int(11) NOT NULL auto_increment,
  `url_link` varchar(255) default NULL,
  `url_short` varchar(6) default NULL,
  `url_date` int(10) default NULL,
  `url_ip` varchar(255) default NULL,
  `url_hits` int(11) default '0',
  PRIMARY KEY  (`url_id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;

Первичный ключ - это автоинкрементное целое число, которое нигде не используется в приложении. Вы можете просто избавиться от него и использовать url_short в качестве первичного ключа. Затем вы можете сделать одну из трех вещей при вставке нового материала:

  1. Используйте INSERT IGNORE и молча отбрасывайте дубликаты.
  2. Используйте INSERT ... ON DUPLICATE KEY UPDATE ... и обновляйте dupes.
  3. Используйте обычный INSERT и проверьте код ошибки: если 1062, это обман.

Я бы пошел на № 3.

Однако, учитывая, что он использует addslashes() для ввода входных параметров в SQL, я бы вообще не стал использовать этот скрипт. Это выглядит устаревшим и небезопасным.

2 голосов
/ 05 апреля 2011

Похоже, что сценарий johnboy полон уязвимостей ... но здесь вы идете!(измененный скрипт index.php, где он вычисляет новый короткий URL)

$short = substr(str_shuffle('abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789'), 0, 5); 
$unique = false;
while(!$unique) {
    $exists = mysql_fetch_assoc(mysql_query("SELECT url_link FROM urls WHERE url_short = '".$short."'")); 
    if($exists['url_link'] != '') {
        // one already exists! create another, try again.
        $short = substr(str_shuffle('abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789'), 0, 5); 
    } else {
        $unique = true;
    }
}
mysql_query("INSERT INTO urls (url_link, url_short, url_ip, url_date) VALUES 
    ( 
    '".addslashes($_POST['url'])."', 
    '".$short."', 
    '".$_SERVER['REMOTE_ADDR']."', 
    '".time()."' 
    ) 
"); 
2 голосов
/ 05 апреля 2011

Создайте уникальный индекс / ограничение для длинного или короткого URL или обоих. Когда скрипт пытается вставить другую запись с теми же значениями, инструкция INSERT завершится неудачно с специфическим кодом ошибки , который вы можете проверить и обработать соответствующим образом.

define('MYSQL_ER_DUP_ENTRY', 1062);
...
if ( !mysql_query($mysql, $query) ) {
  if ( MYSQL_ER_DUP_ENTRY==mysql_errno($mysql) ) {
    // handle duplicate entry
  }
}
0 голосов
/ 05 апреля 2011

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

0 голосов
/ 05 апреля 2011

Простое добавление UNIQUE к столбцу базы данных url_link должно сделать.

...