1

私は他の誰かが作成したデータベースを使用しています (そして私はそれを変更する権限がありません)。ただし、データベース内のストアド プロシージャを調べていると、次の手順に気付きました。

DELIMITER $$

CREATE PROCEDURE `logIn`(userName varChar(50), userPass varChar(50))
BEGIN
  declare userID int;

  SELECT 
    u.userID INTO userID 
  FROM
    users u
  WHERE
    u.userName=userName 
    AND u.userPassword=MD5(userPass);

  IF (IFNULL(uID,-1) > 0) THEN
    select 1 as outMsg;
  ELSE
    select 0 as outMsg;
  END IF;
END$$

、およびのusers3 つの列を持つ対応するテーブルを使用します。userID INTuserName VARCHAR(50)userPassword VARCHAR(50)

私はこれがあまり得意ではないので、SQL インジェクションを許可しないようにそのような関数の入力をサニタイズする必要があるかどうか、またそうでない場合はなぜですか? 一般的な経験則は非常に高く評価されます。

PS この関数は、フォーム送信時に JS スクリプトから呼び出されます。

4

2 に答える 2

1

ここには、基礎となるデータ型とデータベースへの挿入方法に依存する経験則がいくつかあります。

まず、パラメーター化されたクエリは常に SQL インジェクション保護に最適です..しかし..それを変更できない場合..

文字列タイプ:

  1. 一重引用符を削除するか、一重引用 を一重引用符で 2 回置き換えます。

  2. 次の文字のいずれかをエンコードされた代替文字に置き換えます。

    • >
    • <
    • "
    • ;
    • (chr 34)
    • )
    • (
    • たとえば.. ) は & #x29; に置き換えられます。

      -(上記の例のスペースは、コードが表示されるようにするためのものです。削除して ")" を取得します)

文字列以外のデータ型の場合は、データ型が正常であることを確認し、データ型に含めるべきではない文字を削除します。整数の場合は、渡す文字列が整数であることを確認してください。これは通常、コード内の型にキャストすることで実行できます。キャストは機能するか、エラーが発生します。また、データ型の最小値と最大値を超えていないことを確認することもお勧めします。たとえば..整数をチェックしていた場合、次のようなコードを使用できます。

var myInt = parseInt(param);

次に、その境界をチェックして、最大整数値よりも小さく、最小整数値よりも大きいことを確認します。

これは、SQL インジェクション攻撃を防ぐのに十分なはずです...

そして..データベースと実際にやり取りするコードを投稿していないので...追加の予防策として.. --,`,%,",", "". も削除することをお勧めします。

データベース呼び出しに「正常な」値のみが必要なため、$309 のような整数は意味をなさないため、$.. を削除する必要があります。おそらく正規表現を使用して、数字以外の文字、カンマ、ピリオドを置き換えます。[^[0-9,.]]

特に注意してください。

于 2012-12-17T12:25:42.833 に答える
0

はい、プロシージャを実行する前に、入力をサニタイズする必要があります。

プロシージャがform submit で JS から直接呼び出される方法がないため、ここでさらにヘルプを得るために、プロシージャの実際の呼び出しポイントを共有することをお勧めします。何らかの方法でデータベース呼び出しを行うためのサーブレット、PHP ページ、または HTTP に適した仲介機能を使用している可能性があります。

于 2012-12-17T11:56:34.800 に答える