如何避免' =' '或'

时间:2015-11-14 00:14:16

标签: php mysql sql-injection

我制作PHP网站 使用USER / Pass登录 但是USer可以通过使用来跳过此页面 ' =' '或'
'或1 = 1 像这样 代码在这里的文件Login_Check.php

`

include("includeszzz/host_conf.php");
include("includeszzz/mysql.lib.php");
$obj=new connect;
$obj1=new connect;
$username=$_GET["username"];
$password=$_GET["password"];
//echo $username;
//echo $password;
$sql="select username from  admin where username='$username'";
$obj->query($sql);
$U_num=$obj->num_rows();
//echo $U_num;
if($U_num!=0) {
$sql1="select password from admin where username='$username' and password='$password'";
$obj1->query($sql1);
$P_num=$obj1->num_rows();
    if($P_num!=0) {
        session_start();
        $_SESSION["zizo"]="$username";
    //header("location: welcome.php");
    echo "1";
} else {
    echo "Invalid Password Please Try Again";
}
}  else {
echo "Invalid Username Please Try Again";
}

`

1 个答案:

答案 0 :(得分:2)

您希望避免在没有任何卫生设施的情况下在查询中使用用户数据。 http://php.net/manual/en/security.database.sql-injection.php

“示例#5更安全的撰写查询方式......”

<?php

settype($offset, 'integer');
$query = "SELECT id, name FROM products ORDER BY name LIMIT 20 OFFSET $offset;";

// please note %d in the format string, using %s would be meaningless
$query = sprintf("SELECT id, name FROM products ORDER BY name LIMIT 20 OFFSET %d;",
                 $offset);

?>
  • 如果数据库层不支持绑定变量,则引用 每个非数字用户提供的值传递给数据库 使用特定于数据库的字符串转义函数(例如, mysql_real_escape_string(),sqlite_escape_string()等)。通用 像addslashes()这样的函数只在非常具体的情况下才有用 环境(例如,带有禁用的单字节字符集中的MySQL NO_BACKSLASH_ESCAPES)所以最好避免它们。
  • 不打印任何特定于数据库的信息,尤其是关于 模式,通过公平的手段或犯规。另请参见错误报告和错误 处理和记录功能。
  • 您可以使用存储过程和先前定义的游标 抽象数据访问使用户不直接访问表或 观点,但这个解决方案还有其他影响。

此外,您还可以使用绑定参数: http://php.net/manual/en/pdo.prepared-statements.php

<?php
$stmt = $dbh->prepare("INSERT INTO REGISTRY (name, value) VALUES (:name, :value)");
$stmt->bindParam(':name', $name);
$stmt->bindParam(':value', $value);

// insert one row
$name = 'one';
$value = 1;
$stmt->execute();

// insert another row with different values
$name = 'two';
$value = 2;
$stmt->execute();
?>