即使使用mysql_real_escape_string()函数,是否存在SQL注入的可能性?
考虑这个示例情况.SQL是用PHP构造的,如下所示:
$login = mysql_real_escape_string(GetFromPost('login'));
$password = mysql_real_escape_string(GetFromPost('password'));
$sql = "SELECT * FROM table WHERE login='$login' AND password='$password'";
Run Code Online (Sandbox Code Playgroud)
我听过很多人对我说,这样的代码仍然很危险,即使使用了mysql_real_escape_string()函数也可以破解.但我想不出任何可能的漏洞?
像这样的经典注射:
aaa' OR 1=1 --
Run Code Online (Sandbox Code Playgroud)
不工作.
你知道任何可能通过上面的PHP代码注入的注入吗?
有人攻击了我的数据库并放弃了该表.
在我的PHP页面中有一个单独的查询,我在使用mysql_real_escape_string:
$db_host="sql2.netsons.com";
$db_name="xxx";
$username="xxx";
$password="xxx";
$db_con=mysql_connect($db_host,$username,$password);
$connection_string=mysql_select_db($db_name);
mysql_connect($db_host,$username,$password);
mysql_set_charset('utf8',$db_con);
$email= mysql_real_escape_string($_POST['email']);
$name= mysql_real_escape_string($_POST['name']);
$sex= mysql_real_escape_string($_POST['sex']);
if($_POST['M']!=""){ $sim = 1; }else { $sim = 0; }
$query = "INSERT INTO `users` (`email`, `name`, `sex`, `M`) VALUES
( '".$email."', '".ucwords(strtolower($name))."', '".$sex."','".$sim."')";
$res = mysql_query($query) or die("Query fail: " . mysql_error() );
mysql_close($db_con);
Run Code Online (Sandbox Code Playgroud)
而register_globals被禁用.
那么,我的数据库是怎么被黑了的?
我没有看到任何有价值的信息或没有过时的信息.所以,有一个问题:mysql_real_escape_string()是否完全防止SQL注入?然而它是非常过时的(它来自'09),因此在12月的php 5.3和mysql 5.5中,它是否完全保护?
在PHP手册中,有一个注释:
注意:如果此函数不用于转义数据,则查询容易受到SQL注入攻击.
这足以反sql注入吗?如果没有,你能举一个例子和一个很好的解决方案来反sql注入吗?
我写了这个简短的函数来防止my_sql注入,因为它的重要性我只想与其他人仔细检查这将按照我的意图运行.
foreach($_REQUEST as $key => $value) {
$_REQUEST[$key] = stripslashes($value);
$_REQUEST[$key] = mysql_real_escape_string($_REQUEST[$key]);
}
Run Code Online (Sandbox Code Playgroud) 这被标记为重复,但我不认为这是一个公平的判断.这个问题再一次被简单地回答了......但这不是正确的答案.如果从实际的帖子表单中使用"重复"答案,则它不起作用.它被拒绝就像所有其他尝试一样.我实际上已多次使用该答案,它几乎出现在每个SQL注入备忘单上.请将此标记为重复标记.
这个问题纯粹是为了理解,而不是用于访问其他网站.我多次读过MySQL转义不足以保护自己免受SQL注入.因此,我设置了多个测试页面来尝试SQL注入.我成功了一些,但从未使用过该mysql_real_escape_string()功能.
我已经研究并尝试过许多来自备忘单的例子,但不能破解这个,所以我觉得它足够安全或足够安全.有人能举个例子吗?也许是为什么这个登录是不安全的原因和一个绕过登录和/或改变表的示例输入?
我打算也使用MySQLi.在这个例子中,我使用MySQL来询问与MySQLi相比这可能导致SQL注入问题的位置(另一个声明,但我从未见过证明).
这是某人有机会证明不安全感,而不仅仅是说它是不安全的.
if (isset($_POST['aun'])) {
$username = mysql_real_escape_string($_POST['aun']);
$checkadminlogin = mysql_query("SELECT * FROM admin WHERE un='$username'");
$uncreds = mysql_fetch_assoc($checkadminlogin);
$pass = mysql_real_escape_string($_POST['apwd']);
//Line to get key for encrypting input password, used below as $keyinfo['op_value'];
$salt = $keyinfo['op_value'];
$fpass = sha1($pass . $salt);
if ($fpass == $uncreds['pwd']) {
echo 'Congrats, you logged in. Or hacked your way in. Whatever';
}
}
Run Code Online (Sandbox Code Playgroud)
另外在旁注,你不能只是替换所有特殊字符以防止任何注射吗?
include "../admin/site.php"; // Setup db connection.
$appid = -1;
if (is_string($_GET["id"]))
{
$id = mysql_real_escape_string($_GET["id"]);
$sql = "select * from version where id=$id";
$ver = mysql_query($sql);
if ($id > 0 && $ver && mysql_num_rows($ver))
{
$appid = mysql_result($ver, 0, "AppID");
$app = DLookUp("apps", "name", "id=$appid");
$name = mysql_result($ver, 0, "Name");
$notes = mysql_result($ver, 0, "Notes");
}
else $app = "No version by that ID";
}
else $app = "No ID";
/* some html snipped */
if (isset($app) && isset($name))
echo …Run Code Online (Sandbox Code Playgroud) 我遇到了一些奇怪的东西,我不知道它为什么会发生!
我有一个像这样的网址:
http://mysite.com/users/USER_ID
这个用户ID可能是INT也可能是STRING,就像Facebook页面地址一样,如果你用页面ID调用它加载它的页面,你也可以用页面名称"my_page_name"来调用它
所以想象一个用户,它的ID是1,它的地址是my_name
在我的php页面上我需要查询db,但在此之前我需要知道要查找哪个列,id或者page_name
所以我带来了这个解决方案:
<?php
$id = $_GET['id'];
$id_inted = intval($_GET['id']);
if($id == $id_inted){
// The column which I should look into is id
$column = 'id';
}else{
// The column which I should look into is page_name
$column = 'page_name';
}
$query = mysql_qyery(SELECT * FROM members WHERE $column = '$id');
?>
Run Code Online (Sandbox Code Playgroud)
所以我测试了它,但结果很奇怪,即使我调用这个URL:
http://mysite.com/users/page_name
有时候是这样的: $column = 'id';
我打开了一个新的测试页面:
<?php
$real_string = 'abcdefg';
$string_inted …Run Code Online (Sandbox Code Playgroud)