ホームページ  >  記事  >  バックエンド開発  >  PHP の単純なパラメータ フィルタリング コードの学習

PHP の単純なパラメータ フィルタリング コードの学習

WBOY
WBOYオリジナル
2016-07-25 08:58:421179ブラウズ
  1. /**
  2. * パラメータフィルタリングコード
  3. * bbs.it-home.org を編集
  4. */
  5. if (@get_magic_quotes_gpc ()) {
  6. $_GET = sec ( $_GET );
  7. $_POST = sec ( $_POST );
  8. $_COOKIE = sec ( $_COOKIE );
  9. $_FILES = sec ( $_FILES );
  10. }
  11. $_SERVER = sec ( $_SERVER );
  12. function sec(&$array) {
  13. //配列の場合は配列を走査するそしてそれを再帰的に呼び出します
  14. if (is_array ( $array )) {
  15. foreach ( $array as $k => $v ) {
  16. $array [$k] = sec ( $v );
  17. }
  18. } else if ( is_string ( $array )) {
  19. //addslashes 関数を使用して処理します
  20. $array = addlashes ( $array );
  21. } else if (is_numeric ( $array )) {
  22. $array = intval ( $array );
  23. }
  24. return $array;
  25. }
  26. ?>
コードをコピー

1. 入力パラメータ YY が整数の場合、通常、abc.asp 内の元の SQL ステートメントはおおよそ次のようになります。 select * from table name where field=YY なので、次の手順を使用して SQL インジェクションが存在するかどうかをテストできます。 ①HTTP://xxx.xxx.xxx/abc.asp?p=YY’(シングルクォーテーション付き) このとき、abc.ASP内のSQL文は次のようになります。 select * from table name where field=YY’ の場合、abc.asp が異常実行します。 ②HTTP://xxx.xxx.xxx/abc.asp?p=YY かつ 1=1 の場合、abc.asp は正常に実行され、結果は HTTP://xxx.xxx.xxx/abc.asp?p と同じになります。 =YY; ③HTTP://xxx.xxx.xxx/abc.asp?p=YY かつ 1=2 の場合、abc.asp が異常実行します。 上記の 3 つの手順が完全に満たされている場合は、abc.asp に SQL インジェクションの脆弱性が存在するはずです。

整数フィルター関数、コードは次のとおりです。

  1. function num_check($id) {

  2. if (! $id) {
  3. die ( 'パラメータを空にすることはできません!' );
  4. } // かどうかempty 判定
  5. else if (inject_check ( $id )) {
  6. die ( 'illegalparameter' );
  7. } // インジェクション判定
  8. else if (! is_numetic ( $id )) {
  9. die ( 'illegalparameter' );
  10. }
  11. //数値判定
  12. $id = intval ($id);
  13. //整数化
  14. return $id;
  15. }

  16. //文字フィルタ関数

  17. function str_check($str ) {
  18. if (inject_check ( $str )) {
  19. die ( 'illegalparameter' );
  20. }
  21. //インジェクション判定
  22. $str = htmlspecialchars ( $str );
  23. // html変換
  24. return $str;
  25. }
  26. function search_check($str) {
  27. $str = str_replace ( "_", "_", $str );
  28. //"_" を除外
  29. $str = str_replace ( "%", "%", $ str );
  30. //「%」を除外
  31. $str = htmlspecialchars ( $str );
  32. //htmlを変換
  33. return $str;
  34. }
  35. //フォームフィルター関数
  36. function post_check($str, $min, $max) {
  37. if (isset ( $min ) && strlen ( $str ) < $min) {
  38. die ( '最小 $min バイト' );
  39. } else if (isset ( $max ) && strlen ( $str ) > $ max) {
  40. die ( '$max バイトまで' );
  41. }
  42. returntripslashes_array ( $str );
  43. }
  44. ?>

コードをコピー

入力パラメータ YY の場合は文字列です。通常、abc.asp 内の元の SQL ステートメントはおおよそ次のとおりです。 select * from table name where field='YY' なので、次の手順を使用して SQL インジェクションが存在するかどうかをテストできます。 ①HTTP://xxx.xxx.xxx/abc.asp?p=YY’(シングルクォーテーション付き) このとき、abc.ASP内のSQL文は次のようになります。 select * from table name where field=YY’ の場合、abc.asp が異常実行します。 ②HTTP://xxx.xxx.xxx/abc.asp?p=YY&;nb … 39;1'='1'、abc.asp は正常に動作し、HTTP://xxx.xxx.xxx/abc と同じです.asp ?p=YY の実行結果は同じです。 ③HTTP://xxx.xxx.xxx/abc.asp?p=YY&;nb … 39;1'='2'、abc.asp が異常実行します。 上記の 3 つの手順が完全に満たされている場合は、abc.asp に SQL インジェクションの脆弱性が存在するはずです。

SQL インジェクションを防ぐ関数をアタッチします。

  1. //アンチインジェクション関数
  2. function inject_check($sql_str) {
  3. return eregi ( 'select|inert|update|delete|'|/*|*|../|. / |UNION|into|load_file|outfile', $sql_str );
  4. // bbs.it-home.org へのインジェクションを防ぐフィルター
  5. }
  6. functiontripslashes_array(&$array) {
  7. if (is_array ( $array )) {
  8. foreach ( $array as $k => $v ) {
  9. $array [$k] = ストリップスラッシュ_配列 ( $v );
  10. }
  11. } else if (is_string ( $array )) {
  12. $array = ストリップスラッシュ ( $ array );
  13. }
  14. return $array;
  15. }
  16. ?>
コードをコピー


声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。