PHPデータフィルタリング関数とメソッドの例、PHPフィルタリング関数の例
1. PHP送信データフィルタリングの基本原則
1) 変数をデータベースに送信するときは、インジェクション問題と同様に、フィルタリングにaddslashes()を使用する必要があります。 , addslashes() を 1 つ実行するだけです。実際、変数値に関しては、 intval() 関数も文字列のフィルタリングに適しています。
2) php.iniでmagic_quotes_gpcとmagic_quotes_runtimeを有効にします。 magic_quotes_gpc は、get、post、cookie の引用符をスラッシュに変更できます。 magic_quotes_runtime は、データベースに出入りするデータにおいて書式設定の役割を果たします。実際、このパラメータは、インジェクションが夢中になっていた昔から非常に人気がありました。
3) システム関数を使用する場合は、安心してシステム関数を使用できるように、escapeshellarg()、escapeshellcmd() パラメータを使用してフィルタリングする必要があります。
4) クロスサイトの場合、strip_tags() と htmlspecialchars() の 2 つのパラメータはどちらも有効で、ユーザーが送信した html と php のタグはすべて変換されます。たとえば、山括弧「<」は「<」などの無害な文字に変換されます。
以下のコードをコピーします
$new = htmlspecialchars("Test", ENT_QUOTES);
strip_tags($text,);
5) 関連関数のフィルタリングの場合は、前の include() と同様に、unlink、 fopen() などで、演算を実行したい変数を指定するか、該当する文字を厳密にフィルタリングすれば問題ないと思います。
2. PHPの簡単なデータフィルタリング
1) 入力:trim($str),addslashes($str)
2) 出力:stripslashes($str)
3) 表示:htmlspecialchars(nl2br($str))
dispatch.php スクリプトの詳細については、以下の例を参照してください:
コードは次のとおりです コードをコピーします
リーリー
これが公的にアクセス可能な唯一の PHP スクリプトである場合、そのプログラムは、そもそもグローバル セキュリティ処理をバイパスできないように設計されていると確信できます。また、開発者は特定のタスクの制御フローを簡単に確認できます。たとえば、コード全体を閲覧しなくても簡単にわかります。$form_valid が true の場合、end.inc は process.inc がインクルードされる前であり、false に初期化されたばかりであるため、ユーザーに表示される唯一のものです。 process.inc の内部ロジックによって true に設定されると判断できます。それ以外の場合は、フォームが再度表示されます (関連するエラー メッセージが表示される可能性があります)。
注意
(dispatch.phpではなく)index.phpなどのディレクトリ指向のファイルを使用する場合は、http://example.org/?task=print_formのようにURLアドレスを使用できます。
ApacheForceType リダイレクトまたは mod_rewrite を使用して、URL アドレス http://example.org/app/print-form を調整することもできます。
メソッドを含める
もう1つの方法は、すべてのセキュリティ処理を担当する単一のモジュールを使用することです。このモジュールは、すべてのパブリック PHP スクリプトの先頭 (または最先頭) に含まれています。以下のスクリプトsecurity.incを参照してください
コードは以下の通りです コードをコピーしてください
リーリー
この例では、送信された各フォームには一意の検証値フォームが含まれているとみなされ、security.inc はフィルタリングが必要なフォーム内のデータを個別に処理します。この要件を実装する HTML フォームは次のとおりです。
次のようにコードをコピーします
ユーザー名:
パスワード:
$allowed という配列は、どのフォーム変数が許可されているかを確認するために使用されます。このリストはフォームの前に置く必要があります。一貫して処理されます。プロセス制御は何を実行するかを決定し、実際のフィルター処理されたデータは process.inc に到着します。
注
security.inc が常にすべてのスクリプトの先頭に含まれるようにするより良い方法は、auto_prepend_file 設定を使用することです。
フィルタリングの例
データフィルタリングではホワイトリストの確立が非常に重要です。遭遇する可能性のあるすべてのフォーム データの例を示すことは不可能なので、いくつかの例は一般的な理解を得るのに役立ちます。
次のコードはメールアドレスを検証します:
コードは次のとおりです コードをコピーします
リーリー
次のコードは、$_POST['color'] の内容が赤、緑、青であることを保証します:
コードは次のとおりです コードをコピーします
リーリー
次のコードは、$_POST['num'] が整数であることを保証します:
コードは次のとおりです コードをコピーします
リーリー
次のコードは、$_POST['num'] が浮動小数点数 (float) であることを保証します:
コードは次のとおりです コードをコピーします
リーリー
?>
名字转换
之前每个例子都使用了数组$clean。对于开发人员判断数据是否有潜在的威胁这是一个很好的习惯。 永远不要在对数据验证后还将其保存在$_POST或者$_GET中,作为开发人员对超级全局数组中保存的数据总是应当保持充分的怀疑。
需要补充的是,使用$clean可以帮助思考还有什么没有被过滤,这更类似一个白名单的作用。可以提升安全的等级。
如果仅仅将验证过的数据保存在$clean,在数据验证上仅存的风险是你所引用的数组元素不存在,而不是未过滤的危险数据。
时机
一旦 PHP 脚本开始执行,则意味着 HTTP 请求已经全部结束。此时,用户便没有机会向脚本发送数据。因此,没有数据可以被输入到脚本中(甚至register_globals被开启的情况下)。这就是为什么初始化变量是非常好的习惯。
防注入
代码如下 复制代码
//PHP整站防注入程序,需要在公共文件中require_once本文件
//判断magic_quotes_gpc状态
if (@get_magic_quotes_gpc ()) {
$_GET = sec ( $_GET );
$_POST = sec ( $_POST );
$_COOKIE = sec ( $_COOKIE );
$_FILES = sec ( $_FILES );
}
$_SERVER = sec ( $_SERVER );
function sec(&$array) {
//如果是数组,遍历数组,递归调用
if (is_array ( $array )) {
foreach ( $array as $k => $v ) {
$array [$k] = sec ( $v );
}
} else if (is_string ( $array )) {
//使用addslashes函数来处理
$array = addslashes ( $array );
} else if (is_numeric ( $array )) {
$array = intval ( $array );
}
return $array;
}
//整型过滤函数
function num_check($id) {
if (! $id) {
die ( '参数不能为空!' );
} //是否为空的判断
else if (inject_check ( $id )) {
die ( '非法参数' );
} //注入判断
else if (! is_numetic ( $id )) {
die ( '非法参数' );
}
//数字判断
$id = intval ( $id );
//整型化
return $id;
}
//字符过滤函数
function str_check($str) {
if (inject_check ( $str )) {
die ( '非法参数' );
}
//注入判断
$str = htmlspecialchars ( $str );
//转换html
return $str;
}
function search_check($str) {
$str = str_replace ( "_", "_", $str );
//把"_"过滤掉
$str = str_replace ( "%", "%", $str );
//把"%"过滤掉
$str = htmlspecialchars ( $str );
//转换html
return $str;
}
//表单过滤函数
function post_check($str, $min, $max) {
if (isset ( $min ) && strlen ( $str ) < $min) {
die ( '最少$min字节' );
} else if (isset ( $max ) && strlen ( $str ) > $max) {
die ( '最多$max字节' );
}
return stripslashes_array ( $str );
}
//防注入函数
function inject_check($sql_str) {
return eregi ( 'select|inert|update|delete|'|/*|*|../|./|UNION|into|load_file|outfile', $sql_str );
//进行过滤,防注入
}
function stripslashes_array(&$array) {
if (is_array ( $array )) {
foreach ( $array as $k => $v ) {
$array [$k] = stripslashes_array ( $v );
}
} else if (is_string ( $array )) {
$array = stripslashes ( $array );
}
return $array;
}
?>
ログイン後にコピー
addslashes
htmlspecialchars
mysql_real_escape_string
数字的可以用intval(),最好在之前就循环$_POST,挨个的addslashes或者其他函数。
上面都可以,根据需要来。
假定你的数据在数据$demo中,我们来写段代码进行过滤。
$count = 0;
foreach($demo as $ditem){
if(($ditem['a']==0)||($ditem['b']==0)||($ditem['c']==0)||($ditem['c']==0)) continue;
echo $ditem['id'].' '.$ditem['a'].' '.$ditem['b'].' '.$ditem['c'].' '.$ditem['d'].' '.$ditem['e']."
";
$count++;
}
echo '总行数:'.$count;
http://www.bkjia.com/PHPjc/908127.htmlwww.bkjia.comtruehttp://www.bkjia.com/PHPjc/908127.htmlTechArticlephp数据过滤函数与方法示例,php过滤函数示例 1、php提交数据过滤的基本原则 1)提交变量进数据库时,我们必须使用addslashes()进行过滤,像...