[[oktatas:programozás:php|< PHP]]
====== PHP Űrlapfeldolgozás ======
* **Szerző:** Sallai András
* Copyright (c) Sallai András, 2011, 2014
* Licenc: GNU Free Documentation License 1.3
* Web: http://szit.hu
===== Űrlap =====
===== A GET és a POST metódus =====
==== A metódusokról ====
Az böngésző egy űrlap tartalmát két módon küldheti el a webszervernek:
* GET metódus
* POST metódus
A legszembetűnőbb, hogy a GET metódus használata esetén az átadott paraméterek
a böngésző címsorában is látszanak. A POST metódus esetén, nem.
==== Az URL maximális hossza ====
A HTTP protokoll nem határozza meg egy URL hosszát.
^ A böngészők adatai ^^^^^
^ IE ^ Firefox ^ Safari ^ Opera ^ Chrome ^
| 2048 | 65 536 | 80 000 | 190000 | ? |
^ Webszerverek ^^^
^ Apache ^ IIS ^ Perl HTTP::Daemon ^
| 4000 \\ alapértelmezetten | 16 384 | 8000 |
A w3schools 2048 karakterben adja meg maximumot.
Nagy Gusztáv a könyvében 2000 körül adja meg a határt.
A W3C konzorcium a 256 karakteres határt weboldalukon
tévhitként kezeli, amelyet néhány webszerveren beállított
limit miatt vált ismerté, a denial-of-service támadások
korlátozására.
Az apache webszerveren a LimitRequestLine direktíva szolgál
az érték beállítására. Használatára két példa:
LimitRequestLine 4094
LimitRequestLine 8190
1855 karakteres URL:
* http://www.seomofo.com/experiments/title-and-h1-of-this-post-but-for-the-sake-of-keyword-prominence-stuffing-im-going-to-mention-it-again-using-various-synonyms-stemmed-variations-and-of-coursea-big-fat-prominent-font-size-heres-the-stumper-that-stumped-me-what-is-the-max-number-of-chars-in-a-url-that-google-is-willing-to-crawl-and-index-for-whatever-reason-i-thought-i-had-read-somewhere-that-googles-limit-on-urls-was-255-characters-but-that-turned-out-to-be-wrong-so-maybe-i-just-made-that-number-up-the-best-answer-i-could-find-was-this-quote-from-googles-webmaster-trends-analyst-john-mueller-we-can-certainly-crawl-and-index-urls-over-1000-characters-long-but-that-doesnt-mean-that-its-a-good-practice-the-setup-for-this-experiment-is-going-to-be-pretty-simple-im-going-to-edit-the-permalink-of-this-post-to-be-really-really-long-then-im-going-to-see-if-google-indexes-it-i-might-even-see-if-yahoo-and-bing-index-iteven-though-no-one-really-cares-what-those-assholes-are-doing-url-character-limits-unrelated-to-google-the-question-now-is-how-many-characters-should-i-make-the-url-of-this-post-there-are-a-couple-of-sources-ill-reference-to-help-me-make-this-decision-the-first-is-this-quote-from-the-microsoft-support-pages-microsoft-internet-explorer-has-a-maximum-uniform-resource-locator-url-length-of-2083-characters-internet-explorer-also-has-a-maximum-path-length-of-2048-characters-this-limit-applies-to-both-post-request-and-get-request-urls-the-second-source-ill-cite-is-the-http-11-protocol-which-says-the-http-protocol-does-not-place-any-a-priori-limit-on-the-length-of-a-uri-servers-must-be-able-to-handle-the-uri-of-any-resource-they-serve-and-should-be-able-to-handle-uris-of-unbounded-length-if-they-provide-get-based-forms-that-could-generate-such-uris-a-server-should-return-414-request-uri-too-long-status-if-a-uri-is-longer.html
^ ^ GET ^ POST ^
| Adathossz-korlát | maximum 2048 | Nincs korlátozás |
| Kedvencek | Kedvencekbe tehető | A kedvencekben nem menthető |
| Vissza gomb/frissítés | Nincs | Az adatok újra elküldésre kerülnek |
| Kódolás | application/x-www-form-urlencoded | application/x-www-form-urlencoded \\ multipart/form-data \\ bináris adatok számára multipart kódolás |
| Előzmények | A paraméterek megmaradnak \\ az előzményben | A paraméterek nem \\ szerepelnek az előzményben. |
| Adattípus-korlát | csak ASCII | Nincs korlátozás, \\ bináris adat is megengedett |
| Biztonság | A paraméterek \\ látszanak az URL-ben | Paraméterek nem látszanak, \\ nem tárolódnak, és \\ az előzményekben sem szerepelnek |
===== Űrlap feldolgozó =====
$valasz = $_POST['nem'];
Annak ellenőrzése, hogy tartalmaz-e értéket egy változó:
empty($_POST["nev"])
empty($_GET["nev"])
if(empty($_GET['valami'])) {
echo "Nincs ilyen";
}
===== Fájlfeltöltés =====
==== Űrlap ====
$_FILES["file"]["name"] - A feltöltött fájl neve.
$_FILES["file"]["type"] - A feltöltött fájl típusa.
$_FILES["file"]["size"] - A feltöltött fájl mérete byte-okban.
$_FILES["file"]["tmp_name"] - Az ideiglenes fájl neve, amelyen a szerveren tárolásra kerül.
$_FILES["file"]["error"] - A feltöltés ezzel a kóddal tér vissza hiba esetén.
==== Fogadó script ====
0)
{
echo "Hiba: " . $_FILES["file"]["error"] . "
";
}
else
{
echo "Feltöltés: " . $_FILES["file"]["name"] . "
";
echo "Típus: " . $_FILES["file"]["type"] . "
";
echo "Méret: " . ($_FILES["file"]["size"] / 1024) . " Kb
";
echo "Tárolva itt: " . $_FILES["file"]["tmp_name"];
}
?>
==== Feldolgozó script korlátozásokkal ====
Feltöltő
EOT;
$allowedExts = array("jpg", "jpeg", "gif", "png");
$extension = end(explode(".", $_FILES["kepfile"]["name"]));
if(empty($_FILES["kepfile"]["name"]))
{
echo "Nem adtál meg fájlt!";
}
else
{
if (!(
($_FILES["kepfile"]["type"] == "image/gif") ||
($_FILES["kepfile"]["type"] == "image/jpeg") ||
($_FILES["kepfile"]["type"] == "image/pjpeg") ||
($_FILES["kepfile"]["type"] == "image/png"))
)
{
echo "Tiltott fájltípus";
}
else
{
if (!($_FILES["kepfile"]["size"] < 20000))
{
echo "Túl nagy fájlméret";
}
else
{
if(!in_array($extension, $allowedExts))
{
echo "Tiltott kiterjesztés";
}
else
{
if ($_FILES["kepfile"]["error"] > 0)
{
echo "Hiba: " . $_FILES["kepfile"]["error"] . "
";
}
else
{
echo "Feltöltés: " . $_FILES["kepfile"]["name"] . "
";
echo "Típus: " . $_FILES["kepfile"]["type"] . "
";
echo "Méret: " . ($_FILES["kepfile"]["size"] / 1024) . " Kb
";
echo "Eltárolva itt: " . $_FILES["kepfile"]["tmp_name"];
}
}
}
}
}
print "";
?>
==== Feltöltött fájl elmentése ====
Feltöltő
EOT;
$allowedExts = array("jpg", "jpeg", "gif", "png");
$extension = end(explode(".", $_FILES["kepfile"]["name"]));
if(empty($_FILES["kepfile"]["name"]))
{
echo "Nem adtál meg fájlt!";
}
else
{
if (!(
($_FILES["kepfile"]["type"] == "image/gif") ||
($_FILES["kepfile"]["type"] == "image/jpeg") ||
($_FILES["kepfile"]["type"] == "image/pjpeg") ||
($_FILES["kepfile"]["type"] == "image/png"))
)
{
echo "Tiltott fájltípus";
}
else
{
if (!($_FILES["kepfile"]["size"] < 200000))
{
echo "Túl nagy fájlméret";
}
else
{
if(!in_array($extension, $allowedExts))
{
echo "Tiltott kiterjesztés";
}
else
{
if ($_FILES["kepfile"]["error"] > 0)
{
echo "Hiba: " . $_FILES["kepfile"]["error"] . "
";
}
else
{
echo "Feltöltés: " . $_FILES["kepfile"]["name"] . "
";
echo "Típus: " . $_FILES["kepfile"]["type"] . "
";
echo "Méret: " . ($_FILES["kepfile"]["size"] / 1024) . " Kb
";
echo "Ideiglenesen tárolva itt: " . $_FILES["kepfile"]["tmp_name"]."
";
if (file_exists("upload/" . $_FILES["kepfile"]["name"]))
{
echo "A " .$_FILES["kepfile"]["name"] . " fájl már létezik. ";
}
else
{
move_uploaded_file($_FILES["kepfile"]["tmp_name"], "upload/"
. $_FILES["kepfile"]["name"]);
echo "Végleg tárolva itt: " . "upload/" . $_FILES["kepfile"]["name"];
}
}
}
}
}
}
print "";
?>
Esetleg így:
Feltöltő
EOT;
$maxmeret = 20000;
$allowedExts = array("jpg", "jpeg", "gif", "png");
$extension = end(explode(".", $_FILES["kepfile"]["name"]));
if(empty($_FILES["kepfile"]["name"]))
{
echo "Nem adtál meg fájlt!";
}
else
{
$upload = true;
if (!(
($_FILES["kepfile"]["type"] == "image/gif") ||
($_FILES["kepfile"]["type"] == "image/jpeg") ||
($_FILES["kepfile"]["type"] == "image/pjpeg") ||
($_FILES["kepfile"]["type"] == "image/png"))
)
{
echo "Tiltott fájltípus
";
$upload = false;
}
if ($_FILES["kepfile"]["size"] > $maxmeret)
{
echo "Túl nagy fájlméret
";
$upload = false;
}
if(!in_array($extension, $allowedExts))
{
echo "Tiltott kiterjesztés
";
$upload = false;
}
if ($upload)
{
if ($_FILES["kepfile"]["error"] > 0)
{
echo "Hiba: " . $_FILES["kepfile"]["error"] . "
";
$upload = false;
}
else
{
echo "Feltöltés: " . $_FILES["kepfile"]["name"] . "
";
echo "Típus: " . $_FILES["kepfile"]["type"] . "
";
echo "Méret: " . ($_FILES["kepfile"]["size"] / 1024) . " Kb
";
echo "Ideiglenesen tárolva itt: " . $_FILES["kepfile"]["tmp_name"]."
";
}
if (file_exists("upload/" . $_FILES["kepfile"]["name"]))
{
echo "A " .$_FILES["kepfile"]["name"] . " fájl már létezik.
";
}
else
{
move_uploaded_file($_FILES["kepfile"]["tmp_name"], "upload/"
. $_FILES["kepfile"]["name"]);
echo "Végleg tárolva itt: " . "upload/" . $_FILES["kepfile"]["name"]."
";
}
}
}
print "";
?>
Ugyanaz átrendezve:
Feltöltő
EOT;
$allowedExts = array("jpg", "jpeg", "gif", "png");
$extension = end(explode(".", $_FILES["kepfile"]["name"]));
if(empty($_FILES["kepfile"]["name"])) {
echo "Nem adtál meg fájlt!";
}elseif (!(
($_FILES["kepfile"]["type"] == "image/gif") ||
($_FILES["kepfile"]["type"] == "image/jpeg") ||
($_FILES["kepfile"]["type"] == "image/pjpeg") ||
($_FILES["kepfile"]["type"] == "image/png"))
) {
echo "Tiltott fájltípus";
}elseif (!($_FILES["kepfile"]["size"] < 200000)) {
echo "Túl nagy fájlméret";
}elseif(!in_array($extension, $allowedExts)) {
echo "Tiltott kiterjesztés";
}elseif ($_FILES["kepfile"]["error"] > 0) {
echo "Hiba: " . $_FILES["kepfile"]["error"] . "
";
}else {
echo "Feltöltés: " . $_FILES["kepfile"]["name"] . "
";
echo "Típus: " . $_FILES["kepfile"]["type"] . "
";
echo "Méret: " . ($_FILES["kepfile"]["size"] / 1024) . " Kb
";
echo "Ideiglenesen tárolva itt: " . $_FILES["kepfile"]["tmp_name"]."
";
if (file_exists("upload/" . $_FILES["kepfile"]["name"])) {
echo "A " .$_FILES["kepfile"]["name"] . " fájl már létezik. ";
}else {
move_uploaded_file($_FILES["kepfile"]["tmp_name"], "upload/"
. $_FILES["kepfile"]["name"]);
echo "Végleg tárolva itt: " . "upload/" . $_FILES["kepfile"]["name"];
}
}
print "";
==== Egyéb ====
Esetleg tegyük a feltöltéskönyvtárat változóba:
$uploaddir = '/var/www/uploads/';
$uploadfile = $uploaddir . basename($_FILES['userfile']['name']);
Esetleg megvizsgálhatjuk a mentés sikerességét:
if (move_uploaded_file($_FILES['userfile']['tmp_name'], $uploadfile)) {
echo "A fájl érvényes és sikeresen feltöltésre került\n";
} else {
echo "Lehetséges fájlfeltöltés támadás!\n";
}
==== Időfeldolgozás ====
Az input elem date típusát így használjuk:
Ha megkapjuk dátumot egy másik PHP scriptben, annak formátuma:
2020-01-10T18:00:00.000Z
Ha adatbázisba akarjuk írni, át kell alakítani:
$date = $_POST['date'];
$standardDate("Y-m-d H:i:s", strtotime($date));
$sql="insert into tabla1 set date=$standardDate";
===== Önmagát hívó script =====
A script vár egy számot, majd mindig eltárolja.
Összeg: $osszeg
EOT;
Vegyük észre, hogy a form elemnek nincs action tulajdonsága.
===== Forrás =====
* http://www.faqs.org/rfcs/rfc2068.html (2014)
* http://www.boutell.com/newfaq/misc/urllength.html (2014)
* http://stackoverflow.com/questions/812925/what-is-the-maximum-possible-length-of-a-query-string (2014)
* http://www.w3schools.com/tags/ref_httpmethods.asp (2014)
* http://www.w3.org/2001/tag/doc/get7#myths (2014)
* http://httpd.apache.org/docs/2.2/mod/core.html#limitrequestline (2014)