anpera.net
https://anpera.homeip.net/phpbb3/

MySQL Suchstring Methode
https://anpera.homeip.net/phpbb3/viewtopic.php?f=34&t=2922
Seite 1 von 1

Autor:  dragonslayer [ So 24 Sep, 2006 01:39 ]
Betreff des Beitrags:  MySQL Suchstring Methode

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);*/
}')

Autor:  Eliwood [ So 24 Sep, 2006 12:47 ]
Betreff des Beitrags: 

Naja. Es lässt sich nur ein Fremdzeichen reinschmuggeln... :)

Autor:  dragonslayer [ So 24 Sep, 2006 21:33 ]
Betreff des Beitrags: 

Naja, bei der alten version reicht es ' einzugeben und das wars dann.
Das geht doch jetzt nicht mehr? Oder hab ich was übersehen?

Autor:  Eliwood [ Mo 25 Sep, 2006 16:25 ]
Betreff des Beitrags: 

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.

Autor:  Devilzimti [ Mo 25 Sep, 2006 20:02 ]
Betreff des Beitrags: 

$this->bbcode_second_pass_code('', '<?
$search = '%';
for ($i=0;$i<strlen($str_input_string);$i++)
{
$search.=substr($str_input_string,$i,1).'%';
}
?> ')

Ist sicher.

Autor:  Eliwood [ Mo 25 Sep, 2006 20:19 ]
Betreff des Beitrags: 

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.

Autor:  Devilzimti [ Mi 27 Sep, 2006 20:34 ]
Betreff des Beitrags: 

Ja, und das Querry wird nicht ausgeführt => Sichar :D

Autor:  dragonslayer [ Do 28 Sep, 2006 18:46 ]
Betreff des Beitrags: 

@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]

Autor:  Eliwood [ Do 28 Sep, 2006 20:36 ]
Betreff des Beitrags: 

Verdammt. Hab die Kommentare nicht gesehen :pein:

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

Autor:  Devilzimti [ So 01 Okt, 2006 14:39 ]
Betreff des Beitrags: 

Zend Profiler...
Hast Post :D

Autor:  Eliwood [ Di 03 Okt, 2006 18:03 ]
Betreff des Beitrags: 

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 ;)

Seite 1 von 1 Alle Zeiten sind UTC + 1 Stunde
Powered by phpBB® Forum Software © phpBB Group
https://www.phpbb.com/