php.de

Zurück   php.de > Webentwicklung > Datenbanken

Datenbanken SQL und Co

Antwort
 
LinkBack Themen-Optionen Thema bewerten
Alt 03.01.2012, 13:39  
Neuer Benutzer
 
Registriert seit: 03.01.2012
Beiträge: 6
PHP-Kenntnisse:
Fortgeschritten
boarda befindet sich auf einem aufstrebenden Ast
Standard [Erledigt] MSSQL weigert sich blowfish-verschlüsselte Inhalte anzunehmen.

Hallo Leute,

Leider konnte ich zu meiner Problematik nichts konkretes dazu finden.

Problem:
Ich möchte den Inhalt einer HTML Email verschlüsselt in der MSSQL Datenbank speichern.
Fehler:
Code:
Warning: mssql_query() [function.mssql-query]: message: Line 1: Incorrect syntax near '�'. (severity 15) in C:\Programme\Apache Software Foundation\Apache2.2\htdocs\save.php on line 164
Warning: mssql_query() [function.mssql-query]: message: The identifier that starts with '�x��d....' is too long. Maximum length is 128. (severity 15) in C:\Prog...
Warning: mssql_query() [function.mssql-query]: message: Unclosed quotation mark before the character string 'wq$-�#O�Ѥ!��̊o:�}?(�����Ð���'. (severity 15) in C:\Prog...
Remotesystem:
Win2003 Std, Apache 2.2, Php 5.2.17, MSSQL 2000
Das Feld in der Tabelle ist auf Varchar 5000 gesetzt (der Text als Blowfish sind aktuell 2700 Zeichen).

PHP-Code:
$query_inhalt mcrypt_encrypt(MCRYPT_BLOWFISHBLOWFISHKEY$inhaltMCRYPT_MODE_ECB);
$sql = ("UPDATE pakete SET inhalt = '".$query_inhalt."' WHERE code = '".$code."'");
$query mssql_query($sql
Die Fehlermeldung kommt wohl aufgrund der speziellen Charaktere zustande, sodass die Query schon vorher abbricht und die darin enthaltenen Sonderzeichen als weitere Queryanweisungen interpretiert.

Grüße und ein gutes neues Jahr.

Geändert von boarda (03.01.2012 um 14:17 Uhr). Grund: auf hinweis von eagle querystring korrigiert.
boarda ist offline   Mit Zitat antworten
Sponsor Mitteilung
PHP Code Flüsterer

Registriert seit: 21.08.2005
Beiträge: 4682
PHP-Kenntnisse:
Fortgeschritten

Alt 03.01.2012, 13:50  
Erfahrener Benutzer
 
Registriert seit: 01.09.2010
Beiträge: 4.561
PHP-Kenntnisse:
Fortgeschritten
eagle275 ist ein sehr geschätzer Menscheagle275 ist ein sehr geschätzer Menscheagle275 ist ein sehr geschätzer Mensch
Standard

du musst mindestens erstmal den String-Datenwert im SQL-Befehl in Stringbegrenzer setzen, weil sonst SQL denkt du meinst eine andere Spalte und da knallt es dann
PHP-Code:
$query_inhalt mcrypt_encrypt(MCRYPT_BLOWFISHBLOWFISHKEY$inhaltMCRYPT_MODE_ECB);
$sql = ("UPDATE pakete SET inhalt = '".$query_inhalt."'  WHERE code = '".$code."'");
$query mssql_query($sql
wenn es dann immer noch Probleme gibt, dann musst du das Encoding anständig einstellen
__________________
"Irren ist männlich", sprach der Igel und stieg von der Drahtbürste
eagle275 ist offline   Mit Zitat antworten
Alt 03.01.2012, 14:16  
Neuer Benutzer
 
Registriert seit: 03.01.2012
Beiträge: 6
PHP-Kenntnisse:
Fortgeschritten
boarda befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
Zitat von eagle275 Beitrag anzeigen
PHP-Code:
$query_inhalt mcrypt_encrypt(MCRYPT_BLOWFISHBLOWFISHKEY$inhaltMCRYPT_MODE_ECB);
$sql = ("UPDATE pakete SET inhalt = '".$query_inhalt."'  WHERE code = '".$code."'");
$query mssql_query($sql
Danke für den Hinweis, hatte das wie üblich drin und danach entfernt um zu testen.
Fehlermeldung bleibt Incorrect syntax near '���'.
Nach utf8_decode von $query_inhalt ebenfalls (nur die Zeichen ändern sich auf Fragezeichen bzw andere Ascii's. Oder wie hattest du das mit dem Encoding gemeint?

PHP-Code:
$query_inhalticonv("UTF-8""ISO-8859-1//TRANSLIT"$query_inhalt);
// auch ohne //TRANSLIT 
Konvertierung funktionierte nicht. Es sei angemerkt, dass ich sonst bisher keinerlei Probleme hatte, Daten mit Umlauten und Sonderzeichen zu speichern.

Geändert von boarda (03.01.2012 um 14:28 Uhr).
boarda ist offline   Mit Zitat antworten
Alt 03.01.2012, 14:49  
Erfahrener Benutzer
 
Registriert seit: 01.09.2010
Beiträge: 4.561
PHP-Kenntnisse:
Fortgeschritten
eagle275 ist ein sehr geschätzer Menscheagle275 ist ein sehr geschätzer Menscheagle275 ist ein sehr geschätzer Mensch
Standard

dann ist es offensichtlich, dass dein Blowfish wohl selbst Hochkomma produziert, die vorzeitig den String beenden

für mysql würde ich dir zu mysql_real_escape_string raten

bei mssql muss man selbst Hand anlegen oder aber mit prepared Statements (über eine andere Datenbankerweiterung) arbeiten

PHP-Code:
$query_inhalt mcrypt_encrypt(MCRYPT_BLOWFISHBLOWFISHKEY$inhaltMCRYPT_MODE_ECB);
$fix_str=stripslashes($query_inhalt);
$fix_str=str_replace("'","''",$fix_str);
$fix_str=str_replace("\0","[NULL]",$fix_str);
$sql = ("UPDATE pakete SET inhalt = '".$fix_str."'  WHERE code = '".$code."'");
$query mssql_query($sql); 
versuch es mal damit
__________________
"Irren ist männlich", sprach der Igel und stieg von der Drahtbürste
eagle275 ist offline   Mit Zitat antworten
Alt 03.01.2012, 15:24  
Neuer Benutzer
 
Registriert seit: 03.01.2012
Beiträge: 6
PHP-Kenntnisse:
Fortgeschritten
boarda befindet sich auf einem aufstrebenden Ast
Standard

Danke eagle, dass das Blowfish Hochkomma und Backslashes/Slashes produziert ist und der String vorzeitig beendet wird war mir schon klar gewesen, ist in meinem ursprünglichen Text leider nicht ganz ersichtlich. Allerdings hatte ich nicht an die einfache und logische Lösung des replacen der Inhalte gedacht.
Wenn ich stripslashes verwenden würde, wäre aber der Blowfish Code zerstört - das muss ja auch wieder decrypted werden, habs nun aber für die relevanten Zeichen händisch gemacht und es funktioniert einwandfrei.

Mein Encrypt von HTML > Blowfish > str_replace > MSSQL varchar:
PHP-Code:
$fix_str mcrypt_encrypt(MCRYPT_BLOWFISHBLOWFISHKEY$inhaltMCRYPT_MODE_ECB);
$fix_str=str_replace("\\","BACKSLASH",$fix_str);
$fix_str=str_replace("/","SLASH",$fix_str);
$fix_str=str_replace("'","SNGLUP",$fix_str);
$fix_str=str_replace('"',"DBLUP",$fix_str);
$inhalt_mssql=str_replace("\0","[NULL]",$fix_str); 
Beim Decrypt das ganze in umgekehrter Art:
PHP-Code:
$inhalt_mssql=str_replace("BACKSLASH","\\",$fix_str);
$fix_str=str_replace("SLASH","/",$fix_str);
$fix_str=str_replace("SNGLUP","'",$fix_str);
$fix_str=str_replace("DBLUP",'"',$fix_str);
$fix_str=str_replace("[NULL]","\0",$fix_str);
$inhalt mcrypt_decrypt(MCRYPT_BLOWFISHBLOWFISHKEY$fix_strMCRYPT_MODE_ECB); 
Vielen Dank für die rasche und kompetente Hilfe
boarda ist offline   Mit Zitat antworten
Alt 03.01.2012, 22:19  
Erfahrener Benutzer
 
Benutzerbild von Dark Guardian
 
Registriert seit: 10.10.2009
Beiträge: 2.629
PHP-Kenntnisse:
Fortgeschritten
Dark Guardian ist jedem bekanntDark Guardian ist jedem bekanntDark Guardian ist jedem bekanntDark Guardian ist jedem bekanntDark Guardian ist jedem bekanntDark Guardian ist jedem bekannt
Standard

Kannst du den Blowfish Code nicht noch einfach durch Base64 jagen? Spart dir das Replacen.
__________________
"Alles im Universum funktioniert, wenn du nur weißt wie du es anwenden musst".
Dark Guardian ist gerade online   Mit Zitat antworten
Alt 03.01.2012, 22:22  
Erfahrener Benutzer
 
Registriert seit: 19.06.2009
Beiträge: 837
PHP-Kenntnisse:
Fortgeschritten
Jens Clasen ist einfach richtig nettJens Clasen ist einfach richtig nettJens Clasen ist einfach richtig nettJens Clasen ist einfach richtig nettJens Clasen ist einfach richtig nett
Standard

Da hast Du Dich jetzt aber für die idiotischste Lösung entschieden. Was machst Du, falls Dein Input mal zufällig DBLUP enthält? Mit Deiner Decodierung zerschießt Du Dir da die Daten. Abgesehen davon werden Single-Quotes bei MsSQL gewöhnlich durch zwei aufeinander folgende Quotes maskiert.

Ein weiteres Problem hast Du noch: Von der mssql-Extension ist heutzutage auch weitest gehend abzuraten. Microsoft selbst hat mit sqlserv was neues raus, was sich besser eignet. Alternativ kommt auch PDO in Frage - das kann Prepared Statements und macht Dir auch für Binärdaten das Leben erheblich leichter. Z(Zu Binärdaten sagt Microsoft selbst übrigens kurz und knapp "nicht mit reinem SQL - nimm Prepared Statements für sowas.".

Gruß Jens
Jens Clasen ist offline   Mit Zitat antworten
Alt 04.01.2012, 14:42  
Neuer Benutzer
 
Registriert seit: 03.01.2012
Beiträge: 6
PHP-Kenntnisse:
Fortgeschritten
boarda befindet sich auf einem aufstrebenden Ast
Standard

@Dark_Guardian: Das war des Rätsels Lösung, soetwas schwebte mir von Anfang an vor, hatte davon aber noch nicht gehört.

@Jens: danke man lernt nie aus *idiot*, warum ist von der mssql-Extension abzuraten, kannst du dies bitte spezifizieren?
Soweit ich gesehen habe, bleibt damit die Syntax weitgehend gleich (es gibt nur zb. kein sqlsrv_fetch_assoc , aber mit _array hat man ja quasi das selbe).
Mssql wird von MS nicht mehr weiter unterstützt, womit ich annehme, dass in künftigen Serverversionen nur die sqlserv Extension von Anfang an einwandfrei laufen wird. Hier läuft aber 2003 und MSSQL2000 und dies wird sich auf Kundenseite nicht ändern.
boarda ist offline   Mit Zitat antworten
Alt 04.01.2012, 14:52  
Erfahrener Benutzer
 
Registriert seit: 01.09.2010
Beiträge: 4.561
PHP-Kenntnisse:
Fortgeschritten
eagle275 ist ein sehr geschätzer Menscheagle275 ist ein sehr geschätzer Menscheagle275 ist ein sehr geschätzer Mensch
Standard

das hat weniger mit der "Serverversion" zu tun, sondern mit PHP selbst

sowohl die mysql als auch die mssql-Erweiterung gehören definitiv zum GANZ alten Eisen und werden möglicherweise mit einer folgenden PHP-Version nicht mehr ausgeliefert / verfügbar sein. Die Folge wäre das dein Hoster irgendwann beschließt seine Webserver auf neue Software-Versionen umzustellen und dein Script dann "knallt" weil die Datenbankschnittstelle nicht mehr funktioniert und du dir dann unter erschwerten Bedingungen DANN eine neue Datenbankschnittstelle basteln musst.
Daher wäre es günstiger JETZT schon auf die zukunftssichere PDO-Erweiterung zu setzen, die als neuer PHP-Standard wohl nicht so schnell ausgewechselt wird
Obendrein bietet sie mit prepared Statements ein zeitgemäßes Mittel um sämtliche Escaping-Probleme samt SQL-Injections gleich an der Wurzel zu packen bzw gleich ganz zu verhindern
__________________
"Irren ist männlich", sprach der Igel und stieg von der Drahtbürste
eagle275 ist offline   Mit Zitat antworten
Alt 04.01.2012, 15:10  
Neuer Benutzer
 
Registriert seit: 03.01.2012
Beiträge: 6
PHP-Kenntnisse:
Fortgeschritten
boarda befindet sich auf einem aufstrebenden Ast
Standard

Lt. MSDN: The SQLSRV driver does not support SQL Server 2000
Somit bleiben wir bei dem ganz alten Eisen, da dies die Voraussetzungen des Kunden sind (und lt. deren IT so bleibt, da es keinen "Hoster" gibt, sondern die eine eigene Serverfarm unterhalten).

PDO inkl. prepared Statements werd ich mir aber generell mal anschaun für die künftigen Projekte, danke.
boarda ist offline   Mit Zitat antworten
Antwort


Themen-Optionen
Thema bewerten
Thema bewerten:

Forumregeln
Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are an
Gehe zu

Besucher kamen über folgende Suchanfragen bei Google auf diese Seite
line 1: incorrect syntax near \'max\', verschlüsselung php java blowfish, blowfish in varchar2 speichern, mssql function blowfish encryption, mssql blowfish function, blowfish utf-8, php mcrypt_encrypt anführungszeichen, php blowfish verschlüsselung, blowfisch in datenbank speichern, msdn mssql blowfish, blowfish updaten, blowfish verschlüsselung zeichen art, mssql snglup, php mssql unclosed quotation marks

Alle Zeitangaben in WEZ +2. Es ist jetzt 16:26 Uhr.




Powered by vBulletin® Version 3.7.2 (Deutsch)
Copyright ©2000 - 2012, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO 3.2.0
Aprilia-Forum, Aquaristik-Forum, Liebeskummer-Forum, Zierfisch-Forum, Geizkragen-Forum