C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[3]: C#からデータベース書き込み


(過去ログ 153 を表示中)

[トピック内 23 記事 (1 - 20 表示)]  << 0 | 1 >>

■89004 / inTopicNo.1)  C#からデータベース書き込み
  
□投稿者/ tetris (1回)-(2018/10/25(Thu) 09:31:14)

分類:[C#] 

command.CommandText = "INSERT INTO 来館記録_T ( [会社名],[氏名])" + " VALUES ( 'kaisyamei', 'simei')";

OleDbCommandを使ってデータベースに値を挿入したいときに変数を使う方法をご教授願います。

このままだと kaisyamei と simei という文字列だけがフィールドに挿入されてしまいます。(当たり前ですが・・・。)
これをkaisyameiというテキストボックスコントロールに入ってる値を挿入したいのですが・・・。

kaisyameiテキストボックスの値を変数(Tmptext)とかに代入してもうまくいかず、Tmptextという文字列だけが挿入されてしまいました。


どなたかご教授願います。
引用返信 編集キー/
■89005 / inTopicNo.2)  Re[1]: C#からデータベース書き込み
□投稿者/ Hongliang (714回)-(2018/10/25(Thu) 10:23:03)
// どのDBを使用するかも書いていただく方が回答しやすいです。

パラメタライズドクエリなどと呼ばれる方法を使用します。

command.CommandText = "INSERT INTO 来館記録_T ([会社名],[氏名]) VALUES (?, ?)";
command.Parameters.AddWithValue("@kaisya", kaisyamei.Text);
command.Parameters.AddWithValue("@simei", simei.Text);

こうすることで、本来クエリに入っていてはいけない文字列が含まれることによる
SQLインジェクション等の回避も行えます。

なお、OLEDBではパラメータに名前を使えず、?で位置を指定するだけになります。
なのでAddWithValueの第1引数は実際のところ意味がありません。
SQL ServerにSqlClientでつなぐなどなら、VALUES (@kaisya, @simei)
という風にクエリ本文にパラメータ名を付けられるのですが。

引用返信 編集キー/
■89006 / inTopicNo.3)  Re[1]: C#からデータベース書き込み
□投稿者/ しま (5回)-(2018/10/25(Thu) 10:35:47)
No89004 (tetris さん) に返信
> command.CommandText = "INSERT INTO 来館記録_T ( [会社名],[氏名])" + " VALUES ( 'kaisyamei', 'simei')";
>
> OleDbCommandを使ってデータベースに値を挿入したいときに変数を使う方法をご教授願います。
>
> このままだと kaisyamei と simei という文字列だけがフィールドに挿入されてしまいます。(当たり前ですが・・・。)
> これをkaisyameiというテキストボックスコントロールに入ってる値を挿入したいのですが・・・。
>
> kaisyameiテキストボックスの値を変数(Tmptext)とかに代入してもうまくいかず、Tmptextという文字列だけが挿入されてしまいました。
>
>
> どなたかご教授願います。

ご教授する程の者ではございませんが、幾つか質問がございます。

1)お使いのデーターベースの製品名とバージョンが書いてありませんが、何でしょうか?

>kaisyameiテキストボックスの値を変数(Tmptext)とかに代入してもうまくいかず
2)この時のコードは書いてありませんが、どのようなコードだったのでしょうか。
SQL の Update 文の記述が不適切だったのかもしれないので、Uodate 文を示して下されば
改善案が出せるかもしれません
3)直接文字列の連結を使って sql 文を記述していますが、何故このようなことをなさるのでしょうか?
4)OleDB をお使いのようですが、OleDB を選ぶわけは何だったのでしょうか? DBによっては別の接続の方が便利な場合があります

引用返信 編集キー/
■89007 / inTopicNo.4)  Re[2]: C#からデータベース書き込み
□投稿者/ tetris (2回)-(2018/10/25(Thu) 11:13:48)
No89006 (しま さん) に返信
> ■No89004 (tetris さん) に返信
>> command.CommandText = "INSERT INTO 来館記録_T ( [会社名],[氏名])" + " VALUES ( 'kaisyamei', 'simei')";
>>
>>OleDbCommandを使ってデータベースに値を挿入したいときに変数を使う方法をご教授願います。
>>
>>このままだと kaisyamei と simei という文字列だけがフィールドに挿入されてしまいます。(当たり前ですが・・・。)
>>これをkaisyameiというテキストボックスコントロールに入ってる値を挿入したいのですが・・・。
>>
>>kaisyameiテキストボックスの値を変数(Tmptext)とかに代入してもうまくいかず、Tmptextという文字列だけが挿入されてしまいました。
>>
>>
>>どなたかご教授願います。
>
> ご教授する程の者ではございませんが、幾つか質問がございます。
>
> 1)お使いのデーターベースの製品名とバージョンが書いてありませんが、何でしょうか?
> MS Access2016のaccdb形式のファイルとなります。

> >kaisyameiテキストボックスの値を変数(Tmptext)とかに代入してもうまくいかず
> 2)この時のコードは書いてありませんが、どのようなコードだったのでしょうか。
> SQL の Update 文の記述が不適切だったのかもしれないので、Uodate 文を示して下されば
> 改善案が出せるかもしれません

String Tmptext1 = kaisyamei.Text;
 本当にシンプルにストリング型に入れてるだけですね。。。。
> 3)直接文字列の連結を使って sql 文を記述していますが、何故このようなことをなさるのでしょうか?

他のやり方を知らなかったからですね。。
> 4)OleDB をお使いのようですが、OleDB を選ぶわけは何だったのでしょうか? DBによっては別の接続の方が便利な場合があります

SQLサーバーを使用している場合はSQLで・・。みたいな考えだったので、OleDBを使っています。
>
引用返信 編集キー/
■89008 / inTopicNo.5)  Re[2]: C#からデータベース書き込み
□投稿者/ tetris (3回)-(2018/10/25(Thu) 11:15:53)
No89005 (Hongliang さん) に返信
> // どのDBを使用するかも書いていただく方が回答しやすいです。
>
> パラメタライズドクエリなどと呼ばれる方法を使用します。
>
> command.CommandText = "INSERT INTO 来館記録_T ([会社名],[氏名]) VALUES (?, ?)";
> command.Parameters.AddWithValue("@kaisya", kaisyamei.Text);
> command.Parameters.AddWithValue("@simei", simei.Text);
>
> こうすることで、本来クエリに入っていてはいけない文字列が含まれることによる
> SQLインジェクション等の回避も行えます。
>
> なお、OLEDBではパラメータに名前を使えず、?で位置を指定するだけになります。
> なのでAddWithValueの第1引数は実際のところ意味がありません。
> SQL ServerにSqlClientでつなぐなどなら、VALUES (@kaisya, @simei)
> という風にクエリ本文にパラメータ名を付けられるのですが。

すみません、そうすると変数に値を入れてデータベースに渡したい場合はOLEDBではだめなのでしょうか・・・。。
データベースはMS Access2016のaccdbファイルになります。
引用返信 編集キー/
■89010 / inTopicNo.6)  Re[3]: C#からデータベース書き込み
□投稿者/ しま (6回)-(2018/10/25(Thu) 11:43:10)
No89007 (tetris さん) に返信
>>>kaisyameiテキストボックスの値を変数(Tmptext)とかに代入してもうまくいかず
>>2)この時のコードは書いてありませんが、どのようなコードだったのでしょうか。
>> SQL の Update 文の記述が不適切だったのかもしれないので、Uodate 文を示して下されば
>> 改善案が出せるかもしれません
>
> String Tmptext1 = kaisyamei.Text;
>  本当にシンプルにストリング型に入れてるだけですね。。。。

Insert 文と書くべきところを Update 文と誤って書いて送信してしましました。

わたくしが示してほしかったのは

commnd.CommandText ="insert into 来館記録_T " ...となっているであろう

insert 文の実際の内容だったのです。

再度お知らせ願えますか?
引用返信 編集キー/
■89011 / inTopicNo.7)  Re[3]: C#からデータベース書き込み
□投稿者/ WebSurfer (1624回)-(2018/10/25(Thu) 11:51:40)
No89008 (tetris さん) に返信

パラメータ化クエリを利用してください。

「変数を使う」という目的が果たせるだけでなく、SQL インジェクション攻撃防止のために
必須です。パラメータ化のもう一つのメリットにパフォーマンスの向上があります。

SQL Server の場合ですが、以下の記事が参考になりませんか?

パラメータ化クエリ
http://surferonwww.info/BlogEngine/post/2012/02/02/Parameterized-query.aspx

Access 等に使われる OleDb プロバイダの場合は、疑問符 (?) で指定される位置パラメー
タマーカーが使用されますが、基本的なところは同じです。
引用返信 編集キー/
■89015 / inTopicNo.8)  Re[1]: C#からデータベース書き込み
□投稿者/ WebSurfer (1626回)-(2018/10/25(Thu) 12:02:18)
No89004 (tetris さん) に返信


ひょっとして、

「tetris」さん=「テトリス」さん=「わたー」さん

ですか?

であれば、利用規約、

"一貫して同じハンドルを使用し、場を混乱させないようにしましょう。同じハンドルの方
が質問の背景がわかりやすいです (自作自演をしたり別人を装うのは回答者の善意を裏切
る行為です)。"

を守っていただければと思います。
引用返信 編集キー/
■89020 / inTopicNo.9)  Re[2]: C#からデータベース書き込み
□投稿者/ tetris (4回)-(2018/10/25(Thu) 13:19:21)
No89015 (WebSurfer さん) に返信
> ■No89004 (tetris さん) に返信
パラメータクエリ、調べてみましたが、まだ理解に時間がかかりそうなので、参考にさせていただき、勉強してみます。

すみません、特に理由があったわけではないのですが、投稿する度に名前書いていたので・・・。
これからは統一させていただきます!ご迷惑おかけしました!
引用返信 編集キー/
■89021 / inTopicNo.10)  Re[4]: C#からデータベース書き込み
□投稿者/ tetris (5回)-(2018/10/25(Thu) 13:24:58)
No89010 (しま さん) に返信
> ■No89007 (tetris さん) に返信
> >>>kaisyameiテキストボックスの値を変数(Tmptext)とかに代入してもうまくいかず
> >>2)この時のコードは書いてありませんが、どのようなコードだったのでしょうか。
> >> SQL の Update 文の記述が不適切だったのかもしれないので、Uodate 文を示して下されば
> >> 改善案が出せるかもしれません
>>
>> String Tmptext1 = kaisyamei.Text;
>> 本当にシンプルにストリング型に入れてるだけですね。。。。
>
> Insert 文と書くべきところを Update 文と誤って書いて送信してしましました。
>
> わたくしが示してほしかったのは
>
> commnd.CommandText ="insert into 来館記録_T " ...となっているであろう
>
> insert 文の実際の内容だったのです。
>
> 再度お知らせ願えますか?


OleDbCommand command = new OleDbCommand();

OleDbConnection conn = new OleDbConnection();

conn.ConnectionString = @"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\Users\takahashi\Desktop\VisitUser.accdb";
conn.Open();
command.CommandText = "INSERT INTO 来館記録_T ( [会社名],[氏名])" + " VALUES ( 'Tmptext1', 'Temptext2')";
command.CommandType = System.Data.CommandType.Text;
command.Connection = conn;
command.ExecuteNonQuery();
conn.Close();


別部分でTmptext1とTmpText2に値を代入してます。

String Tmptext1 = kaisyamei.Text;
String Tmptext2 = simei.Text;

尚 kaisyamei と simei はユーザーが入力できるテキストボックスになります
引用返信 編集キー/
■89022 / inTopicNo.11)  Re[5]: C#からデータベース書き込み
□投稿者/ 魔界の仮面弁士 (1893回)-(2018/10/25(Thu) 13:44:58)
No89021 (tetris さん) に返信
> command.CommandText = "INSERT INTO 来館記録_T ( [会社名],[氏名])" + " VALUES ( 'Tmptext1', 'Temptext2')";

仮に、変数では無くリテラルとしての Tmptext1 を入力するのだとしても、
 command.CommandText = "INSERT INTO 来館記録_T ( [会社名],[氏名]) VALUES ( 'Tmptext1', 'Temptext2')";
で良いはずです。文字列連結する意味が無いかと。


変数として埋め込むなら、C# 6.0 以降なら
 command.CommandText = $"INSERT INTO 来館記録_T ( [会社名],[氏名]) VALUES ( '{Tmptext1}', '{Temptext2}')";
と書けますし、あるいはそれ以前のバージョンでも
 command.CommandText = "INSERT INTO 来館記録_T ( [会社名],[氏名]) VALUES ( '" + Tmptext1 + "', '" + Temptext2 + "')";
のようにして、SQL を構築することはできます。

しかしこのような SQL 記述は、既に他の方が書かれているように避けるべきです。
何故なら、たとえば kaisyamei.Text = "McDonald's"; だった場合に、生成される文字列が
「〜 VALUES ( 'McDonald's', 'tetris')」になってしまい、正常な SQL と認識できなくなるなどの
問題を抱えるからです。

Replace などを使って無毒化させる方法もありますが、通常は Hongliang さんが書かれたように、
パラメータークエリを用いて INSERT / UPDATE を行います。
引用返信 編集キー/
■89023 / inTopicNo.12)  Re[6]: C#からデータベース書き込み
□投稿者/ tetris (6回)-(2018/10/25(Thu) 14:22:50)
No89022 (魔界の仮面弁士 さん) に返信
> ■No89021 (tetris さん) に返信
>>command.CommandText = "INSERT INTO 来館記録_T ( [会社名],[氏名])" + " VALUES ( 'Tmptext1', 'Temptext2')";
>
> 仮に、変数では無くリテラルとしての Tmptext1 を入力するのだとしても、
>  command.CommandText = "INSERT INTO 来館記録_T ( [会社名],[氏名]) VALUES ( 'Tmptext1', 'Temptext2')";
> で良いはずです。文字列連結する意味が無いかと。
>
>
> 変数として埋め込むなら、C# 6.0 以降なら
>  command.CommandText = $"INSERT INTO 来館記録_T ( [会社名],[氏名]) VALUES ( '{Tmptext1}', '{Temptext2}')";
> と書けますし、あるいはそれ以前のバージョンでも
>  command.CommandText = "INSERT INTO 来館記録_T ( [会社名],[氏名]) VALUES ( '" + Tmptext1 + "', '" + Temptext2 + "')";
> のようにして、SQL を構築することはできます。
>
> しかしこのような SQL 記述は、既に他の方が書かれているように避けるべきです。
> 何故なら、たとえば kaisyamei.Text = "McDonald's"; だった場合に、生成される文字列が
> 「〜 VALUES ( 'McDonald's', 'tetris')」になってしまい、正常な SQL と認識できなくなるなどの
> 問題を抱えるからです。
>
> Replace などを使って無毒化させる方法もありますが、通常は Hongliang さんが書かれたように、
> パラメータークエリを用いて INSERT / UPDATE を行います。

ご回答ありがとうございます。
そのような文字列が入力されることがない環境なので記述参考にさせて頂きます。
ありがとうございました。
解決済み
引用返信 編集キー/
■89025 / inTopicNo.13)  Re[7]: C#からデータベース書き込み
□投稿者/ WebSurfer (1629回)-(2018/10/25(Thu) 15:15:16)
No89023 (tetris さん) に返信

> そのような文字列が入力されることがない環境なので記述参考にさせて頂きます。

どういうことですか? 質問者さんの最初の課題「変数を使う方法」は解決できたのでしょうか?

パラメータ化しないで文字列連結で解決したということですと真の解決にはなってないし、多数の
回答者のせっかくの提案をスルーすることになるのですけど・・・
引用返信 編集キー/
■89026 / inTopicNo.14)  Re[8]: C#からデータベース書き込み
□投稿者/ tetris (7回)-(2018/10/25(Thu) 15:20:53)
No89025 (WebSurfer さん) に返信
> ■No89023 (tetris さん) に返信
>
>>そのような文字列が入力されることがない環境なので記述参考にさせて頂きます。
>
> どういうことですか? 質問者さんの最初の課題「変数を使う方法」は解決できたのでしょうか?
>
> パラメータ化しないで文字列連結で解決したということですと真の解決にはなってないし、多数の
> 回答者のせっかくの提案をスルーすることになるのですけど・・・

わかりづらくて申し訳ありません!


> 変数として埋め込むなら、C# 6.0 以降なら
>  command.CommandText = $"INSERT INTO 来館記録_T ( [会社名],[氏名]) VALUES ( '{Tmptext1}', '{Temptext2}')";
> と書けますし、あるいはそれ以前のバージョンでも
>  command.CommandText = "INSERT INTO 来館記録_T ( [会社名],[氏名]) VALUES ( '" + Tmptext1 + "', '" + Temptext2 + "')";
> のようにして、SQL を構築することはできます。

変数として埋め込む方法を教えてくださったので、ここの記述を参考に手を付けようと思ったからです。
そしてその後に書かれていた
McDonald's
のような「'」が入力されることがないので(会社名や氏名しか入力しないため)、尚更この意見を参考にすればよいのではないかと思ったからです。
もしなにか勘違いしていたら申し訳ないですが。。
引用返信 編集キー/
■89027 / inTopicNo.15)  Re[9]: C#からデータベース書き込み
□投稿者/ 魔界の仮面弁士 (1894回)-(2018/10/25(Thu) 15:31:12)
No89026 (tetris さん) に返信
> 変数として埋め込む方法を教えてくださったので、ここの記述を参考に手を付けようと思ったからです。

「ここの記述」がどの発言を指しているのか読み取れませんでしたが:

SELECT / INSERT / UPDATE / DELETE のいずれであっても

(1) 推奨されない手法
command.CommandText = "INSERT INTO 来館記録_T ( [会社名],[氏名]) VALUES ( '" + Tmptext1 + "', '" + Temptext2 + "')";

(2) 提案されている例
command.CommandText = "INSERT INTO 来館記録_T ( [会社名],[氏名]) VALUES ( ?, ? )";
command.Parameters.AddWithValue("kaisya", kaisyamei.Text);
command.Parameters.AddWithValue("simei", simei.Text);

のようにする、ということです。

※ WHERE [ID] IN ( 〜 ) のような問い合わせがある場合は、Dapper を経由で呼び出した方が楽かも。
引用返信 編集キー/
■89030 / inTopicNo.16)  Re[10]: C#からデータベース書き込み
□投稿者/ tetris (8回)-(2018/10/25(Thu) 16:34:36)
No89027 (魔界の仮面弁士 さん) に返信
> ■No89026 (tetris さん) に返信
>>変数として埋め込む方法を教えてくださったので、ここの記述を参考に手を付けようと思ったからです。
>
> 「ここの記述」がどの発言を指しているのか読み取れませんでしたが:
>
> SELECT / INSERT / UPDATE / DELETE のいずれであっても
>
> (1) 推奨されない手法
> command.CommandText = "INSERT INTO 来館記録_T ( [会社名],[氏名]) VALUES ( '" + Tmptext1 + "', '" + Temptext2 + "')";
>
> (2) 提案されている例
> command.CommandText = "INSERT INTO 来館記録_T ( [会社名],[氏名]) VALUES ( ?, ? )";
> command.Parameters.AddWithValue("kaisya", kaisyamei.Text);
> command.Parameters.AddWithValue("simei", simei.Text);
>
> のようにする、ということです。
>
> ※ WHERE [ID] IN ( 〜 ) のような問い合わせがある場合は、Dapper を経由で呼び出した方が楽かも。

ご丁寧にありがとうございます。
提案されている例:の方で非常にやりたかったことができました。
すごく感謝いたします!ありがとうございました!!!
解決済み
引用返信 編集キー/
■89033 / inTopicNo.17)  Re[9]: C#からデータベース書き込み
□投稿者/ WebSurfer (1630回)-(2018/10/25(Thu) 18:41:42)
No89026 (tetris さん) に返信

> McDonald's
> のような「'」が入力されることがないので(会社名や氏名しか入力しないため)、
> 尚更この意見を参考にすればよいのではないかと思ったからです。
> もしなにか勘違いしていたら申し訳ないですが。。

SQL インジェクション対策もきちんとやりましょうと言っています。と言うか、おそらくそれが
一番重要なことだと思います。

悪意を持った攻撃者がいるという環境ではないのかもしれませんが、間違いとか興味本位でとん
でもない入力をする人がいつかもしれません。

テキストボックスに ; DROP 来館記録_T-- とか入力されたら大変なことになるのでは?
引用返信 編集キー/
■89034 / inTopicNo.18)  Re[10]: C#からデータベース書き込み
□投稿者/ 魔界の仮面弁士 (1895回)-(2018/10/25(Thu) 22:48:27)
2018/10/25(Thu) 23:11:20 編集(投稿者)

No89033 (WebSurfer さん) に返信
> SQL インジェクション対策もきちんとやりましょうと言っています。と言うか、おそらくそれが
> 一番重要なことだと思います。

重要ですね。同意します。

シングルクォーテーションを使うことは無い、という暗黙ルールだとか、
画面側などで入らないように入力制限している、などといった点とは関係なく、
今回のようなケースでは、常にパラメータークエリーを使うべきだと思います。

Access の場合、' や " 、vbNullChar すなわち ChrW(0) などなど、
気を付ける文字はいろいろあるわけで、それらすべてを自前でサニタイズするのは
あまり現実的ではありませんから、常にパラメーターとして渡すのが安全かつ確実です。

外部から得た入力値では無く、常に固定値となるような安全な値であることが保証されているばあいは
無理にパラメーター化するまでも無く、SQL 埋め込みとすることもできますが、それはまた別の話。

(ただ、そのままパラメーターとして渡せず、LIKE 演算子のエスケープ処理などのように、
 どうしても自前でサニタイズせざるを得ないケースもあるので、そこは臨機応変に)



> テキストボックスに ; DROP 来館記録_T-- とか入力されたら大変なことになるのでは?

WebSurfer さんに確認したいのですが、これは何が起きることを想定しておられますか?

上記の入力が
 kaisyamei.Text = "; DROP 来館記録_T--";
 command.CommandText = "INSERT INTO 来館記録_T ( [会社名],[氏名]) VALUES ( '" + Tmptext1 + "', '" + kaisyamei.Text + "')";
を意味しているのであれば、そのまま INSERT されるだけに思えますので、
これが SQL インジェクション の例と言えるのかは、正直疑問です。

あるいは、入力された文字列が
 kaisyamei.Text = "'); DROP 来館記録_T--";
だったとしても、それによってテーブルがドロップされたりするわけでは無いですよね。


一応、Access 以外のデータベースにおいては、「--」がコメントを表す記号として
解釈されることがあるので、そういう場合には警戒すべきだったのかもしれません。

しかし Microsoft Access の場合、ANSI-89 SQL モードおよび ANSI-92 SQL モードの
いずれにおいても、SQL 文中のコメントをそもそもサポートしていないので、この点は心配無いでしょう。


また、セミコロンで区切って複数の SQL コマンドを並べる手法についても、
Access データベースではマルチステートメント構文として処理されることはありません。
せいぜい、『SQL ステートメントの後に文字が見つかりました。』の
構文エラーで弾かれる程度と認識しています。

セミコロンで区切って書けるのは、せいぜい PARAMETERS ステートメントぐらいではないですかね。
ちなみに PARAMETERS ステートメントというのは、こういう構文の SQL です。
http://makoto-watanabe.main.jp/access/dasqlparameters.htm


ただし PARAMETERS な SQL は、Access 本体、あるいは ADO や DAO による接続時に使われる
構文なので、ADO.NET からの接続時に使うことはまずありません。

一応、下記のようにすれば呼べなくも無いのですが…
ADO.NET からの接続時には、名前付きパラメーターを利用できず、
出現順の位置パラメーターとしてしか処理されないので、メリットは皆無です。

string sql = @"
PARAMETERS [kaisha] VARCHAR(10), [simei] VARCHAR(10);
INSERT INTO 来館記録_T ( [会社名],[氏名]) VALUES ( [kaisha] , [simei] )
";
var cmd = conn.CreateCommand();
cmd.CommandText = sql;
cmd.Parameters.AddWithValue("kaisha", "あああ");
cmd.Parameters.AddWithValue("name", "いいい");
cmd.Parameters.AddWithValue("p1", DBNull.Value);
cmd.Parameters.AddWithValue("p2", DBNull.Value);

conn.Open();
cmd.ExecuteNonQuery();
conn.Close();


蛇足ついでに書いておくと、JET Database の古いバージョン(VB4 頃まで)においては、
どちらかというと VBA ステートメント実行文字となる垂直バー(|)の方が問題でした。
https://web.archive.org/web/20011109124047/http://support.microsoft.com/support/kb/articles/q147/6/87.asp

今は、文字列中に | 記号が渡されても実行されないよう対策されていますので、
現行バージョンにおいては、
 kaisyamei.Text = " |shell(\"cmd /c echo aaa>C:\\temp\\test.txt\"| ";
な文字列が入力されたとしても、cmd.exe が実行されたりはしません。

おまけに JET 3.5 以降では、Sandbox モードによる保護も追加されていますしね。
https://support.office.com/ja-jp/article/04f63c28-7099-4779-b2bb-6150db8c9dfc
引用返信 編集キー/
■89035 / inTopicNo.19)  Re[11]: C#からデータベース書き込み
□投稿者/ WebSurfer (1631回)-(2018/10/26(Fri) 00:14:12)
No89034 (魔界の仮面弁士 さん) に返信

WebSurfer さんに確認したいのですが、これは何が起きることを想定しておられますか?

以下の記事を見ていただければと思います。

SQL インジェクション
https://docs.microsoft.com/ja-jp/previous-versions/sql/sql-server-2008/ms161953(v=sql.100)

質問者さんのケース、Access ではどうかとか、魔界の仮面弁士さんが言われるほど詳しく考え
てませんけど。

でも、上に紹介した記事に書いてある「高いスキルを持つ決然たる攻撃者は、パラメータ化され
たデータであっても操作できるのです」とか言われると、それ以前のパラメータ化をしないなん
て言うのは問題外と思ってます。
引用返信 編集キー/
■89036 / inTopicNo.20)  Re[3]: C#からデータベース書き込み
 
□投稿者/ 774RR (636回)-(2018/10/26(Fri) 09:59:27)
っていうか初等教育って大事って話ですよね。三つ子の魂百まで。

ループには for 文を使う (goto も使えるけど教えない)
データベースにアクセスする際にはパラメタライズドクエリを使う (文字列結合は教えない)

今どきなら、最初からこのように教えられるべき。そして1つプログラム完成させたのちに
文字列結合はダメな理由を教えると、文字列結合を使おうという発想自体が消滅します。
常にパラメタライズドクエリを使うようになり、教えるほうも教えられたほうも win-win
# 逆順はダメ

まあデーターベース系ソフトを一度も組んだことないオイラの言う話ぢゃないですけど。

引用返信 編集キー/

次の20件>
トピック内ページ移動 / << 0 | 1 >>

管理者用

- Child Tree -