-2

我试图通过著名的“1 OR 1”技术防止 sql 注入 url,使用 get 变量来检查 id 是否只是字符串 ex:(page.php?id=abc) 或整数 ex:(page.php?id= 12)

所以,我使用 is_string() 函数来检查字符串和 is_numeric 的数字,但它所做的只是检查第一个字母。因此,如果 ( ?id=ab345 ) 它仍然会返回 true。

那么,有没有办法检查所有值是否都是字符串,并且所有值都只是整数?

这是链接: <a href="site.com/page.php?id=MyProfile"> My Profile </a>

此页面获取 id 并进行数据库查询 if(isset($_GET['id']) {**AND IF ID IS TEXT ONLY**} {Perform code} 我缺少的是介于两者之间的 ** **

4

3 回答 3

0

您的问题的许多可能答案之一是;

$id = isset(isset($_GET['id'])) ? (int) $_GET['id'] : 0;    //force to integer, or 0 if not set

这会将 id 的值强制为整数,如果未在 URL 中设置,则强制为零(不要忘记讨厌的脚本小子,他们会手动更改 URL 以尝试破坏您的网站!)

但是......说实话......我有点担心你甚至认为这会阻止 SQL 注入攻击。我强烈建议您花更多时间进一步阅读该主题,这可能就是您的问题被否决的原因。

于 2012-10-06T19:22:24.063 回答
0

// Request: _GET['id'] = ab345
var_dump(is_numeric($_GET['id'])); // false
var_dump(is_string($_GET['id'])); // true

// Request: _GET['id'] = 345
var_dump(is_numeric($_GET['id'])); // true
var_dump(is_string($_GET['id'])); // false

于 2012-10-06T19:06:15.667 回答
0

默认情况下,PHP 中的所有这些输入都是string。如果您需要更具体的值,可以使用 PHP 具有的过滤器和验证功能(数据过滤器文档),例如查看默认可用的过滤器:http ://www.php.net/manual/en/过滤器.filters.php

于 2012-10-06T19:13:05.303 回答