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、 ""); }