我的網站上有一些代碼檢查數據庫中是否存在輸入字段的輸入值,然后盡可能簡單地輸出結果。不幸的是,如果發送了錯誤的值,它不會給我“找不到結果”。1 - 我該如何解決這個問題?沒有錯誤消息或其他任何內容,只有一個白頁。2 - 另一個問題:公眾是否可以使用這種類型的輸入字段檢查來獲取我的數據庫登錄憑據,并使用單獨的 search.php 將登錄憑據放在文件頂部?3 - 我怎樣才能用我的 php 代碼保護這個檢查免受任何主要攻擊?我認為 SQL 注入已經被阻止了。謝謝索引.php:<form action="search.php" method="Post"> <input type="text" name="query" /> <input type="submit" value="Search" /></form>搜索.php:<?php$mydatabase=mysqli_connect("localhost", "root", "") or die("Error connecting to database: ".mysql_error());mysqli_select_db($mydatabase, "mydb") or die(mysql_error());$query = $_POST['query']; $min_length = 1;if(strlen($query) >= $min_length){ $query = htmlspecialchars($query); $query = mysqli_real_escape_string($mydatabase, $query); $raw_results = mysqli_query($mydatabase, "SELECT * FROM mytable WHERE (`title` LIKE '%".$query."%')") or die("mysql_error()"); while($results = mysqli_fetch_array($raw_results)){ if (empty($results)) { echo 'No results found'; } else { echo "<p><h3>".$results['title']."</h3>".$results['name']."</p>"; } }} else{ echo "Minimum length is ".$min_length;}?>
1 回答

元芳怎么了
TA貢獻1798條經驗 獲得超7個贊
問題 1 的答案mysqli_fetch_array
的手冊頁提醒您,如果結果集中沒有行,它將返回。If gets set to your loop will never run and that is why you never see your No results found消息。您需要在循環外進行空檢查或將其切換到do-while循環。NULL
$results
NULL
while
while
問題 2 的答案
我不確定我是否完全理解您的要求,但只要您的憑據位于.php
文件內的 PHP 標記內,就沒有人應該能夠公開看到這些。*
*此聲明肯定有例外。最佳做法是為您的憑據使用環境變量。至少從一個單獨的文件加載全局變量,以防原始 PHP 文件暴露給用戶。在這種情況下,他們只會看到環境變量或全局變量,而不是您的實際憑據。
問題 3 的答案
我認為您使用htmlspecialchars
和mysqli_real_escape_string
是保護數據庫的良好開端,但您確實應該仔細閱讀這些函數可能帶來的缺點。我傷口建議調查準備好的陳述。PHP 手冊提供了豐富的信息,但是這個SO Answer也做得很好;如果您錯過了我鏈接到另一個答案的鏈接的答案,您也會發現它非常有幫助。
- 1 回答
- 0 關注
- 85 瀏覽
添加回答
舉報
0/150
提交
取消