何かを投稿するサイトを作るにあたって避けられないのが荒らし対策です。
ユーザー入力を信用してはいけません。此方の意図した方法、あるいは値で受け取ることが出来る保証はありません。
第二回でCSRF対策をしましたが、それも完全に防御出来る保証になりません。
つまり、受け取った全ての値を疑ってかかる必要があります。
特に、選択式のフォームから受け取った値は盲信しないようにして下さい。必ず、選択肢のうちのどれかになっているか確認しましょう。
また、一行テキスト入力をフォームから受け取った場合は改行が含まれませんが、その保証はありません。
phpのempty()は、文字の「0」や全角スペースを誤って判定します。
<?php
//代わりにこの関数を使う(入力が空でないときに真、それ以外で偽を返す)
function not_empty(string $s){
$s = preg_replace('/( | )/', '', trim($s)); //タブと改行と半角全角スペースを取り除く
if (!empty($s)){
return true;
}
if (strpos($s, '0') !== false){
//文字の「0」は良い
return true;
}
return false;
}
セッションクッキーは「httponly」にしないと改ざんの危険性が高まります。php.iniに「session.cookie_httponly = 1」と書きましょう。
<?php
//フォーム入力はこの関数を通したり、
function expelliarmus(string $s){
return htmlspecialchars($s, ENT_QUOTES, 'UTF-8');
}
//処理を始める前にこの処理を噛ませたり、
if (isset($_POST)){
foreach ($_POST as $k => $v){
#各投稿内容を、全て改行コードと文字コードをそろえる。
$_POST[$k] = preg_replace('/\r\n|\r|\n/', PHP_EOL, mb_convert_encoding($v, 'UTF-8'));
}
}
数値の入力で、かならず数字が得られるとは限りませんし整数である保証もありません。型キャストしましょう。
とにかく念には念を押しましょう。
先の対策で荒らし(サイバー攻撃)はある程度防御出来、少なくともサイトが誤動作することは無いでしょう。
しかし、それで誹謗中傷や悪口等は防げません。
NGワードを決めたり、会員制にしてあれこれしたり、する手がありますが一部の荒らしのせいで利便性が損なわれるのは向こうの思うつぼです。
(荒らしを)持ち込まない、増やさない、滅する の三原則です。
まず、持ち込まないためには、裏サイト宣伝し過ぎないこととリンクは一部の人にだけ教えるようにしましょう。
増やさないために、荒らしはあまり放置しないで黙って削除です。かまってもいけません。荒らしが徳しないようにします。そういう雰囲気を作ることが大切です。
滅するには、難しいですがアクセスブロックです。一定期間、 その名前で投稿不可にしたり、密かにクッキーを付与してブロックを継続させたり、、、。ただしIPブロックはやめましょう。そんなことすると、いつの間にか誰も投稿出来なくなります。(荒らしは何度もIPを変えますし、巻き添えブロック多発です)
正面から戦ってはいけません。奴らは貴方の揚げ足をとったり墓穴を掘らせたいのです。
相手の実力を見誤ってはなりません。大抵、奴らの方が何枚も上手であると想定しましょう。
自分の実力を過信してはいけません。相手は貴方の倍以上、長く生きています。
勝とうとは思わないで下さい。サイトが壊れない限り、貴方の負けではありません。
学校裏サイトが現れ20年。体罰はなくなり、暴力教師のほとんどが死に、ブラック校則が7割減少した。
学校裏サイトで、、、「他の者にできたか? ここまでやれたか? この先できるか?」
「裏サイトひとつで校則を...教員を正しい方向へ導けるか?」
「私利私欲の為にしか使えない、自分の為にしか使えない、馬鹿な器の小さな学生しかいないじゃないか!」