1. SQL インジェクションのチートシートを使用する
基本原則は、ユーザーが送信したデータを決して信頼しないことです。
もう 1 つのルールは、データを送信または保存するときにデータをエスケープすることです。
これは、入力フィルター、出力エスケープ (FIEO) として要約できます。 SQL インジェクションの脆弱性の通常の原因は、次のステートメントにあるように、入力がフィルターされていないことです:
ユーザーから
WHERE name = '{$_GET['name']}'";
出力をエスケープする場合、プログラム外で使用することを目的としたデータはエスケープする必要があることを覚えておく必要があります。エスケープしないと、正しく解析されない可能性があります。
対照的に、入力をフィルタリングすると、使用前にデータが正しいことが保証されます。
フィルタリングされた入力では、プログラム外の生データは信頼できないため、フィルタリングする必要があることに注意してください。
次の例は、入力フィルタリングと出力エスケープを示しています:
$clean = array。 () ;
$sql = array();
// 名前をフィルターします (簡単にするために、アルファベットの名前が必要です。)
if (ctype_alpha($_GET['name']) {
$clean['name' ] = $_GET['name'];
} else {
// ここで何かを行ってください
// 名前をエスケープします。
$sql['name'] = mysql_real_escape_string(' name' ]);
$query = "SELECT *
FROM users
?> SQL インジェクションを防ぐ方法は、次のような準備ステートメントを使用することです。
コードをコピーします。 コードは次のとおりです。
// クエリ形式を指定します。
2. 比較演算子の違いを理解する
たとえば、文字列内に部分文字列が存在するかどうかを検出するには、strpos() を使用します (部分文字列が見つからない場合は、関数は FALSE を返します)、結果はエラーにつながる可能性があります:
コードをコピー
コードは次のとおりです:
$authors = 'Chris & Sean'; $authors, 'Chris')) {
もちろん、このバグは厳密な比較ステートメントで修正できます:
コードをコピー
コードは次のとおりです:
echo 'Chris is an author.'; else {
echo 'Chris is not an author.';
コードをコピーします。
コードは次のとおりです。
if (auth($username) = = 'admin ') {
$admin = TRUE; } else {
$admin = FALSE; ?>
if (auth($username) == 'admin') {
$name = 'admin@example.org';
$admin = TRUE; {
/* データベースから名前とメールアドレスを取得します。 */
$query = $db->prepare('SELECT name, email
FROM users
WHERE username = :username'); (array('username' => $clean['username']));
$result = $query->fetch(PDO::FETCH_ASSOC);
$name = $result['name']; email = $result['email'];
$admin = FALSE;
?>
$admin は明示的に TRUE または FALSE に設定されているため、すべて問題ないようです。ただし、後で別の開発者が elseif ステートメントをコードに追加した場合、その開発者はそのことを忘れる可能性があります:
コードは次のとおりです:
$email = 'mod@example.org';
$moderator = TRUE;
/* 名前とメールアドレスを取得します。 -> prepare('ユーザー名、メールアドレスを選択
WHERE ユーザー名 = :ユーザー名');
$query->execute(array('ユーザー名' => $clean['ユーザー名']));結果 = $クエリ->fetch(PDO::FETCH_ASSOC);
$name = $result['name'];
$admin = FALSE; ;
}
?>
elseif 条件をトリガーするユーザー名をユーザーが指定すると、$admin が初期化されず、望ましくない動作、またはさらに悪いことにセキュリティの脆弱性が発生する可能性があります。さらに、最初の条件で初期化されていない $moderator 変数にも同様の状況が存在します。
$admin と $moderator を初期化することで、この状況を回避するのは非常に簡単です:
コードをコピーします
コードは次のとおりです:
$admin = FALSE;
if (auth($username) == '管理者') {
$name = 'admin@example.org';
$admin = TRUE; ) == 'mod') {
$name = $result['email'];
コードの残りの部分が何であれ、明示的に別の値に設定されない限り $admin が FALSE であることは明らかです。 $moderator についても同様です。起こり得る最悪の事態は、$admin または $moderator がいかなる条件下でも変更されず、その結果、管理者またはモデレーターである人が、対応する管理者またはモデレーターとして扱われないことです。
何かをショートカットしたいのに、例に else が含まれていることを見て少しがっかりした場合。興味があるかもしれないボーナスのヒントがあります。これが近道と言えるかどうかはわかりませんが、それでも役立つことを願っています。
ユーザーが特定のページを表示する権限を持っているかどうかを検出する関数を考えてみましょう:
コードをコピーします
コードは次のとおりです:
functionauthorized($username, $page) {
if (!isBlacklisted($username)) {
if (isAdmin($username)) {
return TRUE;
} elseif (isAllowed($username, $page)) {
return
} else {
return FALSE;
} else {
return FALSE;
}
}
(管理者がブラックリストに含まれている場合という特殊なケースもありますが、これは考えにくいため、ここではこの状況を無視します)。
コードをシンプルにし、ビジネス ロジックに重点を置くために、関数を使用してこの判断を行います。
例:
コードをコピーします
コードは次のとおりです:
function allowed($username, $page) {
if (!isBlacklisted($username)) {
if (isAdmin($username) || isAllowed($username, $page)) {
return TRUE;
} else {
return FALSE;
}
?>
実際には、次のように関数全体を複合条件に変換できます。コード
コードは次のとおりです:
function allowed($username, $page) { if (!isBlacklisted($username) && (isAdmin($username) || isAllowed($username, $page) ) {UReturn true; } else {Return false; function allowed($username, $page) {
?>
ただし、コード行数を転写することが目的の場合は、 isBlacklisted( を使用していることに注意してください。 )、isAdmin()、および isAllowed() など、これらの判断に関係するものによっては、コードを単なる複合条件に減らすことは魅力的ではない可能性があります
次に、「即時復帰」関数という小さなトリックを説明します。できるだけ早く返すと、これらのルールを非常に簡単に表現できます。 :
コードをコピー
;この例ではさらに多くのコード行が使用されていますが、非常に単純で魅力的ではありません。さらに重要なのは、このアプローチにより、考慮する必要があるコンテキストの量が減ります。たとえば、ユーザーがブラックリストに登録されているかどうかを判断した後は、そのことを忘れても問題ありません。これは、特にロジックが複雑な場合に非常に役立ちます。
4. 常に中括弧を使用してください
この記事の内容によれば、責任著者は「中括弧」ではなく「中括弧」を意味するはずです。 「括弧」は通常「角括弧」を意味します。中括弧がないと可読性と保守性が損なわれるため、このヒントは無条件に無視する必要があります。
簡単な例を示します:
if (date('d M') == '21 May')
$birthdays = array ('アル フランケン'、
'クリス シフレット'、
'クリス ウォレス'、
'ローレンス トゥロー');は次のとおりです:
if (date('d M') == '21 May')
$birthdays = array('Al Franken',
'Chris Shiflett',
'Lawrence Tureaud');
party(TRUE);
中括弧がないと、毎日社交的な集まりに参加することになります。おそらくあなたには忍耐力があるので、この間違いは歓迎されるでしょう。この愚かな例が、過度のパーティーが予期せぬ副作用をもたらす可能性があるという点から逸れないことを願っています。
中かっこをなくすことを推奨するために、以前の記事では例として次のような短いステートメントを使用しました:
else $height ++;
各条件が別の行に配置されているため、このエラーは発生する頻度が低いように見えますが、これにより別の問題が発生します。読んで理解するにはさらに時間がかかります。一貫性は非常に重要な特性であるため、開発者はコーディング標準自体が好きではない場合でも、コーディング標準に従うことがよくあります。
常に中かっこを使用することをお勧めします:
コードをコピーします
if (date('d M') == '5月21日') {
$birthdays = array('アル・フランケン',
'クリス・シフレット',
'クリス・ウォレス',
'ローレンスTureaud');
party(TRUE);
?>
毎日パーティーをするのは問題ありませんが、必ず招待してください。 ereg_replace() と preg_replace() の代わりに str_replace() を使用してください
私たちは否定を聞くのは嫌いですが、(原文どおり) 誤用を実証するために使用されたこの小さなトリックは、回避しようとしていたのと同じ悪用問題を引き起こします。 (
軽蔑的に聞こえるのは嫌ですが、このヒントは、防止しようとしているのと同じ誤用につながる一種の誤解を示しています。) 文字列関数が文字マッチングにおいて正規表現関数より高速かつ効率的であることは明らかですが、著者はこれはひどいです 修正してください: 文字列関数のほうが正規表現関数よりも文字列のマッチングが速いというのは明白な事実ですが、このことから結果を導き出そうとする著者の試みは惨めに失敗します:
正規表現を使用している場合は、 ereg_replace() と preg_replace を使用してください。 () は str_replace() よりもはるかに高速です。 str_replace() はパターン マッチングをサポートしていないため、このステートメントには意味がありません。文字列関数と正規表現関数のどちらを選択するかは、どちらが速いかではありません。パターンを照合する必要がある場合は、正規表現関数を使用します。
6. トリプル演算子を使用します。最近実行した監査から抜粋した行:
コードをコピー コードは次のようになります:
7. Memcached
ディスクアクセスは遅く、ネットワークアクセスも遅く、データベースは通常両方を使用します。
プログラムが複数のサーバーに分散されていない場合は、memcached は必要ない可能性があります。単一キャッシュ方法 - データをシリアル化し、一時ファイルに保存します。たとえば、リクエストごとに多くの冗長な作業を排除できます。実際、これはお客様のアプリケーションの最適化を支援する際に、私たちが考慮する簡単な成果です。
簡単に手に入る果物とは:
実のなる木には、動物や人間がそれほど苦労せずに届くほど低い枝がいくつかあることがよくあります。これらの低い枝に含まれる果物は、高いところにある果物ほど熟していない、または魅力的ではない可能性があります。これは、一般に、最小限の労力で最も簡単なターゲットを選択することを意味します。データをメモリにキャッシュする方法は、私たちの同僚である George Schlossnagle によって元々開発されたキャッシュ システムである APC の共有型ヘルパー メソッドを使用しています。次の例を考えてみましょう。 ?php $feed = apc_fetch('news');
if ($feed === FALSE) { $feed = file_get_contents('http://example.org/news.xml');
// これを保存します5 分間のデータを共有メモリに保存します。
apc_store('news', $feed, 300);
// $feed で何かをします
;
このタイプのキャッシュを使用すると、リクエストごとにリモート サーバーがフィード データを送信するのを待つ必要がありません。多少の遅延が発生します。この例では上限は 5 分ですが、これはアプリケーションのニーズに応じてほぼリアルタイムに調整できます。
8. フレームワークを使用する
すべての決定には結果が伴います。私たちはフレームワークが大好きです。実際、CakePHP と Solar の主任開発者は OmniTI で私たちと協力しています。しかし、フレームワークを使用すると魔法のように物事が改善されるわけではありません。
10 月に、私たちの同僚の Paul Jones が HP Advent に「フランチャイズとしてのフレームワーク」という記事を書き、フレームワークを商用フランチャイズと比較しました。彼は、マイケル・ガーバーの著書「電子神話再訪」からのアドバイスを引用しています:
ガーバーは、ビジネスを成功させるには、起業家は自分のビジネスをフランチャイズとして販売するつもりであるかのように行動する必要があると指摘しています。これは、ビジネスオーナーがあらゆる決定に個人的に関与せずにビジネスを運営できる唯一の方法です。
( ガーバー氏は、ビジネスを成功させるには、起業家は自分のビジネスをフランチャイズのプロトタイプとして販売するつもりであるかのように行動する必要があると指摘しています。それが、ビジネスオーナーがあらゆることに個人的に関与することなくビジネスを運営できる唯一の方法です。 )
これは良い提案です。フレームワークを使用する予定がある場合でも、独自のタグや規則を定義する場合でも、将来の開発者の観点から価値を理解することが重要です。
私たちは、すべてに当てはまる真実をお伝えしたいと思っていますが、フレームワークが常に適切であることを示すためにアイデアを拡張することは、私たちがやりたいことではありません。
フレームワークを使用するべきかどうか尋ねられたら、私たちが与えることができる最善の答えは、「それは状況による」です。
9. エラー抑制演算子を正しく使用してください
常にエラー抑制演算記号の使用を避けるようにしてください。以前の記事で、著者は次のように述べています:
@ 演算子は非常に遅く、高パフォーマンスのコードを記述する必要がある場合は非常に高価になる可能性があります。
エラー抑制が遅いのは、PHP が抑制ステートメントを実行する前に error_reporting レベルを動的に 0 に変更し、その後すぐに復元するためです。これにはお金がかかります。
さらに悪いことに、エラー抑制機能を使用すると、問題の根本原因を追跡することが困難になります。
前の記事では、参照による変数への値の割り当てをサポートするために次の例を使用しました。 。 。 (この文をどう訳せばいいでしょうか?混乱しています~~~)
前の記事では、$albus が設定されているかどうかが不明な場合に、参照によって変数を割り当てる練習をサポートするために次の例を使用しています:
$albert =& $albus;
?>
これは今のところ、奇妙な未定義の動作に依存していますが、次のような説明はありません。なぜこれが機能するのかをよく理解すると、バグが発生します。
$albert は $albus を参照しているため、後で $albus を変更すると $albert にも影響します
より良い解決策は isset() を使用して中括弧を追加することです:
if (!isset($albus)) {
$albert = NULL;
?>
エラー抑制演算子を過度に使用するコードを継承する場合は、エラー抑制を無効にする Scream という新しい PECL 拡張機能があります
。 これは実際には賢い方法ですが、前の記事ではまったく説明されていませんでした。以下は補足的な例です:
// ユーザー名は少なくとも 6 つです
}
?>
文字列を配列として扱う場合 (荒野に光はありません。実際、C 言語では通常、文字は配列の形で存在します)、文字列内の各文字は配列の要素になります。特定の要素の有無を確認することで、文字列に少なくともその数の文字が存在するかどうかを確認できます。 (最初の文字は要素 0 であるため、$username[5] は $username の 6 番目の文字であることに注意してください。)
この方法で isset を使用する方が strlen よりわずかに高速である理由は複雑です。簡単に説明すると、strlen() は関数であり、isset() は構文構造です。一般に、関数の呼び出しは、言語構造を使用するよりもコストが高くなります。
著者について:
こんにちは、私たちは Chris Shiflett と Sean Coates です。私たちは 2 人とも OmniTI (「聞いたことのない最も重要な Web 会社」) で働いており、shiflett.org と seancoates で PHP やその他のことについてブログを書いています。 .com 、PHP Advent のキュレーション、@shiflett および @coates としての活動を行っています。
翻訳元: http://coding.smashingmagazine.com/2009/03/24/10-useful-php-tips-revisited/
)

PHPは主に手順プログラミングですが、オブジェクト指向プログラミング(OOP)もサポートしています。 Pythonは、OOP、機能、手続き上のプログラミングなど、さまざまなパラダイムをサポートしています。 PHPはWeb開発に適しており、Pythonはデータ分析や機械学習などのさまざまなアプリケーションに適しています。

PHPは1994年に発信され、Rasmuslerdorfによって開発されました。もともとはウェブサイトの訪問者を追跡するために使用され、サーバー側のスクリプト言語に徐々に進化し、Web開発で広く使用されていました。 Pythonは、1980年代後半にGuidovan Rossumによって開発され、1991年に最初にリリースされました。コードの読みやすさとシンプルさを強調し、科学的コンピューティング、データ分析、その他の分野に適しています。

PHPはWeb開発と迅速なプロトタイピングに適しており、Pythonはデータサイエンスと機械学習に適しています。 1.PHPは、単純な構文と迅速な開発に適した動的なWeb開発に使用されます。 2。Pythonには簡潔な構文があり、複数のフィールドに適しており、強力なライブラリエコシステムがあります。

PHPは、多数のWebサイトとアプリケーションをサポートし、フレームワークを通じて開発ニーズに適応するため、近代化プロセスで依然として重要です。 1.PHP7はパフォーマンスを向上させ、新機能を紹介します。 2。Laravel、Symfony、Codeigniterなどの最新のフレームワークは、開発を簡素化し、コードの品質を向上させます。 3.パフォーマンスの最適化とベストプラクティスは、アプリケーションの効率をさらに改善します。

phphassiblasifly-impactedwebdevevermentandsbeyondit.1)itpowersmajorplatformslikewordpratsandexcelsindatabase interactions.2)php'sadaptableability allowsitale forlargeapplicationsusingframeworkslikelavel.3)

PHPタイプは、コードの品質と読みやすさを向上させるためのプロンプトがあります。 1)スカラータイプのヒント:php7.0であるため、基本データ型は、int、floatなどの関数パラメーターで指定できます。 3)ユニオンタイプのプロンプト:PHP8.0であるため、関数パラメーターまたは戻り値で複数のタイプを指定することができます。 4)Nullable Typeプロンプト:null値を含めることができ、null値を返す可能性のある機能を処理できます。

PHPでは、クローンキーワードを使用してオブジェクトのコピーを作成し、\ _ \ _クローンマジックメソッドを使用してクローン動作をカスタマイズします。 1.クローンキーワードを使用して浅いコピーを作成し、オブジェクトのプロパティをクローン化しますが、オブジェクトのプロパティはクローニングしません。 2。\ _ \ _クローン法は、浅いコピーの問題を避けるために、ネストされたオブジェクトを深くコピーできます。 3.クローニングにおける円形の参照とパフォーマンスの問題を避けるために注意し、クローニング操作を最適化して効率を向上させます。

PHPはWeb開発およびコンテンツ管理システムに適しており、Pythonはデータサイエンス、機械学習、自動化スクリプトに適しています。 1.PHPは、高速でスケーラブルなWebサイトとアプリケーションの構築においてうまく機能し、WordPressなどのCMSで一般的に使用されます。 2。Pythonは、NumpyやTensorflowなどの豊富なライブラリを使用して、データサイエンスと機械学習の分野で驚くほどパフォーマンスを発揮しています。


ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

AI Hentai Generator
AIヘンタイを無料で生成します。

人気の記事

ホットツール

AtomエディタMac版ダウンロード
最も人気のあるオープンソースエディター

MantisBT
Mantis は、製品の欠陥追跡を支援するために設計された、導入が簡単な Web ベースの欠陥追跡ツールです。 PHP、MySQL、Web サーバーが必要です。デモおよびホスティング サービスをチェックしてください。

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中国語版
中国語版、とても使いやすい
