<>&などの保存方法と注意点

このQ&Aのポイント
  • 保存する際に<>&などの特殊文字を含める場合、適切なエスケープ方法を使用する必要があります。
  • 保存する際に<>&などの特殊文字がエラーとなる原因は、SQLインジェクション攻撃の可能性があるため、注意が必要です。
  • 特殊文字を含むデータを保存する際は、パラメータ化クエリを使用してデータベースに安全に保存するようにしましょう。
回答を見る
  • ベストアンサー

<>&などを保存する方法をおしえてください。

<>&などを保存する方法をおしえてください。 NameTextBox CommentTextBox 保存ボタン があり保存ボタンを押すと 下記コードが実行されるようにしました。 これで、保存はできるようになったのですが <>&などを使用するとエラーとなってしまします。 <>&を使用するにはどのようにしたらいいのでしょうか? 教えてください。 Dim strSQL As String = "INSERT INTO tableA (Name,Comment) VALUES (@Name,@Comment)" Using con As New SqlConnection(conStr) Dim command As New SqlCommand(strSQL, con) con.Open() Using cmd1 As SqlDataReader = con.CreateCommand() cmd1.CommandType = CommandType.Text Try with cmd1 .Parameters.Add("@Name", SqlDbType.NVarChar) .Parameters.Add("@Comment", SqlDbType.NVarChar) .Parameters("@Name").Value = NameTextBox .Parameters("@Comment").Value = CommentTextBox End With cmd1.CommandText = strSQL cmd1.ExecuteNonQuery() Catch er As Exception Finally con.Close() Catch ex As Exception Finally con.Close() End Try End Using End Using

  • epiko
  • お礼率58% (21/36)

質問者が選んだベストアンサー

  • ベストアンサー
回答No.3

あぁ、これですかね。 http://d.hatena.ne.jp/yourvoice/20051005/1128532635 テキストボックスに html のタグっぽい物を入力するとエラーになるってやつ。 その aspx の html ソースの先頭にある <%@ Page Language="VB" ~ %> の中に ValidateRequest="false" てのを入れてみてください。 ただしこれは入力値のチェックを行わなくする宣言です。 下記ページ等を読んで安全性を確保するようにしてください。 http://msdn.microsoft.com/ja-jp/library/bb355989.aspx 今回のケースではパラメーター化しているのでザルではないと思いますが。

その他の回答 (3)

回答No.4

#3 です。 ValidateRequest="false" はすでに #2 さんが言ってますね。 もし当たりなら #2 さんにポイントをあげてください。私はいりません。

回答No.2

<>& ↑これを入力すると ※パターン1  DBの書き込みロジックでエラーが発生 ※パターン2  Post時にエラーが発生し、DBの書き込みロジックにまでたどり着いていない が考えられます。 #1のtemtecomai2さんが、DBの書き込みロジックを検証してくれているので、パターン2を疑います。 ASPXファイルの先頭に <%@ Page ~~~~~~ %> があると思います。 ValidateRequest="false" を追加してみてください。 それでやってみてどうなりますか?

epiko
質問者

お礼

ValidateRequest="false"をし 読み込みに TextComment.Text= System.Web.HttpUtility.HtmlEncode(dr("comment") で表示されました。ありがとうございます。

回答No.1

例えばどんな文字列で、どこの行でどんなエラーが出ますか? ASP.NET で追試してみましたが正常に投入できましたよ。 Dim sql As String = "INSERT INTO tableA(Name, Comment) VALUES(@Name, @Comment)" Dim conStr As String = "Data Source=hogePC;Initial Catalog=testDB;Persist Security Info=True;User ID=hogeUser;Password=hogePassword" Using con As New SqlConnection(conStr)  con.Open()  Using cmd1 As SqlCommand = con.CreateCommand()   cmd1.CommandType = Data.CommandType.Text   Try    With cmd1     .Parameters.Add("@Name", Data.SqlDbType.NVarChar)     .Parameters.Add("@Comment", Data.SqlDbType.NVarChar)     .Parameters("@Name").Value = NameTextBox.Text     .Parameters("@Comment").Value = CommentTextBox.Text     .CommandText = sql     .ExecuteNonQuery()    End With   Catch ex As Exception   Finally    con.Close()   End Try  End Using End Using

epiko
質問者

補足

回答ありがとうございます。 エラーになる内容なのですが <日本語>なら保存ができるのですが どうやら<123ABC>など<>の中を半角英数字にすると エラー:Sys.WebForms.PageRequestMasagerServerErrorrException: サーバーで要求を処理中に不明なエラーが発生しました。 サーバーから返された状態コード500 というエラーになります。 半角英数字が使いたいのですがどうしたらいいでしょうか? よろしくお願いします。

関連するQ&A

  • VB2008とObjectBlowser9の連動について

    お世話になります。 先日、こちらのサイトでTextBoxの暗号化について質問させていただいたのですが、 現在、ObjectBlowser9のファンクションに、暗号化の dbms_obfuscation_toolkit.desencrypt( input_string => orgstr, key_string => keystr, encrypted_string => encstr ); を作成し、VBからそのファンクションに接続しようと考えております。 ですが、 Using con As New OracleConnection(builder.ConnectionString) con.Open()  Using cmd As New OracleCommand With cmd .Connection = con .CommandType = CommandType.StoredProcedure .CommandText = "CON_PASS_ANGO" .Parameters.Add("keystr", OracleType.VarChar).Value = keystr .Parameters.Add("orgstr", OracleType.VarChar).Value = orgstr .Parameters.Add("encstr", OracleType.VarChar).Direction = _ ParameterDirection.ReturnValue .ExecuteNonQuery() MessageBox.Show(String.Format("{0}X{1}={2}", _    keystr, orgstr, .Parameters("encstr").Value)) End With End Using End Using と記述したところ、 .Parameters.Add("encstr", OracleType.VarChar).Direction のところで、 パラメータ 'encstr': 可変長データ型 : String のサイズが設定されていません。というエラーが出てしまいます。 エラーの意味も調べたのですがいまいち理解できず、停滞しているところです。どなたか解決策をご提示願えないでしょうか、 よろしくお願いします。

  • Insertできません

    どうしてもInsertできませんどこが間違っているのか教えてください。 Dim cn As New SqlConnection("workstation id=""ユーザー名?"";packet size=4096;user id=test;data source=server名;per" & _ "sist security info=True;initial catalog=テーブル名;Password=パスワード") Dim cmd As New SqlCommand("カラム1", cn) cmd.CommandType = CommandType.StoredProcedure 'cnst.CommandText = "INSERT INTO テーブル名(カラム1, カラム2, カラム3,カラム4) " & _ '"VALUES (@カラム1, @カラム2, @カラム3,@カラム4())" Dim p1 As SqlParameter = cmd.Parameters.Add("@カラム1", SqlDbType.VarChar, 20) p1.Value = TextBox1.Text Dim p2 As SqlParameter = cmd.Parameters.Add("@カラム2", SqlDbType.VarChar, 20) p2.Value = TextBox2.Text Dim p3 As SqlParameter = cmd.Parameters.Add("@カラム3", SqlDbType.VarChar, 20) p3.Value = Dropdownlist1.DataTextField Dim p4 As SqlParameter = cmd.Parameters.Add("@カラム4", SqlDbType.VarChar, 20) p4.Value = TextBox3.Text cn.Open() cmd.ExecuteNonQuery() cn.Close() SqlDataAdapter2.Fill(DataSet21) DataGrid1.DataBind() End Sub __________________________________________ __________________________________________

  • プロシージャまたは関数の引数が多すぎますのエラー

    お世話になります。 下記のコードを実行すると プロシージャまたは関数 spTest の引数が多すぎます どこが悪いのかご教示お願いいたします。 Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles MyBase.Load Dim i As Integer Dim conn As New SqlConnection(connstr) Dim cmd As New SqlCommand conn.Open() cmd.Connection = conn cmd.CommandText = "Delete Table2" cmd.CommandType = CommandType.Text Debug.WriteLine(cmd.ExecuteNonQuery()) For i = 1 To 100 spTest(cmd, i) Next conn.Close() End Sub sub spTest(ByRef cmd As SqlCommand, ByVal intID As Integer) Dim param As SqlParameter With cmd .CommandType = CommandType.StoredProcedure .CommandText = "spTest" param = .Parameters.Add(New _ SqlParameter("@ID", SqlDbType.Int)) param.Value = intID .ExecuteNonQuery()    ''''' ここで2回目からエラーが発生します End With End sub

  • ストアドプロシージャの戻り値が取得できない

    ストアドプロシージャの戻り値が取得できない ストアドプロシージャ内でSelectとUpdateを行い、設定した戻り値をリターンしたいのです。 ついでにSelectとした複数行の結果の読み込みもしたいのですが。 Dim cmd As New System.Data.SqlClient.SqlCommand Dim i As Integer Dim readerA As System.Data.SqlClient.SqlDataReader cmd.CommandType = Data.CommandType.StoredProcedure cmd.CommandText = "SP名" cmd.Parameters.Add("A", System.Data.SqlDbType.Int) cmd.Parameters("A").Direction = System.Data.ParameterDirection.ReturnValue readerA = cmd.ExecuteReader() i = cmd.Parameters("A").Value if (i = 0) Then 処理 End If While readerA.Read() 処理 End While 上記でSelectした結果をreaderA("カラム名") で読みこめているのですが、戻り値Aの値が取得できていません。 ウォッチ式でcmd.Parameters("A").Valueを見るとNothingになっています。 ちなみに、違うストアドを実行しているところでは戻り値は取得できています。。。 ストアドがおかしいんでしょうか。Selectの取得結果も見ようとしているのがまずいのでしょうか。 環境はvb.net、SQLServer2005です。

  • VB2010からPROCEDUREを実行でエラー

    VB2010を使っています。 Oracleのプロシージャを呼び出しするのですが、 以下のエラーが出て困っています。 ORA-06550:行1、列7: PLS-00801:内部エラー[22503] ORA-06550:行1、列7: PL/SQL:Statement ignored 実際のPG Public Function ORA_EXECUTE(ByVal strSQL As String) As Boolean ' データ格納領域の初期化 Dim v_return_flg As Boolean Dim Ora_Cnn_bk As OracleConnection Dim Ora_Cmd_bk As OracleCommand ' Oracle接続情報の初期化 Ora_Cnn_bk = New OracleConnection Ora_Cmd_bk = New OracleCommand ' Oracleへのコネクションの確立 Ora_Cnn_bk.ConnectionString = "User Id=(ユーザ名); Password=(パスワード); Data Source=(接続文字列)" & "; Pooling=false" Ora_Cnn_bk.Open() v_return_flg = False Try Dim oTYPE_CHAR As OracleDbType = OracleDbType.Char Dim oPARM_OUTPUT = ParameterDirection.Output 'バインド変数のセット Ora_Cmd_bk.Parameters.Add("AAA", oTYPE_CHAR) Ora_Cmd_bk.Parameters("AAA").Value = " " Ora_Cmd_bk.Parameters("AAA").Direction = oPARM_OUTPUT Ora_Cmd_bk.Parameters("AAA").OracleDbType = oTYPE_CHAR 'ストアドプロシージャ実行 Ora_Cmd_bk.CommandType = CommandType.StoredProcedure Ora_Cmd_bk.CommandText = strSQL Ora_Cmd_bk.Connection = Ora_Cnn_bk Ora_Cmd_bk.ExecuteNonQuery() Catch ex As Exception MessageBox.Show("SQL(" + strSQL + ")" + Chr(13) + ex.Message, "確認", MessageBoxButtons.OK) Finally ' コネクションを閉じる Ora_Cnn_bk.Close() ' Oracle接続情報のクリア Ora_Cnn_bk = Nothing Ora_Cmd_bk = Nothing End Try ' データ返却 Return v_return_flg End Function Oracle側のプロシージャは、別PGで使用していて C++からアクセスし使える状態です。 お分かりになる方教えてください。 m(_ _)m

  • DB コミット後にインサートの再開方法

    データベースの挿入についてお教えください。コードは、既にあるテーブルにインサートをおこなっています。 コードはc#で書かれています。 using System; using Mono.Data.Sqlite; public class Example { static void Main() { string cs = "URI=file:test.db"; using (SqliteConnection con = new SqliteConnection(cs)) { con.Open(); using(SqliteTransaction tr = con.BeginTransaction()) { using (SqliteCommand cmd = con.CreateCommand()) { cmd.CommandText = "INSERT INTO Friends(Name) VALUES ('Tom')"; cmd.ExecuteNonQuery(); } tr.Commit(); } con.Close(); } } } tr.Commit()を行なうと、テーブルに挿入されますが、コミット後に新たにデータを挿入したい場合どのようにすればいいでしょうか? あくまで、コードでtr.Commit()コミット後にデータを挿入したい場合です。 using(SqliteTransaction tr = con.BeginTransaction()) { using (SqliteCommand cmd = con.CreateCommand()) { cmd.CommandText = "INSERT INTO Friends(Name) VALUES ('Tom')"; cmd.ExecuteNonQuery(); } tr.Commit(); } using(SqliteTransaction tr = con.BeginTransaction()) { using (SqliteCommand cmd = con.CreateCommand()) { cmd.CommandText = "INSERT INTO Friends(Name) VALUES ('KEN')"; cmd.ExecuteNonQuery(); } tr.Commit(); } 上記のように、トランザクションを同様に2つ書けばできるのは、それでは芸がないので、何か良い書き方がないでしょうか?

  • コンボボックスと連携したグリッドビュー

    コンボボックスには 先頭が""で続きにデータが入っています。 下記のようにすると""が選択できないようです。 うまいことやる方法はありますでしょうか? そもそもDBをバインドさせたコンボボックスの先頭に どうやったら""が表示させられるのかわからないのですが・・・ strSql = "SELECT A.名前 " strSql = strSql & ", B.番号" strSql = strSql & "FROM A,B " strSql = strSql & "WHERE A.ID = B.ID " strSql = strSql & "AND A.ID = @ID" cmd.Parameters.Add("@ID", SqlDbType.Int) cmd.Parameters("@ID").Value = Me.ComboBox1.SelectedValue

  • GridView1の選択の指定とダミーデータの追加について

    GridView1とTwxtBox1を用意し GridView1に選択ボタンをつけ押すと、TextBox1にその行の1行目を表示するようにしたいのですが ★に何を入れたら、選択行を指定することができるのでしょうか?教えてください。 Protected Sub GridView1_SelectedIndexChanged(ByVal sender As Object, ByVal e As System.EventArgs) TextBox1.Text = GridView1.Rows.Item(★).Cells(1).Text End Sub Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Dim conStr As String = ConfigurationManager.ConnectionStrings("ConnectionString").ConnectionString Dim strSQL As String strSQL = "SELECT 1CELL FROM tableA" Using con As New SqlConnection(conStr) Using cmd As NEw SqlCommand(strSQL, con) Dim dr As SqlDataReader con.Open() dr = cmd.ExecuteReader(Data.CommandBehavior.CloseConnection) GridView1.DataSource = dr GridView1.DataBind() dr.Close() End Using End Using End Sub また、GridView1に出ているデータに選択するデータがない場合の為に データーベースにはなくても【-】というデータを常に表示できるようにしたいのですが どのようにしたらいいのでしょうか? 【tableAの1CELL】 AAAAA BBBBB CCCCC DDDDD - ←データベースにはこのデータはないけれどGridView1には常に表示し、これを選択するとTextBox1に【-】が入るようにしたいのですが よろしくお願いします。

  • Disposeの動き

    VB2010でプログラム開発を行っています。 VB2010は初心者で、インターネットを使って調べながら構築していますので、ほとんど意味を理解していない状態です。 この度下記の文を書いたのですが、Point1で「Cmd.Dispose() 」を入れないとPoint2で「OleDbException が発生しました エラーを特定できません」のエラーになってしまいます。 そこで2つの疑問が出てきたので教えていただけないでしょうか。 疑問1: なぜ、Point1でDisposeしないとエラーになってしまうのか。 疑問2: Point1でDisposeすると、内容が破棄されると思っていたのですが、そのまま処理が進むようです。 なぜ、再度「Dim Cmd As New OleDbCommand」の宣言が必要無く、トランザクションも続いているのでしょうか。 また、よりスマートな書き方があればご教授いただけるとありがたいです。 よろしくお願いします。 Module Module1   Public Con As New OleDbConnection   Public Cmd As New OleDbCommand   Public bTrans As OleDb.OleDbTransaction   Public sb As New System.Text.StringBuilder() End Module Private Sub Btn_Kanryo_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Btn_Kanryo.Click   Dim ExResult AS Integer        '新規トランザクションの開始。        bTrans = Con.BeginTransaction        'コマンドオブジェクトにトランザクション関連付け        Cmd.Transaction = bTrans        'DB更新1        sb = New System.Text.StringBuilder        sb.AppendLine("UPDATE A ")        sb.AppendLine("SET")        sb.AppendLine(" A_AA = '1'")        sb.AppendLine(" WHERE")        sb.AppendLine(" A_BB='123'")        Cmd.Connection = Con        Cmd.CommandText = sb.ToString        ExResult = Cmd.ExecuteNonQuery()        'ストアドプロシージャ―処理        Cmd.Connection = Con        Cmd.CommandType = CommandType.StoredProcedure        Cmd.CommandText = "AAA.ABC"        Dim outPara As New OleDbParameter("ERR_FLG", OleDbType.Decimal)        outPara.Direction = ParameterDirection.Output        Cmd.Parameters.Add(outPara)        Cmd.ExecuteNonQuery() Point1⇒ Cmd.Dispose()        'DB更新2        sb = New System.Text.StringBuilder        sb.AppendLine("DELETE ")        sb.AppendLine(" B")        sb.AppendLine(" WHERE ")        sb.AppendLine(" B_AA='1'")        Cmd.Connection = Con        Cmd.CommandText = sb.ToString Point2⇒ ExResult = Cmd.ExecuteNonQuery()        bTrans.Commit() End Sub

  • VB.Net SqlCommand 共通に

    お世話になります。 VB.Net 駆け出しの者です。 SqlCommand を使いストアドプロシジャーを実行して戻り値を DateSet にするような関数はプログラムを作っていくと、かなり多数になるようになりました。接続文字列だったり、いろいろ同じような記述が続いているなと思っておりました。 そこで、以下のような関数を作り、この部分を使いまわせないものかと思っております。 ストアドプロシジャーの名前や、そのほか必要な部分の文字はすべて変数にして、なんとか使えないのかなと思っているのですが、問題なのは、パラメータの部分でうまくいかないのです。 パラメータの部分だけ別関数にして、なんとかねじこめないかなと思っているのですが・・・ そもそもこういうやり方が正しいのかどうかもわからないのですが、その辺りも含めご教授いただければ幸いでございます。 何卒よろしくお願いいたします。 Public Function CommonDataSet(ByVal NameStored As String, ByVal CMDPara As SqlCommand, ByVal BasicTableName As String, ByVal ErrStr As String, ByVal ErrStrCaption As String) As DataSet     Dim SQLCon As SqlConnection = New SqlConnection(CMO.GetConnectStrings())     Try       CMDPara = New SqlCommand(NameStored, SQLCon)       CMDPara.CommandType = CommandType.StoredProcedure       SQLCon.Open()       Dim custDA As SqlDataAdapter = New SqlDataAdapter       Dim custDS As DataSet = New DataSet       ’この部分で下記の関数でパラメータを設定したいのですが、うまくいきません       custDA.SelectCommand = CMDPara       custDA.Fill(custDS, BasicTableName)       CommonDataSet = custDS     Catch ex As Exception       Err.Raise(Err.Number)       MessageBox.Show(ErrStr, ErrStrCaption, MessageBoxButtons.OK, MessageBoxIcon.Warning)       CommonDataSet = Nothing     End Try     If SQLCon.State <> ConnectionState.Closed Then       SQLCon.Close()       SQLCon.Dispose()     End If End Function パラメータを設定する関数 上の関数の引数として設定したいのです  ByVal CMDPara As SqlCommand の部分のパラメータとして Private Function CommonPara(CMD As SqlCommand) As SqlCommand     CMD.Parameters.Clear()     CMD.Parameters.Add(New SqlParameter(パラメータ1の記述)     CMD.Parameters.Add(New SqlParameter(パラメータ2の記述)     CMD.Parameters.Add(New SqlParameter(パラメータ3の記述)     CommonPara = CMD End Function

専門家に質問してみよう