summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAnton Šijanec <sijanecantonluka@gmail.com>2019-01-21 21:43:52 +0100
committerGitHub <noreply@github.com>2019-01-21 21:43:52 +0100
commitce02585679f681af26c541529eae954e9062c513 (patch)
treec7ad06f5a5288a00c45e0a2acaa946e7f46c58b3
parentUpdated README.md (diff)
downloadbalkan-shortlink-ce02585679f681af26c541529eae954e9062c513.tar
balkan-shortlink-ce02585679f681af26c541529eae954e9062c513.tar.gz
balkan-shortlink-ce02585679f681af26c541529eae954e9062c513.tar.bz2
balkan-shortlink-ce02585679f681af26c541529eae954e9062c513.tar.lz
balkan-shortlink-ce02585679f681af26c541529eae954e9062c513.tar.xz
balkan-shortlink-ce02585679f681af26c541529eae954e9062c513.tar.zst
balkan-shortlink-ce02585679f681af26c541529eae954e9062c513.zip
-rw-r--r--index.php386
1 files changed, 386 insertions, 0 deletions
diff --git a/index.php b/index.php
new file mode 100644
index 0000000..3ca6749
--- /dev/null
+++ b/index.php
@@ -0,0 +1,386 @@
+<?php
+// OPOZORILA: PROGRAM MORA BITI NUJNO POD IMENOM index.php IN POGANJATI SE MORA POD Apache 2, ki podpria RewriteEngine, Imeti moraš SQL uporabnika in bazo,
+// .htaccess mora delati, potrebno je imeti dovoljenja za pisanje v mapo. .htaccess ob prvem zagonu ne sme
+// obstajati, naredi se sam. NUJNO MORATE SKOPIRATI MAPO securimage iz phpcaptcha.org/download/ zraven index.php, drugače captcha ne bo delala.
+// (C) 2019 Anton Šijanec.
+// Uporaba dovoljena za učenje in za nekomercijalne namene, brez zaslužkov in z navedbo avtorja. Hvala!
+// exit("Balkan ŠortLink je v pripravi. Pripravljen bo čez okoli 2 dni. Anton Šijanec, Projekt začet 20. januarja, predviden čas začetka obratovanja storitve
+// je 23. januar 2019. Program bo odprtokoden in dostopen na mojem GitHubu, AstiriL!");
+session_start();
+clearstatcache();
+ini_set('display_errors', 'On');
+error_reporting(E_ALL);
+$nadaljuj = "ja";
+include_once $_SERVER['DOCUMENT_ROOT'] . '/securimage/securimage.php';
+$securimage = new Securimage();
+
+$verzija = "0.0.19.01.21";
+$log .= "Verzija: " . $verzija . "\n";
+
+
+// definicije - uporabniškega vnosa ne preverjam, zato si ne naredite sql vrivanja (angl. sql injection) ali vrinjanja skript (ni htmlchars sanitizacije).
+// drugače pa je program dokaj varen prej vrivanjem... upajmo... vsi ostali uporabniški vnosi so sanitizirani.
+$servername = "lol.u.though.i.will.show.a4l.space"; // domena, IP naslov oziroma ime gostitelja za dostop do MySQL ali ekvivalentne SQL podatkovne baze (strežnika)
+$username = "nofreesqlforyou"; // uporabniško ime za dostop do strežnika SQL
+$password = "donttrytoconnect"; // geslo za dostop do strežnika SQL
+$baza = "itdoesntwork"; // podatkovna baza SQL v katero naj pišem - naredi jo pred zagonom programa
+$tabela = "srslyitdoesnt"; // tabela, ki naj jo naredim v podatkovni bazi SQL oziroma tabela v podatkovni bazi SQL, ki naj jo uporabljam
+$rxshort = "/^[0-9a-z]{1,6}$/"; // angleško regular expression, ki naj ga uporabim za kratek niz - nujno popravi še besedilne opise. Pusti ga takega, kot je!
+$domena = "š.ga"; // tvoja domena
+$captcha = "ja"; // ja/ne: ali naj uporabljam captcho? potrebujete phpcaptcha.org, mapo securimage skopirajte zraven index.php (tega programa).
+
+// samoinštalacija - .htaccess ne sme obstajati ob prvem zagonu
+if(!file_exists(".htaccess")) {
+ $htaccess = "
+RewriteEngine on
+RewriteCond %{REQUEST_FILENAME} !-f
+RewriteCond %{REQUEST_FILENAME} !-d
+RewriteRule ^(.*)$ /index.php?r=$1 [NC,L,QSA]
+ ";
+ if(file_put_contents(".htaccess", $htaccess)) {
+ exit("Program je bil verjetno zagnan prvič. Izdelava .htaccess je uspela.\n");
+ } else {
+ $log .= "Program je bil zagnan verjetno prvič. Izdelava .htaccess ni uspela. Popravi dovoljenja mape.\n";
+ }
+}
+if($captcha !== "ne") {
+if(!file_exists("securimage")) {
+ exit("securimage mapa z datotekami za captcho ne obstaja. Naložite jo iz phpcaptcha.org/download in jo postavite zraven index.php, ali pa spremenite
+ nastavitev captcha v konfiguracijah (definicije) iz ja na ne (ne priporočam).\n");
+} else {
+ // okejjjjj
+}
+}
+
+// sql povezava in izbira podatkovne baze
+$conn = mysqli_connect($servername, $username, $password, $baza); // naredi povezavo
+if (!$conn) { // preveri povezavo
+ die("<pre>Povezava v podatkovno bazo ni uspela. <!-- Razhroščevanje: " . mysqli_connect_error() . "-->\n</pre>");
+}
+$log .= "Povezava v podatkovno bazo uspešna.\n";
+if(mysqli_select_db($conn,$baza)) {
+ $log .= "Izbira podatkovne baze uspešna.\n";
+} else {
+ die("Podatkovne baze ni bilo mogoče izbrati. <!-- Razhroščevanje: " . mysqli_error($conn) . "-->\n");
+}
+
+
+
+
+
+//poglej če tabela links obstaja
+$alitabelaobstaja = mysqli_query($conn, 'SELECT 1 from `'.$tabela.'`');
+if($alitabelaobstaja !== FALSE) {
+ $log .= "Tabela v podatkovni bazi obstaja. Program je že bil v uporabi.\n";
+} else {
+ // ne - naredi jo!
+ $log .= "Tabela v podatkovni bazi ne obstaja. Program je bil zagnan prvič. Poskusil jo bom narediti.\n";
+$sql = "CREATE TABLE IF NOT EXISTS `".$tabela."` (
+ `short` varchar(10) COLLATE utf8_unicode_ci NOT NULL,
+ `long` text(767) COLLATE utf8_unicode_ci NOT NULL,
+ PRIMARY KEY (`short`)
+) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci";
+if (mysqli_query($conn, $sql)) {
+ $log .= "Tabela v podatkovni bazi je bila uspešno narejena.\n";
+} else {
+ die("<pre>Napaka v izdelavi tabele v podatkovni bazi! <!-- razhroščevanje: " . mysqli_error($conn) . "-->\n</pre>");
+}
+}
+
+
+//če je potrebna preusmeritev (glej .htaccess, pa ti bo jasno)
+if(!empty($_REQUEST['r'])) {
+ // preveri, če dolg niz že obstaja
+$safer = mysqli_real_escape_string($conn, $_REQUEST['r']);
+// echo $safer; //debug
+$query = "SELECT `long` from `".$tabela."` where `short`='".$safer."';";
+$result = mysqli_query($conn, $query);
+echo mysqli_error($conn); //debug
+if(mysqli_num_rows($result) > 0) {
+
+
+ // echo array_pop(mysqli_fetch_row($result); //debug //to je to!
+ $dolgkiobstaja = array_pop(mysqli_fetch_row($result)); //to je to!
+ // ŠortLink obstaja, preusmerjam!
+ header("Location: ".$dolgkiobstaja);
+} else {
+ $log .= "Kratek URL še ne obstaja v podatkovni bazi.\n";
+ $alert .= "<div class=alert>
+ <span class=closebtn onclick=this.parentElement.style.display='none';>&times;</span>
+<b>Napaka!</b> Kratek URL še ne obstaja v podatkovni bazi.
+</div><br>";
+}
+}
+
+
+
+// če je zahteva za vpis, vpiši!
+if(!empty($_REQUEST['submit'])) {
+ $log .= "Obrazec je bil izpolnjen, začenjam preverjanje vnosa.";
+
+
+
+if($captcha !== "ne") {
+ if ($securimage->check($_POST['captcha_code']) == false) {
+ $log .= "Preverjanje človeštva (CAPTCHA) je negativno. Mogoče niste človek, zato ne bom nadaljeval.";
+ $alert .= "<div class=alert>
+ <span class=closebtn onclick=this.parentElement.style.display='none';>&times;</span>
+<b>Napaka preverjanja!</b> Preverjanje CAPTCHA je pokazalo negativni rezultat. Mogoče niste človek, zato ne bom nadaljeval.
+</div><br>";
+ $nadaljuj = "ne";
+} else {
+ $log .= "Preverjanje človeštva (CAPTCHA) je pozitivno. Človek ste.";
+}
+}
+
+// regex match kratkega niza
+if(preg_match($rxshort, $_REQUEST['short'])) {
+ $log .= "Preverjanje krajšalnega niza je pozitivno. Krajševalni niz se lahko uporabi.\n";
+} else {
+ $log .= "Krajšalni niz se ne ujema z regexom " . $rxshort . ", zato ne bom nadaljeval.\n";
+ $nadaljuj = "ne";
+ $alert .= "<div class=alert>
+ <span class=closebtn onclick=this.parentElement.style.display='none';>&times;</span>
+<b>Napaka vnosa!</b> Krajševalni niz se ne ujema z njegovimi pravili. Mora biti 1 do 6 znakov dolg in lahko vsebuje male črke in številke.
+</div><br>";
+}
+
+
+// preverjanje, ce je res URL
+if(filter_var($_REQUEST['long'], FILTER_VALIDATE_URL)) {
+ $log .= "Preverjanje dolgega URL-ja je pozitivno. Dolg URL se lahko uporabi.\n";
+} else {
+ $log .= "Preverjanje dolgega URL-ja je negativno, zato ne bom nadeljeval.\n";
+ $nadaljuj = "ne";
+ $alert .= "<div class=alert>
+ <span class=closebtn onclick=this.parentElement.style.display='none';>&times;</span>
+<b>Napaka vnosa!</b> Dolg URL se ne ujema z standardi. Poskusite ponovno.
+</div><br>";
+}
+
+
+// preprecevanje sql prekoračitve
+if(strlen($_REQUEST['long']) > 767) { //strlen pove bajte, mb_strlen pove dolžino niza
+ $log .= "Dolg URL je predolg. Mora biti krajši od 767 bajtov, drugače lahko pride do napak v podatkovni bazi.\n";
+ $nadaljuj = "ne";
+ $alert .= "<div class=alert>
+ <span class=closebtn onclick=this.parentElement.style.display='none';>&times;</span>
+<b>Napaka vnosa!</b> URL je predolg. Mora biti krajši od 767 bajtov.
+</div><br>"; //drugače lahko pride do napak v SQL bazi podatkov
+} else {
+ $log .= "Dolg URL ni predolg. To je v redu.\n";
+}
+
+if($nadaljuj == "ja") { //nadaljuj z sql stvarmi, samo, če so zgornji pogoji zadostni
+
+//preveri, če kratek niz že obstaja
+$safeshort = mysqli_real_escape_string($conn, $_REQUEST['short']);
+$query = "SELECT * from `".$tabela."` where `short`='".$safeshort."';";
+$result = mysqli_query($conn, $query);
+if(mysqli_num_rows($result) > 0) {
+ $alert .= "<div class=alert>
+ <span class=closebtn onclick=this.parentElement.style.display='none';>&times;</span>
+<b>Napaka!</b> Krajšalni tekst že obstaja v podatkovni bazi. Izberite drugega.
+</div><br>";
+ $log .= "Krajševalni tekst že obstaja v podatkovni bazi, zato ne morem nadaljevati.\n";
+ $nadaljuj = "ne";
+} else {
+ $log .= "Krajševalni tekst še ne obstaja v podatkovni bazi. To je v redu.\n";
+}
+
+// preveri, če dolg niz že obstaja
+$safelong = mysqli_real_escape_string($conn, $_REQUEST['long']);
+$query = "SELECT `short` from `".$tabela."` where `long`='".$safelong."';";
+$result = mysqli_query($conn, $query);
+if(mysqli_num_rows($result) > 0) {
+ // echo array_pop(mysqli_fetch_row($result); //debug //to je to!
+ $kratekkiobstaja = array_pop(mysqli_fetch_row($result)); //to je to!
+ $alert .= "<div class=alert>
+ <span class=closebtn onclick=this.parentElement.style.display='none';>&times;</span>
+<b>Napaka!</b> Dolg URL že obstaja v podatkovni bazi. Nanj kaže <b>".$domena."/".htmlspecialchars($kratekkiobstaja)."</b>
+</div><br>";
+ $log .= "Dolg URL že obstaja v podatkovni bazi, zato ne morem nadaljevati.\n";
+ $nadaljuj = "ne";
+} else {
+ $log .= "Dolg URL še ne obstaja v podatkovni bazi. To je v redu.\n";
+}
+
+ /*
+//idk ne dela -- v redu, vem zakaj: podpičje manjka! jaoooo in še `'" jaooooo sql nima ", ' je za nize, ` je za stolpce, tabele,...
+$prepared = mysqli_prepare($conn, "SELECT * FROM ".$tabela." WHERE short=?");
+// var_dump(mysqli_error($conn)); //debug
+$binded = mysqli_stmt_bind_param($prepared, "s", $_REQUEST['short']);
+// echo $binded; //debug
+$executed = mysqli_stmt_execute($prepared);
+echo $executed; //debug
+$binded_result = mysqli_stmt_bind_result($prepared, $rezultat);
+echo $rezultat; //debug
+$fetched = mysqli_stmt_fetch($prepared);
+echo $fetched; //debug
+$result = mysqli_query($conn, $prepared);
+echo mysqli_error($conn); //debug
+if(mysqli_num_rows($result) == 0) {
+ $log .= "Krajševalni tekst še ne obstaja v podatkovni bazi. To je v redu.\n";
+} else {
+ $alert .= "<div class=alert>
+ <span class=closebtn onclick=this.parentElement.style.display='none';>&times;</span>
+<b>Napaka!</b> Krajšalni tekst že obstaja v podatkovni bazi. Izberite drugega.
+</div><br>";
+ $log .= "Krajševalni tekst že obstaja v podatkovni bazi, zato ne morem nadaljevati.\n";
+ $nadaljuj = "ne";
+}
+
+//preverjanje, če krajševalni niz že obstaja
+$prepared = mysqli_prepare($conn, "SELECT * FROM ".$tabela." WHERE long=?");
+// echo mysqli_error($conn); //debug
+mysqli_stmt_bind_param($prepared, "s", $_REQUEST['long']);
+$result = mysqli_query($conn);
+if(mysqli_num_rows($result) == 0) {
+ $log .= "Dolg URL še ne obstaja v podatkovni bazi. To je v redu.\n";
+} else {
+ $alert .= "<div class=alert>
+ <span class=closebtn onclick=this.parentElement.style.display='none';>&times;</span>
+<b>Napaka!</b> Dolg URL že obstaja v podatkovni bazi. Nanj vodi <b>".$domena."/".htmlspecialchars($result)."</b>.
+</div><br>";
+ $log .= "Dolg URL že obstaja v podatkovni bazi, zato ne morem nadaljevati. Nanj vodi ".$domena."/".htmlspecialchars($result).".\n";
+ $nadaljuj = "ne";
+}
+*/
+}
+
+
+
+
+if($nadaljuj !== "ja") {
+ $log .= "URL ni bil okrajšan. Glej napake zgoraj!";
+} else {
+$query = "INSERT INTO `".$tabela."` (`short`, `long`) VALUES ('".$safeshort."','".$safelong."');";
+$result = mysqli_query($conn, $query);
+// var_dump(mysqli_error($conn)); //debug
+
+
+ //preveri uspeh
+$query = "SELECT * FROM `".$tabela."` WHERE `short`='".$safeshort."';";
+$result = mysqli_query($conn, $query);
+if(mysqli_num_rows($result) == 0) {
+ // var_dump(mysqli_error($conn)); //debug
+ $alert .= "<div class=alert>
+ <span class=closebtn onclick=this.parentElement.style.display='none';>&times;</span>
+<b>Sistemska napaka!</b> Neznana napaka podatkovne baze.
+</div><br>";
+ $log .= "Neznana napaka podatkovne baze. Glej sistemske dnevnike.\n";
+} else {
+ $alert .= "<div class=alertok>
+ <span class=closebtn onclick=this.parentElement.style.display='none';>&times;</span>
+<b>Uspešno!</b> Šortlink <b>".$domena."/".htmlspecialchars($_REQUEST['short'])."</b> je bil uspešno narejen!
+</div><br>";
+ $log .= "Šortlink ".$domena."/".htmlspecialchars($_REQUEST['short'])." je bil uspešno narejen!\n";
+
+}
+
+
+
+ }
+
+
+
+
+} else {
+ $log .= "Obrazec ni bil izpolnjen, zato samo prikazujem stran.\n";
+}
+
+
+$print .= "
+<style>
+.alert {
+ opacity: 1;
+ transition: opacity 0.6s; /* 600ms za izgine */
+}
+/* Škatla z obvestilom */
+.alert {
+ padding: 20px;
+ background-color: #f44336; /* Rdeča */
+ color: white;
+ margin-bottom: 15px;
+}
+
+.alertok {
+ padding: 20px;
+ background-color: #43f436; /* Zelena */
+ color: white;
+ margin-bottom: 15px;
+}
+
+/* Gumb za zapreti */
+.closebtn {
+ margin-left: 15px;
+ color: white;
+ font-weight: bold;
+ float: right;
+ font-size: 22px;
+ line-height: 20px;
+ cursor: pointer;
+ transition: 0.3s;
+}
+
+/* Ko je miška pod gumbom za zapreti */
+.closebtn:hover {
+ color: black;
+}
+</style>
+
+<script>
+// Dobi vse elemente z class=closebtn
+var close = document.getElementsByClassName('closebtn');
+var i;
+
+// Pojdi čez vse gumbe za zapreti
+for (i = 0; i < close.length; i++) {
+ // Ko je gumb kliknjen
+ close[i].onclick = function(){
+
+ // Dobi starša od <span class=closebtn> (<div class=alert>)
+ var div = this.parentElement;
+
+ // Nastavi -prosojnost div-a na 0 (prozorna)
+ div.style.opacity = 0;
+
+ // Skrij div po 600ms (Ko izgine, izginotje je definirano tudi v CSS-ju)
+ setTimeout(function(){ div.style.display = 'none'; }, 600);
+ }
+}
+</script>
+
+";
+$print .= "
+<title>ŠortLink Balkan</title>
+<h1 align=center>ŠortLink Balkan</h1>
+<h2 align=center>Ste kdaj hoteli narediti iz dolgega linka ŠortLink tako, da bi izgledal bolj balkansko?</h2>
+<h2 align=center>Tudi če niste, je tukaj ŠortLink Balkan, edini Link Šortener, namenjen predvsem slovanskim narodom,saj za njegovo uporabo potrebujete črko Š!</h2>
+<h3 align=center>Vsi Šortani linki se bodo začeli z š.ga, na primer š.ga/tekst. Najs ane?</h3>
+<div align=center>
+<form method=POST action=''>
+ <input type=url name=long placeholder='Vpiši dolg URL ...' required=required align=center><br>
+ ".$domena."/<input type=text name=short placeholder='Vpiši krajšalnico ...' required=required align=center><br>
+ <img id=captcha src=/securimage/securimage_show.php alt='Dostop samo ljudem. Prepiši znake iz slike, da potrdiš, da nisi program.' align=center /><br>
+ <input type=text name=captcha_code size=10 maxlength=6 align=center/><br>
+ <input type=submit name=submit value=Skrajšaj! align=center>
+</form>
+<br><small align=center>
+ŠortLink Balkan za svoje delovanje potrebuje in uporablja sejne piškotke. Z uporabo storitve se strinajte z shranjevanjem piškotkov
+v vaš brskalnik za največ 24 minut. Piškotek se uporablja samo za interni namen, torej za to, da izvemo katere črke si imel na preverjanju za ljudi (CAPTCHA)
+in nikakor ne za namene vohunjenja (tracking cookies). Piškotki so vidni samo na domeni š.ga, torej samo našemu strežniku. To sporočilo smo vam po veljavnem EU
+zakonu morali pokazati, ker sta Hrvaška in Slovenija v Evropski Uniji in morata zato upoštevati te glupe zakone.
+</small>
+</div>
+";
+$print .= "
+<h4 align=center>Ker še nisem sprogramiral, ŠortLink Balkan še ne deluje. Ne uporabljaj ga, ker ne bo nič naredil.</h4>";
+
+
+
+
+echo "<pre>" . $log . "</pre>"; // zakomentiraj to vrstico, da dnevnika ne boš prikazal, ali pa samo naredi HTML komentar, da lahko v sili še vedno pogledaš
+echo $print;
+echo $alert;
+?>