【发布时间】:2019-12-06 11:35:30
【问题描述】:
在我的网站上,用户可以提交包含他们的姓名、电子邮件和金额的表单。
<input type='text' minlength='2' maxlength='30' spellcheck='false' placeholder='Elon' autocomplete='off' form='form' required>
<input type='email' minlength='6' maxlength='40' spellcheck='false' placeholder='musk@tesla.com' autocomplete='off' form='form' required>
<input type='number' step='0.01' min='2000' max='99999999.99' placeholder='$2,000.00' autocomplete='off' form='form' required>
但是,不是发布 HTML 表单,而是在一个 JS 函数中解析值,然后将包含所有参数的字符串发送到另一个创建 AJAX 请求的函数。
form.onsubmit = function(e){
const
children = this.children,
summary = this.parentNode.parentNode.children[0].innerText.split('.'),
negotiate = this.parentNode.children[1]
insert_data(`table=offers
&name=${children[0].value.toLowerCase()}
&email=${children[1].value.toLowerCase()}
&amount=${children[2].value * 100}
&sld=${summary[0]}
&tld=${summary[1]}`
)
return false
}
function insert_data(parameters, async){
async = async === undefined || async
let xhr = window.XMLHttpRequest
? new XMLHttpRequest()
: new ActiveXObject('Microsoft.XMLHTTP')
xhr.open('POST', 'ajax.php', async)
xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded;charset=UTF-8')
xhr.send(parameters)
}
考虑到这一点,这是我的第一个问题:为了安全起见,是否应该对 insert_data(parameter string) 进行编码,即使它已发布并且实际上并未作为实际 URL 中的参数传递?
下面是 AJAX 请求向其发布数据的 PHP。在脚本中,我试图在插入数据之前对其进行清理。
今天早些时候,我在 SO 上读到 htmlspecialchars() 和准备好的语句应该就足够了,而且在清理输入方面没有什么可以做的。但我想我不妨尽我所能。
$name = trim(strtolower(htmlspecialchars($_POST["name"])));
$email = trim(strtolower(filter_var($_POST["email"], FILTER_SANITIZE_EMAIL)));
$amount = trim(filter_var($_POST["amount"], FILTER_SANITIZE_NUMBER_INT));
$sld = trim(strtolower(htmlspecialchars($_POST["sld"])));
$tld = trim(strtolower(htmlspecialchars($_POST["tld"])));
我之前还读到FILTER_SANITIZE_MAGIC_QUOTES 现在已弃用,尽管the documentation. 中根本没有提及这一点因此,我想知道是否也弃用了以下任何过滤器?
FILTER_SANITIZE_EMAILFILTER_SANITIZE_NUMBER_INTFILTER_SANITIZE_SPECIAL_CHARSFILTER_SANITIZE_FULL_SPECIAL_CHARSFILTER_SANITIZE_STRING
我的最后一个问题是,如果上面的过滤器都没有被弃用,我应该为$name、$sld 和$tld 使用最后三个过滤器中的哪一个,它们应该是基本的 ASCII字符串?它们看起来都非常相似......
谢谢
【问题讨论】:
-
您能否将您读到
FILTER_SANITIZE_MAGIC_QUOTES已弃用的链接提供给我们?刚刚在 PHP 7 中对其进行了测试,它可以工作。 -
@KIKOSoftware 试图找到它。给我一秒钟
-
@KIKOSoftware stackoverflow.com/a/130323/7543162
-
那个答案说 magic quotes 已被弃用。 过滤器仍然可用,如果你需要它来处理魔术引号的后果,即使它们已经死了多年。
-
@deceze 是的,我知道它说魔术引号已被弃用。 但文档中没有提及它的弃用,这让我认为其他
FILTERS也可能被弃用,我们永远不会知道
标签: php mysql ajax database insert