anpera.net

anpera.net

experimental server @home
Aktuelle Zeit: Do 17 Jul, 2025 14:52

Alle Zeiten sind UTC + 1 Stunde




Ein neues Thema erstellen Auf das Thema antworten  [ 11 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: MySQL Suchstring Methode
BeitragVerfasst: So 24 Sep, 2006 01:39 
Offline
Profi
Profi
Benutzeravatar

Registriert: Mo 20 Sep, 2004 23:43
Beiträge: 164
Wohnort: Berlin
LoGD: http://www.atrahor.de/source.php
Ziemlich häufig kommt im Quelltext
sowas wie
$this->bbcode_second_pass_code('', '
<?
$search = '%';
for ($i=0;$i<strlen($str_input_string);$i++)
{
$search.=substr($str_input_string,$i,1).'%';
}
?>
')
wenn ein Name o.ä gesucht wird. Leider ist man da sehr anfällig gegen SQL Injection. Zwar macht LOTGD bei jedem Parameter ein addslashes, aber durch das aufsplitten geht die Wirkung leider wieder verloren. Außerdem ist es langsam.

Deswegen folgende Funktion:
$this->bbcode_second_pass_code('', '
/**
* @desc Nimmt einen String und wandelt ihn in einen MYSQL Suchstring um
* Zwischen alle Zeichen wird ein Trennzeichen eingefügt
*
* @param string $str_input_string enthält den Eingabestring
* @param string $str_split_char enthält das Zeichen dass zum Trennen verwendet werden soll
* @param string $str_remove_chars enthält den regulären Ausdruck der Zeichen die aus dem String entfernt werden sollen
* @return string
*/
function str_create_search_string($str_input_string = '',$str_split_char='%', $str_remove_chars = '#[\s\W\d]#')
{
//Return an empty string
if($str_input_string == '')
{
return $str_input_string;
}

//Remove slashes
$str_input_string = stripslashes($str_input_string);
$str_input_string = preg_replace($str_remove_chars,'',$str_input_string);

//Split the string
$arr_temp = preg_split('#(?<=.)(?=.)#s', $str_input_string);

//Add split chars
$str_return = $str_split_char.addslashes(implode($str_split_char,$arr_temp)).$str_split_char;

//Return the string
return $str_return;

/*$search = '%';
for ($i=0;$i<strlen($str_input_string);$i++)
{
$search.=substr($str_input_string,$i,1).'%';
}
return addslashes($search);*/
}')

_________________
Atrahor.de
http://www.atrahor.de/ci_images.php?id=1


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So 24 Sep, 2006 12:47 
Offline
Marquis Pherae
Marquis Pherae

Registriert: Mi 09 Feb, 2005 16:01
Beiträge: 3925
Wohnort: Basel
Geschlecht: Männlich
Naja. Es lässt sich nur ein Fremdzeichen reinschmuggeln... :)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So 24 Sep, 2006 21:33 
Offline
Profi
Profi
Benutzeravatar

Registriert: Mo 20 Sep, 2004 23:43
Beiträge: 164
Wohnort: Berlin
LoGD: http://www.atrahor.de/source.php
Naja, bei der alten version reicht es ' einzugeben und das wars dann.
Das geht doch jetzt nicht mehr? Oder hab ich was übersehen?

_________________
Atrahor.de
http://www.atrahor.de/ci_images.php?id=1


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo 25 Sep, 2006 16:25 
Offline
Marquis Pherae
Marquis Pherae

Registriert: Mi 09 Feb, 2005 16:01
Beiträge: 3925
Wohnort: Basel
Geschlecht: Männlich
dragonslayer hat geschrieben:
Naja, bei der alten version reicht es ' einzugeben und das wars dann.
Das geht doch jetzt nicht mehr? Oder hab ich was übersehen?


Überleg doch mal:

Du gibst ein:
'bla

Der String wird zu:

%\%'%b%l%a

Das rot eingefärbte ist dann "Ausserhalb" des Strings.
Klar - Fehler lassen sich provozieren. Aber schlimmes kannst du nicht damit machen. Wird ja mit % vollgestopft ;)

Übrigens ist deines noch unperformanter als das ursprüngliche.
Warum eine so Riesenfunktion drum rum machen? oO
Reicht doch nach jeder for-schleife zu maskieren. Und davor zu entmaskieren.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo 25 Sep, 2006 20:02 
Offline
Freak
Freak
Benutzeravatar

Registriert: Sa 04 Dez, 2004 02:34
Beiträge: 825
$this->bbcode_second_pass_code('', '<?
$search = '%';
for ($i=0;$i<strlen($str_input_string);$i++)
{
$search.=substr($str_input_string,$i,1).'%';
}
?> ')

Ist sicher.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo 25 Sep, 2006 20:19 
Offline
Marquis Pherae
Marquis Pherae

Registriert: Mi 09 Feb, 2005 16:01
Beiträge: 3925
Wohnort: Basel
Geschlecht: Männlich
Devilzimti hat geschrieben:
$this->bbcode_second_pass_code('', '<?
$search = '%';
for ($i=0;$i<strlen($str_input_string);$i++)
{
$search.=substr($str_input_string,$i,1).'%';
}
?> ')

Ist sicher.


Nein. DU kannst Fremdzeichen reinschleussen. Zwar ungefährliches, aber trotzdem.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi 27 Sep, 2006 20:34 
Offline
Freak
Freak
Benutzeravatar

Registriert: Sa 04 Dez, 2004 02:34
Beiträge: 825
Ja, und das Querry wird nicht ausgeführt => Sichar :D


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do 28 Sep, 2006 18:46 
Offline
Profi
Profi
Benutzeravatar

Registriert: Mo 20 Sep, 2004 23:43
Beiträge: 164
Wohnort: Berlin
LoGD: http://www.atrahor.de/source.php
@eliwood
Das ist nicht ganz richtig.
Alle Zeichen die nicht a-Z sind werden herausgefiltert, deswegen kann
%\%'%b%l%a
nicht mehr vorkommen. Außerdem wird am Ende, bevor es auf die Datenbank losgelassen wird, nochmal ein addslashes drübergehauen.
selbst wenn das %\%'%b%l%a da stehen würde, käme bei der Datenbank
%\\%\'%b%l%a an und das ist sicher.

Das hier ist hingegen ganz und gar nicht sicher
$this->bbcode_second_pass_code('', '
<?
$search = '%';
for ($i=0;$i<strlen($str_input_string);$i++)
{
$search.=substr($str_input_string,$i,1).'%';
}
?>
')
und zwar aus genau dem Grund den Eliwood genannt hat.

Zur Performance. Sagen wir es so, mein Zend Profiler sagte mir eine Geschwinigkeitssteigerung von 10% an bei einem 5 Zeichen langen Eingabestring. Je länger der zu durchsuchende String, desto langsamer ist die For Variante, denn die zeichenweise Stringbehandlung durch PHP ist nicht die schnellste.
Ich geb zu, mein

$this->bbcode_second_pass_code('', '$arr_temp = preg_split('#(?<=.)(?=.)#s', $str_input_string); ')
ist ziemlich unglücklich, aber leider gibts die str_split funktion in PHP4 noch nicht die das ganze noch flotter gemacht hätte. Ich persönlich würde mich lieber immer direkt auf PHP Funktionen verlassen, die ja in C geschrieben sind und nicht solche for - Konstrukte verwenden.

Dennoch danke für das Feedback[/code]

_________________
Atrahor.de
http://www.atrahor.de/ci_images.php?id=1


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do 28 Sep, 2006 20:36 
Offline
Marquis Pherae
Marquis Pherae

Registriert: Mi 09 Feb, 2005 16:01
Beiträge: 3925
Wohnort: Basel
Geschlecht: Männlich
Verdammt. Hab die Kommentare nicht gesehen :pein:

Aber @ Drasla: Naja. EIn Fremdzeichen... Also unsicher ist es auch nicht ;)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So 01 Okt, 2006 14:39 
Offline
Freak
Freak
Benutzeravatar

Registriert: Sa 04 Dez, 2004 02:34
Beiträge: 825
Zend Profiler...
Hast Post :D


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di 03 Okt, 2006 18:03 
Offline
Marquis Pherae
Marquis Pherae

Registriert: Mi 09 Feb, 2005 16:01
Beiträge: 3925
Wohnort: Basel
Geschlecht: Männlich
So... Hab die FUnktion für meinen Gebrauch angepasst:

[php]//Split the string
# $arr_temp = preg_split('#(?<=.)(?=.)#s', $str_input_string);
// Changed by Eliwood for supporting PHP 5's function "str_split" - Faster
if(function_exists("str_split")) {
$arr_temp = str_split($str_input_string, 1);
}
else {
$arr_temp = preg_split('#(?<=.)(?=.)#s', $str_input_string);
} [/php]

Falls str_split existiert wird auch das gebraucht ;)


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 11 Beiträge ] 

Alle Zeiten sind UTC + 1 Stunde


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 7 Gäste


Du darfst keine neuen Themen in diesem Forum erstellen
Du darfst keine Antworten zu Themen in diesem Forum erstellen
Du darfst deine Beiträge in diesem Forum nicht ändern
Du darfst deine Beiträge in diesem Forum nicht löschen
Du darfst keine Dateianhänge in diesem Forum erstellen

Suche nach:
Gehe zu:  
cron
POWERED_BY
Deutsche Übersetzung durch phpBB.de
anpera.net - Impressum