<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                合規國際互聯網加速 OSASE為企業客戶提供高速穩定SD-WAN國際加速解決方案。 廣告
                ## **magic_quotes_sybase** 作用:影響 addslashes() 函數。 PHP 5.3.0 起*廢棄*并將自 PHP 5.4.0 起*移除* magic_quotes_sybase=0 時(默認),在啟用magic_quotes_gpc或magic_quotes_runtime時addslashes 將對 ' " \ 進行 \ 轉義操作; magic_quotes_sybase=1 時,在啟用magic_quotes_gpc或magic_quotes_runtime時addslashes 將對` ' `轉義成兩個單引號`''`。 >[danger]注意,當magic_quotes_sybase=On時,它完全覆蓋了magic_quotes_gpc。在這種情況下,即使啟用了magic_quotes_gpc,也不會轉義雙引號、反斜杠或NUL ``` //http://www.test.com/?name=' echo $_GET['name'];//'' //將會覆蓋magic_quotes_gpc的設置,注意'轉義為'' \和"沒有轉義 //http://www.test.com/?name='@"@\ //http://www.test.com/?name=%27@%22@\ echo $_GET['name'];//''@"@\ ``` ## **magic_quotes_gpc** 作用:當php.ini中magic_quotes_gpc=on時,對php服務器端接收的 GET POST COOKIE 的值執行 addslashes() 操作即自動轉換`'和\和"和NULL`(php5.4移除此選項) 作用范圍是:WEB客戶服務端。 作用時間:請求開始時,例如當腳本運行時。 `get_magic_quotes_gpc()`可以獲取當前 magic_quotes_gpc 的配置選項設置(5.4移除后始終返回false) ``` //http://www.test.com/?name='@"@\ //http://www.test.com/?name=%27@%22@\ echo $_GET['name'];//\'@\"@\\ //注意不會轉義QUERY_STRING php4是可以轉義_SERVER的php5取消了,所以我們需要addslashes()轉義 $_SERVER echo $_SERVER['QUERY_STRING'];//name=%27@%22@\ ``` ## **magic_quotes_runtime** 作用:對通過 fread()、file_get_contents() 返回的文本執行 addslashes() 操作,對執行sql查詢的結果執行 addslashes() 操作。 自 PHP 5.3.0 起*廢棄*并將自 PHP 5.4.0 起*移除* 作用范圍:從文件中讀取的數據或執行 exec() 的結果或是從SQL查詢中得到的。 作用時間:每次當腳本訪問運行狀態中產生的數據。 `get_magic_quotes_runtime()`可以獲取magic_quotes_runtime配置的值 `set_magic_quotes_runtime()`可以在腳本中設置magic_quotes_runtime配置的值 如果啟用了`magic_quotes_runtime`,大多數返回任何形式外部數據的函數,包括數據庫和文本段將會用反斜線轉義引號。 如果啟用了[magic\_quotes\_sybase](https://www.php.net/manual/zh/sybase.configuration.php#ini.magic-quotes-sybase),單引號會被單引號轉義而不是反斜線 ``` 受 magic_quotes_runtime 影響的函數(不包括 PECL 里的函數): get_meta_tags() file_get_contents() file() fgets() fwrite() fread() fputcsv() stream_socket_recvfrom() exec() system() passthru() stream_get_contents() bzread() gzfile() gzgets() gzwrite() gzread() exif_read_data() dba_insert() dba_replace() dba_fetch() ibase_fetch_row() ibase_fetch_assoc() ibase_fetch_object() mssql_fetch_row() mssql_fetch_object() mssql_fetch_array() mssql_fetch_assoc() mysqli_fetch_row() mysqli_fetch_array() mysqli_fetch_assoc() mysqli_fetch_object() pg_fetch_row() pg_fetch_assoc() pg_fetch_array() pg_fetch_object() pg_fetch_all() pg_select() sybase_fetch_object() sybase_fetch_array() sybase_fetch_assoc() SplFileObject::fgets() SplFileObject::fgetcsv() SplFileObject::fwrite() ``` ``` //?如果啟用了魔術引號 即magic_quotes_gpc=on時 echo?$_POST['lastname'];?????????????//?O\'reilly echo?addslashes($_POST['lastname']);?//?O\\\'reilly ``` 由于5.4移除了magic_quotes_gpc配置get_magic_quotes_gpc始終返回false ``` // 適用各個 PHP 版本的用法 if (get_magic_quotes_gpc()) { //刪除由 addslashes() 函數添加的反斜杠 $lastname = stripslashes($_POST['lastname']); } else { $lastname = $_POST['lastname']; } ``` 如果使用 MySQL ``` if (get_magic_quotes_gpc()) { //刪除由 addslashes() 函數添加的反斜杠 $lastname = stripslashes($_POST['lastname']); } else { $lastname = $_POST['lastname']; } $lastname = mysql_real_escape_string($lastname); echo $lastname; // O\'reilly $sql = "INSERT INTO lastnames (lastname) VALUES ('$lastname')"; ``` **數據庫字符集設為GBK時,0xbf27本身不是一個有效的GBK字符,但經過 ?addslashes() ?轉換后變為0xbf5c27,前面的0xbf5c是個有效的GBK字符,所以0xbf5c27會被當作一個字符0xbf5c和一個單引號來處理,結果漏洞就觸發了** mysql\_real\_escape\_string() 也存在相同的問題,只不過相比 ?addslashes() 它考慮到了用什么字符集來處理,因此可以用相應的字符集來處理字符 當mysql_real_escape_string檢測到的編碼方式跟client設置的編碼方式(big5/bgk)不一致時,mysql_real_escape_string跟addslashes是沒有區別的。比如: ``` [client] default-character-set=latin1 mysql_query("SET CHARACTER SET 'gbk'", $mysql_conn); 這種情況下mysql_real_escape_string 是基于 latin1工作的,是不安全的 [client] default-character-set=gbk mysql_query("SET CHARACTER SET 'gbk'", $mysql_conn); 這種情況下,mysql_real_escape_string 基于 gbk 工作,是正常的 ``` 實例: ``` echo "PHP version: ".PHP_VERSION."\n";//PHP version: 5.2.5 mysql_connect('servername','username','password'); mysql_select_db("test"); mysql_query("SET NAMES GBK"); //使用cahr處理轉換后的0xbf5c27字符 chr(0xbf)為? chr(0x27)' //模擬$_POST數據 ?' OR username =username # $_POST['username'] = chr(0xbf).chr(0x27).' OR username = username /*'; $_POST['username'] = chr(0xbf).chr(0x27).' OR username = username #'; $_POST['password'] = 'guess'; $username = addslashes($_POST['username']); $password = addslashes($_POST['password']); $sql = "SELECT * FROM users WHERE username = '$username' AND password = '$password'"; $result = mysql_query($sql) or trigger_error(mysql_error().$sql); var_dump(mysql_num_rows($result));//int(3) 有結果有注入風險 var_dump(mysql_client_encoding());//latin1 $username = mysql_real_escape_string($_POST['username']); $password = mysql_real_escape_string($_POST['password']); $sql = "SELECT * FROM users WHERE username = '$username' AND password = '$password'"; $result = mysql_query($sql) or trigger_error(mysql_error().$sql); var_dump(mysql_num_rows($result));//int(3) 有結果有注入風險 var_dump(mysql_client_encoding());//latin1 mysql_set_charset("GBK"); $username = mysql_real_escape_string($_POST['username']); $password = mysql_real_escape_string($_POST['password']); $sql = "SELECT * FROM users WHERE username = '$username' AND password = '$password'"; $result = mysql_query($sql) or trigger_error(mysql_error().$sql); var_dump(mysql_num_rows($result));//int(0) var_dump(mysql_client_encoding());//string(3) "gbk" 結果: PHP version: 5.2.5 int(3) string(6) "latin1" int(3) string(6) "latin1" int(0) string(3) "gbk" ``` 可以看出來不論是使用addslashes還是mysql_real_escape_string,我都可以利用編碼的漏洞來實現輸入任意密碼就能登錄服務器的注入攻擊!!!!(攻擊的原理我就不多說了,感興趣的同學可以研究下字符編碼中單字節和多字節的問題) # **完美解決方案** 由上可知 mysql_real_escape_string() 、 addslashes()、和str_replace(替換單引號)是不能解決sql注入問題的 編寫代碼是要特別小心獲取變量,如:$\_GET $\_POST $\_COOKIE $\_SERVER 完美解決sql注入的方案就是使用擁有Prepared Statement機制的PDO和MYSQLi來代替mysql_query(注:mysql_query自 PHP 5.5.0 起已廢棄,并在將來會被移除): ``` //PDO: $pdo = new PDO('mysql:dbname=dbtest;host=127.0.0.1;charset=utf8', 'user', 'pass'); $pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, false); $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); $stmt = $pdo->prepare('SELECT * FROM employees WHERE name = :name'); $stmt->execute(array('name' => $name)); foreach ($stmt as $row) { // do something with $row } //MYSQLi: $stmt = $dbConnection->prepare('SELECT * FROM employees WHERE name = ?'); $stmt->bind_param('s', $name); $stmt->execute(); $result = $stmt->get_result(); while ($row = $result->fetch_assoc()) { // do something with $row } ``` 堅持過濾輸入和轉義輸出 addcslashes($input, $charlist)、mysql_real_escape_string() htmlspecialchars($input)、strip_tags($input) 富文本時使用[HTMLPurifier 富文本過濾器](http://htmlpurifier.org/) 數據庫報錯信息泄露防范 1. 把php.ini文件 display\_errors = Off 數據庫查詢函數前面加一個@字符
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看