0

SQL ステートメントに追加する変数がありますが、エラーの原因となっている隠し文字があるようです。

数値 (405,000 など) の $addToInventory 変数があります。次のコード スニペットを使用して文字を削除しようとしていますが、エコーすると、番号の後に \0\0\0\0 (null) が表示されます。

$addToInventory= str_replace(",", "", $pieces[1]);
$addToInventory= str_replace("\r", "", $addToInventory);    
$addToInventory= str_replace("\n", "",$addToInventory); 
$addToInventory = preg_replace('/^[\pZ\pC]+|[\pZ\pC]+$/u', '', mysql_real_escape_string($addToInventory));
$sql_query = "UPDATE products set products_quantity = " .$addToInventory."  where products_model like '$code'";

$sql_query をエコーすると、以下が生成されます。

UPDATE products set products_quantity = 405000\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0 where products_model like '111'. 
4

4 に答える 4

7

を使用しtrim()ます。NUL バイト文字を削除します。

この関数は、str の先頭と末尾から空白を取り除いた文字列を返します。2 番目のパラメーターがない場合、trim() は次の文字を削除します。

  • " " (ASCII 32 (0x20))、通常のスペース。
  • "\t" (ASCII 9 (0x09))、タブ。
  • "\n" (ASCII 10 (0x0A))、改行 (改行)。
  • "\r" (ASCII 13 (0x0D))、キャリッジ リターン。
  • "\0" (ASCII 0 (0x00))、NUL バイト。
  • "\x0B" (ASCII 11 (0x0B))、垂直タブ。
$addToInventory= str_replace(",", "", $pieces[1]);
$addToInventory= trim($addToInventory); 
于 2013-05-21T13:11:51.487 に答える
2

文字列を囲む空白文字をすべて取り除きたい場合は、 を使用しますtrim()

$addToInventory = trim( $addToInventory );

現在のコードは、SQL インジェクション攻撃に対して非常に脆弱なようです。クエリで使用する前にさらにサニタイズするか、 PDOmysqli$addToInventoryによって提供されるような準備済みステートメントを使用してください。

于 2013-05-21T13:12:59.820 に答える
0

また、$pieces[1] 変数がサニタイズされていることを完全に確信していない限り、アプリケーションは SQL インジェクションを起こしやすい可能性が高いため、そのようなクエリの作成は避けるべきです。たとえば、攻撃者が $pieces[1] を "'0'; DROP DATABASE something; --" に変更した場合、クエリは次のようになります。 UPDATE products set products_quantity = '0'; DROP DATABASE 何か; -- ここで、products_model は「XXX」のようになります

...データベースを効果的に台無しにします

クエリの作成に使用される変数をサニタイズするか、準備済みステートメントにパラメーターとして追加していることを確認してください。準備済みステートメントの詳細については、http: //en.wikipedia.org/wiki/Prepared_statementを確認してください。

于 2013-05-21T13:18:38.070 に答える