インジェクション攻撃を作成する可能性があると多くの人が言っていることに気付きましたが、私の理解では、誰かがパラメーターではなく文字列からクエリを作成している場合です。ストアド プロシージャがインジェクション攻撃から保護しないという声明をテストするために、脆弱性がある場合は誰かが私に脆弱性を示してくれることを期待して、この例を掲載しています。
プロシージャを呼び出す関数を簡単に挿入して SELECT クエリに埋め込むために、この方法でコードを作成したことに注意してください。つまり、Prepared Statement を作成できません。理想的には、動的で迅速なセットアップをこのように維持したいと考えていますが、誰かが機能するインジェクション攻撃を作成できる場合、明らかにそれは起こりません.
DELIMITER $$
#This procedure searches for an object by a unique name in the table.
#If it is not found, it inserts. Either way, the ID of the object
#is returned.
CREATE PROCEDURE `id_insert_or_find` (in _value char(200), out _id bigint(20))
BEGIN
SET @_value = _value;
SET @id = NULL;
SELECT id INTO _id FROM `table` WHERE name=_value;
IF _id IS NULL THEN
BEGIN
INSERT INTO `table` (`name`) VALUE (_value);
SELECT LAST_INSERT_ID() INTO _id;
END;
END IF;
END$$
CREATE FUNCTION `get_id` (_object_name char(200)) RETURNS INT DETERMINISTIC
BEGIN
SET @id = NULL;
call `id_insert_or_find`(_object_name,@id);
return @id;
END$$
PHP コード
ここで使用する PHP コードは次のとおりです。
(注、Boann は以下のこのコードの愚かさを指摘しています。答えを尊重するために編集しているのではありませんが、コード内の単純なクエリではないことは確かです。->prepare を使用して更新されます。など。新しい脆弱性が見つかった場合は、追加のコメントを歓迎します。 )
function add_relationship($table_name,$table_name_child) {
#This table updates a separate table which has
#parent/child relationships listed.
$db->query("INSERT INTO table_relationships (`table_id`,`tableChild_id`) VALUES (get_id('{$table_name}'),get_id('{$table_name_child}')");
}
最終結果は
table `table`
id name
1 oak
2 mahogany
オークをマホガニーの子にしたい場合は、
add_relationship("mahogany","oak");
プラスチックを樫の木の子にしたいなら
add_relationship("oak","plastic");
うまくいけば、フレームワークとコンテキストを提供するのに役立ちます。