1. Apache サーバーのセキュリティ設定
1. Nobody ユーザーとして実行
通常、Apache は Root によってインストールされ、実行されます。 Apache サーバー プロセスに Root ユーザー権限がある場合、システム セキュリティに大きな脅威となるため、Apache サーバー プロセスが可能な限り低い権限を持つユーザーとして実行されるようにする必要があります。 httpd.conf ファイル内の次のオプションを変更すると、Apache を Nobody ユーザーとして実行して、相対的なセキュリティを実現できます。
UserEveryone
Group# -1
2. ServerRoot ディレクトリの権限
すべての設定が適切で安全であることを確認するには、Apache ホーム ディレクトリへのアクセスが必要です。スーパーユーザー以外がディレクトリの内容を変更できないように、権限を厳密に制御する必要があります。 Apache のホーム ディレクトリは、Apache サーバー設定ファイル httpd.conf のサーバー ルート制御項目に対応します。これは次のようになります。
サーバー ルート /usr/local/apache
SSI 設定
Apache サーバーの実行機能を無効にするには、設定ファイル access.conf または httpd.conf の Options ディレクティブに include NO EXEC オプションを追加します。ユーザーが Apache サーバー内の実行プログラムを直接実行できないようにします。これにより、サーバー システムが漏洩する可能性があります。
オプションには Noexec が含まれます
4. ユーザーがシステム設定を変更できないようにします
ユーザーがシステム設定を変更できないようにするには、Apache サーバーの設定ファイルで次の設定を行います。 .htaccess ファイルを変更して、ユーザーが定義可能なシステム セキュリティ機能をオーバーライドできないようにします。
AllowOveride なし
オプション なし
すべてから許可
次に、特定のディレクトリを適切に構成します。
5. Apache サーバーのデフォルトのアクセス特性を変更する
Apache のデフォルト設定では、サーバーが通常のマッピング ルールを通じてファイルを見つけることができる場合にのみ保証されます。クライアントは http://local host/~root/ などのこのファイルを取得すると、ユーザーはファイル システム全体にアクセスできるようになります。次のコンテンツをサーバー ファイルに追加します:
orderdeny,ellow
Deny from all
により、ファイル システムへのデフォルトのアクセスが無効になります。
6. CGI スクリプトのセキュリティに関する考慮事項
CGI スクリプトは、Web サーバーを通じて実行できる一連のプログラムです。システムのセキュリティを確保するには、CGI の作成者が信頼できるものであることを確認する必要があります。 CGI の場合は、管理を容易にするために、ファイルを cgi-bin などの特定のディレクトリに制限するのが最善です。また、不正なプログラムが常駐したり混在したりするのを避けるために、CGI ディレクトリ内のファイルが書き込み不可であることを確認する必要があります。その中で、セキュリティに優れた CGI プログラムのモジュールを参考としてユーザーに提供できれば、CGI ディレクトリ内の業務以外のアプリケーション スクリプトをすべて削除し、異常な情報漏洩を防ぐことができます。
7. SSL リンク暗号化
上記の一般的な対策により、Apache サーバーに基本的な安全な動作環境を提供できますが、適切なセキュリティ構成ソリューションを策定するには、特定の実装でさらなる改良と分解が必要であることは明らかです。実用化に向けて。
2. PHP セキュリティ設定
サーバーは、プログラムの脆弱性、ユーザー入力フォームの問題、PHP ファイルのアクセス許可の問題など、すべてのセキュリティ問題を防ぐことはできません。
何らかの手段を使って、ハッカーや不純な動機を持つ人々を混乱させることもできます。
1. プログラム コードの脆弱性
多くの PHP プログラムの主な弱点は、PHP 言語自体の問題ではなく、プログラマーのセキュリティ意識の低さが原因です。したがって、誤ったデータ送信による影響を発見するには、コードの各部分で起こり得る問題に常に注意を払う必要があります。
コードをコピー コードは次のとおりです。
unlink ($evil_var); >fwrite ($fp, $evil_var);
システム ($evil_var)
?>;
常にコードに注意して、クライアントから送信されたすべての変数が適切にチェックされていることを確認してから、いくつかの質問を自問してください。
このスクリプトは、期待されているファイルにのみ影響を及ぼしますか?
異常なデータは送信後に何らかの影響を与える可能性がありますか?
このスクリプトは意図しない目的に使用できますか?
このスクリプトを他のスクリプトと組み合わせて悪いことをすることはできますか?
すべての取引は適切に文書化されていますか?
コードを記述するときに次の質問を自問してください。そうしないと、将来セキュリティを強化するためにコードを書き直す必要が生じる可能性があります。これらの問題に注意すれば、システムのセキュリティを完全に保証することはできませんが、少なくともセキュリティを向上させることはできます。
register_globals、magic_quotes、またはプログラミングをより便利にするその他の設定をオフにすることも検討してください。ただし、変数の正当性、ソース、値が台無しになります。
2. ユーザー入力フォームは
PHP コードのセキュリティを確保するためにユーザーが入力したデータを検証します。
注 1: JS は、訪問ユーザーのエクスペリエンスを向上させるためにのみ作成されており、検証ツールではありません。なぜなら、訪問ユーザーが誤ってクライアント スクリプトの実行を無効にして、この検証層をスキップする可能性があるからです。したがって、このデータを PHP サーバー側プログラムで検証する必要があります。
注 2: データの送信元アドレスを確認するためにスーパー変数 $_SERVER['HTTP_REFERER'] を使用しないでください。小規模な初心者ハッカーは、この変数のデータを偽造するツールを使用します。Md5、rand、およびその他の関数を使用します。トークンを生成するには、ソースを検証するときに、トークンが一致するかどうかを確認します。
3. PHP ファイルのパーミッションの問題
PHP はユーザーレベルでファイルシステムにアクセスするように設計されているため、/etc/passwd などのシステムファイルを読み取ることは完全に可能です。 PHP コードの変更、大量の印刷ジョブの送信など。したがって、PHP コードが適切なファイルを読み書きしていることを確認する必要があります。 以下のコードを見てください。ユーザーはホーム ディレクトリ内のファイルを削除したいと考えています。このシナリオでは、ファイル システムが Web インターフェイスを通じて管理されているため、Apache ユーザーがユーザー ディレクトリ内のファイルを削除する権限を持っていると仮定します。
コードをコピー コードは次のとおりです:
$username = $_POST['user_submitted_name '];
$homedir = "/home/$username";
$file_to_delete = "$userfile";
unlink ("$homedir/$userfile");削除されました! ";
?>
コードをコピーします コードは次のとおりです:
< ?php
$username = $_SERVER['REMOTE_USER'];
$homedir = "/home/$username"; ereg('^[ ^./][^ /]*$', $userfile))
die('不正なファイル名')
if (!ereg('^[^./][^/]* $', $username) )
die('悪いユーザー名')
;
4、隐藏PHP扩展名
一般而言,通过隐藏的手段提高安全性被认为是作用不大的做法。但某些情况下,尽可能的多增加一份安全性都是值得的。
一些简单的方法可以帮助隐藏 PHP,这样做可以提高攻击者发现系统弱点的难度。在 php.ini 文件里设置 expose_php = off ,可以减少他们能获得的有用信息。
另一个策略就是让 web 服务器用 PHP 解析不同扩展名。无论是通过 .htaccess 文件还是 Apache 的配置文件,都可以设置能误导攻击者的文件扩展名:
# 使PHP看上去像其它的编程语言
AddType application/x-httpd-php .asp .py .pl
# 使 PHP 看上去像未知的文件类型
AddType application/x-httpd-php .bop .foo .133t
# 使 PHP 代码看上去像 HTML 页面
AddType application/x-httpd-php .htm .html
要让此方法生效,必须把 PHP 文件的扩展名改为以上的扩展名。这样就通过隐藏来提高了安全性,虽然防御能力很低而且有些缺点。
三、Mysql数据库安全性设置
PHP 本身并不能保护数据库的安全。下面的章节只是讲述怎样用 PHP 脚本对数据库进行基本的访问和操作。记住一条简单的原则:深入防御。保护数据库的措施越多,攻击者就越难获得和使用数据库内的信息。正确地设计和应用数据库可以减少被攻击的担忧。
1、数据库设计问题
应用程序永远不要使用数据库所有者或超级用户帐号来连接数据库,因为这些帐号可以执行任意的操作,比如说修改数据库结构(例如删除一个表)或者清空整个数据库的内容。以下截图的用户设置是危险的。
コードをコピー コードは次のとおりです。
$query = sprintf( "INSERT INTO users(name,pwd) VALUES('%s','%s');",
addslashes($username), md5($password));
$result = pg_query($connection) , $query );
$query = sprintf("SELECT 1 FROM users WHERE name='%s' AND pwd='%s';",
addslashes($username), md5($password)) ;
$result = pg_query($connection, $query);
if (pg_num_rows($result) > 0) {
echo 'ようこそ、$username!'
; 🎜>echo 'Authentication failed for $username.';
}
?>
コードをコピー コードは次のとおりです:
$query = "SELECT id, name ,inserted, size FROM products
WHERE size = '$size'
ORDER BY $order LIMIT $limit, $offset;";
$result = odbc_exec($conn, $query);
?>
コードをコピーします コードは次のとおりです:
settype($offset, 'integer');
$query = "商品から ID、名前を選択 名前で注文 LIMIT 20 OFFSET $offset;"; query = sprintf("SELECT ID, name FROM products ORDER BY name LIMIT 20 OFFSET %d;",
);