如何判断mysql_real_escape_string是否有效?

3

正如标题所述,我该如何判断mysql_real_escape_string是否正常工作,而无需等待被黑客攻击?

3个回答

3

检查从中获取的值。

向其发送应该进行转义的文本,例如Ed O'Neil(应返回为Ed O''NeilEd O\'Neil


这样可以吗?$post = $_GET['post'];if(is_numeric($post)) { $post = mysql_real_escape_string($post); } else { die("NAUGHTY NAUGHTY"); }mysql_select_db("*******", $******);$content = mysql_query("SELECT * FROM tbl_***** WHERE Id='" . $post . "'"); - Oliver Bayes-Shelton
在我看来,如果 is_numeric($post) 为真,则 $post 不需要被转义,因为它已经是一个数字。不过,再次确认也无妨。 - Powerlord
如果我期望一个数字值,我通常只使用 "SELECT foo FROM bar WHERE baz=" . (int)$foo; 如果该值不是数字,则返回0,导致(通常情况下,取决于查询)结果集为空,并且任何其他数字将被剥离所有非数字字符(请参阅手册中整数转换的行为)。对于插入/更新,必须进行验证,因为0可能并不总是可以接受的。优点是:比转义要短得多,并且使阅读代码的其他人清楚地知道它是一个数字。关于速度:不确定那里,但我认为它可能比转义更快。 - user253984

1
为了进一步解释'R. Bemrose'所提供的内容,这里提供一些示例代码。请确保将mysql凭据替换为您自己的凭据。
<?php
// Connect
$link = mysql_connect('mysql_host', 'mysql_user', 'mysql_password')
    OR die(mysql_error());

$user = "Ed O'Neil";
$password = "SQL_INJECTION ';'alter table xyz';";

// Query
$query_safe= sprintf("SELECT * FROM users WHERE user='%s' AND password='%s'",
            mysql_real_escape_string($user),
            mysql_real_escape_string($password));

// Query
$query_not_safe= sprintf("SELECT * FROM users WHERE user='%s' AND password='%s'",
            $user,
            $password);

echo $query_safe."\n";
echo $query_not_safe;

?>

1
创建一个单元测试,发送应该转义的所有字符并检查其输出。
但是: 为什么不直接使用具有PDO的参数化查询? 例如:
$dbh = new PDO([...]);
$sth = $dbh->prepare("SELECT foo FROM bar WHERE baz=:baz");
$sth->execute(array(":baz" => $mybaz));

这是最安全的方式,而且由于PDO的存在,它几乎和Perl一样容易。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接