2016-07-22 86 views
0

所以基本上有人告訴我我的網站很容易受到XSS攻擊,所以我正在努力解決這個問題。我被告知htmlspecialchars方法是防止這種情況的好方法。我用這段代碼成功地阻止了XSS攻擊嗎?

我做了這個功能

function _e($string){ 
    return htmlspecialchars($string, ENT_QUOTES, 'UTF-8'); 
} 

,我使用它,例如下面

$userName = _e($_POST['userName']); 
$Pass = _e($_POST['password']); 

問題:

1)僅基於輸入XSS攻擊,或我是否需要對警報和回顯語句執行此操作?

2)我有沒有成功地停在下面的頁面XSS攻擊**

<?php 

    session_start(); 

    if(isset($_SESSION['user_id'])){ 
     header("Location: index.php"); 
    } 

    function _e($string){ 
     return htmlspecialchars($string, ENT_QUOTES, 'UTF-8'); 
    } 

    include '../includes/connection.php'; 
    $userName = _e($_POST['userName']); 
    $Pass = _e($_POST['password']); 



    if(!empty($userName) && !empty($Pass)){ 

     $sql = "SELECT * FROM Admins WHERE Username='$userName'"; 
     $sqlr = mysqli_query($connect,$sql); 
     $sqlrow = $sqlr->fetch_assoc(); 
     $dbPass = $sqlrow['Password']; 
     $hash = password_verify($Pass, $dbPass); 

     if ($hash == 0){ 
      die("There was no password found matching what you have entered."); 
     }else{ 
      $records = "SELECT * FROM Admins WHERE Username='$userName' AND Password='$dbPass' AND AdminLevel >=1"; 
      $results = mysqli_query($connect,$records); 
      if ($results->num_rows == 1){ 
       $row = $results->fetch_assoc(); 
       $_SESSION['user_id'] = $row['ID']; 
       $_SESSION['admin_level'] = $row['AdminLevel']; 
       $_SESSION['user_name'] = $row['Username']; 
       $easyName = $_SESSION['user_name']; 
       $recordsS = "UPDATE `Admins` SET Status='1' WHERE Username='$userName'"; 
       $resultsS = mysqli_query($connect,$recordsS); 
       header("Location: index.php"); 
      }else{ 
       $message = "Either you have entered the incorrect login information, or you account has not been approved yet."; 
       echo "<script type='text/javascript'>alert('$message');</script>"; 
      } 
     } 
    } 
?> 
<!doctype html> 
<html> 
    <head> 
     <meta charset="utf-8"> 
     <title>ServerSide Moderation Services</title> 
     <link rel="stylesheet" href="../styles/mainStyles.css" type="text/css" /> 
     <link rel="stylesheet" href="../styles/loginFormStyle.css" type="text/css" /> 
     <meta name="viewport" content="width=device-width, initial-scale=1.0"/> 
    </head> 
    <body class="body"> 
     <?php include '../includes/header.php'; ?> 

     <div class="mainContent"> 
      <div class="logRegArea"> 
       <article class="leftContent"> 
        <header> 
         <h2 class="loginArea" style="text-align:center">Login Below:</h2> 
        </header> 
        <content> 
         <div id="login"> 
          <form action="../pages/login.php" method="POST"> 
           <input type="text" placeholder="Enter Your Username" name="userName"> 
           <input type="password" placeholder="Enter Your Password" name="password"> 
           <input type="submit"> 
          </form> 
         </div> 
        </content> 
       </article> 
      </div> 
     </div> 
     <footer class="mainFooter"> 
      <p>This website was developed by ROBLOX user: <a href="https://www.roblox.com/users/8869935/profile" title="Made by: wattleman">wattleman</a></p> 
     </footer> 
    </body> 
</html> 
+0

請使用PHP的哈希函數來設置密碼。切勿存儲純文本密碼! –

回答

1

直接回答你的兩個問題:?

1)如果您的信息包含來自比其他任何來源的數據你的代碼,消毒它。信任沒有。

2)種類。不過,我無法在任何地方看到您的數據輸出。

您需要在這裏考慮兩件事。

1)通過將htmlspecialchars應用於用戶提供的數據插入到數據庫之前,您已經修復了XSS的大部分問題。但是,通常最好插入數據「原始」,並且在您將其回顯到頁面時應用htmlspecialchars。這是因爲轉換html實體對於生成HTML是有意義的,但沒有別的。如果您需要運行搜索,創建導出等,您可能會發現自己需要將這些實體再次轉換回來。

2)您可以接受SQL注入攻擊。 htmlspecialchars爲此提供零保護。您需要使用mysqli_real_escape_string或參數化查詢。更多關於那here

+0

我很欣賞反饋。我唯一採取的是原始數據。當我彈出警報時,是否還需要使用特殊字符,或者因爲它是沒有輸入的回顯,是否正常? 2)我現在正在處理準備好的陳述。 – Austin

+0

如果消息來自100%信任的源而沒有未轉義的HTML實體的可能性,例如你的硬編碼文本,沒有理由去消毒它 – rjdown

+0

我已經完全改變了這個問題。你介意通過它並幫我找到問題嗎? – Austin