[解決済み] 文字列をサニタイズして、URLやファイル名を安全にする?
質問
私は、特定の文字列をサニタイズして、URL (投稿スラッグ) で使用しても安全で、ファイル名として使用しても安全なようにする関数を考え出そうとしています。たとえば、誰かがファイルをアップロードするとき、名前からすべての危険な文字を削除することを確認したいのです。
今のところ、私はこの問題を解決し、外国の UTF-8 データも可能にすることを期待して、次の関数を考え出しました。
/**
* Convert a string to the file/URL safe "slug" form
*
* @param string $string the string to clean
* @param bool $is_filename TRUE will allow additional filename characters
* @return string
*/
function sanitize($string = '', $is_filename = FALSE)
{
// Replace all weird characters with dashes
$string = preg_replace('/[^\w\-'. ($is_filename ? '~_\.' : ''). ']+/u', '-', $string);
// Only allow one dash separator at a time (and make string lowercase)
return mb_strtolower(preg_replace('/--+/u', '-', $string), 'UTF-8');
}
誰かこれに対して実行できるトリッキーなサンプルデータを持っていませんか? - あるいは、アプリを悪い名前から保護するもっと良い方法を知っていますか?
is-filename は vim の一時ファイルのようないくつかの追加文字を許可します。
update: 有効な使い道が思いつかなかったので、星印の文字を削除しました。
どのように解決するのですか?
あなたの解決策について、いくつか意見を聞かせてください。
- パターンの末尾にある 'u' は パターン を意味し、マッチするテキストは UTF-8 として解釈されることを意味します (後者を想定しているのでしょうか?)。
- \はアンダースコア文字にマッチします。ファイルに対して特別にそれを含んでいるので、URL にそれらを望まないという仮定につながりますが、あなたが持っているコードでは、URL はアンダースコアを含むことが許可されます。
- foreign UTF-8" を含めることは、ロケールに依存するようです。これがサーバーのロケールなのか、クライアントのロケールなのかは明らかではありません。PHP のドキュメントから。
word" 文字とは、文字、数字、アンダースコア、つまり Perl の "word" の一部となり得る文字のことです。文字と数字の定義は PCRE の文字テーブルによって制御され、ロケール固有のマッチングが行われる場合は異なる場合があります。例えば、"fr" (フランス語) ロケールでは、アクセント付きの文字に 128 より大きな文字コードが使用され、これらは \w によってマッチングされます。
スラッグの作成
投稿のスラッグにアクセント記号付きの文字などを含めるべきではありません。技術的には、パーセントエンコード(URL エンコードの規則による)されるべきなので、見苦しい URL になってしまうからです。
私だったら、小文字にした後、「特殊」文字を同等の文字に変換し (例: é -> e)、「a-z」以外の文字を「-」に置き換え、あなたが行ったように「-」を 1 つだけ使用することに制限します。特殊文字を変換する実装はこちらにあります。 https://web.archive.org/web/20130208144021/http://neo22s.com/slug
一般的な除菌
OWASPはEnterprise Security APIをPHPで実装しており、アプリケーションの入出力を安全にエンコード、デコードするためのメソッドなどが含まれています。
Encoder インターフェースは、以下のものを提供します。
canonicalize (string $input, [bool $strict = true])
decodeFromBase64 (string $input)
decodeFromURL (string $input)
encodeForBase64 (string $input, [bool $wrap = false])
encodeForCSS (string $input)
encodeForHTML (string $input)
encodeForHTMLAttribute (string $input)
encodeForJavaScript (string $input)
encodeForOS (Codec $codec, string $input)
encodeForSQL (Codec $codec, string $input)
encodeForURL (string $input)
encodeForVBScript (string $input)
encodeForXML (string $input)
encodeForXMLAttribute (string $input)
encodeForXPath (string $input)
https://github.com/OWASP/PHP-ESAPI https://www.owasp.org/index.php/Category:OWASP_Enterprise_Security_API
関連
-
[解決済み】phpのob_start()の使い道は?
-
[解決済み】「セッションキャッシュリミッターを送信できません - ヘッダーはすでに送信されています」【重複】。
-
[解決済み】XAMPPエラー: www.example.com:443:0 サーバー証明書に、サーバー名と一致するIDが含まれていません。
-
[解決済み】Chrome net::ERR_INCOMPLETE_CHUNKED_ENCODING エラーが発生しました。
-
[解決済み] URI、URL、URNの違いは何ですか?
-
[解決済み] PHPの文字列で、シングルクオートとダブルクオートの違いは何ですか?
-
[解決済み] ディレクトリ内のファイルをループしてパスを変更し、ファイル名にサフィックスを追加する方法
-
[解決済み] javascriptでURLをホスト名とパスにパースするには?
-
[解決済み】Bashでファイル名と拡張子を抽出する。
-
[解決済み】URLでbase64エンコードされた文字列を受け渡す
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】空の配列要素を削除する
-
[解決済み】mysqli_result クラスのオブジェクトを文字列に変換できない
-
[解決済み】「セッションキャッシュリミッターを送信できません - ヘッダーはすでに送信されています」【重複】。
-
[解決済み】PHP 7.2 - Warning: count(): パラメータは配列かCountableを実装したオブジェクトでなければならない [解決済み]
-
[解決済み】変な電話番号を生成するフェイカー?
-
[解決済み】メンバ関数をnullで呼び出す?
-
[解決済み】新しいPHPMailerはPHPMailerAutoload.phpが必要?
-
[解決済み】Xampp ローカルホスト/ダッシュボード
-
[解決済み] PHP 未定義関数への呼び出し
-
[解決済み] URLを作成する際に安全な文字は何ですか?