2

SQLクエリで使用される前に文字列/変数をサニタイズするための短い関数を作成しました。

function cleanstring($sanitize, $maxlength=10, $minlength=0){
    if(strlen($sanitize) <= $maxlength && strlen($sanitize) >= $minlength){
    $sanitize = substr(mysql_real_escape_string(strip_tags($sanitize)), 0, $maxlength);
}
else{
    include("includes/header.php");
    exit("Error!");
    }

return $sanitize;
}

使用して呼び出されます:

$variable = cleanstring($_POST['someInput'], 5, 5) 

文字列の長さを定義し、real_escape_stringとstrip_tagsを使用して文字列をクリーンアップしてから、substr()を使用して、返されるデータが長さの基準に一致することを確認します。

PDOを使用せずにこの消毒機能を改善する方法はありますか?

4

2 に答える 2

2

私はあなたがポイントを逃していると思います(またはポイントを大きくしすぎています)。 制御文字をデータと混合するときはいつでも、これらの制御文字をエスケープしてデータとして解釈されるようにする方法が必要です。

Webプログラミングには、いくつかの領域があります。

  • SQL(データベースごとに異なります)
  • コマンドシェル
  • URI
  • HTML属性
  • HTMLコンテンツ
  • JavaScript

それぞれが独自の脱出方法を求めています。URIをエンコードしてからhref=""属性にエンコードするなど、複数のレベルのエスケープが存在する場合があります。

あなたの関数は技術的には「安全」ですが、ちょっと混乱しています。入力を黙って切り捨てるのではなく、ユーザーにエラーを与える方がいいと思いませんか?また、誰かが...についてコメントした場合、When I put <strong> tags around the gadget, it breaks?あなたのコードは。を削除し<strong>ます。しかし<>SQLに挿入するのは完全に安全です。

上記の各項目に対して作成されたメソッドを使用することをお勧めします。

  • MySQL:、"'" . mysqli_real_escape_string(...) . "'"場合intvalによっては。
  • コマンドシェル:escapeshellargI(...)
  • URI:urlencode()
  • HTML属性:'"' . htmlspecialchars(..., ENT_QUOTES) . '"'
  • HTMLコンテンツ: `htmlspecialchars(...)
  • JavaScript:json_encode(...)コンテキストによっては、HTMLのエンコーディングでラップされている可能性があります。

便宜上、これらの一部をより短い関数にラップすることができます。

function QA($val)
{
    return '"' . htmlspecialchars($val, ENT_QUOTES) . '"';
}

等...

ただし、重要な点は、100%の時間、データが制御文字として読み取られないようにすることです。

于 2013-02-26T20:34:20.247 に答える
0

しないstrip_tagsでください、しないでくださいmysql_real_excape_string!!! strip_tags印刷では、サニタイズではなく、htmlspecialcharsまたは他の何かで印刷するかどうかを考える必要があります。mysql_real_excape_stringプリペアドステートメントを使用する代わりに。フィルタを使用して、文字列を電子メールなどとしてサニタイズします。

于 2013-02-26T20:34:06.723 に答える