バグ修正の概要を強化

 

1.コードインジェクション

1.1コマンドインジェクション

信頼できないソースからのコマンドインジェクションアプリケーション実行コマンド文字列または文字列の部分を指す、これらのプログラムには信頼できない認証は、フィルタリング、悪意のある攻撃コマンドが実行される可能性がありません。

問題のコード:

$dir = $_POST['dir']
exec("cmd.exe /c dir" + $dir); 

リハビリテーションプログラム:
(1)非信頼Purifyのからのユーザ入力データのための手順は、安全でない文字を削除します。
(2)リストを制限するために、ユーザが入力することができるデータのセキュリティで保護された文字列のリストを作成するために、入力の種類を定義します。修理例:

//方式1 
            であれば(するpreg_match( '/ ^ [\ W \:\ - ] + $ /'!、$ DIR)){ 
                 //エラー処理
            } 
            
          $ CMD =にfilter_var($ CMD、FILTER_VALIDATE_REGEXP、
          配列(「オプション"=>アレイ("正規表現」=> getCommandFilterReg())))。
          ... 
           $ MSG =にescapeshellarg($ MSG)。
           //方式2 
        関数cmd_arg($ CMD、$フィルタ= 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_')
        { 
        	$ filter_chars = str_split($フィルタ)
        	$ filter_chars = array_combine($ filter_chars、$ filter_chars)。
        	$ cmd_chars = str_split($ CMD)。
        	$ RET = '';
        
        	{ 
        		$ RET = ISSET($ filter_chars [$ V])?$ filter_chars [$ V]: ''; 
        	} 
        
        	戻りの$ RET; 
        } 
      $ CMD = cmd_arg($ CMD)。  

  

1.2 JS動的コードインジェクション

(1)フロントエンドサーバーの応答を解析するために主に評価関数を使用し

evalResponse:関数(){ 
    試み{ 
      リターンはeval((this.transport.responseText)); 
    }キャッチ(E){ 
      this.dispatchException(E); 
    }

  

Aを置き換えるためにカスタム関数を使用し、eval関数を使用しないでください:.リハビリテーションプログラム

関数_dhtmlxEvalData(コード)
{ 
	VARスクリプト。
		
	IF(コード){ 
		VARのdata_key = '_process_json_data _' +のparseInt(RAND(0,1000000000000))。
		コード'[ "+ data_key + '" =ウィンドウ'] =(' +コード+ ');' 
		コードが有効で、プロローグの位置が含まれている場合// 
		//厳密モードプラグマを注入することによって、コードを実行する
		文書に//スクリプトタグ。
		スクリプト=のdocument.createElement( "スクリプト"); 
		script.text =コード。
		document.head.appendChild(スクリプト).parentNode.removeChild(スクリプト); 

		[data_key]ウィンドウを返します。
	} 

	はnullを返します。
} 
 _dhtmlxEvalData(this.transport.responseText)を返します。

  

(2)のdocument.write(HTML)は、HTMLはdocument.location = URLで書かれており、フィルタリング処理は、URLではありません

VAR HTML = '<スパン>' +行[I] + '</スパン>'; 
document.write(HTML)
.... 

はdocument.location = URL

  

修理スキーム:にdocument.writeを回避する  リファレンスアドレス
Bホワイトリスト。

//document.write()换成如下写法
_var SNEW =のdocument.createElement( "スクリプト")。
sNew.async =はtrue。
sNew.src = "https://example.com/script.min.js"。
VAR S0 = document.getElementsByTagName( 'スクリプト')[0]; 
s0.parentNode.insertBefore(SNEW、S0)。


//document.location =のURL的处理の

 関数safe_url(URL、whiteChars)
			{ 
			    whiteChars = '' +(whiteChars || '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz〜+#、%&= *-_;:@ []')。
			    するvar RET = ''; 

			    ため(VAR i = 0; iがurl.lengthを<; iは++)
			    { 
			        RET + = whiteChars [whiteChars.indexOf(URL [I])] || ''; 
			    } 

			    行います
			    {
			        RET = ret.replace(/ジャバスクリプト:/ GI、 '')。
			    }しばらく(RET =古いです!)。

			    RETを返します。
} 
はdocument.location = safe_url(URL)。

  

(3)受信したグローバル変数および関数は、のsetTimeoutを満たすために

問題のコード:

this.timer = setTimeoutメソッド(this.onTimerEvent.bind(本)、
      this.decay * this.frequency * 1000); 
      
      ... 
      (U = setTimeoutメソッド(関数(){ 
		x.abort( "タイムアウト")
	}、
c.timeout))。

  

修理スキーム:匿名関数を使用して、ラップsetTimeout関数

(関数(){ 
      this.timer =たsetTimeout(this.onTimerEvent.bind(本)、
      this.decay * this.frequency * 1000); 

   })(); 
   
   ... 
   (U =(関数()
		{ 
		VAR U = setTimeoutメソッド(関数(){ 
			x.abort( "タイムアウト")
			}、c.timeout); 
				Uを返します; 
			})() 
		)。
   

  

1.3 JSON注入

問題のコード:

$データ=ののfile_get_contents( "PHP://入力"); 
   $データ= json_decode($データ、真の);

  

修理スキーム:にfilter_var修理の例を使用して機能をフィルタリング:

$データ=ののfile_get_contents( "PHP://入力"); 
        $データ=にfilter_var($データ、FILTER_SANITIZE_STRING、FILTER_FLAG_NO_ENCODE_QUOTES)。
        $データ= json_decode($データ、真の);

  

1.4 SQLインジェクション

理由のSQLインジェクションが発生します。

1、信頼できないプログラムへのデータソースからのデータ。

2、動的SQLクエリを構築するために使用されるデータ。

問題のコード:

$ sqlを= "設定から選択した値WHERE IP =" $ IP "と所有者=" $ _ SESSION [ "ユーザー"]。。。。
        $ STM->実行(); 
        $ STM-> fetchAllの(PDO :: FETCH_ASSOC)。

  

リハビリテーションプログラム:

;、SQLステートメントを連結することによって構築されていない保証
Bは、その後、プリコンパイルされたSQL文を実行するためのいくつかの方法を使用して、
C、最後に条件SQL文を必要ように設定されたパラメータ値に結合しました。

修理例:

$ sqlを= "??IP = AND所有者= configの中から選択した値"。
        $ STM = $ DB->準備($のSQL)。
        $ STM->実行(配列($のIP、$ _SESSION [ "ユーザ"])); 
        $行= $ STM->はfetchAll(PDO :: FETCH_ASSOC)。

  

2.安全でない乱数

標準の擬似ランダム値発生器は、様々な暗号攻撃に抵抗することはできません。擬似乱数発生器(PRNG)は、統計的PRNGをランダムアルゴリズムを近似し、PRNGはポータブルで再現され、攻撃者は、それが生成する文字列を容易に推測することができます。環境の高いセキュリティ要件、元の予測値としてランダムデータを生成することができる機能では、エラー安全でないランダム性を生成します。

2.1 PHP例

コードは、ランド()とmt_rand()関数を使って学習する関連します

mt_srand(時間()); 
$トークン= mt_rand(); 
... 
$ randnum =ランド(1,10000)。
$ strのMD5 =(。$トークン$ randnum.time()); 
...

  

リハビリテーションプログラム:1.php7は、より良い乱数random_int()の代わりにmt_rand(のPHP5の使用されている)を追加し
、この機能をサポートする必要がある2.再利用openssl_random_pseudo_bytesカスタム関数ランダム機能は、動作環境に注意を払います

修理例:

f
慰めのdynamicNumber($分、$ max)は、{ 
    $範囲= $最大- $分+ 1。
    ($範囲== 0)は$分を返す場合。
    $長=(INT)(ログ($の範囲、2)/ 8)+ 1。
    $最大= POW(2、8 *の$長); 
    $ NUM = $最大+ 1; 
    一方、($ NUM> $ max)は、{ 
        $ NUM = hexdec(BIN2HEX(openssl_random_pseudo_bytes($の長さは、$ S)))。
    } 
    リターン($のNUM%の$の範囲)+ $分。
} 
関数getDynamicInt($分= 0、$最大= NULL)
{ 
    IF($最大=== NULL){ 
        $最大= getrandmax()。
    } 
    dynamicNumber($分、$ max)を返します。
} 

関数getDynamicMtInt($分= 0、$最大= NULL)
{ 
    IF($最大=== NULL){ 
        $最大= mt_getrandmax()。
    }
    dynamicNumber($分、$ max)を返します。
} 


$トークン= getDynamicMtInt()。
... 
$ randnum = getDynamicInt(1,10000)。

  

2.2 JS例

コードは(Math.randomを使用)

... 
のvar RND = Math.random(),; 
...

  

修復スキーム:Math.random()を使用していない、基準の原則  自己修復機能は、ランダムな例を定義しました:

VaRのランド=(関数(){ 
  VAR種子=(新しいDate())。getTime()
  関数r(){ 
    種子=(シード* 9301 + 49297)%233280 
    戻りシード/(233280.0)
  } 
  return関数(数){ 
    Math.ceil(R()*数)を返す
  } 
})()
はconsole.log(RAND(5))。

関数randnum(){ 
        VAR種子=(新しいDate())getTime()。
        種子=(シード* 9301 + 49297)%233280。
        戻りシード/(233280.0)。
     
	}

  

3.ハードコードされたパスワード

プログラムは、ハードコードされたパスワードのプロセスである一方で、システムのセキュリティが低下し、一方で、メンテナンスをプログラミングすることは容易ではありません。

(パスワード== NULL){もし
            パスワード= "123456"。
         }

  

パスワードは、passwd、合格、password_xxx、xxx_passwdなど:そのようなキーワードで、いくつかの変数として、偽かもしれ強化

修復モード:プログラム任意のパスワードは、パスワードの値を取得するために、設定ファイルを暗号化する必要があります。変数偽陽性の場合は、唯一の変数名を変更します。

4.その他

1.空のパスワードの問題

実際には、唯一の変数が空に設定されていますが、エラーを強化します

passwdの$ = ""; 
//空に機能を備えたソリューション
$ passwdを= strval(NULL);

  

2.変数カバレッジ

($のparams)を抽出
代わりに// 
($ paramsは、EXTR_SKIP)を抽出。

  

3.base64_pri_decrypt()メソッドは、スタッフィングモードので、壊れやすい暗号化メカニズムなしで公開鍵暗号RSA OAEPを行います。

openssl_public_encrypt($入力、$出力、$キー、OPENSSL_NO_PADDING)。
  = " 
            openssl_private_decrypt($ password_base64_decode、$ password_decode、$ pi_key、OPENSSL_PKCS1_OAEP_PADDING); //私钥解密

  

動的パケットコード噴射のsetTimeoutを4.js

this.timer = setTimeoutメソッド(this.onTimerEvent.bind(本)、this.decay * this.frequency * 1000);

  

ラップする匿名関数

(関数(){this.timer =たsetTimeout(this.onTimerEvent.bind(本)、this.decay * this.frequency * 1000); 

})();

  

例2:

(U = setTimeoutメソッド(関数(){x.abort( "タイムアウト")}、c.timeout))。改为
(U =(関数(){VAR U = setTimeoutメソッド(関数(){x.abort( "タイムアウト")}、c.timeout); Uを返します;})())。

  

5.Cookieセキュリティ:広すぎるパスパス不传「/」

6..xss、CSSドム

safe_url:関数(URL、whiteChars){ 
whiteChars = '' +(whiteChars || '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz〜+#、%&= *-_;:@ []')。
するvar RET = ''; ため(VAR i = 0; iがurl.lengthを<; iは++) { RET + = whiteChars [whiteChars.indexOf(URL [I])] || ''; } やる { VAR古い= RETと、 RET = ret.replace(/ジャバスクリプト:/ GI、 '')。 }しばらく(RET =古いです!)。 RETを返します。 }、

  

filter_var_array 7.jsonencode出力()

機能stripHtml(値){ 
	// htmlタグを削除し、スペース文字は
	( "/<.[^<>]*?>/グラム")value.replaceを返す.replace(/ | / GI、"")
	//削除句読点
	.replace(/[.(),;:!?%#$'\"_+=\/\-""']*/ G、 ""); 
}

  

 

おすすめ

転載: www.cnblogs.com/mrwh/p/11552720.html