私はこれについてたくさんのスレッドを読んでいましたが、それらのどれもこの問題に対処しませんでした。
$
エスケープされたコンテンツが含まれているため、MySQLの動作が中断されるコマンドラインでMySQL式を実行する必要があります。
mysql -u root -p -e "some statement that change a pa$$word"
確認してもらいました。printf
printf "%q\n" 'pa$$word'
pa\$\$word
したがって、脱出する必要はありません。$
それ以外の場合、MySQLクエリに無効なパスワードが入力されます。
答え1
あなたはいくつかのダイナミクスを誤解しました。
構文を一重引用符で囲むと'
、つまり拡張はなく、sをエスケープする必要はありません$
。拡張とは、たとえば特殊文字が存在する$
場合にエスケープされていない場合、特殊シェルプロセスがトリガーされることを意味します。したがって、単一引用符を使用して拡張を抑制する場合は、エスケープする必要はありません。したがって、以下を使用してください。
mysql -u root -p -e 'some statement that change a pa$$word'
に関しては、printf
あなたがしたことは検査ではありませんでした。呼び出すと、s%q
にバックスラッシュが追加されます$
。
何かがうまくいかない場合は、$$
シェルのPID(プロセスID)が変更されたためです。これは、シェルが通常の状況で特殊文字の組み合わせで実行する操作です。エスケープされていない、または一重引用符内に配置されていない場合。
答え2
これは私に役立ちます。
$ mysql -uroot -p'secret' -e "UPDATE users SET
password='pa\$\$word',email='[email protected]' WHERE id = 1;"
答え3
延長したくない場合は、次の$variable
3つのオプションがあります。
- 二重引用符の代わりに一重引用符を使用します(ただし、ステートメントで一重引用符をエスケープする必要があります。したがって、まだ必要です)適切に脱出を処理してください!
- サポートされていない他のシェルを使用してください。
$variables
(サポートされていない良いシェルはわかりません。) - 実際に使用代わりに変数がうまく機能します(ただし、SQL挿入攻撃を避けるためにまだSQLエスケープを処理する必要があることに注意してください)。
つまり、これを行うことができます(変数の設定の正確な概念はシェルによって異なります!以下はアイデアを提供するためにテストされていません)。
pass='pa$$word'
mysql -whatever "dangerous sql injection statement '$pass' if you cannot trust the pass variable"
しかし、準備されたステートメントを使用するそして、このために設計されたプログラミング言語はシェルスクリプトではありません。壊れる可能性がはるかに少ない。
覚える小さなバービーテーブル。誰かがパスワードを選択した場合はどうなりますか');DROP TABLE users; --
?かなり安全なパスワードですか?入力内容を整理してください。シェルでこれを行うのは痛いです。したがって、この操作にシェルを使用しないでください。。詳しくは、次の本をご覧ください。