Flucht MYSQL-Befehl-Linien via Bash-Skript
PHP mysql_real_escape_string()
korrekt escape-Zeichen, die Probleme verursachen könnte. Was ist die beste Art und Weise zu imitieren, um diese Funktionalität für die BASH?
Ist es eh zu tun bereit mysql-Anweisungen mithilfe von bash? Dies scheint der beste Weg zu sein.
Meisten meiner Variablen nicht (sollte nicht) haben Sonderzeichen, jedoch gebe ich dem user die komplette Freiheit für Ihr Passwort. Es kann auch Zeichen wie ' und ".
Ich tun kann mehrere SQL-Anweisungen, so werde ich wollen, um ein Skript zu erstellen, dass nimmt in den Parametern und dann läuft die Anweisung. Dies ist, was ich habe, so weit:
doSQL.sh:
#!/bin/sh
SQLUSER="root"
SQLPASS="passwor339c"
SQLHOST="localhost"
SQL="$1"
SQLDB="$2"
if [ -z "$SQL" ]; then echo "ERROR: SQL not defined"; exit 1; fi
if [ -z "$SQLDB" ]; then SQLDB="records"; fi
echo "$SQL" | mysql -u$SQLUSER -p$SQLPASS -h$SQLHOST $SQLDB
und ein Beispiel zur Verwendung von Sprach-Befehl:
example.sh:
PASSWORD=$1
doSQL "INSERT INTO active_records (password) VALUES ('$PASSWORD')"
Offensichtlich dieses scheitern würden, wenn die das Passwort enthalten ein einziges Zitat.
InformationsquelleAutor ParoX | 2010-12-08
Du musst angemeldet sein, um einen Kommentar abzugeben.
In der Bash,
printf
tun können, die die Flucht für Sie:Werde ich überlasse es Ihnen zu entscheiden, wenn das aggressiv genug.
a
variable.Es funktioniert für mich:
a='$#'; printf ...; echo ...
gibt mir\$#
. Was bekommen Sie? Ich kann nicht sagen, wie es "scheint zu scheitern", es sei denn, Sie sagen mir.Ich erkannte, es war interpolierende $#, weil ich mit double-quotes.
Sie haben Probleme, wenn die Flucht utf8-Zeichen, wird es geben \302240 für die utf , und es kann Ihnen eine Menge ärger.
InformationsquelleAutor Dennis Williamson
Scheint dies ein klassischer Fall von mit dem falschen Werkzeug für den job.
Du hast eine viel Arbeit vor Sie implementieren die Flucht erfolgt durch
mysql_real_escape_string()
in der bash. Beachten Sie, dassmysql_real_escape_string()
tatsächlich delegiert die Flucht in die MySQL-Bibliothek die berücksichtigt, die Verbindungs-und Datenbank-Zeichensätze. Es nennt sich "real", weil seine Vorgängermysql_escape_string()
hat nicht den Zeichensatz berücksichtigt, und könnte dazu verleiten, SQL-Injektion.Ich würde vorschlagen, über eine scripting-Sprache, die eine MySQL-Bibliothek, wie Ruby, Python oder PHP.
Wenn Sie darauf bestehen, bash, dann verwenden Sie die MySQL Prepared Statements syntax.
Würde prepared statements wirklich einen Unterschied machen? Sie müssen noch Werte übergeben mysql, bevor Sie bereiten eine Anweisung.
InformationsquelleAutor hobodave
mysql_real_escape_string()
natürlich entgeht nur einen einzigen string-literal angegeben werden, nicht die ganze Erklärung. Sie müssen sich im klaren sein, welchen Zweck der string wird verwendet werden, für die in der Anweisung. Laut MySQL-Handbuch Abschnitt auf zeichenfolgenliterale, zum einsetzen in ein string-Feld müssen Sie nur entkommen, Einzel-und doppelte Anführungszeichen, backslashes und NULs. Aber ein bash-string nicht enthalten, eine NULL, so sollte Folgendes ausreichen:Wenn Sie die Zeichenfolge, die nach einer
LIKE
, Sie werden wahrscheinlich auch wollen zu entkommen%
und_
.Prepared statements sind eine weitere Möglichkeit. Und stellen Sie sicher, dass Sie nicht
echo -e
in Ihre bash.Siehe auch https://www.owasp.org/index.php/SQL_Injection_Prevention_Cheat_Sheet
InformationsquelleAutor Cedric Knight
Dieser zu entkommen Apostrophe
Bitte beachten Sie aber, dass mysql_real_escape_string auch entweicht, \x00, \n, \r, \, " und \x1a. Werden Sie sicher, dass auf der Flucht vor diesen für volle Sicherheit.
Flucht \x00 Beispiel:
Mit ein bisschen Mühe kann man wohl die Flucht diese mit einem sed-Befehl.
InformationsquelleAutor bcoughlan
Dies funktionieren wird:
Übergeben Sie es einer Variablen:
InformationsquelleAutor Shouguang Cao