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把负数转为正整数的方法:1、使用abs()函数将负数转为正数,使用intval()函数对正数取整,转为正整数,语法“intval(abs($number))”;2、利用“~”位运算符将负数取反加一,语法“~$number + 1”。

实现方法:1、使用“sleep(延迟秒数)”语句,可延迟执行函数若干秒;2、使用“time_nanosleep(延迟秒数,延迟纳秒数)”语句,可延迟执行函数若干秒和纳秒;3、使用“time_sleep_until(time()+7)”语句。

php除以100保留两位小数的方法:1、利用“/”运算符进行除法运算,语法“数值 / 100”;2、使用“number_format(除法结果, 2)”或“sprintf("%.2f",除法结果)”语句进行四舍五入的处理值,并保留两位小数。

判断方法:1、使用“strtotime("年-月-日")”语句将给定的年月日转换为时间戳格式;2、用“date("z",时间戳)+1”语句计算指定时间戳是一年的第几天。date()返回的天数是从0开始计算的,因此真实天数需要在此基础上加1。

php判断有没有小数点的方法:1、使用“strpos(数字字符串,'.')”语法,如果返回小数点在字符串中第一次出现的位置,则有小数点;2、使用“strrpos(数字字符串,'.')”语句,如果返回小数点在字符串中最后一次出现的位置,则有。

方法:1、用“str_replace(" ","其他字符",$str)”语句,可将nbsp符替换为其他字符;2、用“preg_replace("/(\s|\ \;||\xc2\xa0)/","其他字符",$str)”语句。

php字符串有下标。在PHP中,下标不仅可以应用于数组和对象,还可应用于字符串,利用字符串的下标和中括号“[]”可以访问指定索引位置的字符,并对该字符进行读写,语法“字符串名[下标值]”;字符串的下标值(索引值)只能是整数类型,起始值为0。

在PHP中,可以利用implode()函数的第一个参数来设置没有分隔符,该函数的第一个参数用于规定数组元素之间放置的内容,默认是空字符串,也可将第一个参数设置为空,语法为“implode(数组)”或者“implode("",数组)”。


ホットAIツール

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

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

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

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

人気の記事

ホットツール

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SecLists
SecLists は、セキュリティ テスターの究極の相棒です。これは、セキュリティ評価中に頻繁に使用されるさまざまな種類のリストを 1 か所にまとめたものです。 SecLists は、セキュリティ テスターが必要とする可能性のあるすべてのリストを便利に提供することで、セキュリティ テストをより効率的かつ生産的にするのに役立ちます。リストの種類には、ユーザー名、パスワード、URL、ファジング ペイロード、機密データ パターン、Web シェルなどが含まれます。テスターはこのリポジトリを新しいテスト マシンにプルするだけで、必要なあらゆる種類のリストにアクセスできるようになります。

Safe Exam Browser
Safe Exam Browser は、オンライン試験を安全に受験するための安全なブラウザ環境です。このソフトウェアは、あらゆるコンピュータを安全なワークステーションに変えます。あらゆるユーティリティへのアクセスを制御し、学生が無許可のリソースを使用するのを防ぎます。

EditPlus 中国語クラック版
サイズが小さく、構文の強調表示、コード プロンプト機能はサポートされていません

mPDF
mPDF は、UTF-8 でエンコードされた HTML から PDF ファイルを生成できる PHP ライブラリです。オリジナルの作者である Ian Back は、Web サイトから「オンザフライ」で PDF ファイルを出力し、さまざまな言語を処理するために mPDF を作成しました。 HTML2FPDF などのオリジナルのスクリプトよりも遅く、Unicode フォントを使用すると生成されるファイルが大きくなりますが、CSS スタイルなどをサポートし、多くの機能強化が施されています。 RTL (アラビア語とヘブライ語) や CJK (中国語、日本語、韓国語) を含むほぼすべての言語をサポートします。ネストされたブロックレベル要素 (P、DIV など) をサポートします。
