PHP でeval()関数を使用する Web ゲームのコードを引き継いでいます。これが重大なセキュリティ問題になる可能性があることはわかっているので、コードのその部分を削除するかどうかを決定する前に、引数をチェックするコードを精査する手助けが必要です。現在、安全であると確信できるまで、コードのこのセクションをゲームから削除しましたが、機能が失われることは理想的ではありません。そのようなことが可能であると仮定して、eval() の使用を避けるためにセグメント全体を再設計するよりも、これをセキュリティで証明したいと思います。悪意のあるコード インジェクションを防止すると思われる関連コード スニップを以下に示します。$value は、";" を含まないことがわかっているユーザー入力文字列です。
1 $value = eregi_replace("[ \t\r]","",$value);
2 $value = addslashes($value);
3 $value = ereg_replace("[A-z0-9_][\(]","-",$value);
4 $value = ereg_replace("[\$]","-",$value);
5 @eval("\$val = $value;");
これまでの私の理解は次のとおりです。
1) $value からすべての空白を削除します
2)データベース呼び出しに必要な文字をエスケープします(なぜこれが必要なのかは私にはわかりません)
3) 英数字の直後に \ または ( が続く文字を検索し、それらの組み合わせを - に置き換えます。おそらくこれは、文字列内の関数呼び出しに似たものをすべて削除することですが、なぜ前の文字も削除するのかは私には不明です. 2行目で明示的に追加した後、 \ も削除されます。
4) 文字列内の php 変数への参照に似たものを避けるために、$ のすべてのインスタンスを - に置き換えます。
だから:ここに穴が残っていますか?そして、上記の正規表現を誤解していますか? 最後に、 ( 文字を除外せずにこれをセキュリティで保護する方法はありますか? 入力される文字列は理想的には数式であり、 ( を許可すると操作の順序を操作できますが、これは現在不可能です。