0

私のコードをフォーマットしていないことをお詫び申し上げます。ツールバーがなくなった…

mysql db にデータを挿入したいと考えています。私はphpで関数を書きました:

function add_ID($ID, $token)  {
 $add = "INSERT INTO ids (ID, token) VALUES ('$ID', '$token')";
 mysql_query($add);
 echo 'added successfully';
}  
if(isset($_GET['addDeviceID'])) {
 add_ID($_GET['ID'], $_GET['token']);
}

Browswe の URL フィールドで、次のような関数を呼び出しています: http://www.justanexample.com/example.php?ID=123123123&token=qwertzuiop

それはうまくいきます。

たとえば、次のようにいずれかのパラメーターにスペースを入れると: http://www.justanexample.com/example.php?ID=123123 123&token=qwertzuiop

私のmysqlデータベースには何も追加されませんでした。

助けていただければ幸いです:) ありがとうございます!

4

5 に答える 5

2

データベースに送信する前に、入力を検証する必要があります。または、検証が不可能な場合は、値をフィルター処理および/またはエスケープします。

検証

IDが 0 より大きい整数であると予想される場合:

if (!ctype_digit($ID)) {
    // invalid ID
}

トークンが英数字の文字列であると予想される場合:

if (!ctype_alnum($token)) {
    // invalid token
}

フィルタリング

フィルタリングは、入力の無効な部分を削除して有効にすることです。

if (!ctype_digit($ID)) {
    $ID = preg_replace('/\D+/', '', $ID);
    // $ID does now only contain digits
}
if (!ctype_alnum($token)) {
    $token = preg_replace('/\D+/', '', $token);
    // $token does now only contain alphanumeric characters
}

逃げる

エスケープとは、文字列が配置される特定のコンテキストのメタ文字を置き換えることです。MySQL クエリの場合、MySQL のコンテキスト文字列宣言のメタ文字をエスケープする関数を使用する必要があります。PHP には、その目的のためのmysql_real_escape_string関数があります。

$add = "INSERT INTO ids (ID, token) VALUES ('".mysql_real_escape_string($ID)."', '".mysql_real_escape_string($token)."')";
于 2010-02-15T11:25:10.763 に答える
0

str_replace関数を使用してそれらからスペースを削除します。

 $ID = str_replace(' ', '', $ID);
 $token= str_replace(' ', '', $token);

 $add = "INSERT INTO ids (ID, token) VALUES ('$ID', '$token')";

また、 $ID はテーブルの整数フィールドであると思われるため、引用符を指定せずにクエリを実行できます。

 $add = "INSERT INTO ids (ID, token) VALUES ($ID, '$token')";
于 2010-02-15T11:19:07.107 に答える
0

関数が SQL インジェクションに対して脆弱です。ユーザーが受け取ったすべてのパラメーターを SQL クエリで使用する前に検証し、文字列をmysql_real_escape_stringに渡す必要がexample.php?token='; DROP DATABASE;あります。

あなたの場合、受け取ったパラメータが最初に期待する形式であることを確認し、そうでない場合はユーザーにエラーを返してから、それらを SQL クエリに渡す必要があります。

function add_ID($ID, $token)  {
  $id = mysql_real_escape_string($id);
  $token = mysql_real_escape_string($token);

  $add = "INSERT INTO ids (ID, token) VALUES ('$ID', '$token')";
  mysql_query($add);
  echo 'added successfully';
}  

if(isset($_GET['addDeviceID'])) {
  $id    = isset($_GET['id']) ? $_GET['id'] : 0; // in case no ID has been passed in
  $token = isset($_GET['token']) ? $_GET['token'] : '';

  if (!is_numeric($id) {
    die('ID is not a number');
  } 

  // validate token here as well

  add_ID($id, $token);
}

また、パラメーター化されたクエリも検討する必要があります。これは、文字列連結を使用するよりも、パラメーターを使用して SQL クエリを実行する全体的にはるかに優れた方法です。そのためには、mysql の代わりに mysqli 拡張機能を使用するか、より高いレベルの PDO を使用することを検討してください。

于 2010-02-15T11:28:27.563 に答える
-1

str_replace を使用してスペースを削除できます。しかし、それは良い習慣ではありません。どうすれば URL を変更できますか? 通常の場合、それは非現実的です。逆に、ユーザーからのすべての入力値をテストする必要があります (ID は整数である必要があり、トークンには "'" 記号やその他のチェックを含めないでください)。sql-injections について読んでください。

于 2010-02-15T11:26:05.210 に答える