簡體   English   中英

如何防止 PHP echo 結束 JS 字符串?

[英]How to prevent PHP echo from ending a JS string?

我有這個代碼:

<!DOCTYPE html>
<html>
    <head>
        <title>Sign up page</title>
        <meta charset="UTF-8"/>
    </head>
    <body>
        <h1>Sign up page</h1>
        <form action="test.php" method="post">
            <input placeholder="Enter your username" name="username"/><br/>
            <input type="password" placeholder="Enter your password" style="margin-bottom:5px" name="password"/><br/>
            <button type="submit" name="submit">Sign up</button>
        </form>
        <?php
        if(isset($_POST["username"],$_POST["password"],$_POST["submit"])){
            if(mb_strlen($_POST["username"])<8){
            ?>
            <script>
                alert("Your username must be at least 8 characters long.");
                var i=document.getElementsByTagName("input")[0];
                i.value="<?php echo $_POST['username']; ?>";
                i.focus();
            </script>
            <?php
            }else if(mb_strlen($_POST["password"])<8){
            ?>
            <script>
                alert("Your password must be at least 8 characters long.");
                var i=document.getElementsByTagName("input")[1];
                i.value="<?php echo $_POST['password']; ?>";
                i.focus();
            </script>
            <?php
            }else{
                echo "Successfully signed up!";
            }
        }
        ?>
    </body>
</html>

它在大多數情況下都可以正常工作,但是如果您嘗試在用戶名字段中輸入";f(); ,您會在控制台中收到錯誤並且沒有警報。

可以清楚地看到,這是因為當 PHP 接收到輸入時,它會在 JS 字符串中回顯它。 ";結束字符串和語句,而f();導致錯誤導致輸入無法聚焦。這發生在 8 個字符以下,因此導致它屬於mb_strlen($_POST["username"])<8

通常我只會使用htmlspecialchars ,但如果你嘗試添加它,那么如果你輸入";<!-- ,它會出現&lt;而不是< 。有些用戶可能想要< (或其他&*;字符)在他們的用戶名,並且(如果他們不是開發人員)會對&lt;的含義感到驚訝。

那么如何在保持用戶友好性的同時防止發生 JavaScript 注入?

您應該將json_encode用於 output 您的值(並注意您不再需要封閉的" s):

i.value=<?php echo json_encode($_POST['username']); ?>;

這將確保字符串中的引號被轉義,並且整個值被 JavaScript 視為字符串。 對於您的示例數據,這將產生

"\";f();"

問題是這個例子中的雙引號。 嘗試addslashes

i.value="<?php echo addslashes($_POST['username']); ?>";

雖然尼克的回答可能對 JS 更好。 我比 JS 更 PHP。

你永遠不應該將未經清理的代碼注入任何東西。 這至少會導致 XSS 攻擊。

我認為在保持用戶友好性的同時清理代碼的最簡單方法是使用json_encode()

<?php
    }else if(mb_strlen($_POST["password"])<8){
$data = json_encode(['password' => $_POST['password']]);
?>

<script>
    alert("Your password must be at least 8 characters long.");
    var user_data = <?php echo $data; ?>;
    var i=document.getElementsByTagName("input")[1];
    i.value=user_data.password;
    i.focus();
</script>

然而!

你真的應該把它放在 Input 元素中:

<input type="password" value="<?=htmlspecialchars($_POST['password'] ?? '',ENT_QUOTES); ?>" placeholder="Enter your password" style="margin-bottom:5px" name="password"/>

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM