2017-08-29 6 views
1

私は、データベースからExcelに情報をプルするSQLクエリーに取り組んでいます。しかし、ソースはウェブサイトからのものなので、使用する文字を制御することはできません。私はテーブルのフィールドを編集する能力がありません。SQLクエリで使用する文字は何ですか?

私はサイトが私のコードで問題が発生分野で時々 '文字を使用して問題に遭遇しました:

例フィールド: 『何かがここにあります』

(Table.fieldName = '何かあります')

'エラーが発生しますが、この場合はVBAで' to 'に変更できます。

問題を引き起こす可能性のある文字は他にありますか?おそらく(または)または - または、

編集:私はPHPを知らないし、準備された陳述が何であるか、それとも私の場合にはうまくいくか理解していないことに注意してください。繰り返しますが、Excelを使用してODBC接続経由でデータをインポートしています。これらはExcelのテーブルに保存されます。ユーザーは、VBAを介してODBC接続を更新する番号を入力します。ユーザーが入力した番号に基づいて、許可されていない文字が含まれる場合があるという、関連するフィールド(ユーザーが入力しないフィールド)があります。私は準備された声明がそれを修正できることを知りません。

+4

代わりに準備されたステートメントを使用して、これについて心配する必要はありません。 – Siyual

+1

あなたはどんなキャラクターが心配すべきかを心配する以外に、この全体のセットアップは、SQLインジェクション攻撃のための巨大なオープニングのように聞こえます。 @Siyualが言及するように、準備されたステートメントを使用し、この問題を回避するためにパラメータをバインドする必要があります(キャラクタの問題も修正されます)。 ADODBを使用している場合は、[このまともな例](https://www.mcpressonline.com/programming-other/microsoft/techtip-use-prepared-statements-with-ado-to-access-iseries-data)を参照してください。クエリの作成時にパラメータを使用する方法を参照してください。 – JNevill

+1

[PHPでSQLインジェクションを防止するにはどうすればいいですか?](https://stackoverflow.com/questions/60174/how-can-i-prevent-sql-injection-in-php) –

答えて

1

データを「スクラブ」する必要があるという古くからの問題が発生しました。 これは、オペレータや外出先がウェブから物事を引き出している場合によく発生します。問題は、他人があなたのシステムに入れているものを制御できないということです。

上記のとおり、「一重引用符」は問題を引き起こす可能性があります。または、コンマが問題を引き起こす可能性があります。また、他の見えないアスキー文字も問題を引き起こす可能性があります。 (特に、プリンタにテキストを送る場合)ラインフィードキャリッジリターンのようなものは、あらゆる種類の問題を引き起こす可能性があり、そこにいることさえ分かりません。

「どのような注意を払うべきなのか」という質問に答えるには、「どのような文字を許可しますか」という言葉に言い換えてください。ここで

あなたはあなたが読んで、各文字列をスキャンするためにVBAを使用することができますall ascii charactersのマップへのリンクです。

あなたの文字列データをスクラブする必要がある場合、これは時間がかかりますが、必要なものです。

基本的な考え方は、読み込み中(または読み込み中)の文字列と、ASCIIコードが許容範囲内にあるかどうかを確認するための文字ベースの文字チェックを解析することです。

すなわち:範囲65

Dim strChar As String 
Dim intAsc As Integer 
Dim booFlag As Boolean 

intAsc = Asc(strChar) 
If ((intAsc >= 65) And (intAsc <= 90)) _ 
    Or ((intAsc >= 97) And (intAsc <= 122)) _ 
    Or ((intAsc >= 48) And (intAsc <= 57)) _ 
    Or ((intAsc = 32) _ 
Then 
    booFlag = True 
End If 

から90をお使いの大文字です。 97 - 122は小文字です。 48〜57は0〜9です。そして、32は真のスペース文字のためのasciiです。 他の "Or"ステートメントを追加して、データベースに必要なコードのみを追加することもできます。しかし、あなたは "シングルクォート"と他の見えないもののアスキーを残したいと思うでしょう。

このコードをVBA関数に配置して、チェックする各文字列を解析することができます。承認されたリストにないものが見つかった場合は、それをスペース文字(または他のもの)に変更することができます。

また、SQLインジェクションが心配な方は、キーワードをスキャンする代わりに、パラメータ化されたクエリを使用してSQLコマンドを送信することを検討する必要があります。

希望は、あなたには動作するフレームワークを提供します。 :)

+0

ありがとうこの。これは私が探していたものです。私のデータソースに基づいて、私はSQLインジェクションについてあまり心配していません。私はここにいる誰かが、どのキャラクターが問題を引き起こすかの方向に私を向けることができると思っていましたが、私はそれを手動で行わなければならないかもしれません。 –

+0

はい...あなたのSQLをどのように構築しているのか、それをどのように使用しているのかによって異なります。 varcharと比較するだけの場合は、一重引用符とNULL終止符が実際の問題(見えない制御文字に加えて)になります。 'Like'ステートメントでは%と他のワイルドカード文字が気になります。 'IN'ステートメントを使用している場合、データにカンマがどのように置かれているか心配する必要があります。だからあなたが達成しようとしているものに基づいて、さまざまな答えがたくさんあります。 – abraxascarab