
Cicklow
Admin
Épsilon
Verificado
Verificación en dos pasos activada
Verificado por Whatsapp
¡Ha verificado su Paypal!
¡Usuario popular!
Suscripción a IA
Actualizado al 2024 con soporte de PHP8
Como crear un acortador de url.
Bueno en este tutorial aprenderemos a crear un acortador de url (sin usar scripts de otros ni nada).
Lo primero que aclaro es que no usare CSS ni nada para el diseño, eso corre por cuenta propia del creador.
1- Crearemos la cara del sitio con JQuery pasaremos la url por ajax a save.php
2- Ahora crearemos save.php
3- conecciona a la BD... db.php
4- creamos un .htaccess
Con este file lo que hacemos es que no permita acceder al sitio con WWW y que lo que mandemos dsp de la / (acortador.td/dwdwded32) sea controlado por go.php
También controlamos los errores y no permitimos listar directorios!
5- creamos go.php, el encardado de redireccionar a la url
6- la tabla mysql
7- Creamos e.php el encargado de controlar los errores
Saludos! 🙂
PD: si queremos eliminar sitios que agregan (por alguna razón) usamos este archivo (admurl.php).
entramos con admurl.php?adm=1
SON LIBRES DE HACER LO QUE GUSTEN CON EL SCRIPT!
Actualización[/B] (para que no rompan las tarlipes):
Para los que no tengan bien configurado su server o un server inseguro usen esta modificación para evitar InjectionSQL.
Crean un archivo noin.php
Como crear un acortador de url.
Bueno en este tutorial aprenderemos a crear un acortador de url (sin usar scripts de otros ni nada).
Lo primero que aclaro es que no usare CSS ni nada para el diseño, eso corre por cuenta propia del creador.
1- Crearemos la cara del sitio con JQuery pasaremos la url por ajax a save.php
Insertar CODE, HTML o PHP:
<script type="text/javascript" src="http://code.jquery.com/jquery-latest.min.js"></script>
<script type="text/javascript">
//Esta funcion es la encargada de ver que sea una url valida.
function validateUrl(d){
matches = d.match(b);
if (!matches) return null;
return matches
}
var b = RegExp("((?:(https?|ftp|itms)://)?(?:(?:[^\\s\\!\"\\#\\$\\%\\&\\'\\(\\)\\*\\+\\,\\.\\/\\:\\;\\<\\=\\>\\?\\@\\\\[\\]\\^\\_`\\{\\|\\}\\~]+\\.)+(?:aero|arpa|asia|biz|cat|com|coop|edu|gov|info|int|jobs|mil|mobi|museum|name|net|org|pro|tel|travel|local|example|invalid|test|\u0645\u0635\u0631|\u0440\u0444|\u0627\u0644\u0633\u0639\u0648\u062f\u064a\u0629|\u0627\u0645\u0627\u0631\u0627\u062a|xn--wgbh1c|xn--p1ai|xn--mgberp4a5d4ar|xn--mgbaam7a8h|\u4e2d\u56fd|\u4e2d\u570b|\u9999\u6e2f|\u0627\u0644\u0627\u0631\u062f\u0646|\u0641\u0644\u0633\u0637\u064a\u0646|\u0642\u0637\u0631|\u0dbd\u0d82\u0d9a\u0dcf|\u0b87\u0bb2\u0b99\u0bcd\u0b95\u0bc8|\u53f0\u7063|\u53f0\u6e7e|\u0e44\u0e17\u0e22|\u062a\u0648\u0646\u0633|xn--fiqs8S|xn--fiqz9S|xn--j6w193g|xn--mgbayh7gpa|xn--ygbi2ammx|xn--wgbl6a|xn--fzc2c9e2c|xn--xkc2al3hye2a|xn--kpry57d|xn--kprw13d|xn--o3cw4h|xn--pgbs0dh|\u0625\u062e\u062a\u0628\u0627\u0631|\u0622\u0632\u0645\u0627\u06cc\u0634\u06cc|\u6d4b\u8bd5|\u6e2c\u8a66|\u0438\u0441\u043f\u044b\u0442\u0430\u043d\u0438\u0435|\u092a\u0930\u0940\u0915\u094d\u0937\u093e|\u03b4\u03bf\u03ba\u03b9\u03bc\u03ae|\ud14c\uc2a4\ud2b8|\u05d8\u05e2\u05e1\u05d8|\u30c6\u30b9\u30c8|\u0baa\u0bb0\u0bbf\u0b9f\u0bcd\u0b9a\u0bc8|xn--kgbechtv|xn--hgbk6aj7f53bba|xn--0zwm56d|xn--g6w251d|xn--80akhbyknj4f|xn--11b5bs3a9aj6g|xn--jxalpdlp|xn--9t4b11yi5a|xn--deba0ad|xn--zckzah|xn--hlcj6aya9esc7a|[a-z]{2})(?::[0-9]+)?|(?:[0-9]{1,3}\\.){3}(?:[0-9]{1,3}))(?:\\/?[\\S]+)?)", "gi");
function Save(){
//esta funcion es llamada cuando el user hace click en el boton crear
if($('#url').val()!=""){ //verificamos que no este vacio el campo
var _U = $('#url').val();
if(validateUrl(_U)==_U){ //verificamos que sea una url valida
//enviamos por ajax la url y save.php nos regresara un texto que la url no es valida o el hash acortador
$.post("save.php", { url: _U },
function(data){
$('#url').val(data);
});
}else{
alert('url no valida!');
}
}
}
</script>
<center>
<font size="2">Url?</font><br/>
<textarea id="url"></textarea><br/>
<a class="back" href="javascript:void(0);" onclick="Save();return false;">Crear</a><br/><br/>
</center>
2- Ahora crearemos save.php
PHP:
<?php
// Verificamos que el referer sea de nuestro sitio
if (stripos($_SERVER['HTTP_REFERER'], 'acortador.tld') === false) {
die('url no válida!');
}
@set_time_limit();
// Agregamos db.php para el acceso a la BD
include('db.php');
// Verificamos que la URL recibida no sea vacía
if (trim($_REQUEST['url']) == "") {
die();
}
// Esta función lo que hace es verificar si ya existe el sitio en nuestra BD, si existe nos regresa el hash, sino llama a la función _new para crear uno nuevo
function _check($U)
{
global $dbh;
$sql = "SELECT * FROM `acortador` WHERE url='" . mysqli_real_escape_string($dbh, $U) . "'";
$result = mysqli_query($dbh, $sql);
$row = mysqli_fetch_array($result);
if ($row['char'] != "") {
return $row['char'];
} else {
return _new($U);
}
}
// Esta función creará un hash nuevo.
// Lo que hacemos es codificar en MD5 la URL (tenemos un hash único) y luego obtenemos lugares casi al azar
// para darle más aleatoriedad al hash
function _new($U)
{
global $dbh;
$Z = md5($U);
$A = substr($Z, 0, 2); // Obtenemos los primeros 2 caracteres del hash
$B = substr($Z, 16, 2); // Obtenemos 2 caracteres a partir del caracter 16
$C = substr($Z, 30, 2); // Obtenemos 2 caracteres a partir del caracter 30
$D = substr($Z, 23, 1); // Obtenemos 1 caractere a partir del caracter 23
$zCode = $A . $B . $C . $D; // Juntamos todo
// Guardamos el código, la URL, la cantidad de visitas y la IP (por si necesitamos banear IP)
mysqli_query($dbh, "INSERT INTO `acortador` VALUES('" . mysqli_real_escape_string($dbh, $zCode) . "','" . mysqli_real_escape_string($dbh, $U) . "','0','" . $_SERVER['REMOTE_ADDR'] . "');");
return $zCode;
}
// Verificamos que no existe la URL de nuestro sitio en la URL que quieren acortar (evitamos un anidado de URL)
if (!preg_match('/acortador\.tld/', $_REQUEST['url'])) {
if (validateURL($_REQUEST['url'])) {
echo 'https://acortador.tld/' . _check(trim($_REQUEST['url']));
} else {
echo 'URL no valida!';
}
} else {
echo $_REQUEST['url']; // Si encontramos nuestra URL en la URL para acortar, le regresamos la URL :)
}
// Verificamos que sea una URL válida :) (otro chequeo aparte del js)
function validateURL($url)
{
// Utilizamos la función filter_var para validar la URL
return filter_var($url, FILTER_VALIDATE_URL) !== false;
}
?>
3- conecciona a la BD... db.php
PHP:
<?php
$dbhost = "localhost";
$dbuser = "root";
$dbpass = "";
$dbname = "cosas";
// Conexión a la base de datos utilizando mysqli
$dbh = mysqli_connect($dbhost, $dbuser, $dbpass, $dbname);
// Verificar la conexión
if (!$dbh) {
die("Error: No se pudo conectar a la base de datos. " . mysqli_connect_error());
}
?>
4- creamos un .htaccess
Insertar CODE, HTML o PHP:
RewriteEngine On
IndexIgnore *
Options -Indexes
RewriteCond %{HTTP_HOST} ^www\.acortador\.tld$ [NC]
RewriteRule ^(.*)$ http://acortador.tld/$1 [R=301,QSA,L]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^.* - [L,QSA]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^([0-9-a-z-A-Z-_]+)$ go.php?id=$1 [L]
ErrorDocument 400 /e.php
ErrorDocument 401 /e.php
ErrorDocument 403 /e.php
ErrorDocument 404 /e.php
ErrorDocument 405 /e.php
ErrorDocument 500 /e.php
ErrorDocument 501 /e.php
ErrorDocument 502 /e.php
ErrorDocument 503 /e.php
ErrorDocument 504 /e.php
ErrorDocument 505 /e.php
Con este file lo que hacemos es que no permita acceder al sitio con WWW y que lo que mandemos dsp de la / (acortador.td/dwdwded32) sea controlado por go.php
También controlamos los errores y no permitimos listar directorios!
5- creamos go.php, el encardado de redireccionar a la url
PHP:
<?php
@set_time_limit();
include('db.php');
include('noin.php');
$SEC = new secure();
$SEC->secureGlobals();
// Verificamos si el hash existe en nuestra base de datos
$id = mysqli_real_escape_string($dbh, $_GET['id']);
$sql = "SELECT * FROM `acortador` WHERE `char`='$id'";
$result = mysqli_query($dbh, $sql);
// Si existe redireccionamos
if ($row = mysqli_fetch_array($result)) {
_suma($dbh, $_GET['id']);
header('HTTP/1.1 301 Moved Permanently');
header('Location: ' . $row['url']);
die();
} else {
// Si no existe el hash en nuestra BD redireccionamos al index de nuestro sitio
header('Location: https://acortador.tld/');
die();
}
// Función encargada de sumar una visita al hash
function _suma($dbh, $U) {
$U = mysqli_real_escape_string($dbh, $U);
mysqli_query($dbh, "UPDATE `acortador` SET stat=(stat+1) WHERE `char`='$U'");
}
?>
6- la tabla mysql
Insertar CODE, HTML o PHP:
CREATE TABLE `acortador` (
`char` varchar(7) NOT NULL,
`url` text NOT NULL,
`stat` double NOT NULL,
`ip` varchar(14) NOT NULL,
UNIQUE KEY `char` (`char`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
7- Creamos e.php el encargado de controlar los errores
PHP:
<?php
header('location: /');
die();
?>
Saludos! 🙂
PD: si queremos eliminar sitios que agregan (por alguna razón) usamos este archivo (admurl.php).
entramos con admurl.php?adm=1
PHP:
<?php
session_start();
if(empty($_GET['adm']) && ($_SESSION['pepe'] ?? "") !== "1") {
die();
} else {
$_SESSION['pepe'] = 1;
}
include 'db.php';
if(!empty($_GET['del'])) {
mysqli_query($dbh, "DELETE FROM acortador WHERE `char`='" . $_GET['del'] . "'");
}
if(empty($_GET['order'])) {
$SQL = mysqli_query($dbh, "SELECT * FROM acortador WHERE 1");
} else {
$SQL = mysqli_query($dbh, "SELECT * FROM acortador WHERE 1 ORDER BY stat DESC");
}
echo '<ul>';
while($ROW = mysqli_fetch_array($SQL)) {
echo '<li><a href="http://anonym.to/?' . $ROW['url'] . '" target="_blank">' . $ROW['url'] . '</a> - <a href="?del=' . $ROW['char'] . '">DEL</a></li>';
}
?>
SON LIBRES DE HACER LO QUE GUSTEN CON EL SCRIPT!
Actualización[/B] (para que no rompan las tarlipes):
Para los que no tengan bien configurado su server o un server inseguro usen esta modificación para evitar InjectionSQL.
Crean un archivo noin.php
PHP:
<?php
// Clase para controlar que no coloquen inyección SQL
class secure {
function secureSuperGlobalGET(&$value, $key) {
$value = htmlspecialchars(stripslashes($value));
$value = str_ireplace("script", "blocked", $value);
return $value;
}
function secureSuperGlobalPOST(&$value, $key) {
$value = htmlspecialchars(stripslashes($value));
$value = str_ireplace("script", "blocked", $value);
return $value;
}
function secureGlobals() {
array_walk($_GET, array($this, 'secureSuperGlobalGET'));
array_walk($_POST, array($this, 'secureSuperGlobalPOST'));
}
}
?>
Última edición: