我很难理解是否使用urldecode((,因为我在教程中读到浏览器自动url解码编码的url,所以我们不必使用urldecodec((。在用户向我的Mysql数据库提交数据之前,我需要过滤他们的输入。在我的页面上显示他们的数据之前,我也需要保护过滤器。
编码
<?php
function test_input($data)
{
$data = trim($data);
$data = stripslashes($data); //Strips only Backward Slashes. Not Forward Slashes.
$data = htmlspecialchars($data);
$data = strip_tags($data);
$data = urlencode($data);
return $data;
}
$input_2 = 'http://www.url.com/index.php';
$input_3 = '<a href="http://www.url.com/index.php">Link</a> *';
echo test_input($input_3);
?>
但是,如果浏览器自动解码,为什么上面的内容不回显解码后的url呢?
我得到回应:%26lt%3Ba+href%3D%26quot%3Bhttp%3A%2F%2Fwww.url.com%2Findex.php%26quot%3B%26gt%3BLink%26lt%3B%2Fa%26gt%3B+%2A
这个代码:代码B
<?php
function test_input($data)
{
$data = trim($data);
$data = stripslashes($data); //Strips only Backward Slashes. Not Forward Slashes.
$data = htmlspecialchars($data);
$data = strip_tags($data);
$data = urlencode($data);
return $data;
}
$input_2 = 'http://www.url.com/index.php';
$input_3 = '<a href="http://www.url.com/index.php">Link</a> *';
echo test_input(urldecode($input_3));
?>
输出如下:%26lt%3Ba+href%3D%26quot%3Bhttp%3A%2F%2Fwww.url.com%2Findex.php%26quot%3B%26gt%3BLink%26lt%3B%2Fa%26gt%3B+%2A
它们的输出相同。请注意,第二个代码使用urldecode((,而第一个代码不使用。因此,它们不应该输出相同的结果。对的
如何修复这样的url是以解码格式回显?注意:自定义功能是一个过滤器,用于过滤用户的输入。正在尝试构建一个筛选器,以便用户可以提交以下详细信息,这些详细信息在提交到我的数据库之前经过筛选,在我的页面上得到响应或显示之前经过筛选。
<form method = 'POST' action = "$_SERVER['PHP_SELF']">
<label for='find'>Find</label>
<input type='text' name='find' id='find'>
<br>
Table:
<input type='radio' name='table' id='sale'><label for='table'>Businesses On Sale</label>
<input type='radio' name='table' id='sold'><label for='table'>Businesses Sold</label>
<br>
<label for="column">Column:</label>
<select name="column" id="column">
<option value=""></option>
<option value="business_submission_id">Business Submission Id</option>
<option value="business_submission_date_and_time">Business Submission Date & Time</option>
<option value="business_name">Business Name</option>
<option value="business_zip">Business Zip</option>
<option value="business_phone">Business Phone</option>
<option value="business_email">Business Email</option>
<option value="business_domain">Business Website Domain Name</option>
<option value="business_url">Business Website Url</option>
<option value="business_description">Business Description</option>
</select>
<button type='submit'>Submit!</button>
</form>
</body>
</html>
这就是您正在做的:
$data = trim($data);
$data = stripslashes($data); //Strips only Backward Slashes. Not Forward Slashes.
$data = htmlspecialchars($data);
$data = strip_tags($data);
$data = urlencode($data);
- 去除末端的空白(通常是个好主意(
- 删除斜杠(通常不是一个好主意,这是一种破坏性且无效的安全措施(
- 使数据适合作为文本插入HTML文档
- 删除标签(通常不是一个好主意,因为它具有破坏性,但在这里完全没有意义,因为
htmlspecialchars
将替换strip_tags
操作的所有字符 - 使数据适合插入URL
- 呼应整件事
专注于这两个对这个场景很重要的方面。
通常情况下,您需要将一些输入放入URL,然后将该URL放入HTML文档:
$foo = "some unsafe user input";
$query_foo = urlencode($foo); // Now safe to be inserted into a URL
$url = "http://example.com/?query=$query_foo";
$html_url = htmlspecialchars($url);
?><a href="<?=$html_url ?>">...</a><?php
在您的情况下,您将内容插入到一个URL中,因此不应该在其中使用urlencode
。urlencode
不适用于整个URL(除非您将整个URL设置为另一个URL的查询字符串值(。
您还可以确保在将HTML插入URL之前将其插入到HTML中是安全的,这是向后的,因为URL将在HTML文档中,而不是相反。
但如果浏览器自动解码,为什么上面的内容不回显解码后的url?
浏览器对正确编码的URL进行解码,以便在您访问该URL时显示在地址栏中;该链接所处的位置";将鼠标悬停在链接上时的状态区域。
您只是将数据作为文本放在HTML中,而不是导航到它,它也不是链接的一部分。
它们的输出相同。请注意,第二个代码使用urldecode((,而第一个代码不使用。因此,它们不应该输出相同的结果。对的
你又倒退了。
您正在解码字符串(其中没有%
编码的字符,因此没有效果(,然后对其进行编码,然后回显编码版本。