Page 1
PHP
バグ・脆弱性の温床10連発
Kill your PHP code by hitting 10 combos
[2019-09-21]PHPカンファレンス北海道2019
#phpcondo
公開日:
by USAMI Kenta@tadsan
に札幌市中央区の札幌市民交流プラザで開催された『PHPカンファレンス北海道2019』でアンカンファレンス(20分)として発表しました。
[2019-09-21]PHPカンファレンス北海道2019
#phpcondo
実家は近所です!!!
前回のぺちこん北海道2016がカンファレンスデビュー戦
ついでにその前は札幌市中央区Ruby会議01
さて
PHPカンファレンスは楽しかったですか!
ここで学んだことは今後の仕事に活かしていきましょう
本題
ということでクイックにいきましょう
10連発
ただしタイトルの「10連発」は任意の進数表記とする
[2019-07-31]第140回 PHP勉強会@東京
#phpstudy
<?
$id = $_REQUEST['id'];if (!is_numeric($id))printf("<p>{$id}は正しいIDではありません</p>");
?>,
short open tagはphp.iniの設定依存なので、
基本は <?php または <?=
<?
$id = $_REQUEST['id'];if (!is_numeric($id))printf("<p>{$id}は正しいIDではありません</p>");
?>,
short open tagはphp.iniの設定依存なので、php.ini依存かつ、
基本は <?php または <?=
$_GETと$_POSTが混ざると不適切な取り扱
いされる傾向がある
short open tagはphp.iniの設定依存なので、php.ini依存かつ、
基本は <?php または <?=
$_GETと$_POSTが混ざると不適切な取り扱
いされる傾向がある
何を期待するのか
不明瞭だがMySQLのAUTO_INCREMENTなサロゲートキーなら不適切
short open tagはphp.iniの設定依存なので、php.ini依存かつ、
基本は <?php または <?=
$_GETと$_POSTが混ざると不適切な取り扱
いされる傾向がある
何を期待するのか
不明瞭だがMySQLのAUTO_INCREMENTなサロゲートキーなら不適切
printfフォーマットに変数埋め込みをしない (入力値に%が含まれるとWarningが発生)
short open tagはphp.iniの設定依存なので、php.ini依存かつ、
基本は <?php または <?=
$_GETと$_POSTが混ざると不適切な取り扱
いされる傾向がある
何を期待するのか
不明瞭だがMySQLのAUTO_INCREMENTなサロゲートキーなら不適切
printfフォーマットに脆弱性ではないが変な文字が混変数埋め込みをしない (入力値に%が含まれる
ざってるので ?> は消す
とWarningが発生)
short open tagはphp.iniの設定依存なので、php.ini依存かつ、
基本は <?php または <?=
$_GETと$_POSTが混ざると不適切な取り扱
いされる傾向がある
脆弱性じゃないけど { は一文でも几帳面に付ける方がオススメ
何を期待するのか
不明瞭だがMySQLのAUTO_INCREMENTなサロゲートキーなら不適切
printfフォーマットに脆弱性ではないが変な文字が混変数埋め込みをしない (入力値に%が含まれる
ざってるので ?> は消す
とWarningが発生)
改善案は各自への宿題とします
const VALIDATE_PATTERN = "/^ # begin([a-zA-Z0-9])+([a-zA-Z0-9\._-])* # localpart@ # at mark([a-zA-Z0-9_-])+([a-zA-Z0-9\._-]+)+ # host$ # end/x";
$email = filter_input(INPUT_GET, 'email');if (!preg_match(VALIDATE_PATTERN, $email)) {echo "Bad mail address!!";}register_account(strtolower($email), $password);
PCRE正規表現は /x 修飾子を付けると空白が無視されるので、これはGood
const VALIDATE_PATTERN = "/^ # begin([a-zA-Z0-9])+([a-zA-Z0-9\._-])* # localpart@ # at mark([a-zA-Z0-9_-])+([a-zA-Z0-9\._-]+)+ # host$ # end/x";
$email = filter_input(INPUT_GET, 'email');if (!preg_match(VALIDATE_PATTERN, $email)) {echo "Bad mail address!!";}register_account(strtolower($email), $password);
PCRE正規表現は /x 修飾子を付けると空白が無視されるので、これはGood
だが、バリデーション(妥当性検証)のために正規表現で判定するのはだめ!!!
const VALIDATE_PATTERN = "/^ # begin([a-zA-Z0-9])+([a-zA-Z0-9\._-])* # localpart@ # at mark([a-zA-Z0-9_-])+([a-zA-Z0-9\._-]+)+ # host$ # end/x";
$email = filter_input(INPUT_GET, 'email');if (!preg_match(VALIDATE_PATTERN, $email)) {echo "Bad mail address!!";}register_account(strtolower($email), $password);
PCRE正規表現は /x 修飾子を付けると空白が無視されるので、これはGood
だが、バリデーション(妥当性検証)のために正規表現で判定するのはだめ!!!
FILTER_VALIDATE_EMAILというフラグを使えば取得と同時に検証できる
const VALIDATE_PATTERN = "/^ # begin([a-zA-Z0-9])+([a-zA-Z0-9\._-])* # localpart@ # at mark([a-zA-Z0-9_-])+([a-zA-Z0-9\._-]+)+ # host$ # end/x";
$email = filter_input(INPUT_GET, 'email');if (!preg_match(VALIDATE_PATTERN, $email)) {echo "Bad mail address!!";}register_account(strtolower($email), $password);
PCRE正規表現は /x 修飾子を付けると空白が無視されるので、これはGood
だが、バリデーション(妥当性検証)のために正規表現で判定するのはだめ!!!
FILTER_VALIDATE_EMAILというBad って表示してるだけで、処理はフラグを使えば取得と同時に検証できる
const VALIDATE_PATTERN = "/^ # begin([a-zA-Z0-9])+([a-zA-Z0-9\._-])* # localpart@ # at mark([a-zA-Z0-9_-])+([a-zA-Z0-9\._-]+)+ # host$ # end/x";
停止できてない!!!!
$email = filter_input(INPUT_GET, 'email');if (!preg_match(VALIDATE_PATTERN, $email)) {echo "Bad mail address!!";}register_account(strtolower($email), $password);
PCRE正規表現は /x 修飾子を付けると空白が無視されるので、これはGood
だが、バリデーション(妥当性検証)のために正規表現で判定するのはだめ!!!
FILTER_VALIDATE_EMAILというBad って表示してるだけで、処理はフラグを使えば取得と同時に検証できる
停止できてない!!!!正規化は検討が必要(本来ローカルパートは大文
字小文字区別するが、実際はサービスの実装依存)
$email = filter_input(INPUT_GET, 'email',FILTER_VALIDATE_EMAIL);if ($email !== false) {echo "Bad mail address!!";exit;}
[$local, $host] = explode('@', $email);$normalized = $local . '@' . strtolower($host);
register_account($email, $password);
$email = filter_input(INPUT_GET, 'email',FILTER_VALIDATE_EMAIL);if ($email !== false) {echo "Bad mail address!!";exit;}
[$local, $host] = explode('@', $email);$normalized = $local . '@' . strtolower($host);
register_account($email, $password);
