Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 用户对数据库的输入_Php_Mysql_Pattern Matching_Mysql Real Escape String - Fatal编程技术网

Php 用户对数据库的输入

Php 用户对数据库的输入,php,mysql,pattern-matching,mysql-real-escape-string,Php,Mysql,Pattern Matching,Mysql Real Escape String,假设这样,我们只需要字符串或数字以及用户发送的数据。使用ereg和preg_匹配函数检查数据是否足够安全?有没有办法伪造它们?我们还应该使用mysql\u real\u escape\u string吗?足够安全与您自己的需要有关。如果出于某种原因,您想要避免使用mysql\u real\u escape\u字符串,那么我首先想问一下为什么 我的回答是:当然。。。取决于你的情况 你可以在与[0-9a-z]的比赛中预赛,没有什么可怕的。为安全起见,请尝试传递多字节字符。只要你的条件不允许你做任何事

假设这样,我们只需要字符串或数字以及用户发送的数据。使用ereg和preg_匹配函数检查数据是否足够安全?有没有办法伪造它们?我们还应该使用mysql\u real\u escape\u string吗?

足够安全与您自己的需要有关。如果出于某种原因,您想要避免使用mysql\u real\u escape\u字符串,那么我首先想问一下为什么

我的回答是:当然。。。取决于你的情况

你可以在与[0-9a-z]的比赛中预赛,没有什么可怕的。为安全起见,请尝试传递多字节字符。只要你的条件不允许你做任何事情,如果匹配不符合你的要求,那么我知道没有什么棘手的工作可以在如此严格的规则下插入恶意字符

但是“字符串”这个术语是非常开放的。包括标点符号吗?什么样的,等等。如果你允许标准的注入字符作为你所说的“字符串”,那么我的答案就不再确定了


但我仍然建议对所有用户提交的信息使用mysql\u real\u escape\u string(),无论您如何在之前对其进行净化。

这将是一个简短的答案

使用PDO

  • 文件:

例如,正在使用此引擎。

如果使用正则表达式匹配有效输入,并且匹配成功,则用户输入有效。也就是说,如果有效输入中没有任何恶意字符(特别是引号或可能的多字节字符),那么就不需要调用
mysql\u real\u escape\u string
。同样的原则也适用于以下情况:

$user_in_num = intval( $_POST['in_num']); // Don't need mysql_real_escape_string here
因此,类似于以下内容:

$subject = $_POST['string_input'];
if( !preg_match('/[^a-z0-9]/i', $subject)) 
{
    exit( 'Invalid input');
}

一旦
预匹配成功,在SQL查询中使用
$subject
是安全的。

如果只对[0-9a-z]进行预匹配,就可以看到。。。据我所知,那里不能输入恶意数据。。但是,是的,我同意所有的用户输入都不应该被信任,应该总是被验证——这应该是一个尽可能的练习。
ereg
是坏的(不推荐使用),通常强制使用正确的类型(使用
(int)
)更好(你不能意外地允许坏的东西)甚至比验证更容易,除非你有一个很好的库为你做所有的验证。我仍然会使用mysql\u real\u escape字符串。为什么不呢?如果你把正则表达式的创建搞砸了怎么办?@Galen-这真的不是重点,尤其是对于这样一个简单的正则表达式。对一个不确定的“如果…?”问题投反对票是无知的。如果您犯了导致安全漏洞的任何其他编程错误,该怎么办?同样的原则也适用于这里。我的观点是没有理由不通过
mysql\u real\u escape\u string
@Galen运行所有内容-我同意你的观点,但这不是OP的问题。我知道,我说的答案应该是你应该总是花时间保护自己。我感谢你的回答。但这并没有回答我的问题。根据你的第一个问题:是的,它足够安全。但是你仍然应该使用mysql\u real\u escape\u string()
,因为你和我们一样都是人。无论如何,使用PDO,这样您就不必再问这个问题了,使用PDO是PHP非常非常好的实践。在其他编程语言中,如果不定义列的类型,则无法执行查询。使用PDO是非常优雅和现代的DB使用方式。(对不起,我的英语不好)