lua
Unterschiede
Hier werden die Unterschiede zwischen zwei Versionen angezeigt.
| Beide Seiten der vorigen RevisionVorhergehende ÜberarbeitungNächste Überarbeitung | Vorhergehende Überarbeitung | ||
| lua [2016-10-18 09:51:11] – [LighttpD + Lua] manfred | lua [2017-05-19 14:03:15] (aktuell) – manfred | ||
|---|---|---|---|
| Zeile 1: | Zeile 1: | ||
| + | ====== Lua ====== | ||
| + | |||
| + | * [[http:// | ||
| + | * [[https:// | ||
| + | * [[https:// | ||
| + | * [[http:// | ||
| + | * **[[http:// | ||
| + | |||
| + | Lua wurde 1993 von der Computer Graphics Technology Group der Päpstlichen Katholischen Universität von Rio de Janeiro in Brasilien entwickelt. Lua ist freie Software und wurde bis zur Version 4 unter einer eigenen BSD-Lizenz veröffentlicht, | ||
| + | |||
| + | Lua kann sowohl zur Erstellung eigenständiger Programme verwendet werden als auch als eingebettete Sprache dienen. | ||
| + | |||
| + | |||
| + | ===== Einführung ===== | ||
| + | |||
| + | * [[https:// | ||
| + | * [[https:// | ||
| + | * [[http:// | ||
| + | * [[https:// | ||
| + | * [[http:// | ||
| + | * [[http:// | ||
| + | |||
| + | |||
| + | ==== ==== | ||
| + | |||
| + | * [[https:// | ||
| + | |||
| + | <file lua lua_start.lua> | ||
| + | local parameter = " | ||
| + | print(" | ||
| + | |||
| + | local pfaddatei = ("/ | ||
| + | print(" | ||
| + | |||
| + | datei = assert (io.popen (pfaddatei)) | ||
| + | print (" | ||
| + | |||
| + | ausgabe = datei:read (" | ||
| + | print (" | ||
| + | |||
| + | for line in io.lines(pfaddatei) do print (line) end | ||
| + | |||
| + | local myFile = io.open( pfaddatei, " | ||
| + | dateigroesse = (myFile: | ||
| + | print ("die Datei ist so groß: " .. dateigroesse) | ||
| + | </ | ||
| + | |||
| + | > lua lua_start.lua | ||
| + | Parameter: | ||
| + | Kammando: | ||
| + | Temp-Datei-Händler: | ||
| + | Rückgabewert: | ||
| + | |||
| + | |||
| + | ===== Argumentenübergabe ===== | ||
| + | |||
| + | <file lua / | ||
| + | print(' | ||
| + | print(arg[0]) | ||
| + | print() | ||
| + | print(' | ||
| + | print(arg[1]) | ||
| + | print() | ||
| + | print(' | ||
| + | print(...) | ||
| + | </ | ||
| + | |||
| + | Beispiel: | ||
| + | > lua / | ||
| + | eigener Skriptname wird ausgegeben: | ||
| + | / | ||
| + | | ||
| + | erstes Argument wird ausgegeben: | ||
| + | 0 | ||
| + | | ||
| + | alle Argumente werden ausgegeben: | ||
| + | 0 | ||
| + | |||
| + | |||
| + | ===== Datenbankzugriff ===== | ||
| + | |||
| + | * [[https:// | ||
| + | * [[https:// | ||
| + | - '' | ||
| + | * [[https:// | ||
| + | * [[https:// | ||
| + | - '' | ||
| + | * [[http:// | ||
| + | - '' | ||
| + | - '' | ||
| + | * [[https:// | ||
| + | |||
| + | <file lua / | ||
| + | local dbConf = {} | ||
| + | dbConf.database = ' | ||
| + | dbConf.username = ' | ||
| + | dbConf.passwort = ' | ||
| + | dbConf.hostname = ' | ||
| + | dbConf.port = " | ||
| + | |||
| + | require(" | ||
| + | luasql = require(" | ||
| + | |||
| + | local env = assert(luasql.mysql()) | ||
| + | local con = assert(env: | ||
| + | |||
| + | |||
| + | function rows (connection, | ||
| + | local cursor = assert (connection: | ||
| + | return function () | ||
| + | return cursor: | ||
| + | end | ||
| + | end | ||
| + | |||
| + | |||
| + | for id, name, address in rows (con, " | ||
| + | -- " | ||
| + | print (string.format ("%s: %s", id, name)) | ||
| + | end | ||
| + | |||
| + | |||
| + | con:close() | ||
| + | env:close() | ||
| + | </ | ||
| + | |||
| + | ausführen | ||
| + | > lua / | ||
| + | |||
| + | |||
| + | ===== LighttpD + Lua ===== | ||
| + | |||
| + | * [[https:// | ||
| + | * [[https:// | ||
| + | |||
| + | Voraussetzungen: | ||
| + | * mod_magnet | ||
| + | * Lua (v5.1; lighttpd 1.4.40+ should also support v5.2 and v5.3) [[http:// | ||
| + | |||
| + | <file bash / | ||
| + | $HTTP[" | ||
| + | magnet.attract-physical-path-to = ( "/ | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | <file lua / | ||
| + | datei = io.open("/ | ||
| + | datei: | ||
| + | datei: | ||
| + | datei: | ||
| + | datei: | ||
| + | datei: | ||
| + | datei: | ||
| + | datei: | ||
| + | datei: | ||
| + | </ | ||
| + | |||
| + | > cat / | ||
| + | uri.authority: | ||
| + | uri.path: /test.php | ||
| + | uri.path-raw: | ||
| + | uri.scheme: https | ||
| + | physical.path: | ||
| + | physical.rel-path: | ||
| + | physical.doc-root: | ||
| + | |||
| + | |||
| + | ==== MySQL-Auth mit LighttpD ==== | ||
| + | |||
| + | Leider gibt es für LighttpD kein Modul um die Passwortabfrage auf eine DB zu realisieren, | ||
| + | |||
| + | * [[https:// | ||
| + | |||
| + | __Die Dateien, die Passwörter enthalten, dürfen nicht für die Welt lesbar sein!__ | ||
| + | > chown 33:33 / | ||
| + | > chmod 0640 / | ||
| + | |||
| + | Die individuellen Daten sehen wie folgt aus, sie können (und müssen) den persönlichen Gegebenheiten angepasst werden: | ||
| + | * **zu schützender Web-Server: | ||
| + | * **Datenbank-Server mit den Passwörtern: | ||
| + | * **Datenbank-Port: | ||
| + | * **Passwort-Datenbank-Name: | ||
| + | * **Passwort-Tabellenname in der Passwort-Datenbank: | ||
| + | * **es müssen mindestens diese beiden Spalten in der Tabelle vorhanden sein:** '' | ||
| + | * **Passwort-Verschlüsselung: | ||
| + | * **das " | ||
| + | |||
| + | <file lighttpd / | ||
| + | # bei Zugriffen auf diesen Web-Server soll das LUA-Skript aktiviert werden | ||
| + | $HTTP[" | ||
| + | magnet.attract-physical-path-to = ( "/ | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | <file lua / | ||
| + | -- nur "/ | ||
| + | if ( string.format(' | ||
| + | |||
| + | -- Passwörter dürfen nur per https eingegeben werden | ||
| + | if (lighty.env[" | ||
| + | lighty.header[" | ||
| + | return 302 | ||
| + | end | ||
| + | |||
| + | --[[ | ||
| + | Config Variables | ||
| + | ]] | ||
| + | local dbConf = {} | ||
| + | dbConf.database = ' | ||
| + | dbConf.username = ' | ||
| + | dbConf.passwort = ' | ||
| + | dbConf.hostname = ' | ||
| + | dbConf.port = " | ||
| + | |||
| + | --[[ | ||
| + | Requires | ||
| + | ]] | ||
| + | |||
| + | -- Debian package: liblua5.1-socket2 | ||
| + | |||
| + | -- required for Base64 De-/ | ||
| + | require(" | ||
| + | |||
| + | -- Debian package: liblua5.1-sql-mysql-2 | ||
| + | |||
| + | -- Lua Mysql Driver | ||
| + | luasql = require(" | ||
| + | |||
| + | --[[ | ||
| + | Function to send HTTP-Auth request | ||
| + | ]] | ||
| + | |||
| + | function doAuth() | ||
| + | lighty.header[" | ||
| + | return 401 | ||
| + | end | ||
| + | |||
| + | --[[ | ||
| + | Function to check Auth Creds against MySQL Database | ||
| + | ]] | ||
| + | local env = assert(luasql.mysql()) | ||
| + | local con = assert(env: | ||
| + | dbConf.database | ||
| + | , | ||
| + | , | ||
| + | , | ||
| + | , | ||
| + | )) | ||
| + | |||
| + | function checkAuthMySQL(user, | ||
| + | local res = con: | ||
| + | SELECT * | ||
| + | FROM `pwtab` | ||
| + | WHERE `name` = ' | ||
| + | AND `passwort` = ' | ||
| + | ]], user, pass) | ||
| + | ) | ||
| + | |||
| + | -- Die Tabelle wir in ein Array gespeichert | ||
| + | local row = res:fetch ({}, " | ||
| + | |||
| + | -- print(type(row)) | ||
| + | |||
| + | |||
| + | -- close everything | ||
| + | -- res: | ||
| + | con:close() | ||
| + | -- env:close() | ||
| + | |||
| + | |||
| + | if (not row) then | ||
| + | return false | ||
| + | else | ||
| + | lighty.req_env[' | ||
| + | return true | ||
| + | end | ||
| + | end | ||
| + | |||
| + | |||
| + | -- MAIN | ||
| + | |||
| + | --[[ | ||
| + | Check for Authorization Header | ||
| + | and force Basic Auth if not set. | ||
| + | ]] | ||
| + | |||
| + | if (not lighty.request.Authorization) then | ||
| + | return doAuth() | ||
| + | end | ||
| + | |||
| + | --[[ | ||
| + | Header found: check string for " | ||
| + | - upb = User Password Base64 encoded | ||
| + | ]] | ||
| + | _, _, upb = string.find(lighty.request.Authorization, | ||
| + | up = mime.unb64(upb) -- Base64 Decode | ||
| + | _, _, username, passwort = string.find(up, | ||
| + | |||
| + | |||
| + | -- ============================================================================= | ||
| + | -- In der DB steht das Passwort nicht im klartext drin, sondern verschlüsselt | ||
| + | -- deshalb muss auch der Passwort-Hash und nicht das Passwort verglichen werden. | ||
| + | -- | ||
| + | -- hier wird aus dem Passwort der Passwort-Hash generiert | ||
| + | -- | ||
| + | |||
| + | local kommando = ("/ | ||
| + | ausgabe = assert (io.popen (kommando)) | ||
| + | pwhash = ausgabe: | ||
| + | |||
| + | -- ============================================================================= | ||
| + | |||
| + | if (not checkAuthMySQL(username, | ||
| + | return doAuth() | ||
| + | end | ||
| + | |||
| + | |||
| + | end | ||
| + | |||
| + | -- return nothing to proceed normal operation | ||
| + | return | ||
| + | |||
| + | </ | ||
| + | |||
| + | Leider gibt es nur für eine [[in LUA native SHA256-Verschlüsselung|SHA256-Verschlüsselung]] eine native LUA-Umsetzung. | ||
| + | Für SHA512 müssen wir uns eines externen Programmes (in diesem Fall ein PHP-Skript) bedienen. | ||
| + | |||
| + | <file php / | ||
| + | <?php | ||
| + | $salt = ' | ||
| + | echo hash(' | ||
| + | ?> | ||
| + | </ | ||
