0

だから私はこの関数を書きました:

function validate_text($text,$min,$max,$include_spaces=true)
{
    $match = array();
    $regex = ($include_spaces)?"/[a-zA-Z0-9 .\-_]":"/[a-zA-Z0-9.\-_]";
    if($max<=0)
    {
        $regex = sprintf($regex."{%d,}/",$min);
    }
    else
    {
        $regex = sprintf($regex."{%d,%d}/",$min,$max);
    }
    if($include_spaces)
    {
        preg_match($regex,$text,$match);
    }
    else
    {
        preg_match($regex,$text,$match);
    }
    return (implode($match)==$text);
}

そしてそれをそのように使用します:

  (validate_text($_POST['prod_name'],10,100,true)

単純なタイトル「paintingbycbkirby」を検証することはできません。製品タイトルに表示されない奇抜な文字(simecolonsやquotes'"など)がないことを確認するために必要です。 mysqlに入れます。何が間違っているのですか?

4

1 に答える 1

1

「このパターンが一致する場合」と言って両端でパターンを固定できるのに、なぜこれをすべて行うのかわかりません。 preg_matchパターンが一致したかどうかはすでにわかります。あなたがしなければならないのは、文字列全体を試して一致させるように指示することだけです。:)

function validate_text($text,$min,$max,$include_spaces=true)
{
    $chars = ($include_spaces) ? "[a-zA-Z0-9 .\-_]" : "[a-zA-Z0-9.\-_]";
    if ($max <= 0) $max = '';
    $regex = "/^{$chars}{{$min},{$max}}$/";
    return !!preg_match($regex, $text);
}

ただし、元の機能については、長々としたかもしれませんが、機能しているようです。var_dump($_POST['prod_name'])あなたはそれがあなたが思っているものであることを確認したいかもしれません. ( がクエリ文字列にある場合は、ではなく でprod_name検索されることに注意してください。)$_GET$_POST


さて・・・ゴールは・・・

「悪い」文字をSQLから除外するためにこれを行っている場合、それは少し見当違いです。たとえば、名前にアポストロフィが含まれていることは十分に考えられます。時間をかけて大量のデータを入力すると、「申し訳ありませんが、あなたのデータは無効です」というメッセージが表示されたときよりも、サイトでイライラすることはめったにありません。:P 「この一般的で完全に正当な文字は無効です」は、「私たちのサイトはデータを適切に処理していない」ように聞こえます。

個人的には、データを制限する正当なビジネス上の理由がない限り、制限しません。物事を安全に保つことはまったく難しくないので、SQLをきれいに保つことはビジネス上の理由ではありません...

$db = new mysqli('localhost', 'dbusername', 'dbpassword', 'dbname');
$stmt = $db->prepare("
    INSERT INTO products (prod_title, other_stuff)
    VALUES (?, ?)
");
$stmt->bind_param('ss', $_POST['prod_title'], $_POST['other_stuff']);
$stmt->execute();

この時点で、私は本当に何を気にする必要さえありませprod_titleother_stuff。このようにプレースホルダーを使用してパラメーターをバインドすると、mysqli は SQL とデータを分離したままにするため、データを壊すことはできません*。そこにあるものは何でもデータベースにうまく入ります。更新と削除についてはほぼ同じことができますが、選択クエリについては少し異なります。

* 非常にあいまいな状況では、壊れる可能性があります。しかし、基本的には、MySQL の古いバージョンや、中国以外では誰も使用していない文字セットなど、非常に悪い状況の完全な嵐が発生する必要があります。

于 2012-12-06T03:30:53.650 に答える