|
2018/10/26(Fri) 11:45:43 編集(投稿者)
■No89037 (魔界の仮面弁士) に追記 > JET の SQL-89 モードなら ProductName LIKE '*%*' と書けますが、 > JET の SQL-92 モードだと ProductName LIKE '%[%]%' と書かねばなりません。 > > で、こういう対応はパラメータークエリで解決する問題では無いので、 > プログラム側でバリデーションとサニタイジングが必要になってしまうという罠。
追加補足すると、上記は『〜を含む文字列を検索』する画面を作る際に、 パラメーターを用いて para = "%" + textBox1.Text + "%"; sql = "SELECT * FROM TBL WHERE ProductName LIKE ?"; あるいは para = textBox1.Text; sql = "SELECT * FROM TBL WHERE ProductName LIKE '%' & ? & '%'"; として実装した場合の問題点を挙げたものです。 元質問では LIKE 検索の話は挙がっていないので、完全に蛇足なのですが。
で、こういう場合、問題になりそうな特殊文字( %,",[,_,],',# など)への 対処を完全に盛り込むのは大変なので、実際には、"%" や "[" や "]" の 利用を、アプリケーションの仕様として禁じてしまうことも多いと思います。
その意味においては、元質問者が書かれていた >> McDonald's >> のような「'」が入力されることがないので(会社名や氏名しか入力しないため) という対応も、選択肢の一つであるとは思っています。 (それでも、パラメーター化すべきという点では変わりませんが)
ただし、『「'」が入力されることが無い』という言い訳が立つのは、 入力制限や検証コードなどを用いて、絶対に入力されないように 防御されているということが前提となります。
「普段の運用上で、そういう文字が必要になることは無いだろう」と 暗黙ルールとして考えているだけというのは NG ですね。 今は入力されていないというだけで、今後必要になる可能性もありえます。
少なくとも、企業名としての "McDonald's Company (Japan), Ltd." "K's cube(株)" "(株)80'sスマイル" などは実在しているわけですし。氏名についても同様ですね。
|